diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 000000000..b198e747a --- /dev/null +++ b/.travis.yml @@ -0,0 +1,17 @@ +language: cpp +compiler: + - gcc + - clang +install: + - sudo apt-get update + - sudo apt-get install libglew-dev +script: + - echo "CXX="$CXX + - echo "CC="$CC + - cmake . -G "Unix Makefiles" #-DCMAKE_CXX_FLAGS=-Werror + - make -j8 + - sudo make install + # Test again with double precision + - cmake . -G "Unix Makefiles" -DUSE_DOUBLE_PRECISION=ON #-DCMAKE_CXX_FLAGS=-Werror + - make -j8 + - sudo make install diff --git a/CMakeLists.txt b/CMakeLists.txt index dfc538089..b04f3f290 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,7 +5,7 @@ set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true) SET(MSVC_INCREMENTAL_DEFAULT ON) PROJECT(BULLET_PHYSICS) -SET(BULLET_VERSION 2.82) +SET(BULLET_VERSION 2.83) IF(COMMAND cmake_policy) cmake_policy(SET CMP0003 NEW) @@ -22,7 +22,7 @@ SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D_DEBUG") OPTION(USE_DOUBLE_PRECISION "Use double precision" OFF) OPTION(USE_GRAPHICAL_BENCHMARK "Use Graphical Benchmark" ON) - +OPTION(BUILD_SHARED_LIBS "Use shared libraries" OFF) OPTION(USE_MSVC_RUNTIME_LIBRARY_DLL "Use MSVC Runtime Library DLL (/MD or /MDd)" OFF) OPTION(USE_MSVC_INCREMENTAL_LINKING "Use MSVC Incremental Linking" OFF) @@ -39,18 +39,20 @@ IF(MSVC) IF (NOT USE_MSVC_INCREMENTAL_LINKING) #MESSAGE("MSVC_INCREMENTAL_DEFAULT"+${MSVC_INCREMENTAL_DEFAULT}) SET( MSVC_INCREMENTAL_YES_FLAG "/INCREMENTAL:NO") - + STRING(REPLACE "INCREMENTAL:YES" "INCREMENTAL:NO" replacementFlags ${CMAKE_EXE_LINKER_FLAGS_DEBUG}) SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "/INCREMENTAL:NO ${replacementFlags}" ) MESSAGE("CMAKE_EXE_LINKER_FLAGS_DEBUG=${CMAKE_EXE_LINKER_FLAGS_DEBUG}") -# STRING(REPLACE "INCREMENTAL:YES" "INCREMENTAL:NO" replacementFlags2 ${CMAKE_EXE_LINKER_FLAGS}) -# SET(CMAKE_EXE_LINKER_FLAGS ${replacementFlag2}) -# STRING(REPLACE "INCREMENTAL:YES" "" replacementFlags3 ${CMAKE_EXTRA_LINK_FLAGS}) -# SET(CMAKE_EXTRA_LINK_FLAGS ${replacementFlag3}) + STRING(REPLACE "INCREMENTAL:YES" "INCREMENTAL:NO" replacementFlags2 ${CMAKE_EXE_LINKER_FLAGS}) + + SET(CMAKE_EXE_LINKER_FLAGS ${replacementFlag2}) + STRING(REPLACE "INCREMENTAL:YES" "" replacementFlags3 "${CMAKE_EXTRA_LINK_FLAGS}") + + SET(CMAKE_EXTRA_LINK_FLAGS ${replacementFlag3}) - STRING(REPLACE "INCREMENTAL:YES" "INCREMENTAL:NO" replacementFlags3 ${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO}) + STRING(REPLACE "INCREMENTAL:YES" "INCREMENTAL:NO" replacementFlags3 "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO}") SET(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO ${replacementFlags3}) SET(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "/INCREMENTAL:NO ${replacementFlags3}" ) @@ -179,8 +181,8 @@ ENDIF (OPENGL_FOUND) -OPTION(BUILD_OBSOLETE_DEMOS "Set when you want to build the obsolete Bullet 2 demos" OFF) -IF(BUILD_OBSOLETE_DEMOS) +OPTION(BUILD_BULLET2_DEMOS "Set when you want to build the Bullet 2 demos" ON) +IF(BUILD_BULLET2_DEMOS) IF (USE_GLUT) IF (MSVC) @@ -188,13 +190,13 @@ IF (USE_GLUT) ADD_DEFINITIONS(-DBT_USE_FREEGLUT) IF (CMAKE_CL_64) - message("Win64 using static freeglut in ObsoleteDemos/Glut/glut64.lib") - SET(GLUT_glut_LIBRARY ${BULLET_PHYSICS_SOURCE_DIR}/ObsoleteDemos/Glut/glut64.lib glu32.lib gdi32.lib winmm.lib user32.lib) + message("Win64 using static freeglut in Demos/Glut/glut64.lib") + SET(GLUT_glut_LIBRARY ${BULLET_PHYSICS_SOURCE_DIR}/Demos/Glut/glut64.lib glu32.lib gdi32.lib winmm.lib user32.lib) ELSE(CMAKE_CL_64) - message("Win32 using static freeglut in ObsoleteDemos/Glut/glut32.lib") - SET(GLUT_glut_LIBRARY ${BULLET_PHYSICS_SOURCE_DIR}/ObsoleteDemos/Glut/glut32.lib glu32.lib gdi32.lib winmm.lib user32.lib) + message("Win32 using static freeglut in Demos/Glut/glut32.lib") + SET(GLUT_glut_LIBRARY ${BULLET_PHYSICS_SOURCE_DIR}/Demos/Glut/glut32.lib glu32.lib gdi32.lib winmm.lib user32.lib) ENDIF (CMAKE_CL_64) - SET(GLUT_INCLUDE_DIR ${BULLET_PHYSICS_SOURCE_DIR}/ObsoleteDemos/Glut ) + SET(GLUT_INCLUDE_DIR ${BULLET_PHYSICS_SOURCE_DIR}/Demos/Glut ) ELSE() FIND_PACKAGE(GLUT) IF (GLUT_FOUND) @@ -212,19 +214,29 @@ IF (USE_GLUT) ENDIF (GLUT_FOUND) ENDIF (MSVC) - IF(NOT WIN32 AND NOT APPLE) + IF(NOT WIN32 AND NOT APPLE AND NOT CMAKE_CROSSCOMPILING) # This is added for linux. This should always work if everything is installed and working fine. SET(GLUT_INCLUDE_DIR /usr/include /usr/local/include) ENDIF() ENDIF(USE_GLUT) - IF(EXISTS ${BULLET_PHYSICS_SOURCE_DIR}/ObsoleteDemos AND IS_DIRECTORY ${BULLET_PHYSICS_SOURCE_DIR}/ObsoleteDemos) - SUBDIRS(ObsoleteDemos) + IF(EXISTS ${BULLET_PHYSICS_SOURCE_DIR}/Demos AND IS_DIRECTORY ${BULLET_PHYSICS_SOURCE_DIR}/Demos) + SUBDIRS(Demos) ENDIF() -ENDIF(BUILD_OBSOLETE_DEMOS) +ENDIF(BUILD_BULLET2_DEMOS) -OPTION(BUILD_BULLET3_DEMOS "Set when you want to build the Bullet 3 demos" ON) +IF (APPLE) + FIND_LIBRARY(COCOA_LIBRARY Cocoa) +ENDIF() + +OPTION(BUILD_BULLET3 "Set when you want to build Bullet 3" ON) +IF(BUILD_BULLET3) + OPTION(BUILD_BULLET3_DEMOS "Set when you want to build the Bullet 3 demos" ON) +ELSE(BUILD_BULLET3) + unset(BUILD_BULLET3_DEMOS CACHE) + OPTION(BUILD_BULLET3_DEMOS "Set when you want to build the Bullet 3 demos" OFF) +ENDIF(BUILD_BULLET3) IF(BUILD_BULLET3_DEMOS) IF(EXISTS ${BULLET_PHYSICS_SOURCE_DIR}/Demos3 AND IS_DIRECTORY ${BULLET_PHYSICS_SOURCE_DIR}/Demos3) SUBDIRS(Demos3) @@ -232,6 +244,10 @@ IF(BUILD_BULLET3_DEMOS) ENDIF() ENDIF(BUILD_BULLET3_DEMOS) +OPTION(BUILD_EXTRAS "Set when you want to build the extras" ON) +IF(BUILD_EXTRAS) + SUBDIRS(Extras) +ENDIF(BUILD_EXTRAS) #Maya Dynamica plugin is moved to http://dynamica.googlecode.com @@ -266,14 +282,14 @@ IF(INSTALL_LIBS) ENDIF(INSTALL_LIBS) #INSTALL of other files requires CMake 2.6 -#IF (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} GREATER 2.5) -# OPTION(INSTALL_EXTRA_LIBS "Set when you want extra libraries installed" OFF) -#ENDIF (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} GREATER 2.5) +IF (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} GREATER 2.5) + OPTION(INSTALL_EXTRA_LIBS "Set when you want extra libraries installed" OFF) +ENDIF (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} GREATER 2.5) -OPTION(BUILD_UNIT_TESTS "Build Unit Tests" OFF) +OPTION(BUILD_UNIT_TESTS "Build Unit Tests" ON) IF (BUILD_UNIT_TESTS) - SUBDIRS(UnitTests) + SUBDIRS(test) ENDIF() set (BULLET_CONFIG_CMAKE_PATH lib${LIB_SUFFIX}/cmake/bullet ) diff --git a/ObsoleteDemos/AllBulletDemos/CMakeLists.txt b/Demos/AllBulletDemos/CMakeLists.txt similarity index 100% rename from ObsoleteDemos/AllBulletDemos/CMakeLists.txt rename to Demos/AllBulletDemos/CMakeLists.txt diff --git a/ObsoleteDemos/AllBulletDemos/DemoEntries.cpp b/Demos/AllBulletDemos/DemoEntries.cpp similarity index 100% rename from ObsoleteDemos/AllBulletDemos/DemoEntries.cpp rename to Demos/AllBulletDemos/DemoEntries.cpp diff --git a/ObsoleteDemos/AllBulletDemos/DemoEntries.h b/Demos/AllBulletDemos/DemoEntries.h similarity index 100% rename from ObsoleteDemos/AllBulletDemos/DemoEntries.h rename to Demos/AllBulletDemos/DemoEntries.h diff --git a/ObsoleteDemos/AllBulletDemos/Main.cpp b/Demos/AllBulletDemos/Main.cpp similarity index 100% rename from ObsoleteDemos/AllBulletDemos/Main.cpp rename to Demos/AllBulletDemos/Main.cpp diff --git a/ObsoleteDemos/AllBulletDemos/Makefile.am b/Demos/AllBulletDemos/Makefile.am similarity index 100% rename from ObsoleteDemos/AllBulletDemos/Makefile.am rename to Demos/AllBulletDemos/Makefile.am diff --git a/Demos/BasicDemo/BasicDemo.cpp b/Demos/BasicDemo/BasicDemo.cpp new file mode 100644 index 000000000..5cdfb0f16 --- /dev/null +++ b/Demos/BasicDemo/BasicDemo.cpp @@ -0,0 +1,147 @@ +/* +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. +*/ + + +///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" + +#include //printf debugging +#include "GLDebugDrawer.h" +#include "LinearMath/btAabbUtil2.h" + +static GLDebugDrawer gDebugDraw; + +///The MyOverlapCallback is used to show how to collect object that overlap with a given bounding box defined by aabbMin and aabbMax. +///See m_physicsSetup.m_dynamicsWorld->getBroadphase()->aabbTest. +struct MyOverlapCallback : public btBroadphaseAabbCallback +{ + btVector3 m_queryAabbMin; + btVector3 m_queryAabbMax; + + int m_numOverlap; + MyOverlapCallback(const btVector3& aabbMin, const btVector3& aabbMax ) : m_queryAabbMin(aabbMin),m_queryAabbMax(aabbMax),m_numOverlap(0) {} + virtual bool process(const btBroadphaseProxy* proxy) + { + btVector3 proxyAabbMin,proxyAabbMax; + btCollisionObject* colObj0 = (btCollisionObject*)proxy->m_clientObject; + colObj0->getCollisionShape()->getAabb(colObj0->getWorldTransform(),proxyAabbMin,proxyAabbMax); + if (TestAabbAgainstAabb2(proxyAabbMin,proxyAabbMax,m_queryAabbMin,m_queryAabbMax)) + { + m_numOverlap++; + } + return true; + } +}; + +void BasicDemo::clientMoveAndDisplay() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + //simple dynamics world doesn't handle fixed-time-stepping + float ms = getDeltaTimeMicroseconds(); + + m_physicsSetup.stepSimulation(ms/1000000.f); + m_physicsSetup.m_dynamicsWorld->debugDrawWorld(); + + /* + ///step the simulation + if (m_physicsSetup.m_dynamicsWorld) + { + m_physicsSetup.m_dynamicsWorld->stepSimulation(ms / 1000000.f); + //optional but useful: debug drawing + m_physicsSetup.m_dynamicsWorld->debugDrawWorld(); + + btVector3 aabbMin(1,1,1); + btVector3 aabbMax(2,2,2); + + MyOverlapCallback aabbOverlap(aabbMin,aabbMax); + m_physicsSetup.m_dynamicsWorld->getBroadphase()->aabbTest(aabbMin,aabbMax,aabbOverlap); + + //if (aabbOverlap.m_numOverlap) + // printf("#aabb overlap = %d\n", aabbOverlap.m_numOverlap); + } + */ + 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_physicsSetup.m_dynamicsWorld) + m_physicsSetup.m_dynamicsWorld->debugDrawWorld(); + + glFlush(); + swapBuffers(); +} + + + + + +void BasicDemo::initPhysics() +{ + setTexturing(true); + setShadows(true); + + setCameraDistance(btScalar(SCALING*50.)); + GraphicsPhysicsBridge gfxBridge; + m_physicsSetup.initPhysics(gfxBridge); + + m_dynamicsWorld = m_physicsSetup.m_dynamicsWorld; + m_dynamicsWorld->setDebugDrawer(&gDebugDraw); + +} +void BasicDemo::clientResetScene() +{ + exitPhysics(); + initPhysics(); +} + + +void BasicDemo::exitPhysics() +{ + m_physicsSetup.exitPhysics(); +} + + + + diff --git a/ObsoleteDemos/BasicDemo/BasicDemo.h b/Demos/BasicDemo/BasicDemo.h similarity index 77% rename from ObsoleteDemos/BasicDemo/BasicDemo.h rename to Demos/BasicDemo/BasicDemo.h index 7a6851f7d..ae6bf7149 100644 --- a/ObsoleteDemos/BasicDemo/BasicDemo.h +++ b/Demos/BasicDemo/BasicDemo.h @@ -24,30 +24,15 @@ subject to the following restrictions: #endif #include "LinearMath/btAlignedObjectArray.h" +#include "BasicDemoPhysicsSetup.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; + BasicDemoPhysicsSetup m_physicsSetup; public: diff --git a/Demos/BasicDemo/BasicDemoPhysicsSetup.cpp b/Demos/BasicDemo/BasicDemoPhysicsSetup.cpp new file mode 100644 index 000000000..62fced239 --- /dev/null +++ b/Demos/BasicDemo/BasicDemoPhysicsSetup.cpp @@ -0,0 +1,89 @@ + + +#include "BasicDemoPhysicsSetup.h" +#include "btBulletDynamicsCommon.h" +#define ARRAY_SIZE_Y 5 +#define ARRAY_SIZE_X 5 +#define ARRAY_SIZE_Z 5 + +void BasicDemoPhysicsSetup::initPhysics(GraphicsPhysicsBridge& gfxBridge) +{ + createEmptyDynamicsWorld(); + + + ///create a few basic rigid bodies + btBoxShape* groundShape = createBoxShape(btVector3(btScalar(50.),btScalar(50.),btScalar(50.))); + gfxBridge.createCollisionShapeGraphicsObject(groundShape); + + //groundShape->initializePolyhedralFeatures(); +// btCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0,1,0),50); + + m_collisionShapes.push_back(groundShape); + + btTransform groundTransform; + groundTransform.setIdentity(); + groundTransform.setOrigin(btVector3(0,-50,0)); + + { + btScalar mass(0.); + btRigidBody* body = createRigidBody(mass,groundTransform,groundShape, btVector4(0,0,1,1)); + gfxBridge.createRigidBodyGraphicsObject(body, btVector3(0, 1, 0)); + } + + + { + //create a few dynamic rigidbodies + // Re-using the same collision is better for memory usage and performance + + btBoxShape* colShape = createBoxShape(btVector3(1,1,1)); + gfxBridge.createCollisionShapeGraphicsObject(colShape); + + //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); + + + for (int k=0;k 0) { float mass = 0.f; @@ -69,7 +69,7 @@ public: 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); @@ -134,7 +134,7 @@ BspDemo::~BspDemo() void BspDemo::initPhysics() { const char* bspfilename = "BspDemo.bsp"; - + initPhysics(bspfilename); } @@ -144,7 +144,7 @@ void BspDemo::initPhysics(const char* bspfilename) { setTexturing(true); setShadows(false); - + m_cameraUp = btVector3(0,0,1); m_forwardAxis = 1; @@ -170,31 +170,23 @@ void BspDemo::initPhysics(const char* bspfilename) #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"); - } + const char* filename = "BspDemo.bsp"; + + const char* prefix[]={"./","../","../../","../../../","../../../../", "BspDemo/", "Demos/BspDemo/", + "../Demos/BspDemo/","../../Demos/BspDemo/"}; + int numPrefixes = sizeof(prefix)/sizeof(const char*); + char relativeFileName[1024]; + FILE* file=0; + + for (int i=0;istepSimulation(dt); //optional but useful: debug drawing @@ -248,7 +240,7 @@ void BspDemo::clientMoveAndDisplay() void BspDemo::displayCallback(void) { - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); renderme(); @@ -295,7 +287,7 @@ char* makeExeToBspFilename(const char* lpCmdLine) // 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; @@ -316,6 +308,6 @@ char* makeExeToBspFilename(const char* lpCmdLine) *(out++) = 's'; *(out++) = 'p'; *(out++) = 0; - + return cleaned_filename; } diff --git a/ObsoleteDemos/BspDemo/BspDemo.h b/Demos/BspDemo/BspDemo.h similarity index 100% rename from ObsoleteDemos/BspDemo/BspDemo.h rename to Demos/BspDemo/BspDemo.h diff --git a/ObsoleteDemos/BspDemo/BspLoader.cpp b/Demos/BspDemo/BspLoader.cpp similarity index 100% rename from ObsoleteDemos/BspDemo/BspLoader.cpp rename to Demos/BspDemo/BspLoader.cpp diff --git a/ObsoleteDemos/BspDemo/BspLoader.h b/Demos/BspDemo/BspLoader.h similarity index 100% rename from ObsoleteDemos/BspDemo/BspLoader.h rename to Demos/BspDemo/BspLoader.h diff --git a/ObsoleteDemos/BspDemo/CMakeLists.txt b/Demos/BspDemo/CMakeLists.txt similarity index 91% rename from ObsoleteDemos/BspDemo/CMakeLists.txt rename to Demos/BspDemo/CMakeLists.txt index 0a070a541..4d201988f 100644 --- a/ObsoleteDemos/BspDemo/CMakeLists.txt +++ b/Demos/BspDemo/CMakeLists.txt @@ -35,7 +35,7 @@ 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}/ObsoleteDemos/BspDemo/BspDemo.bsp ${CMAKE_CURRENT_BINARY_DIR} + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/Demos/BspDemo/BspDemo.bsp ${CMAKE_CURRENT_BINARY_DIR} ) ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) @@ -43,4 +43,4 @@ 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 +ENDIF(INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) diff --git a/ObsoleteDemos/BspDemo/main.cpp b/Demos/BspDemo/main.cpp similarity index 100% rename from ObsoleteDemos/BspDemo/main.cpp rename to Demos/BspDemo/main.cpp diff --git a/ObsoleteDemos/BulletDinoDemo/BulletDino.c b/Demos/BulletDinoDemo/BulletDino.c similarity index 100% rename from ObsoleteDemos/BulletDinoDemo/BulletDino.c rename to Demos/BulletDinoDemo/BulletDino.c diff --git a/ObsoleteDemos/BulletDinoDemo/CMakeLists.txt b/Demos/BulletDinoDemo/CMakeLists.txt similarity index 100% rename from ObsoleteDemos/BulletDinoDemo/CMakeLists.txt rename to Demos/BulletDinoDemo/CMakeLists.txt diff --git a/ObsoleteDemos/BulletXmlImportDemo/BulletXmlImportDemo.cpp b/Demos/BulletXmlImportDemo/BulletXmlImportDemo.cpp similarity index 83% rename from ObsoleteDemos/BulletXmlImportDemo/BulletXmlImportDemo.cpp rename to Demos/BulletXmlImportDemo/BulletXmlImportDemo.cpp index 9c670a81a..dba805a5b 100644 --- a/ObsoleteDemos/BulletXmlImportDemo/BulletXmlImportDemo.cpp +++ b/Demos/BulletXmlImportDemo/BulletXmlImportDemo.cpp @@ -4,8 +4,8 @@ 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, +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. @@ -38,16 +38,36 @@ void BulletXmlImportDemo::initPhysics() setTexturing(true); setShadows(true); - + setupEmptyDynamicsWorld(); - + m_dynamicsWorld->setDebugDrawer(&gDebugDrawer); btBulletXmlWorldImporter* importer = new btBulletXmlWorldImporter(m_dynamicsWorld); - importer->loadFile("bullet_basic.xml"); + static const char* filename = "bullet_basic.xml"; + + const char* prefix[]={"./","../","../../","../../../","../../../../", "BulletXmlImportDemo/", "Demos/BulletXmlImportDemo/", + "../Demos/BulletXmlImportDemo/","../../Demos/BulletXmlImportDemo/"}; + int numPrefixes = sizeof(prefix)/sizeof(const char*); + char relativeFileName[1024]; + bool fileFound = false; + + for (int i=0;iloadFile(relativeFileName); // importer->loadFile("bulletser.xml"); // importer->loadFile("bullet_constraints.xml"); @@ -55,21 +75,21 @@ void BulletXmlImportDemo::initPhysics() void BulletXmlImportDemo::clientMoveAndDisplay() { - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + 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); m_dynamicsWorld->debugDrawWorld(); } - - renderme(); + + renderme(); glFlush(); @@ -81,8 +101,8 @@ void BulletXmlImportDemo::clientMoveAndDisplay() void BulletXmlImportDemo::displayCallback(void) { - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + renderme(); @@ -105,7 +125,7 @@ void BulletXmlImportDemo::setupEmptyDynamicsWorld() btGImpactCollisionAlgorithm::registerAlgorithm(m_dispatcher); 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; @@ -113,7 +133,7 @@ void BulletXmlImportDemo::setupEmptyDynamicsWorld() //btGImpactCollisionAlgorithm::registerAlgorithm((btCollisionDispatcher*)m_dynamicsWorld->getDispatcher()); - + } @@ -122,8 +142,6 @@ void BulletXmlImportDemo::setupEmptyDynamicsWorld() BulletXmlImportDemo::~BulletXmlImportDemo() { - m_fileLoader->deleteAllData(); - delete m_fileLoader; exitPhysics(); } @@ -163,16 +181,16 @@ void BulletXmlImportDemo::exitPhysics() m_collisionShapes.clear(); delete m_dynamicsWorld; - + delete m_solver; - + delete m_broadphase; - + delete m_dispatcher; delete m_collisionConfiguration; - + } diff --git a/ObsoleteDemos/BulletXmlImportDemo/BulletXmlImportDemo.h b/Demos/BulletXmlImportDemo/BulletXmlImportDemo.h similarity index 98% rename from ObsoleteDemos/BulletXmlImportDemo/BulletXmlImportDemo.h rename to Demos/BulletXmlImportDemo/BulletXmlImportDemo.h index 53c163ec4..234291f0b 100644 --- a/ObsoleteDemos/BulletXmlImportDemo/BulletXmlImportDemo.h +++ b/Demos/BulletXmlImportDemo/BulletXmlImportDemo.h @@ -49,8 +49,6 @@ class BulletXmlImportDemo : public PlatformDemoApplication btDefaultCollisionConfiguration* m_collisionConfiguration; - class btBulletWorldImporter* m_fileLoader; - public: BulletXmlImportDemo() diff --git a/ObsoleteDemos/BulletXmlImportDemo/CMakeLists.txt b/Demos/BulletXmlImportDemo/CMakeLists.txt similarity index 99% rename from ObsoleteDemos/BulletXmlImportDemo/CMakeLists.txt rename to Demos/BulletXmlImportDemo/CMakeLists.txt index 486b69027..175c52964 100644 --- a/ObsoleteDemos/BulletXmlImportDemo/CMakeLists.txt +++ b/Demos/BulletXmlImportDemo/CMakeLists.txt @@ -18,6 +18,7 @@ ${BULLET_PHYSICS_SOURCE_DIR}/src ${BULLET_PHYSICS_SOURCE_DIR}/Extras/Serialize/BulletFileLoader ${BULLET_PHYSICS_SOURCE_DIR}/Extras/Serialize/BulletWorldImporter ${BULLET_PHYSICS_SOURCE_DIR}/Extras/Serialize/BulletXmlWorldImporter +${GLUT_INCLUDE_DIR} ) ADD_DEFINITIONS(-DDESERIALIZE_SOFT_BODIES) diff --git a/ObsoleteDemos/BulletXmlImportDemo/Win32BulletXmlImportDemo.cpp b/Demos/BulletXmlImportDemo/Win32BulletXmlImportDemo.cpp similarity index 100% rename from ObsoleteDemos/BulletXmlImportDemo/Win32BulletXmlImportDemo.cpp rename to Demos/BulletXmlImportDemo/Win32BulletXmlImportDemo.cpp diff --git a/ObsoleteDemos/BulletXmlImportDemo/bullet_basic.xml b/Demos/BulletXmlImportDemo/bullet_basic.xml similarity index 100% rename from ObsoleteDemos/BulletXmlImportDemo/bullet_basic.xml rename to Demos/BulletXmlImportDemo/bullet_basic.xml diff --git a/ObsoleteDemos/BulletXmlImportDemo/bulletser.xml b/Demos/BulletXmlImportDemo/bulletser.xml similarity index 100% rename from ObsoleteDemos/BulletXmlImportDemo/bulletser.xml rename to Demos/BulletXmlImportDemo/bulletser.xml diff --git a/ObsoleteDemos/BulletXmlImportDemo/main.cpp b/Demos/BulletXmlImportDemo/main.cpp similarity index 100% rename from ObsoleteDemos/BulletXmlImportDemo/main.cpp rename to Demos/BulletXmlImportDemo/main.cpp diff --git a/ObsoleteDemos/CMakeLists.txt b/Demos/CMakeLists.txt similarity index 87% rename from ObsoleteDemos/CMakeLists.txt rename to Demos/CMakeLists.txt index 912c348a6..5c53f021e 100644 --- a/ObsoleteDemos/CMakeLists.txt +++ b/Demos/CMakeLists.txt @@ -5,12 +5,12 @@ SUBDIRS( HelloWorld ) IF (USE_GLUT) IF (GLUT_FOUND) IF(BUILD_CPU_DEMOS) -# IF(BUILD_EXTRAS) -# SUBDIRS( BulletXmlImportDemo ConcaveDemo ConstraintDemo ConvexDecompositionDemo SerializeDemo ) -# ENDIF() + IF(BUILD_EXTRAS) + SUBDIRS( BulletXmlImportDemo ConcaveDemo ConvexDecompositionDemo SerializeDemo ) + ENDIF() SET(SharedDemoSubdirs OpenGL - CcdPhysicsDemo SliderConstraintDemo GenericJointDemo Raytracer + CcdPhysicsDemo ConstraintDemo SliderConstraintDemo GenericJointDemo Raytracer RagdollDemo ForkLiftDemo BasicDemo FeatherstoneMultiBodyDemo RollingFrictionDemo RaytestDemo VoronoiFractureDemo GyroscopicDemo FractureDemo Box2dDemo BspDemo MovingConcaveDemo VehicleDemo UserCollisionAlgorithm CharacterDemo SoftDemo diff --git a/ObsoleteDemos/CcdPhysicsDemo/CMakeLists.txt b/Demos/CcdPhysicsDemo/CMakeLists.txt similarity index 93% rename from ObsoleteDemos/CcdPhysicsDemo/CMakeLists.txt rename to Demos/CcdPhysicsDemo/CMakeLists.txt index f7ee06103..7ce0d25ef 100644 --- a/ObsoleteDemos/CcdPhysicsDemo/CMakeLists.txt +++ b/Demos/CcdPhysicsDemo/CMakeLists.txt @@ -25,12 +25,17 @@ IF (WIN32) ADD_EXECUTABLE(AppCcdPhysicsDemo main.cpp CcdPhysicsDemo.cpp + CcdPhysicsSetup.h + CcdPhysicsSetup.cpp ${BULLET_PHYSICS_SOURCE_DIR}/build3/bullet.rc ) ELSE() ADD_EXECUTABLE(AppCcdPhysicsDemo main.cpp CcdPhysicsDemo.cpp + CcdPhysicsSetup.h + CcdPhysicsSetup.cpp + ) ENDIF() diff --git a/ObsoleteDemos/CcdPhysicsDemo/CcdPhysicsDemo.cpp b/Demos/CcdPhysicsDemo/CcdPhysicsDemo.cpp similarity index 54% rename from ObsoleteDemos/CcdPhysicsDemo/CcdPhysicsDemo.cpp rename to Demos/CcdPhysicsDemo/CcdPhysicsDemo.cpp index c0acf6551..afe53260e 100644 --- a/ObsoleteDemos/CcdPhysicsDemo/CcdPhysicsDemo.cpp +++ b/Demos/CcdPhysicsDemo/CcdPhysicsDemo.cpp @@ -167,26 +167,11 @@ void CcdPhysicsDemo::initPhysics() m_ShootBoxInitialSpeed = 4000.f; m_defaultContactProcessingThreshold = 0.f; - - ///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_dispatcher->registerCollisionCreateFunc(BOX_SHAPE_PROXYTYPE,BOX_SHAPE_PROXYTYPE,m_collisionConfiguration->getCollisionAlgorithmCreateFunc(CONVEX_SHAPE_PROXYTYPE,CONVEX_SHAPE_PROXYTYPE)); - - 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); + GraphicsPhysicsBridge bridge; + m_physicsSetup.initPhysics(bridge); + m_dynamicsWorld = m_physicsSetup.m_dynamicsWorld; m_dynamicsWorld->getSolverInfo().m_solverMode |=SOLVER_USE_2_FRICTION_DIRECTIONS|SOLVER_RANDMIZE_ORDER; - - - + m_dynamicsWorld ->setDebugDrawer(&sDebugDrawer); //m_dynamicsWorld->getSolverInfo().m_splitImpulse=false; @@ -203,108 +188,6 @@ void CcdPhysicsDemo::initPhysics() m_dynamicsWorld->setGravity(btVector3(0,-10,0)); - ///create a few basic rigid bodies - btBoxShape* box = new btBoxShape(btVector3(btScalar(110.),btScalar(1.),btScalar(110.))); -// box->initializePolyhedralFeatures(); - btCollisionShape* groundShape = box; - -// btCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0,1,0),50); - - m_collisionShapes.push_back(groundShape); - //m_collisionShapes.push_back(new btCylinderShape (btVector3(CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS))); - m_collisionShapes.push_back(new btBoxShape (btVector3(CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS))); - - btTransform groundTransform; - groundTransform.setIdentity(); - //groundTransform.setOrigin(btVector3(5,5,5)); - - //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); - body->setFriction(0.5); - //body->setRollingFriction(0.3); - //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(1,1,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); - - int gNumObjects = 120;//120; - int i; - for (i=0;i3) - { - col=11; - row2 |=1; - } - - btVector3 pos(col*2*CUBE_HALF_EXTENTS + (row2%2)*CUBE_HALF_EXTENTS, - row*2*CUBE_HALF_EXTENTS+CUBE_HALF_EXTENTS+EXTRA_HEIGHT,0); - - trans.setOrigin(pos); - - float mass = 1.f; - - btRigidBody* body = localCreateRigidBody(mass,trans,shape); - body->setAnisotropicFriction(shape->getAnisotropicRollingFrictionDirection(),btCollisionObject::CF_ANISOTROPIC_ROLLING_FRICTION); - body->setFriction(0.5); - - //body->setRollingFriction(.3); - ///when using m_ccdMode - if (m_ccdMode==USE_CCD) - { - body->setCcdMotionThreshold(CUBE_HALF_EXTENTS); - body->setCcdSweptSphereRadius(0.9*CUBE_HALF_EXTENTS); - } - } - } - } void CcdPhysicsDemo::clientResetScene() @@ -381,40 +264,8 @@ void CcdPhysicsDemo::shootBox(const btVector3& destination) void CcdPhysicsDemo::exitPhysics() { + m_physicsSetup.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; + CcdPhysicsSetup m_physicsSetup; enum { @@ -54,7 +49,6 @@ class CcdPhysicsDemo : public PlatformDemoApplication }; int m_ccdMode; - btDefaultCollisionConfiguration* m_collisionConfiguration; public: diff --git a/Demos/CcdPhysicsDemo/CcdPhysicsSetup.cpp b/Demos/CcdPhysicsDemo/CcdPhysicsSetup.cpp new file mode 100644 index 000000000..bbbe0088c --- /dev/null +++ b/Demos/CcdPhysicsDemo/CcdPhysicsSetup.cpp @@ -0,0 +1,179 @@ + +#include "CcdPhysicsSetup.h" +#include "btBulletDynamicsCommon.h" +#define CUBE_HALF_EXTENTS 1.f +#define EXTRA_HEIGHT 1.f + + +void KinematicObjectSetup::initPhysics(GraphicsPhysicsBridge& gfxBridge) +{ + createEmptyDynamicsWorld(); + { + btBoxShape* box = new btBoxShape(btVector3(btScalar(10.), btScalar(1.), btScalar(10.))); + gfxBridge.createCollisionShapeGraphicsObject(box); + btTransform startTrans; + startTrans.setIdentity(); + startTrans.setOrigin(btVector3(0, -1, 0)); + btRigidBody* body = createRigidBody(0, startTrans, box); + body->setMotionState(0); + body->setFriction(1); + body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT); + body->setActivationState(DISABLE_DEACTIVATION); + + gfxBridge.createRigidBodyGraphicsObject(body, btVector3(0,1,0)); + } + { + btBoxShape* box = new btBoxShape(btVector3(btScalar(1.), btScalar(1.), btScalar(1.))); + gfxBridge.createCollisionShapeGraphicsObject(box); + btTransform startTrans; + startTrans.setIdentity(); + startTrans.setOrigin(btVector3(0, 1, 0)); + btRigidBody* body = createRigidBody(1, startTrans, box); + body->setFriction(1); + body->setActivationState(DISABLE_DEACTIVATION); + gfxBridge.createRigidBodyGraphicsObject(body, btVector3(1, 1, 0)); + } +} + +void KinematicObjectSetup::stepSimulation(float deltaTime) +{ + if (m_dynamicsWorld) + { + btCollisionObject* colObj = m_dynamicsWorld->getCollisionObjectArray()[0]; + btRigidBody* body = btRigidBody::upcast(colObj); + if (body) + { + btMotionState* ms = body->getMotionState(); + + btTransform startTrans; + startTrans.setIdentity(); + static float time = 0.f; + time += 0.01f; + static float xPos = 0.f; + xPos = sinf(time)*10.f; + startTrans.setOrigin(btVector3(xPos, -1, 0)); + if (ms) + { + + ms->setWorldTransform(startTrans); + } + else + { + body->setWorldTransform(startTrans); + } + } + m_dynamicsWorld->stepSimulation(deltaTime); + } +} + +void CcdPhysicsSetup::initPhysics(GraphicsPhysicsBridge& gfxBridge) +{ + createEmptyDynamicsWorld(); + + + ///create a few basic rigid bodies + btBoxShape* box = new btBoxShape(btVector3(btScalar(110.), btScalar(1.), btScalar(110.))); + gfxBridge.createCollisionShapeGraphicsObject(box); + // box->initializePolyhedralFeatures(); + btCollisionShape* groundShape = box; + + + m_collisionShapes.push_back(groundShape); + //m_collisionShapes.push_back(new btCylinderShape (btVector3(CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS))); + m_collisionShapes.push_back(new btBoxShape(btVector3(CUBE_HALF_EXTENTS, CUBE_HALF_EXTENTS, CUBE_HALF_EXTENTS))); + + btTransform groundTransform; + groundTransform.setIdentity(); + //groundTransform.setOrigin(btVector3(5,5,5)); + + //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); + gfxBridge.createRigidBodyGraphicsObject(body, btVector3(0, 1, 0)); + body->setFriction(0.5); + //body->setRollingFriction(0.3); + //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(1, 1, 1)); + gfxBridge.createCollisionShapeGraphicsObject(colShape); + //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); + + int gNumObjects = 120;//120; + int i; + for (i = 0; i3) + { + col = 11; + row2 |= 1; + } + + btVector3 pos(col * 2 * CUBE_HALF_EXTENTS + (row2 % 2)*CUBE_HALF_EXTENTS, + row * 2 * CUBE_HALF_EXTENTS + CUBE_HALF_EXTENTS + EXTRA_HEIGHT, 0); + + trans.setOrigin(pos); + + float mass = 1.f; + + btRigidBody* body = createRigidBody(mass, trans, shape); + gfxBridge.createRigidBodyGraphicsObject(body, btVector3(1, 1, 0)); + + body->setAnisotropicFriction(shape->getAnisotropicRollingFrictionDirection(), btCollisionObject::CF_ANISOTROPIC_ROLLING_FRICTION); + body->setFriction(0.5); + + //body->setRollingFriction(.3); + ///when using m_ccdMode + //if (m_ccdMode == USE_CCD) + { + body->setCcdMotionThreshold(CUBE_HALF_EXTENTS); + body->setCcdSweptSphereRadius(0.9*CUBE_HALF_EXTENTS); + } + } + } + +} diff --git a/Demos/CcdPhysicsDemo/CcdPhysicsSetup.h b/Demos/CcdPhysicsDemo/CcdPhysicsSetup.h new file mode 100644 index 000000000..7355c3e3c --- /dev/null +++ b/Demos/CcdPhysicsDemo/CcdPhysicsSetup.h @@ -0,0 +1,23 @@ + +#ifndef CCD_PHYSICS_SETUP_H +#define CCD_PHYSICS_SETUP_H + + +#include "../CommonRigidBodySetup.h" + +struct CcdPhysicsSetup : public CommonRigidBodySetup +{ + virtual void initPhysics(GraphicsPhysicsBridge& gfxBridge); + +}; + +struct KinematicObjectSetup : public CommonRigidBodySetup +{ + virtual void initPhysics(GraphicsPhysicsBridge& gfxBridge); + + virtual void stepSimulation(float deltaTime); + +}; + + +#endif //CCD_PHYSICS_SETUP_H diff --git a/ObsoleteDemos/CcdPhysicsDemo/Makefile.am b/Demos/CcdPhysicsDemo/Makefile.am similarity index 100% rename from ObsoleteDemos/CcdPhysicsDemo/Makefile.am rename to Demos/CcdPhysicsDemo/Makefile.am diff --git a/ObsoleteDemos/CcdPhysicsDemo/main.cpp b/Demos/CcdPhysicsDemo/main.cpp similarity index 100% rename from ObsoleteDemos/CcdPhysicsDemo/main.cpp rename to Demos/CcdPhysicsDemo/main.cpp diff --git a/ObsoleteDemos/CellSpuDemo/BasicDemo2.cpp b/Demos/CellSpuDemo/BasicDemo2.cpp similarity index 100% rename from ObsoleteDemos/CellSpuDemo/BasicDemo2.cpp rename to Demos/CellSpuDemo/BasicDemo2.cpp diff --git a/ObsoleteDemos/CellSpuDemo/BasicDemo2.h b/Demos/CellSpuDemo/BasicDemo2.h similarity index 100% rename from ObsoleteDemos/CellSpuDemo/BasicDemo2.h rename to Demos/CellSpuDemo/BasicDemo2.h diff --git a/ObsoleteDemos/CharacterDemo/CMakeLists.txt b/Demos/CharacterDemo/CMakeLists.txt similarity index 95% rename from ObsoleteDemos/CharacterDemo/CMakeLists.txt rename to Demos/CharacterDemo/CMakeLists.txt index 1a74ed557..9b344f8ae 100644 --- a/ObsoleteDemos/CharacterDemo/CMakeLists.txt +++ b/Demos/CharacterDemo/CMakeLists.txt @@ -46,7 +46,7 @@ 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}/ObsoleteDemos/BspDemo/BspDemo.bsp ${CMAKE_CURRENT_BINARY_DIR} + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/Demos/BspDemo/BspDemo.bsp ${CMAKE_CURRENT_BINARY_DIR} ) ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) diff --git a/ObsoleteDemos/CharacterDemo/CharacterDemo.cpp b/Demos/CharacterDemo/CharacterDemo.cpp similarity index 94% rename from ObsoleteDemos/CharacterDemo/CharacterDemo.cpp rename to Demos/CharacterDemo/CharacterDemo.cpp index d944e1309..29a544a12 100644 --- a/ObsoleteDemos/CharacterDemo/CharacterDemo.cpp +++ b/Demos/CharacterDemo/CharacterDemo.cpp @@ -69,11 +69,11 @@ void CharacterDemo::initPhysics() m_constraintSolver = new btSequentialImpulseConstraintSolver(); m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_overlappingPairCache,m_constraintSolver,m_collisionConfiguration); m_dynamicsWorld->getDispatchInfo().m_allowedCcdPenetration=0.0001f; - + #ifdef DYNAMIC_CHARACTER_CONTROLLER m_character = new DynamicCharacterController (); #else - + btTransform startTransform; startTransform.setIdentity (); //startTransform.setOrigin (btVector3(0.0, 4.0, 0.0)); @@ -101,35 +101,30 @@ void CharacterDemo::initPhysics() btTransform tr; tr.setIdentity(); - const char* bspfilename = "BspDemo.bsp"; + const char* filename = "BspDemo.bsp"; + + const char* prefix[]={"./","../","../../","../../../","../../../../", "BspDemo/", "Demos/BspDemo/", + "../Demos/BspDemo/","../../Demos/BspDemo/"}; + int numPrefixes = sizeof(prefix)/sizeof(const char*); + char relativeFileName[1024]; + FILE* file=0; + + for (int i=0;igetOverlappingPairCache()->findPair(pair.m_pProxy0,pair.m_pProxy1); if (!collisionPair) continue; @@ -217,7 +212,7 @@ void CharacterDemo::clientMoveAndDisplay() /* Character stuff &*/ if (m_character) { - + } debugDrawContacts(); @@ -265,7 +260,7 @@ void CharacterDemo::clientMoveAndDisplay() walkDirection += forwardDir; if (gBackward) - walkDirection -= forwardDir; + walkDirection -= forwardDir; m_character->setWalkDirection(walkDirection*walkSpeed); @@ -344,7 +339,7 @@ void CharacterDemo::clientResetScene() m_character->reset (m_dynamicsWorld); ///WTF m_character->warp (btVector3(10.210001,-2.0306311,16.576973)); - + } void CharacterDemo::specialKeyboardUp(int key, int x, int y) @@ -444,7 +439,7 @@ void CharacterDemo::updateCamera() 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; @@ -452,10 +447,10 @@ void CharacterDemo::updateCamera() 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()) { diff --git a/ObsoleteDemos/CharacterDemo/CharacterDemo.h b/Demos/CharacterDemo/CharacterDemo.h similarity index 100% rename from ObsoleteDemos/CharacterDemo/CharacterDemo.h rename to Demos/CharacterDemo/CharacterDemo.h diff --git a/ObsoleteDemos/CharacterDemo/DynamicCharacterController.cpp b/Demos/CharacterDemo/DynamicCharacterController.cpp similarity index 100% rename from ObsoleteDemos/CharacterDemo/DynamicCharacterController.cpp rename to Demos/CharacterDemo/DynamicCharacterController.cpp diff --git a/ObsoleteDemos/CharacterDemo/DynamicCharacterController.h b/Demos/CharacterDemo/DynamicCharacterController.h similarity index 100% rename from ObsoleteDemos/CharacterDemo/DynamicCharacterController.h rename to Demos/CharacterDemo/DynamicCharacterController.h diff --git a/ObsoleteDemos/CharacterDemo/main.cpp b/Demos/CharacterDemo/main.cpp similarity index 100% rename from ObsoleteDemos/CharacterDemo/main.cpp rename to Demos/CharacterDemo/main.cpp diff --git a/ObsoleteDemos/CollisionDemo/CMakeLists.txt b/Demos/CollisionDemo/CMakeLists.txt similarity index 100% rename from ObsoleteDemos/CollisionDemo/CMakeLists.txt rename to Demos/CollisionDemo/CMakeLists.txt diff --git a/ObsoleteDemos/CollisionDemo/CollisionDemo.cpp b/Demos/CollisionDemo/CollisionDemo.cpp similarity index 100% rename from ObsoleteDemos/CollisionDemo/CollisionDemo.cpp rename to Demos/CollisionDemo/CollisionDemo.cpp diff --git a/ObsoleteDemos/CollisionDemo/CollisionDemo.h b/Demos/CollisionDemo/CollisionDemo.h similarity index 100% rename from ObsoleteDemos/CollisionDemo/CollisionDemo.h rename to Demos/CollisionDemo/CollisionDemo.h diff --git a/ObsoleteDemos/CollisionInterfaceDemo/CMakeLists.txt b/Demos/CollisionInterfaceDemo/CMakeLists.txt similarity index 100% rename from ObsoleteDemos/CollisionInterfaceDemo/CMakeLists.txt rename to Demos/CollisionInterfaceDemo/CMakeLists.txt diff --git a/ObsoleteDemos/CollisionInterfaceDemo/CollisionInterfaceDemo.cpp b/Demos/CollisionInterfaceDemo/CollisionInterfaceDemo.cpp similarity index 100% rename from ObsoleteDemos/CollisionInterfaceDemo/CollisionInterfaceDemo.cpp rename to Demos/CollisionInterfaceDemo/CollisionInterfaceDemo.cpp diff --git a/ObsoleteDemos/CollisionInterfaceDemo/CollisionInterfaceDemo.h b/Demos/CollisionInterfaceDemo/CollisionInterfaceDemo.h similarity index 100% rename from ObsoleteDemos/CollisionInterfaceDemo/CollisionInterfaceDemo.h rename to Demos/CollisionInterfaceDemo/CollisionInterfaceDemo.h diff --git a/ObsoleteDemos/CollisionInterfaceDemo/Win32CollisionInterfaceDemo.cpp b/Demos/CollisionInterfaceDemo/Win32CollisionInterfaceDemo.cpp similarity index 100% rename from ObsoleteDemos/CollisionInterfaceDemo/Win32CollisionInterfaceDemo.cpp rename to Demos/CollisionInterfaceDemo/Win32CollisionInterfaceDemo.cpp diff --git a/ObsoleteDemos/CollisionInterfaceDemo/main.cpp b/Demos/CollisionInterfaceDemo/main.cpp similarity index 100% rename from ObsoleteDemos/CollisionInterfaceDemo/main.cpp rename to Demos/CollisionInterfaceDemo/main.cpp diff --git a/Demos/CommonParameterInterface.h b/Demos/CommonParameterInterface.h new file mode 100644 index 000000000..afb78114b --- /dev/null +++ b/Demos/CommonParameterInterface.h @@ -0,0 +1,41 @@ + +#ifndef PARAM_INTERFACE_H +#define PARAM_INTERFACE_H + +#pragma once + +typedef void (*SliderParamChangedCallback) (float newVal); +#include "LinearMath/btScalar.h" + +struct SliderParams +{ + const char* m_name; + float m_minVal; + float m_maxVal; + SliderParamChangedCallback m_callback; + btScalar* m_paramValuePointer; + void* m_userPointer; + bool m_clampToNotches; + + SliderParams(const char* name, btScalar* targetValuePointer) + :m_name(name), + m_minVal(-100), + m_maxVal(100), + m_callback(0), + m_paramValuePointer(targetValuePointer), + m_userPointer(0), + m_clampToNotches(false) + { + } + +}; + + +struct CommonParameterInterface +{ + virtual void registerSliderFloatParameter(SliderParams& params)=0; + virtual void syncParameters()=0; + virtual void removeAllParameters()=0; +}; + +#endif //PARAM_INTERFACE_H diff --git a/Demos/CommonPhysicsSetup.h b/Demos/CommonPhysicsSetup.h new file mode 100644 index 000000000..2f18d1382 --- /dev/null +++ b/Demos/CommonPhysicsSetup.h @@ -0,0 +1,67 @@ + +#ifndef COMMON_PHYSICS_SETUP_H +#define COMMON_PHYSICS_SETUP_H + +class btRigidBody; +class btBoxShape; +class btTransform; +class btCollisionShape; +#include "LinearMath/btVector3.h" +#include "CommonParameterInterface.h" + +class btDiscreteDynamicsWorld; + +///The GraphicsPhysicsBridge let's the graphics engine create graphics representation and synchronize +struct GraphicsPhysicsBridge +{ + + virtual void createRigidBodyGraphicsObject(btRigidBody* body,const btVector3& color) + { + } + virtual void createCollisionShapeGraphicsObject(btCollisionShape* collisionShape) + { + } + virtual void syncPhysicsToGraphics(const btDiscreteDynamicsWorld* rbWorld) + { + } + virtual void createPhysicsDebugDrawer( btDiscreteDynamicsWorld* rbWorld) + { + } + + virtual CommonParameterInterface* getParameterInterface() + { + return 0; + } + +}; + +struct CommonPhysicsSetup +{ +public: + + virtual ~CommonPhysicsSetup() {} + + virtual void initPhysics(GraphicsPhysicsBridge& gfxBridge) = 0; + + virtual void exitPhysics()=0; + + virtual void stepSimulation(float deltaTime)=0; + + virtual void debugDraw()=0; + + virtual bool pickBody(const btVector3& rayFromWorld, const btVector3& rayToWorld) = 0; + virtual bool movePickedBody(const btVector3& rayFromWorld, const btVector3& rayToWorld)=0; + virtual void removePickingConstraint() = 0; + + virtual void syncPhysicsToGraphics(GraphicsPhysicsBridge& gfxBridge) = 0; + + virtual btRigidBody* createRigidBody(float mass, const btTransform& startTransform,btCollisionShape* shape, const btVector4& color=btVector4(1,0,0,1))=0; + + virtual btBoxShape* createBoxShape(const btVector3& halfExtents)=0; +}; + + + +#endif //COMMON_PHYSICS_SETUP_H + + diff --git a/Demos/CommonRigidBodySetup.h b/Demos/CommonRigidBodySetup.h new file mode 100644 index 000000000..41507db05 --- /dev/null +++ b/Demos/CommonRigidBodySetup.h @@ -0,0 +1,247 @@ + +#ifndef COMMON_RIGID_BODY_SETUP_H +#define COMMON_RIGID_BODY_SETUP_H + +//todo: replace this 'btBulletDynamicsCommon.h' header with specific used header files +#include "btBulletDynamicsCommon.h" +#include "CommonPhysicsSetup.h" + +struct CommonRigidBodySetup : public CommonPhysicsSetup +{ + //keep the collision shapes, for deletion/cleanup + btAlignedObjectArray m_collisionShapes; + btBroadphaseInterface* m_broadphase; + btCollisionDispatcher* m_dispatcher; + btConstraintSolver* m_solver; + btDefaultCollisionConfiguration* m_collisionConfiguration; + btDiscreteDynamicsWorld* m_dynamicsWorld; + + //data for picking objects + class btRigidBody* m_pickedBody; + class btTypedConstraint* m_pickedConstraint; + btVector3 m_oldPickingPos; + btVector3 m_hitPos; + btScalar m_oldPickingDist; + + CommonRigidBodySetup() + :m_broadphase(0), + m_dispatcher(0), + m_solver(0), + m_collisionConfiguration(0), + m_dynamicsWorld(0), + m_pickedBody(0), + m_pickedConstraint(0) + { + } + + virtual void createEmptyDynamicsWorld() + { + ///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)); + } + + + virtual void stepSimulation(float deltaTime) + { + if (m_dynamicsWorld) + { + m_dynamicsWorld->stepSimulation(deltaTime); + } + } + + + virtual void exitPhysics() + { + removePickingConstraint(); + //cleanup in the reverse order of creation/initialization + + //remove the rigidbodies from the dynamics world and delete them + + if (m_dynamicsWorld) + { + + int i; + for (i = m_dynamicsWorld->getNumConstraints() - 1; i >= 0; i--) + { + m_dynamicsWorld->removeConstraint(m_dynamicsWorld->getConstraint(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; jdebugDrawWorld(); + } + + } + + virtual bool pickBody(const btVector3& rayFromWorld, const btVector3& rayToWorld) + { + if (m_dynamicsWorld==0) + return false; + + btCollisionWorld::ClosestRayResultCallback rayCallback(rayFromWorld, rayToWorld); + + m_dynamicsWorld->rayTest(rayFromWorld, rayToWorld, rayCallback); + if (rayCallback.hasHit()) + { + + btVector3 pickPos = rayCallback.m_hitPointWorld; + btRigidBody* body = (btRigidBody*)btRigidBody::upcast(rayCallback.m_collisionObject); + if (body) + { + //other exclusions? + if (!(body->isStaticObject() || body->isKinematicObject())) + { + m_pickedBody = body; + m_pickedBody->setActivationState(DISABLE_DEACTIVATION); + //printf("pickPos=%f,%f,%f\n",pickPos.getX(),pickPos.getY(),pickPos.getZ()); + btVector3 localPivot = body->getCenterOfMassTransform().inverse() * pickPos; + btPoint2PointConstraint* p2p = new btPoint2PointConstraint(*body, localPivot); + m_dynamicsWorld->addConstraint(p2p, true); + m_pickedConstraint = p2p; + btScalar mousePickClamping = 30.f; + p2p->m_setting.m_impulseClamp = mousePickClamping; + //very weak constraint for picking + p2p->m_setting.m_tau = 0.001f; + } + } + + + // pickObject(pickPos, rayCallback.m_collisionObject); + m_oldPickingPos = rayToWorld; + m_hitPos = pickPos; + m_oldPickingDist = (pickPos - rayFromWorld).length(); + // printf("hit !\n"); + //add p2p + } + return false; + } + virtual bool movePickedBody(const btVector3& rayFromWorld, const btVector3& rayToWorld) + { + if (m_pickedBody && m_pickedConstraint) + { + btPoint2PointConstraint* pickCon = static_cast(m_pickedConstraint); + if (pickCon) + { + //keep it at the same picking distance + + btVector3 newPivotB; + + btVector3 dir = rayToWorld - rayFromWorld; + dir.normalize(); + dir *= m_oldPickingDist; + + newPivotB = rayFromWorld + dir; + pickCon->setPivotB(newPivotB); + return true; + } + } + return false; + } + virtual void removePickingConstraint() + { + if (m_pickedConstraint) + { + m_dynamicsWorld->removeConstraint(m_pickedConstraint); + delete m_pickedConstraint; + m_pickedConstraint = 0; + m_pickedBody = 0; + } + } + + + + btBoxShape* createBoxShape(const btVector3& halfExtents) + { + btBoxShape* box = new btBoxShape(halfExtents); + return box; + } + + btRigidBody* createRigidBody(float mass, const btTransform& startTransform, btCollisionShape* shape, const btVector4& color = btVector4(1, 0, 0, 1)) + { + btAssert((!shape || shape->getShapeType() != 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// + + body->setUserIndex(-1); + m_dynamicsWorld->addRigidBody(body); + return body; + } +}; + +#endif //COMMON_RIGID_BODY_SETUP_H + diff --git a/ObsoleteDemos/ConcaveConvexcastDemo/CMakeLists.txt b/Demos/ConcaveConvexcastDemo/CMakeLists.txt similarity index 100% rename from ObsoleteDemos/ConcaveConvexcastDemo/CMakeLists.txt rename to Demos/ConcaveConvexcastDemo/CMakeLists.txt diff --git a/ObsoleteDemos/ConcaveConvexcastDemo/ConcaveConvexcastDemo.cpp b/Demos/ConcaveConvexcastDemo/ConcaveConvexcastDemo.cpp similarity index 100% rename from ObsoleteDemos/ConcaveConvexcastDemo/ConcaveConvexcastDemo.cpp rename to Demos/ConcaveConvexcastDemo/ConcaveConvexcastDemo.cpp diff --git a/ObsoleteDemos/ConcaveConvexcastDemo/ConcaveConvexcastDemo.h b/Demos/ConcaveConvexcastDemo/ConcaveConvexcastDemo.h similarity index 100% rename from ObsoleteDemos/ConcaveConvexcastDemo/ConcaveConvexcastDemo.h rename to Demos/ConcaveConvexcastDemo/ConcaveConvexcastDemo.h diff --git a/ObsoleteDemos/ConcaveConvexcastDemo/main.cpp b/Demos/ConcaveConvexcastDemo/main.cpp similarity index 100% rename from ObsoleteDemos/ConcaveConvexcastDemo/main.cpp rename to Demos/ConcaveConvexcastDemo/main.cpp diff --git a/ObsoleteDemos/ConcaveDemo/CMakeLists.txt b/Demos/ConcaveDemo/CMakeLists.txt similarity index 98% rename from ObsoleteDemos/ConcaveDemo/CMakeLists.txt rename to Demos/ConcaveDemo/CMakeLists.txt index f180492fa..e065ccf57 100644 --- a/ObsoleteDemos/ConcaveDemo/CMakeLists.txt +++ b/Demos/ConcaveDemo/CMakeLists.txt @@ -16,6 +16,8 @@ IF (USE_GLUT) ../OpenGL ${BULLET_PHYSICS_SOURCE_DIR}/Extras/Serialize/BulletFileLoader ${BULLET_PHYSICS_SOURCE_DIR}/Extras/Serialize/BulletWorldImporter + ${GLUT_INCLUDE_DIR} + ) LINK_LIBRARIES( diff --git a/ObsoleteDemos/ConcaveDemo/ConcaveDemo.h b/Demos/ConcaveDemo/ConcaveDemo.h similarity index 100% rename from ObsoleteDemos/ConcaveDemo/ConcaveDemo.h rename to Demos/ConcaveDemo/ConcaveDemo.h diff --git a/ObsoleteDemos/ConcaveDemo/ConcavePhysicsDemo.cpp b/Demos/ConcaveDemo/ConcavePhysicsDemo.cpp similarity index 100% rename from ObsoleteDemos/ConcaveDemo/ConcavePhysicsDemo.cpp rename to Demos/ConcaveDemo/ConcavePhysicsDemo.cpp diff --git a/ObsoleteDemos/ConcaveDemo/Jamfile b/Demos/ConcaveDemo/Jamfile similarity index 100% rename from ObsoleteDemos/ConcaveDemo/Jamfile rename to Demos/ConcaveDemo/Jamfile diff --git a/ObsoleteDemos/ConcaveDemo/Win32ConcaveDemo.cpp b/Demos/ConcaveDemo/Win32ConcaveDemo.cpp similarity index 100% rename from ObsoleteDemos/ConcaveDemo/Win32ConcaveDemo.cpp rename to Demos/ConcaveDemo/Win32ConcaveDemo.cpp diff --git a/ObsoleteDemos/ConcaveDemo/main.cpp b/Demos/ConcaveDemo/main.cpp similarity index 100% rename from ObsoleteDemos/ConcaveDemo/main.cpp rename to Demos/ConcaveDemo/main.cpp diff --git a/ObsoleteDemos/ConcaveRaycastDemo/CMakeLists.txt b/Demos/ConcaveRaycastDemo/CMakeLists.txt similarity index 100% rename from ObsoleteDemos/ConcaveRaycastDemo/CMakeLists.txt rename to Demos/ConcaveRaycastDemo/CMakeLists.txt diff --git a/ObsoleteDemos/ConcaveRaycastDemo/ConcaveRaycastDemo.cpp b/Demos/ConcaveRaycastDemo/ConcaveRaycastDemo.cpp similarity index 100% rename from ObsoleteDemos/ConcaveRaycastDemo/ConcaveRaycastDemo.cpp rename to Demos/ConcaveRaycastDemo/ConcaveRaycastDemo.cpp diff --git a/ObsoleteDemos/ConcaveRaycastDemo/ConcaveRaycastDemo.h b/Demos/ConcaveRaycastDemo/ConcaveRaycastDemo.h similarity index 100% rename from ObsoleteDemos/ConcaveRaycastDemo/ConcaveRaycastDemo.h rename to Demos/ConcaveRaycastDemo/ConcaveRaycastDemo.h diff --git a/ObsoleteDemos/ConcaveRaycastDemo/main.cpp b/Demos/ConcaveRaycastDemo/main.cpp similarity index 100% rename from ObsoleteDemos/ConcaveRaycastDemo/main.cpp rename to Demos/ConcaveRaycastDemo/main.cpp diff --git a/ObsoleteDemos/ConstraintDemo/CMakeLists.txt b/Demos/ConstraintDemo/CMakeLists.txt similarity index 73% rename from ObsoleteDemos/ConstraintDemo/CMakeLists.txt rename to Demos/ConstraintDemo/CMakeLists.txt index 70945677b..d43a3bfa4 100644 --- a/ObsoleteDemos/ConstraintDemo/CMakeLists.txt +++ b/Demos/ConstraintDemo/CMakeLists.txt @@ -14,14 +14,14 @@ INCLUDE_DIRECTORIES( ${BULLET_PHYSICS_SOURCE_DIR}/src ../OpenGL -${BULLET_PHYSICS_SOURCE_DIR}/Extras/Serialize/BulletFileLoader -${BULLET_PHYSICS_SOURCE_DIR}/Extras/Serialize/BulletWorldImporter +${GLUT_INCLUDE_DIR} ) IF (USE_GLUT) LINK_LIBRARIES( - OpenGLSupport BulletWorldImporter BulletDynamics BulletCollision LinearMath BulletFileLoader ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} + OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} + ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} ) ADD_EXECUTABLE(AppConstraintDemo @@ -31,7 +31,7 @@ IF (USE_GLUT) ) ELSE (USE_GLUT) LINK_LIBRARIES( - OpenGLSupport BulletWorldImporter BulletDynamics BulletCollision LinearMath BulletFileLoader ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} + OpenGLSupport BulletDynamics BulletCollision LinearMath ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} ) ADD_EXECUTABLE(AppConstraintDemo diff --git a/ObsoleteDemos/ConstraintDemo/ConstraintDemo.cpp b/Demos/ConstraintDemo/ConstraintDemo.cpp similarity index 100% rename from ObsoleteDemos/ConstraintDemo/ConstraintDemo.cpp rename to Demos/ConstraintDemo/ConstraintDemo.cpp diff --git a/ObsoleteDemos/ConstraintDemo/ConstraintDemo.h b/Demos/ConstraintDemo/ConstraintDemo.h similarity index 100% rename from ObsoleteDemos/ConstraintDemo/ConstraintDemo.h rename to Demos/ConstraintDemo/ConstraintDemo.h diff --git a/Demos/ConstraintDemo/ConstraintPhysicsSetup.cpp b/Demos/ConstraintDemo/ConstraintPhysicsSetup.cpp new file mode 100644 index 000000000..4b2de0f43 --- /dev/null +++ b/Demos/ConstraintDemo/ConstraintPhysicsSetup.cpp @@ -0,0 +1,70 @@ +#include "ConstraintPhysicsSetup.h" + +ConstraintPhysicsSetup::ConstraintPhysicsSetup() +{ +} +ConstraintPhysicsSetup::~ConstraintPhysicsSetup() +{ +} + +btScalar val; +btHingeAccumulatedAngleConstraint* spDoorHinge=0; +void ConstraintPhysicsSetup::stepSimulation(float deltaTime) +{ + val=spDoorHinge->getAccumulatedHingeAngle()*SIMD_DEGS_PER_RAD;// spDoorHinge->getHingeAngle()*SIMD_DEGS_PER_RAD; + if (m_dynamicsWorld) + { + m_dynamicsWorld->stepSimulation(deltaTime); + } +} + + + +void ConstraintPhysicsSetup::initPhysics(GraphicsPhysicsBridge& gfxBridge) +{ + createEmptyDynamicsWorld(); + + gfxBridge.createPhysicsDebugDrawer(m_dynamicsWorld); +int mode = btIDebugDraw::DBG_DrawWireframe + +btIDebugDraw::DBG_DrawConstraints + +btIDebugDraw::DBG_DrawConstraintLimits; + m_dynamicsWorld->getDebugDrawer()->setDebugMode(mode); + +val=1.f; + SliderParams slider("hinge angle",&val); +slider.m_minVal=-720; +slider.m_maxVal=720; + gfxBridge.getParameterInterface()->registerSliderFloatParameter(slider); + + + { // create a door using hinge constraint attached to the world + btCollisionShape* pDoorShape = new btBoxShape(btVector3(2.0f, 5.0f, 0.2f)); + m_collisionShapes.push_back(pDoorShape); + btTransform doorTrans; + doorTrans.setIdentity(); + doorTrans.setOrigin(btVector3(-5.0f, -2.0f, 0.0f)); + btRigidBody* pDoorBody = createRigidBody( 1.0, doorTrans, pDoorShape); + pDoorBody->setActivationState(DISABLE_DEACTIVATION); + const btVector3 btPivotA(10.f + 2.1f, -2.0f, 0.0f ); // right next to the door slightly outside + btVector3 btAxisA( 0.0f, 1.0f, 0.0f ); // pointing upwards, aka Y-axis + + spDoorHinge = new btHingeAccumulatedAngleConstraint( *pDoorBody, btPivotA, btAxisA ); + +// spDoorHinge->setLimit( 0.0f, SIMD_PI_2 ); + // test problem values +// spDoorHinge->setLimit( -SIMD_PI, SIMD_PI*0.8f); + +// spDoorHinge->setLimit( 1.f, -1.f); +// spDoorHinge->setLimit( -SIMD_PI*0.8f, SIMD_PI); +// spDoorHinge->setLimit( -SIMD_PI*0.8f, SIMD_PI, 0.9f, 0.3f, 0.0f); +// spDoorHinge->setLimit( -SIMD_PI*0.8f, SIMD_PI, 0.9f, 0.01f, 0.0f); // "sticky limits" + // spDoorHinge->setLimit( -SIMD_PI * 0.25f, SIMD_PI * 0.25f ); +// spDoorHinge->setLimit( 0.0f, 0.0f ); + m_dynamicsWorld->addConstraint(spDoorHinge); + spDoorHinge->setDbgDrawSize(btScalar(5.f)); + + //doorTrans.setOrigin(btVector3(-5.0f, 2.0f, 0.0f)); + //btRigidBody* pDropBody = localCreateRigidBody( 10.0, doorTrans, shape); + } + +} \ No newline at end of file diff --git a/Demos/ConstraintDemo/ConstraintPhysicsSetup.h b/Demos/ConstraintDemo/ConstraintPhysicsSetup.h new file mode 100644 index 000000000..e85853cb8 --- /dev/null +++ b/Demos/ConstraintDemo/ConstraintPhysicsSetup.h @@ -0,0 +1,16 @@ +#ifndef CONSTAINT_PHYSICS_SETUP_H +#define CONSTAINT_PHYSICS_SETUP_H + +#include "../CommonRigidBodySetup.h" + +struct ConstraintPhysicsSetup : public CommonRigidBodySetup +{ + ConstraintPhysicsSetup(); + virtual ~ConstraintPhysicsSetup(); + virtual void initPhysics(GraphicsPhysicsBridge& gfxBridge); + + virtual void stepSimulation(float deltaTime); + +}; + +#endif //CONSTAINT_PHYSICS_SETUP_H diff --git a/ObsoleteDemos/ConstraintDemo/Win32ConstraintDemo.cpp b/Demos/ConstraintDemo/Win32ConstraintDemo.cpp similarity index 100% rename from ObsoleteDemos/ConstraintDemo/Win32ConstraintDemo.cpp rename to Demos/ConstraintDemo/Win32ConstraintDemo.cpp diff --git a/ObsoleteDemos/ConstraintDemo/main.cpp b/Demos/ConstraintDemo/main.cpp similarity index 100% rename from ObsoleteDemos/ConstraintDemo/main.cpp rename to Demos/ConstraintDemo/main.cpp diff --git a/ObsoleteDemos/ContinuousConvexCollision/CMakeLists.txt b/Demos/ContinuousConvexCollision/CMakeLists.txt similarity index 100% rename from ObsoleteDemos/ContinuousConvexCollision/CMakeLists.txt rename to Demos/ContinuousConvexCollision/CMakeLists.txt diff --git a/ObsoleteDemos/ContinuousConvexCollision/ContinuousConvexCollision.h b/Demos/ContinuousConvexCollision/ContinuousConvexCollision.h similarity index 100% rename from ObsoleteDemos/ContinuousConvexCollision/ContinuousConvexCollision.h rename to Demos/ContinuousConvexCollision/ContinuousConvexCollision.h diff --git a/ObsoleteDemos/ContinuousConvexCollision/ContinuousConvexCollisionDemo.cpp b/Demos/ContinuousConvexCollision/ContinuousConvexCollisionDemo.cpp similarity index 100% rename from ObsoleteDemos/ContinuousConvexCollision/ContinuousConvexCollisionDemo.cpp rename to Demos/ContinuousConvexCollision/ContinuousConvexCollisionDemo.cpp diff --git a/ObsoleteDemos/ConvexDecompositionDemo/CMakeLists.txt b/Demos/ConvexDecompositionDemo/CMakeLists.txt similarity index 95% rename from ObsoleteDemos/ConvexDecompositionDemo/CMakeLists.txt rename to Demos/ConvexDecompositionDemo/CMakeLists.txt index d3cd02e13..08045bd4f 100644 --- a/ObsoleteDemos/ConvexDecompositionDemo/CMakeLists.txt +++ b/Demos/ConvexDecompositionDemo/CMakeLists.txt @@ -1,3 +1,4 @@ + # This is basically the overall name of the project in Visual Studio this is the name of the Solution File @@ -18,6 +19,8 @@ ${BULLET_PHYSICS_SOURCE_DIR}/Extras/HACD ${BULLET_PHYSICS_SOURCE_DIR}/Extras/ConvexDecomposition ${BULLET_PHYSICS_SOURCE_DIR}/Extras/Serialize/BulletFileLoader ${BULLET_PHYSICS_SOURCE_DIR}/Extras/Serialize/BulletWorldImporter +${GLUT_INCLUDE_DIR} + ) IF (USE_GLUT) @@ -53,7 +56,7 @@ IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) 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} + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/Demos/ConvexDecompositionDemo/file.obj ${CMAKE_CURRENT_BINARY_DIR} ) ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) diff --git a/ObsoleteDemos/ConvexDecompositionDemo/ConvexDecompositionDemo.cpp b/Demos/ConvexDecompositionDemo/ConvexDecompositionDemo.cpp similarity index 95% rename from ObsoleteDemos/ConvexDecompositionDemo/ConvexDecompositionDemo.cpp rename to Demos/ConvexDecompositionDemo/ConvexDecompositionDemo.cpp index c2b9bcf87..3b081eaf9 100644 --- a/ObsoleteDemos/ConvexDecompositionDemo/ConvexDecompositionDemo.cpp +++ b/Demos/ConvexDecompositionDemo/ConvexDecompositionDemo.cpp @@ -4,8 +4,8 @@ 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, +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. @@ -178,23 +178,22 @@ void ConvexDecompositionDemo::initPhysics(const char* filename) ConvexDecomposition::WavefrontObj wo; - tcount = wo.loadObj(filename); + tcount = 0; + const char* prefix[]={"./","../","../../","../../../","../../../../", "ConvexDecompositionDemo/", "Demos/ConvexDecompositionDemo/", + "../Demos/ConvexDecompositionDemo/","../../Demos/ConvexDecompositionDemo/"}; + int numPrefixes = sizeof(prefix)/sizeof(const char*); + char relativeFileName[1024]; + + for (int i=0;i m_convexShapes; @@ -220,7 +219,7 @@ void ConvexDecompositionDemo::initPhysics(const char* filename) { } - + virtual void ConvexDecompResult(ConvexDecomposition::ConvexResult &result) { @@ -256,7 +255,7 @@ void ConvexDecompositionDemo::initPhysics(const char* filename) btVector3 vertex(result.mHullVertices[i*3],result.mHullVertices[i*3+1],result.mHullVertices[i*3+2]); vertex *= localScaling; centroid += vertex; - + } } @@ -273,8 +272,8 @@ void ConvexDecompositionDemo::initPhysics(const char* filename) vertices.push_back(vertex); } } - - + + if ( 1 ) { @@ -292,7 +291,7 @@ void ConvexDecompositionDemo::initPhysics(const char* filename) vertex0 *= localScaling; vertex1 *= localScaling; vertex2 *= localScaling; - + vertex0 -= centroid; vertex1 -= centroid; vertex2 -= centroid; @@ -303,20 +302,20 @@ void ConvexDecompositionDemo::initPhysics(const char* filename) index0+=mBaseCount; index1+=mBaseCount; index2+=mBaseCount; - + fprintf(mOutputFile,"f %d %d %d\r\n", index0+1, index1+1, index2+1 ); } } // float mass = 1.f; - + //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 float collisionMargin = 0.01f; - + btAlignedObjectArray planeEquations; btGeometryUtil::getPlaneEquationsFromVertices(vertices,planeEquations); @@ -330,13 +329,13 @@ void ConvexDecompositionDemo::initPhysics(const char* filename) btAlignedObjectArray 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 +#endif if (sEnableSAT) convexShape->initializePolyhedralFeatures(); convexShape->setMargin(0.01f); @@ -361,7 +360,7 @@ void ConvexDecompositionDemo::initPhysics(const char* filename) 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 @@ -394,18 +393,18 @@ void ConvexDecompositionDemo::initPhysics(const char* filename) 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(); bool updateLocalAabb = false; for (i=0;inumVertices();i++) { - convexShape->addPoint(hull->getVertexPointer()[i],updateLocalAabb); + convexShape->addPoint(hull->getVertexPointer()[i],updateLocalAabb); } convexShape->recalcLocalAabb(); @@ -419,13 +418,13 @@ void ConvexDecompositionDemo::initPhysics(const char* filename) 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); @@ -434,7 +433,7 @@ void ConvexDecompositionDemo::initPhysics(const char* filename) m_collisionShapes.push_back (concaveShape); } - + if (tcount) { @@ -445,11 +444,11 @@ void ConvexDecompositionDemo::initPhysics(const char* filename) char outputFileName[512]; strcpy(outputFileName,filename); char *dot = strstr(outputFileName,"."); - if ( dot ) + if ( dot ) *dot = 0; strcat(outputFileName,"_convex.obj"); FILE* outputFile = fopen(outputFileName,"wb"); - + unsigned int depth = 5; float cpercent = 5; float ppercent = 15; @@ -479,7 +478,7 @@ void ConvexDecompositionDemo::initPhysics(const char* filename) std::vector< HACD::Vec3 > points; std::vector< HACD::Vec3 > triangles; - for(int i=0; i vertex(wo.mVertices[index], wo.mVertices[index+1],wo.mVertices[index+2]); @@ -509,17 +508,17 @@ void ConvexDecompositionDemo::initPhysics(const char* filename) bool invert = false; bool addExtraDistPoints = false; bool addNeighboursDistPoints = false; - bool addFacesPoints = false; + bool addFacesPoints = false; myHACD.SetNClusters(nClusters); // minimum number of clusters myHACD.SetNVerticesPerCH(100); // max of 100 vertices per convex-hull myHACD.SetConcavity(concavity); // maximum concavity - myHACD.SetAddExtraDistPoints(addExtraDistPoints); - myHACD.SetAddNeighboursDistPoints(addNeighboursDistPoints); - myHACD.SetAddFacesPoints(addFacesPoints); + myHACD.SetAddExtraDistPoints(addExtraDistPoints); + myHACD.SetAddNeighboursDistPoints(addNeighboursDistPoints); + myHACD.SetAddFacesPoints(addFacesPoints); myHACD.Compute(); - nClusters = myHACD.GetNClusters(); + nClusters = myHACD.GetNClusters(); myHACD.Save("output.wrl", false); @@ -529,7 +528,7 @@ void ConvexDecompositionDemo::initPhysics(const char* filename) // ConvexBuilder cb(desc.mCallback); // cb.process(desc); //now create some bodies - + if (1) { btCompoundShape* compound = new btCompoundShape(); @@ -546,7 +545,7 @@ void ConvexDecompositionDemo::initPhysics(const char* filename) float* vertices = new float[nPoints*3]; unsigned int* triangles = new unsigned int[nTriangles*3]; - + HACD::Vec3 * pointsCH = new HACD::Vec3[nPoints]; HACD::Vec3 * trianglesCH = new HACD::Vec3[nTriangles]; myHACD.GetCH(c, pointsCH, trianglesCH); @@ -585,7 +584,7 @@ void ConvexDecompositionDemo::initPhysics(const char* filename) } /* for (int i=0;iserialize(serializer); - + FILE* f2 = fopen("testFile.bullet","wb"); fwrite(serializer->getBufferPointer(),serializer->getCurrentBufferSize(),1,f2); fclose(f2); @@ -651,17 +650,17 @@ void ConvexDecompositionDemo::initPhysics(const char* filename) //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); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); float dt = getDeltaTimeMicroseconds() * 0.000001f; @@ -681,7 +680,7 @@ void ConvexDecompositionDemo::clientMoveAndDisplay() void ConvexDecompositionDemo::displayCallback(void) { - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); if (m_dynamicsWorld) @@ -749,7 +748,7 @@ void ConvexDecompositionDemo::exitPhysics() delete m_collisionConfiguration; - + } @@ -768,7 +767,7 @@ void ConvexDecompositionDemo::keyboardCallback(unsigned char key, int x, int y) { printf("SAT enabled after the next restart of the demo\n"); } else - { + { printf("SAT disabled after the next restart of the demo\n"); } } else @@ -776,4 +775,4 @@ void ConvexDecompositionDemo::keyboardCallback(unsigned char key, int x, int y) PlatformDemoApplication::keyboardCallback(key,x,y); } -} \ No newline at end of file +} diff --git a/ObsoleteDemos/ConvexDecompositionDemo/ConvexDecompositionDemo.h b/Demos/ConvexDecompositionDemo/ConvexDecompositionDemo.h similarity index 100% rename from ObsoleteDemos/ConvexDecompositionDemo/ConvexDecompositionDemo.h rename to Demos/ConvexDecompositionDemo/ConvexDecompositionDemo.h diff --git a/ObsoleteDemos/ConvexDecompositionDemo/Win32ConvexDecompositionDemo.cpp b/Demos/ConvexDecompositionDemo/Win32ConvexDecompositionDemo.cpp similarity index 100% rename from ObsoleteDemos/ConvexDecompositionDemo/Win32ConvexDecompositionDemo.cpp rename to Demos/ConvexDecompositionDemo/Win32ConvexDecompositionDemo.cpp diff --git a/Demos/ConvexDecompositionDemo/file.obj b/Demos/ConvexDecompositionDemo/file.obj new file mode 100644 index 000000000..15047b022 --- /dev/null +++ b/Demos/ConvexDecompositionDemo/file.obj @@ -0,0 +1,3578 @@ +v 0.000118 -0.390977 -0.478607 +v 0.017389 -0.390977 -0.478271 +v 0.029547 -0.390983 -0.429828 +v 0.000118 -0.390983 -0.429848 +v 0.017389 -0.390977 -0.478271 +v 0.017389 -0.342855 -0.474044 +v 0.029547 -0.317820 -0.429577 +v 0.029547 -0.390983 -0.429828 +v 0.017389 -0.342855 -0.474044 +v 0.000118 -0.331762 -0.473074 +v 0.000118 -0.306727 -0.429520 +v 0.029547 -0.317820 -0.429577 +v -0.017152 -0.342855 -0.474044 +v -0.029311 -0.317820 -0.429577 +v -0.017152 -0.342855 -0.474044 +v -0.017152 -0.390977 -0.478271 +v -0.029311 -0.390983 -0.429828 +v -0.029311 -0.317820 -0.429577 +v -0.017152 -0.390977 -0.478271 +v -0.029311 -0.390983 -0.429828 +v 0.017389 -0.391071 -0.377731 +v 0.000118 -0.391100 -0.378066 +v 0.017389 -0.336012 -0.378305 +v 0.017389 -0.391071 -0.377731 +v 0.029547 -0.317820 -0.429577 +v 0.000118 -0.306727 -0.429520 +v 0.000118 -0.324876 -0.378305 +v 0.017389 -0.336012 -0.378305 +v 0.000118 -0.306727 -0.429520 +v -0.029311 -0.317820 -0.429577 +v -0.017152 -0.336012 -0.378305 +v 0.000118 -0.324876 -0.378305 +v -0.017152 -0.391071 -0.377731 +v -0.017152 -0.336012 -0.378305 +v -0.017152 -0.391071 -0.377731 +v 0.017389 -0.355018 -0.311310 +v 0.000118 -0.358745 -0.310312 +v 0.017389 -0.313071 -0.327714 +v 0.017389 -0.355018 -0.311310 +v 0.000118 -0.302315 -0.330597 +v 0.017389 -0.313071 -0.327714 +v -0.017152 -0.313071 -0.327714 +v 0.000118 -0.302315 -0.330597 +v -0.017152 -0.355018 -0.311310 +v -0.017152 -0.313071 -0.327714 +v -0.017152 -0.355018 -0.311310 +v 0.027414 -0.282077 -0.242925 +v 0.000118 -0.286749 -0.239005 +v 0.027414 -0.244765 -0.265699 +v 0.027414 -0.282077 -0.242925 +v 0.000118 -0.231283 -0.277012 +v 0.027414 -0.244765 -0.265699 +v -0.027178 -0.244765 -0.265699 +v 0.000118 -0.231283 -0.277012 +v -0.027178 -0.282077 -0.242925 +v -0.027178 -0.244765 -0.265699 +v -0.027178 -0.282077 -0.242925 +v 0.035601 -0.254040 -0.188841 +v 0.000118 -0.261848 -0.187464 +v 0.035601 -0.172486 -0.190596 +v 0.035601 -0.254040 -0.188841 +v 0.000118 -0.149955 -0.194569 +v 0.035601 -0.172486 -0.190596 +v -0.035364 -0.172486 -0.190596 +v 0.000118 -0.149955 -0.194569 +v -0.035364 -0.254040 -0.188841 +v -0.035364 -0.172486 -0.190596 +v -0.035364 -0.254040 -0.188841 +v 0.000118 -0.360973 -0.484897 +v 0.017389 -0.390977 -0.478271 +v 0.000118 -0.390977 -0.478607 +v 0.017389 -0.342855 -0.474044 +v 0.000118 -0.331762 -0.473074 +v -0.017152 -0.342855 -0.474044 +v -0.017152 -0.390977 -0.478271 +v 0.035601 -0.232880 -0.098411 +v 0.000118 -0.240808 -0.098411 +v 0.035601 -0.144967 -0.098411 +v 0.035601 -0.232880 -0.098411 +v 0.000118 -0.122088 -0.098411 +v 0.035601 -0.144967 -0.098411 +v -0.035364 -0.144967 -0.098411 +v 0.000118 -0.122088 -0.098411 +v -0.035364 -0.232880 -0.098411 +v -0.035364 -0.144967 -0.098411 +v -0.035364 -0.232880 -0.098411 +v 0.478607 -0.390977 0.000118 +v 0.478271 -0.390977 0.017389 +v 0.429828 -0.390983 0.029547 +v 0.429848 -0.390983 0.000118 +v 0.478271 -0.390977 0.017389 +v 0.474044 -0.342855 0.017389 +v 0.429577 -0.317820 0.029547 +v 0.429828 -0.390983 0.029547 +v 0.474044 -0.342855 0.017389 +v 0.473074 -0.331762 0.000118 +v 0.429520 -0.306727 0.000118 +v 0.429577 -0.317820 0.029547 +v 0.474044 -0.342855 -0.017152 +v 0.429577 -0.317820 -0.029311 +v 0.474044 -0.342855 -0.017152 +v 0.478271 -0.390977 -0.017152 +v 0.429828 -0.390983 -0.029311 +v 0.429577 -0.317820 -0.029311 +v 0.478271 -0.390977 -0.017152 +v 0.429828 -0.390983 -0.029311 +v 0.377731 -0.391071 0.017389 +v 0.378066 -0.391100 0.000118 +v 0.378305 -0.336012 0.017389 +v 0.377731 -0.391071 0.017389 +v 0.429577 -0.317820 0.029547 +v 0.429520 -0.306727 0.000118 +v 0.378305 -0.324876 0.000118 +v 0.378305 -0.336012 0.017389 +v 0.429520 -0.306727 0.000118 +v 0.429577 -0.317820 -0.029311 +v 0.378305 -0.336012 -0.017152 +v 0.378305 -0.324876 0.000118 +v 0.377731 -0.391071 -0.017152 +v 0.378305 -0.336012 -0.017152 +v 0.377731 -0.391071 -0.017152 +v 0.311310 -0.355018 0.017389 +v 0.310312 -0.358745 0.000118 +v 0.327714 -0.313071 0.017389 +v 0.311310 -0.355018 0.017389 +v 0.330597 -0.302315 0.000118 +v 0.327714 -0.313071 0.017389 +v 0.327714 -0.313071 -0.017152 +v 0.330597 -0.302315 0.000118 +v 0.311310 -0.355018 -0.017152 +v 0.327714 -0.313071 -0.017152 +v 0.311310 -0.355018 -0.017152 +v 0.242925 -0.282077 0.027414 +v 0.239005 -0.286749 0.000118 +v 0.265699 -0.244765 0.027414 +v 0.242925 -0.282077 0.027414 +v 0.277012 -0.231283 0.000118 +v 0.265699 -0.244765 0.027414 +v 0.265699 -0.244765 -0.027178 +v 0.277012 -0.231283 0.000118 +v 0.242925 -0.282077 -0.027178 +v 0.265699 -0.244765 -0.027178 +v 0.242925 -0.282077 -0.027178 +v 0.188841 -0.254040 0.035601 +v 0.187464 -0.261848 0.000118 +v 0.190596 -0.172486 0.035601 +v 0.188841 -0.254040 0.035601 +v 0.194569 -0.149955 0.000118 +v 0.190596 -0.172486 0.035601 +v 0.190596 -0.172486 -0.035364 +v 0.194569 -0.149955 0.000118 +v 0.188841 -0.254040 -0.035364 +v 0.190596 -0.172486 -0.035364 +v 0.188841 -0.254040 -0.035364 +v 0.484897 -0.360973 0.000118 +v 0.478271 -0.390977 0.017389 +v 0.478607 -0.390977 0.000118 +v 0.474044 -0.342855 0.017389 +v 0.473074 -0.331762 0.000118 +v 0.474044 -0.342855 -0.017152 +v 0.478271 -0.390977 -0.017152 +v 0.098411 -0.232880 0.035601 +v 0.098411 -0.240808 0.000118 +v 0.098411 -0.144967 0.035601 +v 0.098411 -0.232880 0.035601 +v 0.098411 -0.122088 0.000118 +v 0.098411 -0.144967 0.035601 +v 0.098411 -0.144967 -0.035364 +v 0.098411 -0.122088 0.000118 +v 0.098411 -0.232880 -0.035364 +v 0.098411 -0.144967 -0.035364 +v 0.098411 -0.232880 -0.035364 +v -0.000118 -0.390977 0.478607 +v -0.017389 -0.390977 0.478271 +v -0.029547 -0.390983 0.429828 +v -0.000118 -0.390983 0.429848 +v -0.017389 -0.390977 0.478271 +v -0.017389 -0.342855 0.474044 +v -0.029547 -0.317820 0.429577 +v -0.029547 -0.390983 0.429828 +v -0.017389 -0.342855 0.474044 +v -0.000118 -0.331762 0.473074 +v -0.000118 -0.306727 0.429520 +v -0.029547 -0.317820 0.429577 +v 0.017152 -0.342855 0.474044 +v 0.029310 -0.317820 0.429577 +v 0.017152 -0.342855 0.474044 +v 0.017152 -0.390977 0.478271 +v 0.029310 -0.390983 0.429828 +v 0.029310 -0.317820 0.429577 +v 0.017152 -0.390977 0.478271 +v 0.029310 -0.390983 0.429828 +v -0.017389 -0.391071 0.377731 +v -0.000118 -0.391100 0.378066 +v -0.017389 -0.336012 0.378305 +v -0.017389 -0.391071 0.377731 +v -0.029547 -0.317820 0.429577 +v -0.000118 -0.306727 0.429520 +v -0.000118 -0.324876 0.378305 +v -0.017389 -0.336012 0.378305 +v -0.000118 -0.306727 0.429520 +v 0.029310 -0.317820 0.429577 +v 0.017152 -0.336012 0.378305 +v -0.000118 -0.324876 0.378305 +v 0.017152 -0.391071 0.377731 +v 0.017152 -0.336012 0.378305 +v 0.017152 -0.391071 0.377731 +v -0.017389 -0.355018 0.311310 +v -0.000118 -0.358745 0.310312 +v -0.017389 -0.313071 0.327714 +v -0.017389 -0.355018 0.311310 +v -0.000118 -0.302315 0.330597 +v -0.017389 -0.313071 0.327714 +v 0.017152 -0.313071 0.327714 +v -0.000118 -0.302315 0.330597 +v 0.017152 -0.355018 0.311310 +v 0.017152 -0.313071 0.327714 +v 0.017152 -0.355018 0.311310 +v -0.027414 -0.282077 0.242925 +v -0.000118 -0.286749 0.239005 +v -0.027414 -0.244765 0.265699 +v -0.027414 -0.282077 0.242925 +v -0.000118 -0.231283 0.277012 +v -0.027414 -0.244765 0.265699 +v 0.027178 -0.244765 0.265699 +v -0.000118 -0.231283 0.277012 +v 0.027178 -0.282077 0.242925 +v 0.027178 -0.244765 0.265699 +v 0.027178 -0.282077 0.242925 +v -0.035601 -0.254040 0.188841 +v -0.000118 -0.261848 0.187464 +v -0.035601 -0.172486 0.190596 +v -0.035601 -0.254040 0.188841 +v -0.000118 -0.149955 0.194569 +v -0.035601 -0.172486 0.190596 +v 0.035364 -0.172486 0.190596 +v -0.000118 -0.149955 0.194569 +v 0.035364 -0.254040 0.188841 +v 0.035364 -0.172486 0.190596 +v 0.035364 -0.254040 0.188841 +v -0.000118 -0.360973 0.484897 +v -0.017389 -0.390977 0.478271 +v -0.000118 -0.390977 0.478607 +v -0.017389 -0.342855 0.474044 +v -0.000118 -0.331762 0.473074 +v 0.017152 -0.342855 0.474044 +v 0.017152 -0.390977 0.478271 +v -0.035601 -0.232880 0.098411 +v -0.000118 -0.240808 0.098411 +v -0.035601 -0.144967 0.098411 +v -0.035601 -0.232880 0.098411 +v -0.000118 -0.122088 0.098411 +v -0.035601 -0.144967 0.098411 +v 0.035364 -0.144967 0.098411 +v -0.000118 -0.122088 0.098411 +v 0.035364 -0.232880 0.098411 +v 0.035364 -0.144967 0.098411 +v 0.035364 -0.232880 0.098411 +v -0.478607 -0.390977 -0.000118 +v -0.478271 -0.390977 -0.017389 +v -0.429828 -0.390983 -0.029547 +v -0.429848 -0.390983 -0.000118 +v -0.478271 -0.390977 -0.017389 +v -0.474044 -0.342855 -0.017389 +v -0.429577 -0.317820 -0.029547 +v -0.429828 -0.390983 -0.029547 +v -0.474044 -0.342855 -0.017389 +v -0.473074 -0.331762 -0.000118 +v -0.429520 -0.306727 -0.000118 +v -0.429577 -0.317820 -0.029547 +v -0.474044 -0.342855 0.017152 +v -0.429577 -0.317820 0.029310 +v -0.474044 -0.342855 0.017152 +v -0.478271 -0.390977 0.017152 +v -0.429828 -0.390983 0.029310 +v -0.429577 -0.317820 0.029310 +v -0.478271 -0.390977 0.017152 +v -0.429828 -0.390983 0.029310 +v -0.377731 -0.391071 -0.017389 +v -0.378066 -0.391100 -0.000118 +v -0.378305 -0.336012 -0.017389 +v -0.377731 -0.391071 -0.017389 +v -0.429577 -0.317820 -0.029547 +v -0.429520 -0.306727 -0.000118 +v -0.378305 -0.324876 -0.000118 +v -0.378305 -0.336012 -0.017389 +v -0.429520 -0.306727 -0.000118 +v -0.429577 -0.317820 0.029310 +v -0.378305 -0.336012 0.017152 +v -0.378305 -0.324876 -0.000118 +v -0.377731 -0.391071 0.017152 +v -0.378305 -0.336012 0.017152 +v -0.377731 -0.391071 0.017152 +v -0.311310 -0.355018 -0.017389 +v -0.310312 -0.358745 -0.000118 +v -0.327714 -0.313071 -0.017389 +v -0.311310 -0.355018 -0.017389 +v -0.330597 -0.302315 -0.000118 +v -0.327714 -0.313071 -0.017389 +v -0.327714 -0.313071 0.017152 +v -0.330597 -0.302315 -0.000118 +v -0.311310 -0.355018 0.017152 +v -0.327714 -0.313071 0.017152 +v -0.311310 -0.355018 0.017152 +v -0.242925 -0.282077 -0.027414 +v -0.239005 -0.286749 -0.000118 +v -0.265699 -0.244765 -0.027414 +v -0.242925 -0.282077 -0.027414 +v -0.277012 -0.231283 -0.000118 +v -0.265699 -0.244765 -0.027414 +v -0.265699 -0.244765 0.027178 +v -0.277012 -0.231283 -0.000118 +v -0.242925 -0.282077 0.027178 +v -0.265699 -0.244765 0.027178 +v -0.242925 -0.282077 0.027178 +v -0.188841 -0.254040 -0.035601 +v -0.187464 -0.261848 -0.000118 +v -0.190596 -0.172486 -0.035601 +v -0.188841 -0.254040 -0.035601 +v -0.194569 -0.149955 -0.000118 +v -0.190596 -0.172486 -0.035601 +v -0.190596 -0.172486 0.035364 +v -0.194569 -0.149955 -0.000118 +v -0.188841 -0.254040 0.035364 +v -0.190596 -0.172486 0.035364 +v -0.188841 -0.254040 0.035364 +v -0.484897 -0.360973 -0.000118 +v -0.478271 -0.390977 -0.017389 +v -0.478607 -0.390977 -0.000118 +v -0.474044 -0.342855 -0.017389 +v -0.473074 -0.331762 -0.000118 +v -0.474044 -0.342855 0.017152 +v -0.478271 -0.390977 0.017152 +v -0.098411 -0.232880 -0.035601 +v -0.098411 -0.240808 -0.000118 +v -0.098411 -0.144967 -0.035601 +v -0.098411 -0.232880 -0.035601 +v -0.098411 -0.122088 -0.000118 +v -0.098411 -0.144967 -0.035601 +v -0.098411 -0.144967 0.035364 +v -0.098411 -0.122088 -0.000118 +v -0.098411 -0.232880 0.035364 +v -0.098411 -0.144967 0.035364 +v -0.098411 -0.232880 0.035364 +v 0.000000 -0.094464 0.000000 +v 0.043796 -0.094464 0.105844 +v 0.105811 -0.094464 0.043875 +v -0.043875 -0.094464 0.105811 +v -0.105844 -0.094464 0.043796 +v -0.105811 -0.094464 -0.043875 +v -0.043796 -0.094464 -0.105844 +v 0.043875 -0.094464 -0.105811 +v 0.105844 -0.094464 -0.043796 +v 0.043796 -0.255563 0.105844 +v 0.105811 -0.255563 0.043875 +v 0.105811 -0.094464 0.043875 +v 0.043796 -0.094464 0.105844 +v -0.043875 -0.255563 0.105811 +v 0.043796 -0.255563 0.105844 +v 0.043796 -0.094464 0.105844 +v -0.043875 -0.094464 0.105811 +v -0.105844 -0.255563 0.043796 +v -0.043875 -0.255563 0.105811 +v -0.043875 -0.094464 0.105811 +v -0.105844 -0.094464 0.043796 +v -0.105811 -0.255563 -0.043875 +v -0.105844 -0.255563 0.043796 +v -0.105844 -0.094464 0.043796 +v -0.105811 -0.094464 -0.043875 +v -0.043796 -0.255563 -0.105844 +v -0.105811 -0.255563 -0.043875 +v -0.105811 -0.094464 -0.043875 +v -0.043796 -0.094464 -0.105844 +v 0.043875 -0.255563 -0.105811 +v -0.043796 -0.255563 -0.105844 +v -0.043796 -0.094464 -0.105844 +v 0.043875 -0.094464 -0.105811 +v 0.105844 -0.255563 -0.043796 +v 0.043875 -0.255563 -0.105811 +v 0.043875 -0.094464 -0.105811 +v 0.105844 -0.094464 -0.043796 +v 0.105811 -0.255563 0.043875 +v 0.105844 -0.255563 -0.043796 +v 0.105844 -0.094464 -0.043796 +v 0.105811 -0.094464 0.043875 +v 0.000000 -0.255563 0.000000 +v 0.105811 -0.255563 0.043875 +v 0.043796 -0.255563 0.105844 +v -0.043875 -0.255563 0.105811 +v -0.105844 -0.255563 0.043796 +v -0.105811 -0.255563 -0.043875 +v -0.043796 -0.255563 -0.105844 +v 0.043875 -0.255563 -0.105811 +v 0.105844 -0.255563 -0.043796 +v -0.275954 0.604340 0.275954 +v -0.275954 0.604340 -0.275954 +v -0.275954 0.612392 -0.275954 +v -0.275954 0.612392 0.275954 +v -0.275954 0.604340 -0.275954 +v 0.275954 0.604340 -0.275954 +v 0.275954 0.612392 -0.275954 +v -0.275954 0.612392 -0.275954 +v 0.275954 0.604340 -0.275954 +v 0.275954 0.604340 0.275954 +v 0.275954 0.612392 0.275954 +v 0.275954 0.612392 -0.275954 +v 0.275954 0.604340 0.275954 +v -0.275954 0.604340 0.275954 +v -0.275954 0.612392 0.275954 +v 0.275954 0.612392 0.275954 +v -0.275954 0.612392 0.275954 +v -0.275954 0.612392 -0.275954 +v -0.284007 0.611587 -0.284007 +v -0.284007 0.611587 0.284007 +v -0.275954 0.612392 -0.275954 +v 0.275954 0.612392 -0.275954 +v 0.284007 0.611587 -0.284007 +v -0.284007 0.611587 -0.284007 +v 0.275954 0.612392 -0.275954 +v 0.275954 0.612392 0.275954 +v 0.284007 0.611587 0.284007 +v 0.284007 0.611587 -0.284007 +v 0.275954 0.612392 0.275954 +v -0.275954 0.612392 0.275954 +v -0.284007 0.611587 0.284007 +v 0.284007 0.611587 0.284007 +v -0.284007 0.611587 0.284007 +v -0.284007 0.611587 -0.284007 +v -0.284007 0.603535 -0.284007 +v -0.284007 0.603535 0.284007 +v -0.284007 0.611587 -0.284007 +v 0.284007 0.611587 -0.284007 +v 0.284007 0.603535 -0.284007 +v -0.284007 0.603535 -0.284007 +v 0.284007 0.611587 -0.284007 +v 0.284007 0.611587 0.284007 +v 0.284007 0.603535 0.284007 +v 0.284007 0.603535 -0.284007 +v 0.284007 0.611587 0.284007 +v -0.284007 0.611587 0.284007 +v -0.284007 0.603535 0.284007 +v 0.284007 0.603535 0.284007 +v -0.507297 0.549194 0.507297 +v 0.507297 0.549194 0.507297 +v 0.507297 0.550000 0.507297 +v -0.507297 0.550000 0.507297 +v 0.507297 0.549194 0.507297 +v 0.507297 0.549194 -0.507297 +v 0.507297 0.550000 -0.507297 +v 0.507297 0.550000 0.507297 +v 0.507297 0.549194 -0.507297 +v -0.507297 0.549194 -0.507297 +v -0.507297 0.550000 -0.507297 +v 0.507297 0.550000 -0.507297 +v -0.507297 0.549194 -0.507297 +v -0.507297 0.549194 0.507297 +v -0.507297 0.550000 0.507297 +v -0.507297 0.550000 -0.507297 +v 0.507297 0.558052 0.507297 +v -0.507297 0.558052 0.507297 +v 0.507297 0.558052 -0.507297 +v 0.507297 0.558052 0.507297 +v -0.507297 0.558052 -0.507297 +v 0.507297 0.558052 -0.507297 +v -0.507297 0.558052 0.507297 +v -0.507297 0.558052 -0.507297 +v 0.499245 0.566104 0.499245 +v -0.499245 0.566104 0.499245 +v 0.499245 0.566104 -0.499245 +v 0.499245 0.566104 0.499245 +v -0.499245 0.566104 -0.499245 +v 0.499245 0.566104 -0.499245 +v -0.499245 0.566104 0.499245 +v -0.499245 0.566104 -0.499245 +v 0.499245 0.574157 0.499245 +v -0.499245 0.574157 0.499245 +v 0.499245 0.574157 -0.499245 +v 0.499245 0.574157 0.499245 +v -0.499245 0.574157 -0.499245 +v 0.499245 0.574157 -0.499245 +v -0.499245 0.574157 0.499245 +v -0.499245 0.574157 -0.499245 +v 0.491193 0.582209 0.491193 +v -0.491193 0.582209 0.491193 +v 0.491193 0.582209 -0.491193 +v 0.491193 0.582209 0.491193 +v -0.491193 0.582209 -0.491193 +v 0.491193 0.582209 -0.491193 +v -0.491193 0.582209 0.491193 +v -0.491193 0.582209 -0.491193 +v -0.491193 0.582209 0.491193 +v 0.491193 0.582209 0.491193 +v 0.483140 0.583014 0.483140 +v -0.483140 0.583014 0.483140 +v 0.491193 0.582209 0.491193 +v 0.491193 0.582209 -0.491193 +v 0.483140 0.583014 -0.483140 +v 0.483140 0.583014 0.483140 +v 0.491193 0.582209 -0.491193 +v -0.491193 0.582209 -0.491193 +v -0.483140 0.583014 -0.483140 +v 0.483140 0.583014 -0.483140 +v -0.491193 0.582209 -0.491193 +v -0.491193 0.582209 0.491193 +v -0.483140 0.583014 0.483140 +v -0.483140 0.583014 -0.483140 +v -0.314041 0.591939 -0.314041 +v -0.314041 0.591939 0.314041 +v 0.314041 0.591939 -0.314041 +v -0.314041 0.591939 -0.314041 +v 0.314041 0.591939 0.314041 +v 0.314041 0.591939 -0.314041 +v -0.314041 0.591939 0.314041 +v 0.314041 0.591939 0.314041 +v -0.322094 0.591134 -0.322094 +v -0.322094 0.591134 0.322094 +v 0.322094 0.591134 -0.322094 +v -0.322094 0.591134 -0.322094 +v 0.322094 0.591134 0.322094 +v 0.322094 0.591134 -0.322094 +v -0.322094 0.591134 0.322094 +v 0.322094 0.591134 0.322094 +v -0.322094 0.583082 -0.322094 +v -0.322094 0.583082 0.322094 +v 0.322094 0.583082 -0.322094 +v -0.322094 0.583082 -0.322094 +v 0.322094 0.583082 0.322094 +v 0.322094 0.583082 -0.322094 +v -0.322094 0.583082 0.322094 +v 0.322094 0.583082 0.322094 +v -0.322094 0.583082 0.322094 +v -0.322094 0.583082 -0.322094 +v -0.483140 0.575029 -0.483140 +v -0.483140 0.575029 0.483140 +v -0.322094 0.583082 -0.322094 +v 0.322094 0.583082 -0.322094 +v 0.483140 0.575029 -0.483140 +v -0.483140 0.575029 -0.483140 +v 0.322094 0.583082 -0.322094 +v 0.322094 0.583082 0.322094 +v 0.483140 0.575029 0.483140 +v 0.483140 0.575029 -0.483140 +v 0.322094 0.583082 0.322094 +v -0.322094 0.583082 0.322094 +v -0.483140 0.575029 0.483140 +v 0.483140 0.575029 0.483140 +v -0.483140 0.575029 0.483140 +v -0.483140 0.575029 -0.483140 +v -0.483140 0.583014 -0.483140 +v -0.483140 0.583014 0.483140 +v -0.483140 0.575029 -0.483140 +v 0.483140 0.575029 -0.483140 +v 0.483140 0.583014 -0.483140 +v -0.483140 0.583014 -0.483140 +v 0.483140 0.575029 -0.483140 +v 0.483140 0.575029 0.483140 +v 0.483140 0.583014 0.483140 +v 0.483140 0.583014 -0.483140 +v 0.483140 0.575029 0.483140 +v -0.483140 0.575029 0.483140 +v -0.483140 0.583014 0.483140 +v 0.483140 0.583014 0.483140 +v 0.275954 0.604340 -0.275954 +v -0.275954 0.604340 -0.275954 +v -0.275954 0.604340 0.275954 +v 0.275954 0.604340 0.275954 +v 0.507297 0.549194 -0.507297 +v 0.507297 0.549194 0.507297 +v -0.507297 0.549194 0.507297 +v -0.507297 0.549194 -0.507297 +v 0.061122 0.493612 0.044408 +v 0.075551 0.493612 0.000000 +v 0.153763 0.549783 0.000000 +v 0.124397 0.549782 0.090379 +v 0.023346 0.493612 0.071853 +v 0.047515 0.549782 0.146237 +v -0.023346 0.493612 0.071853 +v -0.047515 0.549782 0.146237 +v -0.061122 0.493612 0.044408 +v -0.124396 0.549782 0.090380 +v -0.075551 0.493612 0.000000 +v -0.153763 0.549783 0.000000 +v -0.061122 0.493612 -0.044407 +v -0.124397 0.549783 -0.090379 +v -0.023346 0.493612 -0.071853 +v -0.047515 0.549783 -0.146237 +v 0.023346 0.493612 -0.071853 +v 0.047515 0.549783 -0.146237 +v 0.061122 0.493612 -0.044407 +v 0.124396 0.549783 -0.090379 +v 0.039643 0.457110 0.028802 +v 0.049002 0.457110 0.000000 +v 0.015142 0.457110 0.046603 +v -0.015142 0.457110 0.046603 +v -0.039643 0.457110 0.028802 +v -0.049002 0.457110 0.000000 +v -0.039643 0.457110 -0.028802 +v -0.015142 0.457110 -0.046603 +v 0.015142 0.457110 -0.046603 +v 0.039643 0.457110 -0.028802 +v 0.065534 -0.100432 0.047613 +v 0.081005 -0.100432 0.000000 +v 0.081005 -0.082613 0.000000 +v 0.065534 -0.082613 0.047613 +v 0.025032 -0.100432 0.077040 +v 0.065534 -0.100432 0.047613 +v 0.065534 -0.082613 0.047613 +v 0.025032 -0.082613 0.077040 +v -0.025032 -0.100432 0.077040 +v 0.025032 -0.100432 0.077040 +v 0.025032 -0.082613 0.077040 +v -0.025032 -0.082613 0.077040 +v -0.065534 -0.100432 0.047613 +v -0.025032 -0.100432 0.077040 +v -0.025032 -0.082613 0.077040 +v -0.065534 -0.082613 0.047613 +v -0.081005 -0.100432 0.000000 +v -0.065534 -0.100432 0.047613 +v -0.065534 -0.082613 0.047613 +v -0.081005 -0.082613 0.000000 +v -0.065534 -0.100432 -0.047613 +v -0.081005 -0.100432 0.000000 +v -0.081005 -0.082613 0.000000 +v -0.065534 -0.082613 -0.047613 +v -0.025032 -0.100432 -0.077040 +v -0.065534 -0.100432 -0.047613 +v -0.065534 -0.082613 -0.047613 +v -0.025032 -0.082613 -0.077040 +v 0.025032 -0.100432 -0.077040 +v -0.025032 -0.100432 -0.077040 +v -0.025032 -0.082613 -0.077040 +v 0.025032 -0.082613 -0.077040 +v 0.065534 -0.100432 -0.047613 +v 0.025032 -0.100432 -0.077040 +v 0.025032 -0.082613 -0.077040 +v 0.065534 -0.082613 -0.047613 +v 0.081005 -0.100432 0.000000 +v 0.065534 -0.100432 -0.047613 +v 0.065534 -0.082613 -0.047613 +v 0.081005 -0.082613 0.000000 +v 0.065534 -0.082613 0.047613 +v 0.081005 -0.082613 0.000000 +v 0.062269 -0.081722 0.000000 +v 0.050377 -0.081722 0.036601 +v 0.025032 -0.082613 0.077040 +v 0.065534 -0.082613 0.047613 +v 0.050377 -0.081722 0.036601 +v 0.019242 -0.081722 0.059221 +v -0.025032 -0.082613 0.077040 +v 0.025032 -0.082613 0.077040 +v 0.019242 -0.081722 0.059221 +v -0.019242 -0.081722 0.059221 +v -0.065534 -0.082613 0.047613 +v -0.025032 -0.082613 0.077040 +v -0.019242 -0.081722 0.059221 +v -0.050377 -0.081722 0.036601 +v -0.081005 -0.082613 0.000000 +v -0.065534 -0.082613 0.047613 +v -0.050377 -0.081722 0.036601 +v -0.062269 -0.081722 0.000000 +v -0.065534 -0.082613 -0.047613 +v -0.081005 -0.082613 0.000000 +v -0.062269 -0.081722 0.000000 +v -0.050377 -0.081722 -0.036601 +v -0.025032 -0.082613 -0.077040 +v -0.065534 -0.082613 -0.047613 +v -0.050377 -0.081722 -0.036601 +v -0.019242 -0.081722 -0.059221 +v 0.025032 -0.082613 -0.077040 +v -0.025032 -0.082613 -0.077040 +v -0.019242 -0.081722 -0.059221 +v 0.019242 -0.081722 -0.059221 +v 0.065534 -0.082613 -0.047613 +v 0.025032 -0.082613 -0.077040 +v 0.019242 -0.081722 -0.059221 +v 0.050377 -0.081722 -0.036601 +v 0.081005 -0.082613 0.000000 +v 0.065534 -0.082613 -0.047613 +v 0.050377 -0.081722 -0.036601 +v 0.062269 -0.081722 0.000000 +v 0.050377 -0.081722 0.036601 +v 0.062269 -0.081722 0.000000 +v 0.062269 -0.063904 0.000000 +v 0.050377 -0.063904 0.036601 +v 0.019242 -0.081722 0.059221 +v 0.050377 -0.081722 0.036601 +v 0.050377 -0.063904 0.036601 +v 0.019242 -0.063904 0.059221 +v -0.019242 -0.081722 0.059221 +v 0.019242 -0.081722 0.059221 +v 0.019242 -0.063904 0.059221 +v -0.019242 -0.063904 0.059221 +v -0.050377 -0.081722 0.036601 +v -0.019242 -0.081722 0.059221 +v -0.019242 -0.063904 0.059221 +v -0.050377 -0.063904 0.036601 +v -0.062269 -0.081722 0.000000 +v -0.050377 -0.081722 0.036601 +v -0.050377 -0.063904 0.036601 +v -0.062269 -0.063904 0.000000 +v -0.050377 -0.081722 -0.036601 +v -0.062269 -0.081722 0.000000 +v -0.062269 -0.063904 0.000000 +v -0.050377 -0.063904 -0.036601 +v -0.019242 -0.081722 -0.059221 +v -0.050377 -0.081722 -0.036601 +v -0.050377 -0.063904 -0.036601 +v -0.019242 -0.063904 -0.059221 +v 0.019242 -0.081722 -0.059221 +v -0.019242 -0.081722 -0.059221 +v -0.019242 -0.063904 -0.059221 +v 0.019242 -0.063904 -0.059221 +v 0.050377 -0.081722 -0.036601 +v 0.019242 -0.081722 -0.059221 +v 0.019242 -0.063904 -0.059221 +v 0.050377 -0.063904 -0.036601 +v 0.062269 -0.081722 0.000000 +v 0.050377 -0.081722 -0.036601 +v 0.050377 -0.063904 -0.036601 +v 0.062269 -0.063904 0.000000 +v 0.050377 -0.063904 0.036601 +v 0.062269 -0.063904 0.000000 +v 0.071637 -0.059449 0.000000 +v 0.057955 -0.059449 0.042107 +v 0.019242 -0.063904 0.059221 +v 0.050377 -0.063904 0.036601 +v 0.057955 -0.059449 0.042107 +v 0.022137 -0.059449 0.068131 +v -0.019242 -0.063904 0.059221 +v 0.019242 -0.063904 0.059221 +v 0.022137 -0.059449 0.068131 +v -0.022137 -0.059449 0.068131 +v -0.050377 -0.063904 0.036601 +v -0.019242 -0.063904 0.059221 +v -0.022137 -0.059449 0.068131 +v -0.057955 -0.059449 0.042107 +v -0.062269 -0.063904 0.000000 +v -0.050377 -0.063904 0.036601 +v -0.057955 -0.059449 0.042107 +v -0.071637 -0.059449 0.000000 +v -0.050377 -0.063904 -0.036601 +v -0.062269 -0.063904 0.000000 +v -0.071637 -0.059449 0.000000 +v -0.057955 -0.059449 -0.042107 +v -0.019242 -0.063904 -0.059221 +v -0.050377 -0.063904 -0.036601 +v -0.057955 -0.059449 -0.042107 +v -0.022137 -0.059449 -0.068131 +v 0.019242 -0.063904 -0.059221 +v -0.019242 -0.063904 -0.059221 +v -0.022137 -0.059449 -0.068131 +v 0.022137 -0.059449 -0.068131 +v 0.050377 -0.063904 -0.036601 +v 0.019242 -0.063904 -0.059221 +v 0.022137 -0.059449 -0.068131 +v 0.057955 -0.059449 -0.042107 +v 0.062269 -0.063904 0.000000 +v 0.050377 -0.063904 -0.036601 +v 0.057955 -0.059449 -0.042107 +v 0.071637 -0.059449 0.000000 +v 0.057955 -0.059449 0.042107 +v 0.071637 -0.059449 0.000000 +v 0.071637 -0.050540 0.000000 +v 0.057955 -0.050540 0.042107 +v 0.022137 -0.059449 0.068131 +v 0.057955 -0.059449 0.042107 +v 0.057955 -0.050540 0.042107 +v 0.022137 -0.050540 0.068131 +v -0.022137 -0.059449 0.068131 +v 0.022137 -0.059449 0.068131 +v 0.022137 -0.050540 0.068131 +v -0.022137 -0.050540 0.068131 +v -0.057955 -0.059449 0.042107 +v -0.022137 -0.059449 0.068131 +v -0.022137 -0.050540 0.068131 +v -0.057955 -0.050540 0.042107 +v -0.071637 -0.059449 0.000000 +v -0.057955 -0.059449 0.042107 +v -0.057955 -0.050540 0.042107 +v -0.071637 -0.050540 0.000000 +v -0.057955 -0.059449 -0.042107 +v -0.071637 -0.059449 0.000000 +v -0.071637 -0.050540 0.000000 +v -0.057955 -0.050540 -0.042107 +v -0.022137 -0.059449 -0.068131 +v -0.057955 -0.059449 -0.042107 +v -0.057955 -0.050540 -0.042107 +v -0.022137 -0.050540 -0.068131 +v 0.022137 -0.059449 -0.068131 +v -0.022137 -0.059449 -0.068131 +v -0.022137 -0.050540 -0.068131 +v 0.022137 -0.050540 -0.068131 +v 0.057955 -0.059449 -0.042107 +v 0.022137 -0.059449 -0.068131 +v 0.022137 -0.050540 -0.068131 +v 0.057955 -0.050540 -0.042107 +v 0.071637 -0.059449 0.000000 +v 0.057955 -0.059449 -0.042107 +v 0.057955 -0.050540 -0.042107 +v 0.071637 -0.050540 0.000000 +v 0.057955 -0.050540 0.042107 +v 0.071637 -0.050540 0.000000 +v 0.062269 -0.046085 0.000000 +v 0.050377 -0.046085 0.036601 +v 0.022137 -0.050540 0.068131 +v 0.057955 -0.050540 0.042107 +v 0.050377 -0.046085 0.036601 +v 0.019242 -0.046085 0.059221 +v -0.022137 -0.050540 0.068131 +v 0.022137 -0.050540 0.068131 +v 0.019242 -0.046085 0.059221 +v -0.019242 -0.046085 0.059221 +v -0.057955 -0.050540 0.042107 +v -0.022137 -0.050540 0.068131 +v -0.019242 -0.046085 0.059221 +v -0.050377 -0.046085 0.036601 +v -0.071637 -0.050540 0.000000 +v -0.057955 -0.050540 0.042107 +v -0.050377 -0.046085 0.036601 +v -0.062269 -0.046085 0.000000 +v -0.057955 -0.050540 -0.042107 +v -0.071637 -0.050540 0.000000 +v -0.062269 -0.046085 0.000000 +v -0.050377 -0.046085 -0.036601 +v -0.022137 -0.050540 -0.068131 +v -0.057955 -0.050540 -0.042107 +v -0.050377 -0.046085 -0.036601 +v -0.019242 -0.046085 -0.059221 +v 0.022137 -0.050540 -0.068131 +v -0.022137 -0.050540 -0.068131 +v -0.019242 -0.046085 -0.059221 +v 0.019242 -0.046085 -0.059221 +v 0.057955 -0.050540 -0.042107 +v 0.022137 -0.050540 -0.068131 +v 0.019242 -0.046085 -0.059221 +v 0.050377 -0.046085 -0.036601 +v 0.071637 -0.050540 0.000000 +v 0.057955 -0.050540 -0.042107 +v 0.050377 -0.046085 -0.036601 +v 0.062269 -0.046085 0.000000 +v 0.050377 -0.046085 0.036601 +v 0.062269 -0.046085 0.000000 +v 0.062269 -0.037015 0.000000 +v 0.050377 -0.037015 0.036601 +v 0.019242 -0.046085 0.059221 +v 0.050377 -0.046085 0.036601 +v 0.050377 -0.037015 0.036601 +v 0.019242 -0.037015 0.059221 +v -0.019242 -0.046085 0.059221 +v 0.019242 -0.046085 0.059221 +v 0.019242 -0.037015 0.059221 +v -0.019242 -0.037015 0.059221 +v -0.050377 -0.046085 0.036601 +v -0.019242 -0.046085 0.059221 +v -0.019242 -0.037015 0.059221 +v -0.050377 -0.037015 0.036601 +v -0.062269 -0.046085 0.000000 +v -0.050377 -0.046085 0.036601 +v -0.050377 -0.037015 0.036601 +v -0.062269 -0.037015 0.000000 +v -0.050377 -0.046085 -0.036601 +v -0.062269 -0.046085 0.000000 +v -0.062269 -0.037015 0.000000 +v -0.050377 -0.037015 -0.036601 +v -0.019242 -0.046085 -0.059221 +v -0.050377 -0.046085 -0.036601 +v -0.050377 -0.037015 -0.036601 +v -0.019242 -0.037015 -0.059221 +v 0.019242 -0.046085 -0.059221 +v -0.019242 -0.046085 -0.059221 +v -0.019242 -0.037015 -0.059221 +v 0.019242 -0.037015 -0.059221 +v 0.050377 -0.046085 -0.036601 +v 0.019242 -0.046085 -0.059221 +v 0.019242 -0.037015 -0.059221 +v 0.050377 -0.037015 -0.036601 +v 0.062269 -0.046085 0.000000 +v 0.050377 -0.046085 -0.036601 +v 0.050377 -0.037015 -0.036601 +v 0.062269 -0.037015 0.000000 +v 0.035221 0.414309 0.025590 +v 0.043536 0.414309 0.000000 +v 0.049002 0.457110 0.000000 +v 0.039643 0.457110 0.028802 +v 0.013453 0.414309 0.041405 +v 0.015142 0.457110 0.046603 +v -0.013453 0.414309 0.041405 +v -0.015142 0.457110 0.046603 +v -0.035221 0.414309 0.025590 +v -0.039643 0.457110 0.028802 +v -0.043536 0.414309 0.000000 +v -0.049002 0.457110 0.000000 +v -0.035221 0.414309 -0.025590 +v -0.039643 0.457110 -0.028802 +v -0.013453 0.414309 -0.041405 +v -0.015142 0.457110 -0.046603 +v 0.013453 0.414309 -0.041405 +v 0.015142 0.457110 -0.046603 +v 0.035221 0.414309 -0.025590 +v 0.013453 0.414309 -0.041405 +v 0.015142 0.457110 -0.046603 +v 0.039643 0.457110 -0.028802 +v 0.051175 0.223460 0.037181 +v 0.063256 0.223460 0.000000 +v 0.019547 0.223460 0.060160 +v -0.019547 0.223460 0.060160 +v -0.051175 0.223460 0.037181 +v -0.063256 0.223460 0.000000 +v -0.051175 0.223460 -0.037181 +v -0.019547 0.223460 -0.060160 +v 0.019547 0.223460 -0.060160 +v 0.051176 0.223460 -0.037181 +v 0.019547 0.223460 -0.060160 +v 0.076220 0.102045 0.055377 +v 0.094213 0.102045 0.000000 +v 0.029113 0.102045 0.089602 +v -0.029113 0.102045 0.089602 +v -0.076220 0.102045 0.055377 +v -0.094213 0.102045 0.000000 +v -0.076220 0.102045 -0.055377 +v -0.029113 0.102045 -0.089602 +v 0.029113 0.102045 -0.089602 +v 0.076220 0.102045 -0.055377 +v 0.029113 0.102045 -0.089602 +v 0.068919 -0.002139 0.050073 +v 0.085189 -0.002139 0.000000 +v 0.026325 -0.002139 0.081019 +v -0.026325 -0.002139 0.081019 +v -0.068919 -0.002139 0.050073 +v -0.085189 -0.002139 0.000000 +v -0.068919 -0.002139 -0.050073 +v -0.026325 -0.002139 -0.081019 +v 0.026325 -0.002139 -0.081019 +v 0.068919 -0.002139 -0.050073 +v 0.026325 -0.002139 -0.081019 +v 0.050377 -0.037015 0.036601 +v 0.062269 -0.037015 0.000000 +v 0.019242 -0.037015 0.059221 +v -0.019242 -0.037015 0.059221 +v -0.050377 -0.037015 0.036601 +v -0.062269 -0.037015 0.000000 +v -0.050377 -0.037015 -0.036601 +v -0.019242 -0.037015 -0.059221 +v 0.019242 -0.037015 -0.059221 +v 0.050377 -0.037015 -0.036601 +v 0.019242 -0.037015 -0.059221 +vt 0.017083 0.467481 +vt 0.017498 0.425773 +vt 0.077301 0.425780 +vt 0.077277 0.475172 +vt 0.017498 0.425773 +vt 0.022716 0.366365 +vt 0.077611 0.335458 +vt 0.077301 0.425780 +vt 0.022716 0.366365 +vt 0.023914 0.320840 +vt 0.077682 0.295421 +vt 0.077611 0.335458 +vt 0.022716 0.366365 +vt 0.077611 0.335458 +vt 0.022716 0.366365 +vt 0.017498 0.425773 +vt 0.077301 0.425780 +vt 0.077611 0.335458 +vt 0.017498 0.425773 +vt 0.077301 0.425780 +vt 0.141617 0.425888 +vt 0.141203 0.458853 +vt 0.140908 0.357917 +vt 0.141617 0.425888 +vt 0.077611 0.335458 +vt 0.077682 0.295421 +vt 0.140908 0.303558 +vt 0.140908 0.357917 +vt 0.077682 0.295421 +vt 0.077611 0.335458 +vt 0.140908 0.357917 +vt 0.140908 0.303558 +vt 0.141617 0.425888 +vt 0.140908 0.357917 +vt 0.141617 0.425888 +vt 0.223614 0.381380 +vt 0.233628 0.407934 +vt 0.203363 0.329596 +vt 0.223614 0.381380 +vt 0.187732 0.293268 +vt 0.203363 0.329596 +vt 0.203363 0.329596 +vt 0.187732 0.293268 +vt 0.223614 0.381380 +vt 0.203363 0.329596 +vt 0.223614 0.381380 +vt 0.308037 0.291333 +vt 0.324950 0.321248 +vt 0.279922 0.245271 +vt 0.308037 0.291333 +vt 0.264859 0.213261 +vt 0.279922 0.245271 +vt 0.279922 0.245271 +vt 0.264859 0.213261 +vt 0.308037 0.291333 +vt 0.279922 0.245271 +vt 0.308037 0.291333 +vt 0.377000 0.255623 +vt 0.378700 0.295995 +vt 0.372639 0.156040 +vt 0.377000 0.255623 +vt 0.367735 0.111762 +vt 0.372639 0.156040 +vt 0.372639 0.156040 +vt 0.367735 0.111762 +vt 0.377000 0.255623 +vt 0.372639 0.156040 +vt 0.377000 0.255623 +vt 0.393655 0.410963 +vt 0.467714 0.453591 +vt 0.467714 0.410963 +vt 0.348935 0.453591 +vt 0.321554 0.410963 +vt 0.348935 0.368334 +vt 0.467714 0.368334 +vt 0.486443 0.230599 +vt 0.486443 0.273314 +vt 0.486443 0.122067 +vt 0.486443 0.230599 +vt 0.486443 0.071872 +vt 0.486443 0.122067 +vt 0.486443 0.122067 +vt 0.486443 0.071872 +vt 0.486443 0.230599 +vt 0.486443 0.122067 +vt 0.486443 0.230599 +vt 0.017083 0.467481 +vt 0.017498 0.425773 +vt 0.077301 0.425780 +vt 0.077277 0.475172 +vt 0.017498 0.425773 +vt 0.022716 0.366365 +vt 0.077611 0.335458 +vt 0.077301 0.425780 +vt 0.022716 0.366365 +vt 0.023914 0.320840 +vt 0.077682 0.295421 +vt 0.077611 0.335458 +vt 0.022716 0.366365 +vt 0.077611 0.335458 +vt 0.022716 0.366365 +vt 0.017498 0.425773 +vt 0.077301 0.425780 +vt 0.077611 0.335458 +vt 0.017498 0.425773 +vt 0.077301 0.425780 +vt 0.141617 0.425888 +vt 0.141203 0.458853 +vt 0.140908 0.357917 +vt 0.141617 0.425888 +vt 0.077611 0.335458 +vt 0.077682 0.295421 +vt 0.140908 0.303558 +vt 0.140908 0.357917 +vt 0.077682 0.295421 +vt 0.077611 0.335458 +vt 0.140908 0.357917 +vt 0.140908 0.303558 +vt 0.141617 0.425888 +vt 0.140908 0.357917 +vt 0.141617 0.425888 +vt 0.223614 0.381380 +vt 0.233628 0.407934 +vt 0.203363 0.329596 +vt 0.223614 0.381380 +vt 0.187732 0.293268 +vt 0.203363 0.329596 +vt 0.203363 0.329596 +vt 0.187732 0.293268 +vt 0.223614 0.381380 +vt 0.203363 0.329596 +vt 0.223614 0.381380 +vt 0.308037 0.291333 +vt 0.324950 0.321248 +vt 0.279922 0.245271 +vt 0.308037 0.291333 +vt 0.264859 0.213261 +vt 0.279922 0.245271 +vt 0.279922 0.245271 +vt 0.264859 0.213261 +vt 0.308037 0.291333 +vt 0.279922 0.245271 +vt 0.308037 0.291333 +vt 0.377000 0.255623 +vt 0.378700 0.295995 +vt 0.372639 0.156040 +vt 0.377000 0.255623 +vt 0.367735 0.111762 +vt 0.372639 0.156040 +vt 0.372639 0.156040 +vt 0.367735 0.111762 +vt 0.377000 0.255623 +vt 0.372639 0.156040 +vt 0.377000 0.255623 +vt 0.393655 0.410963 +vt 0.467714 0.453591 +vt 0.467714 0.410963 +vt 0.348935 0.453591 +vt 0.321554 0.410963 +vt 0.348935 0.368334 +vt 0.467714 0.368334 +vt 0.486443 0.230599 +vt 0.486443 0.273314 +vt 0.486443 0.122067 +vt 0.486443 0.230599 +vt 0.486443 0.071872 +vt 0.486443 0.122067 +vt 0.486443 0.122067 +vt 0.486443 0.071872 +vt 0.486443 0.230599 +vt 0.486443 0.122067 +vt 0.486443 0.230599 +vt 0.017083 0.467481 +vt 0.017498 0.425773 +vt 0.077301 0.425780 +vt 0.077277 0.475172 +vt 0.017498 0.425773 +vt 0.022716 0.366365 +vt 0.077611 0.335458 +vt 0.077301 0.425780 +vt 0.022716 0.366365 +vt 0.023914 0.320840 +vt 0.077682 0.295421 +vt 0.077611 0.335458 +vt 0.022716 0.366365 +vt 0.077611 0.335458 +vt 0.022716 0.366365 +vt 0.017498 0.425773 +vt 0.077301 0.425780 +vt 0.077611 0.335458 +vt 0.017498 0.425773 +vt 0.077301 0.425780 +vt 0.141617 0.425888 +vt 0.141203 0.458853 +vt 0.140908 0.357917 +vt 0.141617 0.425888 +vt 0.077611 0.335458 +vt 0.077682 0.295421 +vt 0.140908 0.303558 +vt 0.140908 0.357917 +vt 0.077682 0.295421 +vt 0.077611 0.335458 +vt 0.140908 0.357917 +vt 0.140908 0.303558 +vt 0.141617 0.425888 +vt 0.140908 0.357917 +vt 0.141617 0.425888 +vt 0.223614 0.381380 +vt 0.233628 0.407934 +vt 0.203363 0.329596 +vt 0.223614 0.381380 +vt 0.187732 0.293268 +vt 0.203363 0.329596 +vt 0.203363 0.329596 +vt 0.187732 0.293268 +vt 0.223614 0.381380 +vt 0.203363 0.329596 +vt 0.223614 0.381380 +vt 0.308037 0.291333 +vt 0.324950 0.321248 +vt 0.279922 0.245271 +vt 0.308037 0.291333 +vt 0.264859 0.213261 +vt 0.279922 0.245271 +vt 0.279922 0.245271 +vt 0.264859 0.213261 +vt 0.308037 0.291333 +vt 0.279922 0.245271 +vt 0.308037 0.291333 +vt 0.377000 0.255623 +vt 0.378700 0.295995 +vt 0.372639 0.156040 +vt 0.377000 0.255623 +vt 0.367735 0.111762 +vt 0.372639 0.156040 +vt 0.372639 0.156040 +vt 0.367735 0.111762 +vt 0.377000 0.255623 +vt 0.372639 0.156040 +vt 0.377000 0.255623 +vt 0.393655 0.410963 +vt 0.467714 0.453591 +vt 0.467714 0.410963 +vt 0.348935 0.453591 +vt 0.321554 0.410963 +vt 0.348935 0.368334 +vt 0.467714 0.368334 +vt 0.486443 0.230599 +vt 0.486443 0.273314 +vt 0.486443 0.122067 +vt 0.486443 0.230599 +vt 0.486443 0.071872 +vt 0.486443 0.122067 +vt 0.486443 0.122067 +vt 0.486443 0.071872 +vt 0.486443 0.230599 +vt 0.486443 0.122067 +vt 0.486443 0.230599 +vt 0.017083 0.467481 +vt 0.017498 0.425773 +vt 0.077301 0.425780 +vt 0.077277 0.475172 +vt 0.017498 0.425773 +vt 0.022716 0.366365 +vt 0.077611 0.335458 +vt 0.077301 0.425780 +vt 0.022716 0.366365 +vt 0.023914 0.320840 +vt 0.077682 0.295421 +vt 0.077611 0.335458 +vt 0.022716 0.366365 +vt 0.077611 0.335458 +vt 0.022716 0.366365 +vt 0.017498 0.425773 +vt 0.077301 0.425780 +vt 0.077611 0.335458 +vt 0.017498 0.425773 +vt 0.077301 0.425780 +vt 0.141617 0.425888 +vt 0.141203 0.458853 +vt 0.140908 0.357917 +vt 0.141617 0.425888 +vt 0.077611 0.335458 +vt 0.077682 0.295421 +vt 0.140908 0.303558 +vt 0.140908 0.357917 +vt 0.077682 0.295421 +vt 0.077611 0.335458 +vt 0.140908 0.357917 +vt 0.140908 0.303558 +vt 0.141617 0.425888 +vt 0.140908 0.357917 +vt 0.141617 0.425888 +vt 0.223614 0.381380 +vt 0.233628 0.407934 +vt 0.203363 0.329596 +vt 0.223614 0.381380 +vt 0.187732 0.293268 +vt 0.203363 0.329596 +vt 0.203363 0.329596 +vt 0.187732 0.293268 +vt 0.223614 0.381380 +vt 0.203363 0.329596 +vt 0.223614 0.381380 +vt 0.308037 0.291333 +vt 0.324950 0.321248 +vt 0.279922 0.245271 +vt 0.308037 0.291333 +vt 0.264859 0.213261 +vt 0.279922 0.245271 +vt 0.279922 0.245271 +vt 0.264859 0.213261 +vt 0.308037 0.291333 +vt 0.279922 0.245271 +vt 0.308037 0.291333 +vt 0.377000 0.255623 +vt 0.378700 0.295995 +vt 0.372639 0.156040 +vt 0.377000 0.255623 +vt 0.367735 0.111762 +vt 0.372639 0.156040 +vt 0.372639 0.156040 +vt 0.367735 0.111762 +vt 0.377000 0.255623 +vt 0.372639 0.156040 +vt 0.377000 0.255623 +vt 0.393655 0.410963 +vt 0.467714 0.453591 +vt 0.467714 0.410963 +vt 0.348935 0.453591 +vt 0.321554 0.410963 +vt 0.348935 0.368334 +vt 0.467714 0.368334 +vt 0.486443 0.230599 +vt 0.486443 0.273314 +vt 0.486443 0.122067 +vt 0.486443 0.230599 +vt 0.486443 0.071872 +vt 0.486443 0.122067 +vt 0.486443 0.122067 +vt 0.486443 0.071872 +vt 0.486443 0.230599 +vt 0.486443 0.122067 +vt 0.486443 0.230599 +vt 0.000000 1.000000 +vt 0.312949 0.385343 +vt 0.374010 0.385343 +vt 0.251887 0.385343 +vt 0.190825 0.385343 +vt 0.129763 0.385343 +vt 0.068702 0.385343 +vt 0.496134 0.385343 +vt 0.435072 0.385343 +vt 0.312949 0.498276 +vt 0.374010 0.498276 +vt 0.374010 0.385343 +vt 0.312949 0.385343 +vt 0.251887 0.498276 +vt 0.312949 0.498276 +vt 0.312949 0.385343 +vt 0.251887 0.385343 +vt 0.190825 0.498276 +vt 0.251887 0.498276 +vt 0.251887 0.385343 +vt 0.190825 0.385343 +vt 0.129763 0.498276 +vt 0.190825 0.498276 +vt 0.190825 0.385343 +vt 0.129763 0.385343 +vt 0.068702 0.498276 +vt 0.129763 0.498276 +vt 0.129763 0.385343 +vt 0.068702 0.385343 +vt 0.007640 0.498276 +vt 0.068702 0.498276 +vt 0.068702 0.385343 +vt 0.007640 0.385343 +vt 0.435072 0.498276 +vt 0.496134 0.498276 +vt 0.496134 0.385343 +vt 0.435072 0.385343 +vt 0.321935 0.273341 +vt 0.321962 0.201250 +vt 0.321962 0.201250 +vt 0.321935 0.273341 +vt 0.234927 0.237263 +vt 0.321935 0.273341 +vt 0.270940 0.324298 +vt 0.198849 0.324271 +vt 0.147891 0.273276 +vt 0.147918 0.201184 +vt 0.198914 0.150227 +vt 0.271005 0.150254 +vt 0.321962 0.201250 +vt 0.143227 0.361033 +vt 0.143227 0.144695 +vt 0.135916 0.138034 +vt 0.135916 0.368993 +vt 0.143227 0.144695 +vt 0.359565 0.144695 +vt 0.366875 0.138034 +vt 0.135916 0.138034 +vt 0.359565 0.144695 +vt 0.359565 0.361033 +vt 0.366875 0.368993 +vt 0.366875 0.138034 +vt 0.359565 0.361033 +vt 0.143227 0.361033 +vt 0.135916 0.368993 +vt 0.366875 0.368993 +vt 0.135916 0.368993 +vt 0.135916 0.138034 +vt 0.113352 0.114821 +vt 0.113352 0.390908 +vt 0.135916 0.138034 +vt 0.366875 0.138034 +vt 0.389439 0.114821 +vt 0.113352 0.114821 +vt 0.366875 0.138034 +vt 0.366875 0.368993 +vt 0.389439 0.390908 +vt 0.389439 0.114821 +vt 0.366875 0.368993 +vt 0.135916 0.368993 +vt 0.113352 0.390908 +vt 0.389439 0.390908 +vt 0.113352 0.390908 +vt 0.113352 0.114821 +vt 0.121903 0.123372 +vt 0.121903 0.382356 +vt 0.113352 0.114821 +vt 0.389439 0.114821 +vt 0.380888 0.123372 +vt 0.121903 0.123372 +vt 0.389439 0.114821 +vt 0.389439 0.390908 +vt 0.380888 0.382356 +vt 0.380888 0.123372 +vt 0.389439 0.390908 +vt 0.113352 0.390908 +vt 0.121903 0.382356 +vt 0.380888 0.382356 +vt 0.004820 0.499440 +vt 0.497971 0.499440 +vt 0.497971 0.499440 +vt 0.004820 0.499440 +vt 0.497971 0.499440 +vt 0.497971 0.006289 +vt 0.497971 0.006289 +vt 0.497971 0.499440 +vt 0.497971 0.006289 +vt 0.004820 0.006289 +vt 0.004820 0.006289 +vt 0.497971 0.006289 +vt 0.004820 0.006289 +vt 0.004820 0.499440 +vt 0.004820 0.499440 +vt 0.004820 0.006289 +vt 0.497971 0.499440 +vt 0.004820 0.499440 +vt 0.497971 0.006289 +vt 0.497971 0.499440 +vt 0.004820 0.006289 +vt 0.497971 0.006289 +vt 0.004820 0.499440 +vt 0.004820 0.006289 +vt 0.491654 0.493123 +vt 0.011137 0.493123 +vt 0.491654 0.012605 +vt 0.491654 0.493123 +vt 0.011137 0.012605 +vt 0.491654 0.012605 +vt 0.011137 0.493123 +vt 0.011137 0.012605 +vt 0.482370 0.483838 +vt 0.020421 0.483838 +vt 0.482370 0.021890 +vt 0.482370 0.483838 +vt 0.020421 0.021890 +vt 0.482370 0.021890 +vt 0.020421 0.483838 +vt 0.020421 0.021890 +vt 0.470567 0.472035 +vt 0.032224 0.472035 +vt 0.470567 0.033693 +vt 0.470567 0.472035 +vt 0.032224 0.033693 +vt 0.470567 0.033693 +vt 0.032224 0.472035 +vt 0.032224 0.033693 +vt 0.032224 0.472035 +vt 0.470567 0.472035 +vt 0.459013 0.460481 +vt 0.043778 0.460481 +vt 0.470567 0.472035 +vt 0.470567 0.033693 +vt 0.459013 0.045247 +vt 0.459013 0.460481 +vt 0.470567 0.033693 +vt 0.032224 0.033693 +vt 0.043778 0.045247 +vt 0.459013 0.045247 +vt 0.032224 0.033693 +vt 0.032224 0.472035 +vt 0.043778 0.460481 +vt 0.043778 0.045247 +vt 0.098754 0.100222 +vt 0.098754 0.405506 +vt 0.404037 0.100222 +vt 0.098754 0.100222 +vt 0.404037 0.405506 +vt 0.404037 0.100222 +vt 0.098754 0.405506 +vt 0.404037 0.405506 +vt 0.094840 0.096308 +vt 0.094840 0.409420 +vt 0.407951 0.096308 +vt 0.094840 0.096308 +vt 0.407951 0.409420 +vt 0.407951 0.096308 +vt 0.094840 0.409420 +vt 0.407951 0.409420 +vt 0.087012 0.088481 +vt 0.087012 0.417248 +vt 0.415779 0.088481 +vt 0.087012 0.088481 +vt 0.415779 0.417248 +vt 0.415779 0.088481 +vt 0.087012 0.417248 +vt 0.415779 0.417248 +vt 0.586243 0.413570 +vt 0.586243 0.086583 +vt 0.504496 0.004836 +vt 0.504496 0.495317 +vt 0.586243 0.086583 +vt 0.913231 0.086583 +vt 0.994978 0.004836 +vt 0.504496 0.004836 +vt 0.913231 0.086583 +vt 0.913231 0.413570 +vt 0.994978 0.495317 +vt 0.994978 0.004836 +vt 0.913231 0.413570 +vt 0.586243 0.413570 +vt 0.504496 0.495317 +vt 0.994978 0.495317 +vt 0.052083 0.452177 +vt 0.052083 0.053552 +vt 0.043778 0.045247 +vt 0.043778 0.460481 +vt 0.052083 0.053552 +vt 0.450708 0.053552 +vt 0.459013 0.045247 +vt 0.043778 0.045247 +vt 0.450708 0.053552 +vt 0.450708 0.452177 +vt 0.459013 0.460481 +vt 0.459013 0.045247 +vt 0.450708 0.452177 +vt 0.052083 0.452177 +vt 0.043778 0.460481 +vt 0.459013 0.460481 +vt 0.997798 0.502710 +vt 0.503545 0.502710 +vt 0.503545 0.996963 +vt 0.997798 0.996963 +vt 0.497971 0.006289 +vt 0.497971 0.499440 +vt 0.004820 0.499440 +vt 0.004820 0.006289 +vt 0.366183 0.254192 +vt 0.376207 0.221754 +vt 0.430543 0.221754 +vt 0.410142 0.287774 +vt 0.339940 0.274240 +vt 0.356731 0.328576 +vt 0.307501 0.274241 +vt 0.290711 0.328576 +vt 0.281258 0.254192 +vt 0.237300 0.287774 +vt 0.271234 0.221754 +vt 0.216899 0.221754 +vt 0.281258 0.189315 +vt 0.237300 0.155734 +vt 0.307501 0.169267 +vt 0.290711 0.114932 +vt 0.339940 0.169267 +vt 0.356731 0.114932 +vt 0.366183 0.189315 +vt 0.410142 0.155734 +vt 0.351262 0.242793 +vt 0.357763 0.221754 +vt 0.334240 0.255796 +vt 0.313201 0.255796 +vt 0.296180 0.242793 +vt 0.289678 0.221754 +vt 0.296180 0.200714 +vt 0.313201 0.187711 +vt 0.334240 0.187711 +vt 0.351262 0.200714 +vt 0.350121 0.494170 +vt 0.396949 0.494170 +vt 0.396949 0.469050 +vt 0.350121 0.469050 +vt 0.300793 0.494170 +vt 0.350121 0.494170 +vt 0.350121 0.469050 +vt 0.300793 0.469050 +vt 0.249801 0.494170 +vt 0.300793 0.494170 +vt 0.300793 0.469050 +vt 0.249801 0.469050 +vt 0.200473 0.494170 +vt 0.249801 0.494170 +vt 0.249801 0.469050 +vt 0.200473 0.469050 +vt 0.153645 0.494170 +vt 0.200473 0.494170 +vt 0.200473 0.469050 +vt 0.153645 0.469050 +vt 0.106818 0.494170 +vt 0.153645 0.494170 +vt 0.153645 0.469050 +vt 0.106818 0.469050 +vt 0.057489 0.494170 +vt 0.106818 0.494170 +vt 0.106818 0.469050 +vt 0.057489 0.469050 +vt 0.006498 0.494170 +vt 0.057489 0.494170 +vt 0.057489 0.469050 +vt 0.006498 0.469050 +vt 0.443776 0.494170 +vt 0.493105 0.494170 +vt 0.493105 0.469050 +vt 0.443776 0.469050 +vt 0.396949 0.494170 +vt 0.443776 0.494170 +vt 0.443776 0.469050 +vt 0.396949 0.469050 +vt 0.350121 0.469050 +vt 0.396949 0.469050 +vt 0.396949 0.467794 +vt 0.350121 0.467794 +vt 0.300793 0.469050 +vt 0.350121 0.469050 +vt 0.350121 0.467794 +vt 0.300793 0.467794 +vt 0.249801 0.469050 +vt 0.300793 0.469050 +vt 0.300793 0.467794 +vt 0.249801 0.467794 +vt 0.200473 0.469050 +vt 0.249801 0.469050 +vt 0.249801 0.467794 +vt 0.200473 0.467794 +vt 0.153645 0.469050 +vt 0.200473 0.469050 +vt 0.200473 0.467794 +vt 0.153645 0.467794 +vt 0.106818 0.469050 +vt 0.153645 0.469050 +vt 0.153645 0.467794 +vt 0.106818 0.467794 +vt 0.057489 0.469050 +vt 0.106818 0.469050 +vt 0.106818 0.467794 +vt 0.057489 0.467794 +vt 0.006498 0.469050 +vt 0.057489 0.469050 +vt 0.057489 0.467794 +vt 0.006498 0.467794 +vt 0.443776 0.469050 +vt 0.493105 0.469050 +vt 0.493105 0.467794 +vt 0.443776 0.467794 +vt 0.396949 0.469050 +vt 0.443776 0.469050 +vt 0.443776 0.467794 +vt 0.396949 0.467794 +vt 0.350121 0.467794 +vt 0.396949 0.467794 +vt 0.396949 0.442675 +vt 0.350121 0.442675 +vt 0.300793 0.467794 +vt 0.350121 0.467794 +vt 0.350121 0.442675 +vt 0.300793 0.442675 +vt 0.249801 0.467794 +vt 0.300793 0.467794 +vt 0.300793 0.442675 +vt 0.249801 0.442675 +vt 0.200473 0.467794 +vt 0.249801 0.467794 +vt 0.249801 0.442675 +vt 0.200473 0.442675 +vt 0.153645 0.467794 +vt 0.200473 0.467794 +vt 0.200473 0.442675 +vt 0.153645 0.442675 +vt 0.106818 0.467794 +vt 0.153645 0.467794 +vt 0.153645 0.442675 +vt 0.106818 0.442675 +vt 0.057489 0.467794 +vt 0.106818 0.467794 +vt 0.106818 0.442675 +vt 0.057489 0.442675 +vt 0.006498 0.467794 +vt 0.057489 0.467794 +vt 0.057489 0.442675 +vt 0.006498 0.442675 +vt 0.443776 0.467794 +vt 0.493105 0.467794 +vt 0.493105 0.442675 +vt 0.443776 0.442675 +vt 0.396949 0.467794 +vt 0.443776 0.467794 +vt 0.443776 0.442675 +vt 0.396949 0.442675 +vt 0.350121 0.442675 +vt 0.396949 0.442675 +vt 0.396949 0.436395 +vt 0.350121 0.436395 +vt 0.300793 0.442675 +vt 0.350121 0.442675 +vt 0.350121 0.436395 +vt 0.300793 0.436395 +vt 0.249801 0.442675 +vt 0.300793 0.442675 +vt 0.300793 0.436395 +vt 0.249801 0.436395 +vt 0.200473 0.442675 +vt 0.249801 0.442675 +vt 0.249801 0.436395 +vt 0.200473 0.436395 +vt 0.153645 0.442675 +vt 0.200473 0.442675 +vt 0.200473 0.436395 +vt 0.153645 0.436395 +vt 0.106818 0.442675 +vt 0.153645 0.442675 +vt 0.153645 0.436395 +vt 0.106818 0.436395 +vt 0.057489 0.442675 +vt 0.106818 0.442675 +vt 0.106818 0.436395 +vt 0.057489 0.436395 +vt 0.006498 0.442675 +vt 0.057489 0.442675 +vt 0.057489 0.436395 +vt 0.006498 0.436395 +vt 0.443776 0.442675 +vt 0.493105 0.442675 +vt 0.493105 0.436395 +vt 0.443776 0.436395 +vt 0.396949 0.442675 +vt 0.443776 0.442675 +vt 0.443776 0.436395 +vt 0.396949 0.436395 +vt 0.350121 0.436395 +vt 0.396949 0.436395 +vt 0.396949 0.423835 +vt 0.350121 0.423835 +vt 0.300793 0.436395 +vt 0.350121 0.436395 +vt 0.350121 0.423835 +vt 0.300793 0.423835 +vt 0.249801 0.436395 +vt 0.300793 0.436395 +vt 0.300793 0.423835 +vt 0.249801 0.423835 +vt 0.200473 0.436395 +vt 0.249801 0.436395 +vt 0.249801 0.423835 +vt 0.200473 0.423835 +vt 0.153645 0.436395 +vt 0.200473 0.436395 +vt 0.200473 0.423835 +vt 0.153645 0.423835 +vt 0.106818 0.436395 +vt 0.153645 0.436395 +vt 0.153645 0.423835 +vt 0.106818 0.423835 +vt 0.057489 0.436395 +vt 0.106818 0.436395 +vt 0.106818 0.423835 +vt 0.057489 0.423835 +vt 0.006498 0.436395 +vt 0.057489 0.436395 +vt 0.057489 0.423835 +vt 0.006498 0.423835 +vt 0.443776 0.436395 +vt 0.493105 0.436395 +vt 0.493105 0.423835 +vt 0.443776 0.423835 +vt 0.396949 0.436395 +vt 0.443776 0.436395 +vt 0.443776 0.423835 +vt 0.396949 0.423835 +vt 0.350121 0.423835 +vt 0.396949 0.423835 +vt 0.396949 0.417555 +vt 0.350121 0.417555 +vt 0.300793 0.423835 +vt 0.350121 0.423835 +vt 0.350121 0.417555 +vt 0.300793 0.417555 +vt 0.249801 0.423835 +vt 0.300793 0.423835 +vt 0.300793 0.417555 +vt 0.249801 0.417555 +vt 0.200473 0.423835 +vt 0.249801 0.423835 +vt 0.249801 0.417555 +vt 0.200473 0.417555 +vt 0.153645 0.423835 +vt 0.200473 0.423835 +vt 0.200473 0.417555 +vt 0.153645 0.417555 +vt 0.106818 0.423835 +vt 0.153645 0.423835 +vt 0.153645 0.417555 +vt 0.106818 0.417555 +vt 0.057489 0.423835 +vt 0.106818 0.423835 +vt 0.106818 0.417555 +vt 0.057489 0.417555 +vt 0.006498 0.423835 +vt 0.057489 0.423835 +vt 0.057489 0.417555 +vt 0.006498 0.417555 +vt 0.443776 0.423835 +vt 0.493105 0.423835 +vt 0.493105 0.417555 +vt 0.443776 0.417555 +vt 0.396949 0.423835 +vt 0.443776 0.423835 +vt 0.443776 0.417555 +vt 0.396949 0.417555 +vt 0.350121 0.417555 +vt 0.396949 0.417555 +vt 0.396949 0.404768 +vt 0.350121 0.404768 +vt 0.300793 0.417555 +vt 0.350121 0.417555 +vt 0.350121 0.404768 +vt 0.300793 0.404768 +vt 0.249801 0.417555 +vt 0.300793 0.417555 +vt 0.300793 0.404768 +vt 0.249801 0.404768 +vt 0.200473 0.417555 +vt 0.249801 0.417555 +vt 0.249801 0.404768 +vt 0.200473 0.404768 +vt 0.153645 0.417555 +vt 0.200473 0.417555 +vt 0.200473 0.404768 +vt 0.153645 0.404768 +vt 0.106818 0.417555 +vt 0.153645 0.417555 +vt 0.153645 0.404768 +vt 0.106818 0.404768 +vt 0.057489 0.417555 +vt 0.106818 0.417555 +vt 0.106818 0.404768 +vt 0.057489 0.404768 +vt 0.006498 0.417555 +vt 0.057489 0.417555 +vt 0.057489 0.404768 +vt 0.006498 0.404768 +vt 0.443776 0.417555 +vt 0.493105 0.417555 +vt 0.493105 0.404768 +vt 0.443776 0.404768 +vt 0.396949 0.417555 +vt 0.443776 0.417555 +vt 0.443776 0.404768 +vt 0.396949 0.404768 +vt 0.350998 0.547962 +vt 0.398319 0.547961 +vt 0.398319 0.498824 +vt 0.350998 0.498825 +vt 0.301150 0.547961 +vt 0.301150 0.498825 +vt 0.249620 0.547961 +vt 0.249620 0.498825 +vt 0.199772 0.547962 +vt 0.199772 0.498825 +vt 0.152451 0.547962 +vt 0.152451 0.498824 +vt 0.105130 0.547961 +vt 0.105130 0.498824 +vt 0.055282 0.547962 +vt 0.055282 0.498824 +vt 0.003753 0.547962 +vt 0.003753 0.498824 +vt 0.445640 0.547961 +vt 0.495488 0.547962 +vt 0.495488 0.498824 +vt 0.445640 0.498824 +vt 0.350998 0.737698 +vt 0.398319 0.737698 +vt 0.301150 0.737698 +vt 0.249620 0.737698 +vt 0.199772 0.737698 +vt 0.152451 0.737698 +vt 0.105130 0.737698 +vt 0.055282 0.737698 +vt 0.003753 0.737698 +vt 0.445640 0.737698 +vt 0.495488 0.737698 +vt 0.350998 0.858405 +vt 0.398319 0.858405 +vt 0.301150 0.858405 +vt 0.249620 0.858405 +vt 0.199772 0.858405 +vt 0.152451 0.858405 +vt 0.105130 0.858405 +vt 0.055282 0.858405 +vt 0.003753 0.858405 +vt 0.445640 0.858405 +vt 0.495488 0.858405 +vt 0.350998 0.961982 +vt 0.398319 0.961982 +vt 0.301150 0.961982 +vt 0.249620 0.961982 +vt 0.199772 0.961982 +vt 0.152451 0.961982 +vt 0.105130 0.961982 +vt 0.055282 0.961982 +vt 0.003753 0.961982 +vt 0.445640 0.961982 +vt 0.495488 0.961982 +vt 0.350998 0.996654 +vt 0.398319 0.996654 +vt 0.301150 0.996654 +vt 0.249620 0.996654 +vt 0.199772 0.996654 +vt 0.152451 0.996654 +vt 0.105130 0.996654 +vt 0.055282 0.996654 +vt 0.003753 0.996654 +vt 0.445640 0.996654 +vt 0.495488 0.996654 +vn 0.000001 -0.000117 -1.000000 +vn 0.000007 -0.000119 -1.000000 +vn 0.000004 -0.000642 -1.000000 +vn 0.000290 -0.001097 -0.999999 +vn 0.965539 -0.259953 0.012557 +vn 0.960748 -0.276359 0.024272 +vn 0.995038 -0.099144 0.008333 +vn 0.997311 0.073275 0.000826 +vn 0.384905 -0.746403 0.542891 +vn -0.062420 -0.728758 0.681921 +vn 0.161475 -0.510903 0.844336 +vn 0.298440 -0.528902 0.794478 +vn -0.388088 -0.822360 0.416066 +vn -0.374937 -0.503238 0.778571 +vn -0.967185 -0.253827 0.011142 +vn -0.969696 -0.243379 0.021376 +vn -0.995359 -0.095953 0.007360 +vn -0.997773 0.066697 0.000871 +vn -0.000005 -0.000117 -1.000000 +vn -0.000578 -0.001225 -0.999999 +vn -0.002059 0.162154 -0.986763 +vn 0.036715 0.227361 -0.973118 +vn 0.988150 0.153490 0.000530 +vn 0.997092 0.076202 0.000795 +vn 0.419290 0.355620 0.835302 +vn 0.335340 0.314686 0.887986 +vn 0.476829 0.120448 0.870704 +vn 0.548589 -0.115983 0.828008 +vn -0.425538 0.336785 0.839936 +vn -0.326355 0.383871 0.863791 +vn -0.479491 0.111072 0.870489 +vn -0.546378 -0.151051 0.823805 +vn -0.988094 0.153853 0.000548 +vn -0.996980 0.077652 0.000810 +vn -0.071204 0.307808 -0.948780 +vn 0.134041 0.542848 -0.829065 +vn 0.038742 0.586621 -0.808935 +vn 0.999191 -0.037450 -0.014645 +vn 0.997224 -0.066926 -0.032638 +vn 0.508477 -0.486691 0.710340 +vn 0.518399 -0.586423 0.622391 +vn -0.510691 -0.477362 0.715067 +vn -0.519541 -0.586094 0.621748 +vn -0.999321 -0.034320 -0.013421 +vn -0.997248 -0.066385 -0.032993 +vn -0.208233 0.626135 -0.751394 +vn 0.208454 0.614903 -0.760553 +vn 0.003597 0.581754 -0.813357 +vn 0.994885 -0.089661 -0.046525 +vn 0.994269 -0.101688 -0.032983 +vn 0.510524 -0.657019 0.554699 +vn 0.512927 -0.632907 0.579944 +vn -0.512007 -0.660652 0.548989 +vn -0.514396 -0.638014 0.573004 +vn -0.992961 -0.104288 -0.056137 +vn -0.993472 -0.105450 -0.043510 +vn -0.215729 0.522222 -0.825073 +vn 0.214294 0.359182 -0.908332 +vn 0.000134 0.334072 -0.942548 +vn 0.997269 -0.072312 -0.015018 +vn 0.998775 -0.049471 -0.001064 +vn 0.525393 -0.499573 0.688759 +vn 0.520961 -0.381681 0.763491 +vn -0.527026 -0.502395 0.685451 +vn -0.522284 -0.373646 0.766556 +vn -0.997005 -0.073521 -0.023992 +vn -0.999371 -0.035442 -0.000762 +vn -0.214604 0.292047 -0.932016 +vn -0.000002 -0.996240 0.086630 +vn 0.254654 -0.964745 -0.066466 +vn -0.000002 -0.978728 -0.205161 +vn 0.384905 -0.746403 0.542891 +vn -0.062420 -0.728758 0.681921 +vn -0.388088 -0.822360 0.416066 +vn -0.254657 -0.964744 -0.066466 +vn 0.215116 0.223526 -0.950664 +vn -0.074129 0.228601 -0.970694 +vn 1.000000 0.000000 -0.000000 +vn 1.000000 0.000000 -0.000000 +vn 0.532664 -0.238851 0.811923 +vn 0.525606 -0.243348 0.815181 +vn -0.532938 -0.238769 0.811767 +vn -0.526504 -0.236645 0.816574 +vn -1.000000 -0.000000 0.000000 +vn -1.000000 -0.000000 0.000000 +vn -0.212589 0.222631 -0.951442 +vn 0.000117 0.000000 -1.000000 +vn 0.000118 0.000007 -1.000000 +vn 0.000642 0.000004 -1.000000 +vn 0.001097 0.000289 -0.999999 +vn 0.259953 0.965539 0.012557 +vn 0.276358 0.960748 0.024272 +vn 0.099144 0.995038 0.008333 +vn -0.073275 0.997311 0.000826 +vn 0.746403 0.384905 0.542891 +vn 0.728758 -0.062420 0.681921 +vn 0.510903 0.161476 0.844336 +vn 0.528902 0.298440 0.794478 +vn 0.822360 -0.388088 0.416066 +vn 0.503238 -0.374936 0.778572 +vn 0.253827 -0.967185 0.011142 +vn 0.243379 -0.969696 0.021376 +vn 0.095953 -0.995359 0.007360 +vn -0.066697 -0.997773 0.000871 +vn 0.000117 -0.000006 -1.000000 +vn 0.001225 -0.000578 -0.999999 +vn -0.162154 -0.002061 -0.986763 +vn -0.227361 0.036714 -0.973118 +vn -0.153490 0.988150 0.000530 +vn -0.076202 0.997092 0.000795 +vn -0.355620 0.419290 0.835302 +vn -0.314686 0.335340 0.887986 +vn -0.120448 0.476829 0.870704 +vn 0.115983 0.548589 0.828008 +vn -0.336785 -0.425537 0.839937 +vn -0.383871 -0.326354 0.863792 +vn -0.111072 -0.479490 0.870490 +vn 0.151051 -0.546377 0.823805 +vn -0.153853 -0.988094 0.000549 +vn -0.077652 -0.996980 0.000810 +vn -0.307808 -0.071204 -0.948780 +vn -0.542849 0.134040 -0.829065 +vn -0.586621 0.038742 -0.808935 +vn 0.037450 0.999191 -0.014646 +vn 0.066926 0.997224 -0.032638 +vn 0.486691 0.508477 0.710340 +vn 0.586423 0.518399 0.622390 +vn 0.477362 -0.510691 0.715067 +vn 0.586095 -0.519541 0.621748 +vn 0.034320 -0.999321 -0.013421 +vn 0.066385 -0.997248 -0.032993 +vn -0.626135 -0.208233 -0.751394 +vn -0.614903 0.208454 -0.760553 +vn -0.581754 0.003596 -0.813357 +vn 0.089661 0.994885 -0.046525 +vn 0.101687 0.994269 -0.032983 +vn 0.657019 0.510524 0.554699 +vn 0.632907 0.512927 0.579944 +vn 0.660652 -0.512006 0.548989 +vn 0.638015 -0.514396 0.573004 +vn 0.104288 -0.992961 -0.056137 +vn 0.105450 -0.993472 -0.043510 +vn -0.522222 -0.215730 -0.825073 +vn -0.359182 0.214294 -0.908332 +vn -0.334072 0.000134 -0.942547 +vn 0.072312 0.997269 -0.015018 +vn 0.049471 0.998775 -0.001064 +vn 0.499573 0.525393 0.688759 +vn 0.381681 0.520961 0.763491 +vn 0.502395 -0.527026 0.685451 +vn 0.373646 -0.522284 0.766556 +vn 0.073521 -0.997005 -0.023992 +vn 0.035442 -0.999371 -0.000762 +vn -0.292047 -0.214604 -0.932016 +vn 0.996240 -0.000002 0.086630 +vn 0.964745 0.254654 -0.066466 +vn 0.978728 -0.000002 -0.205161 +vn 0.746403 0.384905 0.542891 +vn 0.728758 -0.062420 0.681921 +vn 0.822360 -0.388088 0.416066 +vn 0.964744 -0.254658 -0.066466 +vn -0.223526 0.215116 -0.950664 +vn -0.228601 -0.074129 -0.970694 +vn -0.000000 1.000000 -0.000000 +vn -0.000000 1.000000 -0.000000 +vn 0.238851 0.532664 0.811923 +vn 0.243348 0.525606 0.815181 +vn 0.238770 -0.532938 0.811767 +vn 0.236645 -0.526504 0.816574 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn -0.222631 -0.212589 -0.951442 +vn -0.000001 0.000116 -1.000000 +vn -0.000009 0.000119 -1.000000 +vn -0.000005 0.000642 -1.000000 +vn -0.000289 0.001096 -0.999999 +vn -0.965539 0.259953 0.012557 +vn -0.960748 0.276358 0.024272 +vn -0.995038 0.099144 0.008333 +vn -0.997311 -0.073275 0.000826 +vn -0.384905 0.746403 0.542891 +vn 0.062420 0.728758 0.681921 +vn -0.161475 0.510903 0.844336 +vn -0.298440 0.528902 0.794478 +vn 0.388088 0.822361 0.416066 +vn 0.374936 0.503239 0.778571 +vn 0.967185 0.253827 0.011142 +vn 0.969696 0.243379 0.021376 +vn 0.995359 0.095953 0.007360 +vn 0.997773 -0.066696 0.000871 +vn 0.000006 0.000116 -1.000000 +vn 0.000578 0.001225 -0.999999 +vn 0.002061 -0.162154 -0.986763 +vn -0.036715 -0.227361 -0.973118 +vn -0.988150 -0.153490 0.000530 +vn -0.997092 -0.076202 0.000795 +vn -0.419290 -0.355620 0.835302 +vn -0.335340 -0.314686 0.887986 +vn -0.476829 -0.120448 0.870704 +vn -0.548589 0.115983 0.828008 +vn 0.425538 -0.336785 0.839937 +vn 0.326355 -0.383871 0.863791 +vn 0.479490 -0.111072 0.870490 +vn 0.546377 0.151051 0.823806 +vn 0.988094 -0.153853 0.000549 +vn 0.996980 -0.077652 0.000810 +vn 0.071202 -0.307807 -0.948781 +vn -0.134041 -0.542849 -0.829065 +vn -0.038743 -0.586621 -0.808935 +vn -0.999191 0.037450 -0.014645 +vn -0.997224 0.066925 -0.032638 +vn -0.508477 0.486691 0.710340 +vn -0.518400 0.586423 0.622390 +vn 0.510690 0.477362 0.715067 +vn 0.519540 0.586095 0.621748 +vn 0.999321 0.034320 -0.013421 +vn 0.997248 0.066385 -0.032993 +vn 0.208233 -0.626135 -0.751394 +vn -0.208455 -0.614903 -0.760553 +vn -0.003597 -0.581754 -0.813357 +vn -0.994885 0.089660 -0.046525 +vn -0.994269 0.101687 -0.032983 +vn -0.510524 0.657019 0.554699 +vn -0.512927 0.632907 0.579944 +vn 0.512006 0.660652 0.548989 +vn 0.514396 0.638015 0.573004 +vn 0.992961 0.104288 -0.056137 +vn 0.993472 0.105451 -0.043510 +vn 0.215730 -0.522222 -0.825072 +vn -0.214294 -0.359182 -0.908332 +vn -0.000134 -0.334072 -0.942547 +vn -0.997269 0.072312 -0.015018 +vn -0.998775 0.049471 -0.001064 +vn -0.525393 0.499573 0.688759 +vn -0.520961 0.381681 0.763491 +vn 0.527026 0.502395 0.685451 +vn 0.522284 0.373646 0.766556 +vn 0.997005 0.073521 -0.023992 +vn 0.999371 0.035442 -0.000762 +vn 0.214604 -0.292047 -0.932016 +vn 0.000002 0.996240 0.086630 +vn -0.254654 0.964745 -0.066466 +vn 0.000002 0.978728 -0.205161 +vn -0.384905 0.746403 0.542891 +vn 0.062420 0.728758 0.681921 +vn 0.388088 0.822361 0.416066 +vn 0.254658 0.964744 -0.066466 +vn -0.215116 -0.223526 -0.950664 +vn 0.074129 -0.228601 -0.970694 +vn -1.000000 -0.000000 -0.000000 +vn -1.000000 -0.000000 -0.000000 +vn -0.532664 0.238851 0.811923 +vn -0.525606 0.243348 0.815181 +vn 0.532938 0.238770 0.811767 +vn 0.526504 0.236645 0.816574 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.212589 -0.222631 -0.951442 +vn -0.000117 -0.000002 -1.000000 +vn -0.000120 -0.000009 -1.000000 +vn -0.000642 -0.000005 -1.000000 +vn -0.001096 -0.000290 -0.999999 +vn -0.259953 -0.965540 0.012557 +vn -0.276358 -0.960748 0.024272 +vn -0.099144 -0.995038 0.008333 +vn 0.073275 -0.997311 0.000826 +vn -0.746403 -0.384905 0.542891 +vn -0.728758 0.062420 0.681921 +vn -0.510903 -0.161475 0.844336 +vn -0.528903 -0.298440 0.794478 +vn -0.822360 0.388088 0.416066 +vn -0.503238 0.374937 0.778571 +vn -0.253827 0.967185 0.011142 +vn -0.243379 0.969696 0.021376 +vn -0.095953 0.995359 0.007360 +vn 0.066697 0.997773 0.000871 +vn -0.000116 0.000005 -1.000000 +vn -0.001225 0.000578 -0.999999 +vn 0.162155 0.002059 -0.986763 +vn 0.227361 -0.036715 -0.973118 +vn 0.153490 -0.988150 0.000530 +vn 0.076203 -0.997092 0.000795 +vn 0.355621 -0.419290 0.835302 +vn 0.314686 -0.335340 0.887986 +vn 0.120448 -0.476829 0.870704 +vn -0.115983 -0.548589 0.828008 +vn 0.336785 0.425538 0.839937 +vn 0.383871 0.326355 0.863791 +vn 0.111072 0.479490 0.870490 +vn -0.151051 0.546377 0.823805 +vn 0.153853 0.988094 0.000548 +vn 0.077652 0.996980 0.000810 +vn 0.307808 0.071202 -0.948781 +vn 0.542849 -0.134041 -0.829065 +vn 0.586621 -0.038743 -0.808934 +vn -0.037450 -0.999191 -0.014645 +vn -0.066925 -0.997224 -0.032638 +vn -0.486691 -0.508477 0.710340 +vn -0.586423 -0.518400 0.622390 +vn -0.477362 0.510691 0.715067 +vn -0.586095 0.519541 0.621748 +vn -0.034320 0.999321 -0.013421 +vn -0.066385 0.997248 -0.032993 +vn 0.626135 0.208232 -0.751395 +vn 0.614903 -0.208454 -0.760553 +vn 0.581754 -0.003597 -0.813357 +vn -0.089660 -0.994885 -0.046525 +vn -0.101687 -0.994269 -0.032983 +vn -0.657019 -0.510525 0.554699 +vn -0.632907 -0.512927 0.579944 +vn -0.660652 0.512007 0.548988 +vn -0.638015 0.514396 0.573004 +vn -0.104288 0.992961 -0.056137 +vn -0.105451 0.993472 -0.043510 +vn 0.522222 0.215729 -0.825072 +vn 0.359182 -0.214295 -0.908331 +vn 0.334072 -0.000134 -0.942547 +vn -0.072312 -0.997269 -0.015018 +vn -0.049471 -0.998775 -0.001064 +vn -0.499573 -0.525393 0.688759 +vn -0.381681 -0.520961 0.763491 +vn -0.502395 0.527026 0.685451 +vn -0.373646 0.522284 0.766556 +vn -0.073521 0.997005 -0.023992 +vn -0.035442 0.999371 -0.000763 +vn 0.292047 0.214604 -0.932016 +vn -0.996240 0.000002 0.086630 +vn -0.964745 -0.254654 -0.066466 +vn -0.978728 0.000002 -0.205161 +vn -0.746403 -0.384905 0.542891 +vn -0.728758 0.062420 0.681921 +vn -0.822360 0.388088 0.416066 +vn -0.964744 0.254657 -0.066466 +vn 0.223526 -0.215116 -0.950664 +vn 0.228601 0.074129 -0.970694 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 -0.000000 +vn -0.238851 -0.532664 0.811923 +vn -0.243348 -0.525606 0.815181 +vn -0.238770 0.532938 0.811767 +vn -0.236645 0.526504 0.816574 +vn -0.000000 1.000000 0.000000 +vn -0.000000 1.000000 0.000000 +vn 0.222631 0.212589 -0.951442 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.706842 0.707371 0.000000 +vn 0.706842 0.707371 0.000000 +vn 0.706842 0.707371 0.000000 +vn 0.706842 0.707371 0.000000 +vn -0.000374 1.000000 0.000000 +vn -0.000374 1.000000 0.000000 +vn -0.000374 1.000000 0.000000 +vn -0.000374 1.000000 0.000000 +vn -0.707371 0.706842 0.000000 +vn -0.707371 0.706842 0.000000 +vn -0.707371 0.706842 0.000000 +vn -0.707371 0.706842 0.000000 +vn -1.000000 -0.000374 0.000000 +vn -1.000000 -0.000374 0.000000 +vn -1.000000 -0.000374 0.000000 +vn -1.000000 -0.000374 0.000000 +vn -0.706842 -0.707371 -0.000000 +vn -0.706842 -0.707371 -0.000000 +vn -0.706842 -0.707371 -0.000000 +vn -0.706842 -0.707371 0.000000 +vn 0.000374 -1.000000 -0.000000 +vn 0.000374 -1.000000 0.000000 +vn 0.000374 -1.000000 -0.000000 +vn 0.000374 -1.000000 -0.000000 +vn 0.707371 -0.706842 -0.000000 +vn 0.707371 -0.706842 -0.000000 +vn 0.707371 -0.706842 -0.000000 +vn 0.707371 -0.706842 -0.000000 +vn 1.000000 0.000374 0.000000 +vn 1.000000 0.000374 0.000000 +vn 1.000000 0.000374 0.000000 +vn 1.000000 0.000374 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn -0.099506 0.000000 0.995037 +vn -0.099506 0.000000 0.995037 +vn -0.099506 0.000000 0.995037 +vn -0.099506 0.000000 0.995037 +vn 0.000000 -0.099506 0.995037 +vn 0.000000 -0.099506 0.995037 +vn 0.000000 -0.099506 0.995037 +vn 0.000000 -0.099506 0.995037 +vn 0.099506 0.000000 0.995037 +vn 0.099506 0.000000 0.995037 +vn 0.099506 0.000000 0.995037 +vn 0.099506 0.000000 0.995037 +vn 0.000000 0.099506 0.995037 +vn 0.000000 0.099506 0.995037 +vn 0.000000 0.099506 0.995037 +vn 0.000000 0.099506 0.995037 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -0.929987 0.000000 0.367592 +vn -0.677867 0.000000 0.735184 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -0.929987 0.367592 +vn 0.000000 -0.677867 0.735184 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.929987 0.000000 0.367592 +vn 0.677867 0.000000 0.735184 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 0.929987 0.367592 +vn 0.000000 0.677867 0.735184 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn -0.000000 -1.000000 0.000000 +vn -0.000000 -1.000000 0.000000 +vn -0.000000 -1.000000 0.000000 +vn -0.000000 -1.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.967538 0.252725 +vn 0.000000 0.862856 0.505449 +vn 0.967538 0.000000 0.252725 +vn 0.862856 0.000000 0.505449 +vn -0.000000 -0.967538 0.252725 +vn -0.000000 -0.862856 0.505449 +vn -0.967538 0.000000 0.252725 +vn -0.862856 0.000000 0.505449 +vn 0.000000 0.862856 0.505449 +vn 0.000000 0.967538 0.252725 +vn 0.862856 0.000000 0.505449 +vn 0.967538 0.000000 0.252725 +vn -0.000000 -0.862856 0.505449 +vn -0.000000 -0.967538 0.252725 +vn -0.862856 0.000000 0.505449 +vn -0.967538 0.000000 0.252725 +vn 0.000000 0.967538 0.252725 +vn 0.000000 0.862856 0.505449 +vn 0.967538 0.000000 0.252724 +vn 0.862857 0.000000 0.505449 +vn -0.000000 -0.967538 0.252724 +vn -0.000000 -0.862857 0.505448 +vn -0.967538 0.000000 0.252725 +vn -0.862857 0.000000 0.505449 +vn 0.000000 0.707107 0.707107 +vn 0.000000 0.707107 0.707107 +vn 0.707108 0.000000 0.707106 +vn 0.707107 0.000000 0.707107 +vn -0.000000 -0.707108 0.707105 +vn -0.000000 -0.707108 0.707105 +vn -0.707108 0.000000 0.707106 +vn -0.707108 0.000000 0.707105 +vn 0.000000 0.099506 0.995037 +vn 0.000000 0.099506 0.995037 +vn 0.000000 0.099506 0.995037 +vn 0.000000 0.099506 0.995037 +vn 0.099506 0.000000 0.995037 +vn 0.099501 0.000000 0.995037 +vn 0.099506 0.000000 0.995037 +vn 0.099506 0.000000 0.995037 +vn -0.000000 -0.099501 0.995037 +vn -0.000000 -0.099501 0.995037 +vn -0.000000 -0.099501 0.995037 +vn -0.000000 -0.099501 0.995037 +vn -0.099501 0.000000 0.995037 +vn -0.099506 0.000000 0.995037 +vn -0.099501 0.000000 0.995037 +vn -0.099501 0.000000 0.995037 +vn -0.275482 0.000000 0.961306 +vn -0.187896 0.000000 0.982189 +vn 0.000000 -0.275482 0.961306 +vn 0.000000 -0.187896 0.982189 +vn 0.275482 0.000000 0.961306 +vn 0.187896 0.000000 0.982189 +vn 0.000000 0.275482 0.961306 +vn 0.000000 0.187896 0.982189 +vn -0.516067 0.000000 0.856548 +vn -0.903649 0.000000 0.428274 +vn 0.000000 -0.516067 0.856548 +vn 0.000000 -0.903649 0.428274 +vn 0.516067 0.000000 0.856548 +vn 0.903649 0.000000 0.428274 +vn 0.000000 0.516067 0.856548 +vn 0.000000 0.903649 0.428274 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn -0.049938 0.000000 0.998752 +vn -0.049938 0.000000 0.998752 +vn -0.049938 0.000000 0.998752 +vn -0.049938 0.000000 0.998752 +vn 0.000000 -0.049938 0.998752 +vn 0.000000 -0.049938 0.998752 +vn 0.000000 -0.049938 0.998752 +vn 0.000000 -0.049938 0.998752 +vn 0.049938 0.000000 0.998752 +vn 0.049938 0.000000 0.998752 +vn 0.049938 0.000000 0.998752 +vn 0.049938 0.000000 0.998752 +vn 0.000000 0.049938 0.998752 +vn 0.000000 0.049938 0.998752 +vn 0.000000 0.049938 0.998752 +vn 0.000000 0.049938 0.998752 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 1.000000 -0.000002 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 -0.000002 +vn 0.000000 1.000000 -0.000005 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -0.000000 -1.000000 0.000002 +vn 0.000000 -1.000000 0.000005 +vn -0.000000 -1.000000 0.000002 +vn -0.000000 -1.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.562661 0.423331 -0.710072 +vn 0.704032 0.011758 -0.710070 +vn 0.582173 0.063049 -0.810617 +vn 0.433925 0.393201 -0.810618 +vn 0.206373 0.673207 -0.710072 +vn 0.119934 0.573161 -0.810618 +vn -0.228742 0.665939 -0.710072 +vn -0.239867 0.534192 -0.810618 +vn -0.576487 0.404302 -0.710072 +vn -0.508049 0.291177 -0.810618 +vn -0.704032 -0.011763 -0.710070 +vn -0.582173 -0.063055 -0.810616 +vn -0.562662 -0.423334 -0.710070 +vn -0.433926 -0.393204 -0.810616 +vn -0.206373 -0.673209 -0.710070 +vn -0.119934 -0.573164 -0.810616 +vn 0.228743 -0.665941 -0.710070 +vn 0.239869 -0.534195 -0.810616 +vn 0.576487 -0.404306 -0.710070 +vn 0.508049 -0.291182 -0.810616 +vn 0.745732 0.553468 -0.370886 +vn 0.928631 0.009435 -0.370885 +vn 0.277988 0.886096 -0.370886 +vn -0.295936 0.880264 -0.370886 +vn -0.756825 0.538201 -0.370886 +vn -0.928631 -0.009437 -0.370885 +vn -0.745732 -0.553469 -0.370885 +vn -0.277989 -0.886096 -0.370885 +vn 0.295937 -0.880265 -0.370885 +vn 0.756824 -0.538202 -0.370885 +vn 0.951056 0.309017 0.000000 +vn 0.951056 0.309017 0.000000 +vn 0.951056 0.309017 0.000000 +vn 0.951056 0.309017 0.000000 +vn 0.587785 0.809017 0.000000 +vn 0.587785 0.809017 0.000000 +vn 0.587785 0.809017 0.000000 +vn 0.587785 0.809017 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn -0.587785 0.809017 0.000000 +vn -0.587785 0.809017 0.000000 +vn -0.587785 0.809017 0.000000 +vn -0.587785 0.809017 0.000000 +vn -0.951056 0.309017 0.000000 +vn -0.951056 0.309017 0.000000 +vn -0.951056 0.309017 0.000000 +vn -0.951056 0.309017 0.000000 +vn -0.951056 -0.309017 0.000000 +vn -0.951056 -0.309017 -0.000000 +vn -0.951056 -0.309017 0.000000 +vn -0.951056 -0.309017 0.000000 +vn -0.587785 -0.809017 0.000000 +vn -0.587785 -0.809017 0.000000 +vn -0.587785 -0.809017 0.000000 +vn -0.587785 -0.809017 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.587785 -0.809017 0.000000 +vn 0.587785 -0.809017 0.000000 +vn 0.587785 -0.809017 0.000000 +vn 0.587785 -0.809017 0.000000 +vn 0.951056 -0.309017 -0.000000 +vn 0.951056 -0.309017 0.000000 +vn 0.951056 -0.309017 -0.000000 +vn 0.951056 -0.309017 -0.000000 +vn 0.047494 0.015432 0.998752 +vn 0.047493 0.015432 0.998752 +vn 0.047494 0.015432 0.998752 +vn 0.047494 0.015432 0.998752 +vn 0.029353 0.040401 0.998752 +vn 0.029353 0.040401 0.998752 +vn 0.029353 0.040401 0.998752 +vn 0.029353 0.040401 0.998752 +vn 0.000000 0.049938 0.998752 +vn 0.000000 0.049938 0.998752 +vn 0.000000 0.049938 0.998752 +vn 0.000000 0.049938 0.998752 +vn -0.029353 0.040401 0.998752 +vn -0.029353 0.040401 0.998752 +vn -0.029353 0.040401 0.998752 +vn -0.029353 0.040401 0.998752 +vn -0.047493 0.015431 0.998752 +vn -0.047494 0.015432 0.998752 +vn -0.047493 0.015431 0.998752 +vn -0.047493 0.015431 0.998752 +vn -0.047493 -0.015432 0.998752 +vn -0.047493 -0.015432 0.998752 +vn -0.047493 -0.015432 0.998752 +vn -0.047493 -0.015432 0.998752 +vn -0.029353 -0.040400 0.998752 +vn -0.029353 -0.040400 0.998752 +vn -0.029353 -0.040400 0.998752 +vn -0.029353 -0.040400 0.998752 +vn 0.000000 -0.049937 0.998752 +vn 0.000000 -0.049937 0.998752 +vn 0.000000 -0.049937 0.998752 +vn 0.000000 -0.049937 0.998752 +vn 0.029353 -0.040399 0.998752 +vn 0.029353 -0.040400 0.998752 +vn 0.029353 -0.040399 0.998752 +vn 0.029353 -0.040399 0.998752 +vn 0.047493 -0.015432 0.998752 +vn 0.047493 -0.015432 0.998752 +vn 0.047493 -0.015432 0.998752 +vn 0.047493 -0.015432 0.998752 +vn 0.951056 0.309017 0.000000 +vn 0.951056 0.309017 0.000000 +vn 0.951056 0.309017 0.000000 +vn 0.951056 0.309017 0.000000 +vn 0.587785 0.809017 0.000000 +vn 0.587785 0.809017 0.000000 +vn 0.587785 0.809017 0.000000 +vn 0.587785 0.809017 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn -0.587785 0.809017 0.000000 +vn -0.587785 0.809017 0.000000 +vn -0.587785 0.809017 0.000000 +vn -0.587785 0.809017 0.000000 +vn -0.951056 0.309017 0.000000 +vn -0.951056 0.309017 0.000000 +vn -0.951056 0.309017 0.000000 +vn -0.951056 0.309017 0.000000 +vn -0.951056 -0.309017 0.000000 +vn -0.951056 -0.309017 -0.000000 +vn -0.951056 -0.309017 0.000000 +vn -0.951056 -0.309017 0.000000 +vn -0.587785 -0.809017 0.000000 +vn -0.587785 -0.809017 0.000000 +vn -0.587785 -0.809017 0.000000 +vn -0.587785 -0.809017 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.587785 -0.809017 0.000000 +vn 0.587785 -0.809017 0.000000 +vn 0.587785 -0.809017 0.000000 +vn 0.587785 -0.809017 0.000000 +vn 0.951056 -0.309017 -0.000000 +vn 0.951056 -0.309017 0.000000 +vn 0.951056 -0.309017 -0.000000 +vn 0.951056 -0.309017 -0.000000 +vn 0.425325 0.138196 -0.894427 +vn 0.425326 0.138197 -0.894427 +vn 0.425325 0.138196 -0.894427 +vn 0.425325 0.138196 -0.894427 +vn 0.262866 0.361804 -0.894427 +vn 0.262865 0.361803 -0.894427 +vn 0.262866 0.361804 -0.894427 +vn 0.262866 0.361804 -0.894427 +vn -0.000000 0.447215 -0.894427 +vn 0.000000 0.447214 -0.894427 +vn -0.000000 0.447215 -0.894427 +vn -0.000000 0.447215 -0.894427 +vn -0.262865 0.361803 -0.894427 +vn -0.262866 0.361804 -0.894427 +vn -0.262865 0.361803 -0.894427 +vn -0.262865 0.361803 -0.894427 +vn -0.425326 0.138196 -0.894427 +vn -0.425325 0.138196 -0.894427 +vn -0.425326 0.138196 -0.894427 +vn -0.425326 0.138196 -0.894427 +vn -0.425326 -0.138196 -0.894427 +vn -0.425326 -0.138196 -0.894427 +vn -0.425326 -0.138196 -0.894427 +vn -0.425326 -0.138196 -0.894427 +vn -0.262865 -0.361804 -0.894427 +vn -0.262865 -0.361804 -0.894427 +vn -0.262865 -0.361804 -0.894427 +vn -0.262865 -0.361804 -0.894427 +vn 0.000000 -0.447214 -0.894427 +vn 0.000000 -0.447214 -0.894427 +vn 0.000000 -0.447214 -0.894427 +vn 0.000000 -0.447214 -0.894427 +vn 0.262865 -0.361804 -0.894427 +vn 0.262865 -0.361804 -0.894427 +vn 0.262865 -0.361804 -0.894427 +vn 0.262865 -0.361804 -0.894427 +vn 0.425326 -0.138196 -0.894427 +vn 0.425326 -0.138196 -0.894427 +vn 0.425326 -0.138196 -0.894427 +vn 0.425326 -0.138196 -0.894427 +vn 0.951056 0.309017 0.000000 +vn 0.951056 0.309017 0.000000 +vn 0.951056 0.309017 0.000000 +vn 0.951056 0.309017 0.000000 +vn 0.587786 0.809017 -0.000000 +vn 0.587785 0.809017 0.000000 +vn 0.587786 0.809017 -0.000000 +vn 0.587786 0.809017 -0.000000 +vn -0.000000 1.000000 0.000000 +vn -0.000000 1.000000 -0.000001 +vn -0.000000 1.000000 0.000000 +vn -0.000000 1.000000 0.000000 +vn -0.587785 0.809017 0.000000 +vn -0.587785 0.809017 0.000000 +vn -0.587785 0.809017 0.000000 +vn -0.587785 0.809017 0.000000 +vn -0.951056 0.309017 0.000000 +vn -0.951056 0.309017 0.000000 +vn -0.951056 0.309017 0.000000 +vn -0.951056 0.309017 0.000000 +vn -0.951056 -0.309017 0.000000 +vn -0.951056 -0.309017 -0.000000 +vn -0.951056 -0.309017 0.000000 +vn -0.951056 -0.309017 0.000000 +vn -0.587785 -0.809017 0.000000 +vn -0.587785 -0.809017 0.000000 +vn -0.587785 -0.809017 0.000000 +vn -0.587785 -0.809017 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.587785 -0.809017 0.000000 +vn 0.587785 -0.809017 0.000000 +vn 0.587785 -0.809017 0.000000 +vn 0.587785 -0.809017 0.000000 +vn 0.951056 -0.309017 -0.000000 +vn 0.951056 -0.309017 0.000000 +vn 0.951056 -0.309017 -0.000000 +vn 0.951056 -0.309017 -0.000000 +vn 0.425325 0.138197 0.894427 +vn 0.425326 0.138197 0.894427 +vn 0.425325 0.138197 0.894427 +vn 0.425325 0.138197 0.894427 +vn 0.262866 0.361803 0.894427 +vn 0.262866 0.361804 0.894427 +vn 0.262866 0.361803 0.894427 +vn 0.262866 0.361803 0.894427 +vn 0.000000 0.447214 0.894427 +vn -0.000000 0.447213 0.894427 +vn 0.000000 0.447214 0.894427 +vn 0.000000 0.447214 0.894427 +vn -0.262866 0.361804 0.894427 +vn -0.262865 0.361804 0.894427 +vn -0.262866 0.361804 0.894427 +vn -0.262866 0.361804 0.894427 +vn -0.425326 0.138197 0.894427 +vn -0.425326 0.138197 0.894427 +vn -0.425326 0.138197 0.894427 +vn -0.425326 0.138197 0.894427 +vn -0.425324 -0.138197 0.894428 +vn -0.425326 -0.138197 0.894427 +vn -0.425324 -0.138197 0.894428 +vn -0.425324 -0.138197 0.894428 +vn -0.262866 -0.361803 0.894427 +vn -0.262865 -0.361802 0.894428 +vn -0.262866 -0.361803 0.894427 +vn -0.262866 -0.361803 0.894427 +vn 0.000000 -0.447213 0.894427 +vn 0.000000 -0.447213 0.894427 +vn 0.000000 -0.447213 0.894427 +vn 0.000000 -0.447213 0.894427 +vn 0.262866 -0.361802 0.894427 +vn 0.262866 -0.361803 0.894427 +vn 0.262866 -0.361802 0.894427 +vn 0.262866 -0.361802 0.894427 +vn 0.425326 -0.138198 0.894427 +vn 0.425325 -0.138197 0.894427 +vn 0.425326 -0.138198 0.894427 +vn 0.425326 -0.138198 0.894427 +vn 0.951056 0.309017 0.000000 +vn 0.951056 0.309017 0.000001 +vn 0.951056 0.309017 0.000000 +vn 0.951056 0.309017 0.000000 +vn 0.587785 0.809017 0.000000 +vn 0.587785 0.809017 0.000000 +vn 0.587785 0.809017 0.000000 +vn 0.587785 0.809017 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn -0.587785 0.809017 0.000001 +vn -0.587785 0.809017 0.000000 +vn -0.587785 0.809017 0.000001 +vn -0.587785 0.809017 0.000001 +vn -0.951056 0.309017 0.000000 +vn -0.951056 0.309017 0.000001 +vn -0.951056 0.309017 0.000000 +vn -0.951056 0.309017 0.000000 +vn -0.951056 -0.309017 0.000000 +vn -0.951056 -0.309017 -0.000000 +vn -0.951056 -0.309017 0.000000 +vn -0.951056 -0.309017 0.000000 +vn -0.587785 -0.809017 0.000000 +vn -0.587785 -0.809017 0.000000 +vn -0.587785 -0.809017 0.000000 +vn -0.587785 -0.809017 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.587785 -0.809017 0.000000 +vn 0.587785 -0.809017 0.000000 +vn 0.587785 -0.809017 0.000000 +vn 0.587785 -0.809017 0.000000 +vn 0.951056 -0.309017 0.000001 +vn 0.951056 -0.309017 0.000000 +vn 0.951056 -0.309017 0.000001 +vn 0.951056 -0.309017 0.000001 +vn 0.808878 0.587853 -0.012040 +vn 0.999927 0.000136 -0.012040 +vn 0.928631 0.009435 -0.370885 +vn 0.745732 0.553468 -0.370886 +vn 0.308865 0.951030 -0.012040 +vn 0.277988 0.886096 -0.370886 +vn -0.309124 0.950945 -0.012040 +vn -0.295936 0.880264 -0.370886 +vn -0.809038 0.587632 -0.012040 +vn -0.756825 0.538201 -0.370886 +vn -0.999927 -0.000136 -0.012040 +vn -0.928631 -0.009437 -0.370885 +vn -0.808878 -0.587853 -0.012040 +vn -0.745732 -0.553469 -0.370885 +vn -0.308865 -0.951030 -0.012040 +vn -0.277989 -0.886096 -0.370885 +vn 0.309124 -0.950945 -0.012040 +vn 0.295937 -0.880265 -0.370885 +vn 0.809038 -0.587632 -0.012040 +vn 0.309124 -0.950945 -0.012040 +vn 0.295937 -0.880265 -0.370885 +vn 0.756824 -0.538202 -0.370885 +vn 0.797207 0.577639 0.175482 +vn 0.984482 -0.001267 0.175482 +vn 0.305427 0.935906 0.175482 +vn -0.303017 0.936689 0.175482 +vn -0.795718 0.579689 0.175482 +vn -0.984482 0.001267 0.175482 +vn -0.797207 -0.577639 0.175482 +vn -0.305426 -0.935906 0.175482 +vn 0.303017 -0.936689 0.175482 +vn 0.795718 -0.579689 0.175482 +vn 0.303017 -0.936689 0.175482 +vn 0.805510 0.586917 0.081747 +vn 0.996652 0.001359 0.081747 +vn 0.306690 0.948292 0.081747 +vn -0.309275 0.947452 0.081747 +vn -0.807107 0.584718 0.081747 +vn -0.996652 -0.001359 0.081747 +vn -0.805510 -0.586917 0.081747 +vn -0.306690 -0.948292 0.081747 +vn 0.309275 -0.947452 0.081747 +vn 0.807107 -0.584718 0.081747 +vn 0.309275 -0.947452 0.081747 +vn 0.768673 0.548289 -0.329426 +vn 0.944145 -0.008240 -0.329426 +vn 0.299593 0.895389 -0.329426 +vn -0.283921 0.900482 -0.329426 +vn -0.758987 0.561621 -0.329426 +vn -0.944145 0.008240 -0.329426 +vn -0.768673 -0.548289 -0.329426 +vn -0.299593 -0.895389 -0.329426 +vn 0.283921 -0.900482 -0.329426 +vn 0.758987 -0.561620 -0.329426 +vn 0.283921 -0.900482 -0.329426 +vn 0.726320 0.416280 -0.546965 +vn 0.832289 -0.090142 -0.546964 +vn 0.342922 0.763698 -0.546965 +vn -0.171461 0.819409 -0.546965 +vn -0.620351 0.562133 -0.546965 +vn -0.832288 0.090142 -0.546965 +vn -0.726320 -0.416280 -0.546965 +vn -0.342922 -0.763698 -0.546965 +vn 0.171461 -0.819409 -0.546965 +vn 0.620351 -0.562134 -0.546965 +vn 0.171461 -0.819409 -0.546965 +f 1/1/1 2/2/2 3/3/3 +f 3/3/3 4/4/4 1/1/1 +f 5/5/5 6/6/6 7/7/7 +f 7/7/7 8/8/8 5/5/5 +f 9/9/9 10/10/10 11/11/11 +f 11/11/11 12/12/12 9/9/9 +f 10/10/10 13/13/13 14/14/14 +f 14/14/14 11/11/11 10/10/10 +f 15/15/15 16/16/16 17/17/17 +f 17/17/17 18/18/18 15/15/15 +f 19/19/19 1/1/1 4/4/4 +f 4/4/4 20/20/20 19/19/19 +f 4/4/4 3/3/3 21/21/21 +f 21/21/21 22/22/22 4/4/4 +f 8/8/8 7/7/7 23/23/23 +f 23/23/23 24/24/24 8/8/8 +f 25/25/25 26/26/26 27/27/27 +f 27/27/27 28/28/28 25/25/25 +f 29/29/29 30/30/30 31/31/31 +f 31/31/31 32/32/32 29/29/29 +f 18/18/18 17/17/17 33/33/33 +f 33/33/33 34/34/34 18/18/18 +f 20/20/20 4/4/4 22/22/22 +f 22/22/22 35/35/35 20/20/20 +f 22/22/22 21/21/21 36/36/36 +f 36/36/36 37/37/37 22/22/22 +f 24/24/24 23/23/23 38/38/38 +f 38/38/38 39/39/39 24/24/24 +f 28/28/28 27/27/27 40/40/40 +f 40/40/40 41/41/41 28/28/28 +f 32/32/32 31/31/31 42/42/42 +f 42/42/42 43/43/43 32/32/32 +f 34/34/34 33/33/33 44/44/44 +f 44/44/44 45/45/45 34/34/34 +f 35/35/35 22/22/22 37/37/37 +f 37/37/37 46/46/46 35/35/35 +f 37/37/37 36/36/36 47/47/47 +f 47/47/47 48/48/48 37/37/37 +f 39/39/39 38/38/38 49/49/49 +f 49/49/49 50/50/50 39/39/39 +f 41/41/41 40/40/40 51/51/51 +f 51/51/51 52/52/52 41/41/41 +f 43/43/43 42/42/42 53/53/53 +f 53/53/53 54/54/54 43/43/43 +f 45/45/45 44/44/44 55/55/55 +f 55/55/55 56/56/56 45/45/45 +f 46/46/46 37/37/37 48/48/48 +f 48/48/48 57/57/57 46/46/46 +f 48/48/48 47/47/47 58/58/58 +f 58/58/58 59/59/59 48/48/48 +f 50/50/50 49/49/49 60/60/60 +f 60/60/60 61/61/61 50/50/50 +f 52/52/52 51/51/51 62/62/62 +f 62/62/62 63/63/63 52/52/52 +f 54/54/54 53/53/53 64/64/64 +f 64/64/64 65/65/65 54/54/54 +f 56/56/56 55/55/55 66/66/66 +f 66/66/66 67/67/67 56/56/56 +f 57/57/57 48/48/48 59/59/59 +f 59/59/59 68/68/68 57/57/57 +f 69/69/69 70/70/70 71/71/71 +f 69/69/69 72/72/72 70/70/70 +f 69/69/69 73/73/73 72/72/72 +f 69/69/69 74/74/74 73/73/73 +f 69/69/69 75/75/75 74/74/74 +f 69/69/69 71/71/71 75/75/75 +f 76/76/76 77/77/77 59/59/59 +f 76/76/76 59/59/59 58/58/58 +f 78/78/78 79/79/79 61/61/61 +f 78/78/78 61/61/61 60/60/60 +f 80/80/80 81/81/81 63/63/63 +f 80/80/80 63/63/63 62/62/62 +f 82/82/82 83/83/83 65/65/65 +f 82/82/82 65/65/65 64/64/64 +f 84/84/84 85/85/85 67/67/67 +f 84/84/84 67/67/67 66/66/66 +f 77/77/77 86/86/86 68/68/68 +f 77/77/77 68/68/68 59/59/59 +f 87/87/87 88/88/88 89/89/89 +f 89/89/89 90/90/90 87/87/87 +f 91/91/91 92/92/92 93/93/93 +f 93/93/93 94/94/94 91/91/91 +f 95/95/95 96/96/96 97/97/97 +f 97/97/97 98/98/98 95/95/95 +f 96/96/96 99/99/99 100/100/100 +f 100/100/100 97/97/97 96/96/96 +f 101/101/101 102/102/102 103/103/103 +f 103/103/103 104/104/104 101/101/101 +f 105/105/105 87/87/87 90/90/90 +f 90/90/90 106/106/106 105/105/105 +f 90/90/90 89/89/89 107/107/107 +f 107/107/107 108/108/108 90/90/90 +f 94/94/94 93/93/93 109/109/109 +f 109/109/109 110/110/110 94/94/94 +f 111/111/111 112/112/112 113/113/113 +f 113/113/113 114/114/114 111/111/111 +f 115/115/115 116/116/116 117/117/117 +f 117/117/117 118/118/118 115/115/115 +f 104/104/104 103/103/103 119/119/119 +f 119/119/119 120/120/120 104/104/104 +f 106/106/106 90/90/90 108/108/108 +f 108/108/108 121/121/121 106/106/106 +f 108/108/108 107/107/107 122/122/122 +f 122/122/122 123/123/123 108/108/108 +f 110/110/110 109/109/109 124/124/124 +f 124/124/124 125/125/125 110/110/110 +f 114/114/114 113/113/113 126/126/126 +f 126/126/126 127/127/127 114/114/114 +f 118/118/118 117/117/117 128/128/128 +f 128/128/128 129/129/129 118/118/118 +f 120/120/120 119/119/119 130/130/130 +f 130/130/130 131/131/131 120/120/120 +f 121/121/121 108/108/108 123/123/123 +f 123/123/123 132/132/132 121/121/121 +f 123/123/123 122/122/122 133/133/133 +f 133/133/133 134/134/134 123/123/123 +f 125/125/125 124/124/124 135/135/135 +f 135/135/135 136/136/136 125/125/125 +f 127/127/127 126/126/126 137/137/137 +f 137/137/137 138/138/138 127/127/127 +f 129/129/129 128/128/128 139/139/139 +f 139/139/139 140/140/140 129/129/129 +f 131/131/131 130/130/130 141/141/141 +f 141/141/141 142/142/142 131/131/131 +f 132/132/132 123/123/123 134/134/134 +f 134/134/134 143/143/143 132/132/132 +f 134/134/134 133/133/133 144/144/144 +f 144/144/144 145/145/145 134/134/134 +f 136/136/136 135/135/135 146/146/146 +f 146/146/146 147/147/147 136/136/136 +f 138/138/138 137/137/137 148/148/148 +f 148/148/148 149/149/149 138/138/138 +f 140/140/140 139/139/139 150/150/150 +f 150/150/150 151/151/151 140/140/140 +f 142/142/142 141/141/141 152/152/152 +f 152/152/152 153/153/153 142/142/142 +f 143/143/143 134/134/134 145/145/145 +f 145/145/145 154/154/154 143/143/143 +f 155/155/155 156/156/156 157/157/157 +f 155/155/155 158/158/158 156/156/156 +f 155/155/155 159/159/159 158/158/158 +f 155/155/155 160/160/160 159/159/159 +f 155/155/155 161/161/161 160/160/160 +f 155/155/155 157/157/157 161/161/161 +f 162/162/162 163/163/163 145/145/145 +f 162/162/162 145/145/145 144/144/144 +f 164/164/164 165/165/165 147/147/147 +f 164/164/164 147/147/147 146/146/146 +f 166/166/166 167/167/167 149/149/149 +f 166/166/166 149/149/149 148/148/148 +f 168/168/168 169/169/169 151/151/151 +f 168/168/168 151/151/151 150/150/150 +f 170/170/170 171/171/171 153/153/153 +f 170/170/170 153/153/153 152/152/152 +f 163/163/163 172/172/172 154/154/154 +f 163/163/163 154/154/154 145/145/145 +f 173/173/173 174/174/174 175/175/175 +f 175/175/175 176/176/176 173/173/173 +f 177/177/177 178/178/178 179/179/179 +f 179/179/179 180/180/180 177/177/177 +f 181/181/181 182/182/182 183/183/183 +f 183/183/183 184/184/184 181/181/181 +f 182/182/182 185/185/185 186/186/186 +f 186/186/186 183/183/183 182/182/182 +f 187/187/187 188/188/188 189/189/189 +f 189/189/189 190/190/190 187/187/187 +f 191/191/191 173/173/173 176/176/176 +f 176/176/176 192/192/192 191/191/191 +f 176/176/176 175/175/175 193/193/193 +f 193/193/193 194/194/194 176/176/176 +f 180/180/180 179/179/179 195/195/195 +f 195/195/195 196/196/196 180/180/180 +f 197/197/197 198/198/198 199/199/199 +f 199/199/199 200/200/200 197/197/197 +f 201/201/201 202/202/202 203/203/203 +f 203/203/203 204/204/204 201/201/201 +f 190/190/190 189/189/189 205/205/205 +f 205/205/205 206/206/206 190/190/190 +f 192/192/192 176/176/176 194/194/194 +f 194/194/194 207/207/207 192/192/192 +f 194/194/194 193/193/193 208/208/208 +f 208/208/208 209/209/209 194/194/194 +f 196/196/196 195/195/195 210/210/210 +f 210/210/210 211/211/211 196/196/196 +f 200/200/200 199/199/199 212/212/212 +f 212/212/212 213/213/213 200/200/200 +f 204/204/204 203/203/203 214/214/214 +f 214/214/214 215/215/215 204/204/204 +f 206/206/206 205/205/205 216/216/216 +f 216/216/216 217/217/217 206/206/206 +f 207/207/207 194/194/194 209/209/209 +f 209/209/209 218/218/218 207/207/207 +f 209/209/209 208/208/208 219/219/219 +f 219/219/219 220/220/220 209/209/209 +f 211/211/211 210/210/210 221/221/221 +f 221/221/221 222/222/222 211/211/211 +f 213/213/213 212/212/212 223/223/223 +f 223/223/223 224/224/224 213/213/213 +f 215/215/215 214/214/214 225/225/225 +f 225/225/225 226/226/226 215/215/215 +f 217/217/217 216/216/216 227/227/227 +f 227/227/227 228/228/228 217/217/217 +f 218/218/218 209/209/209 220/220/220 +f 220/220/220 229/229/229 218/218/218 +f 220/220/220 219/219/219 230/230/230 +f 230/230/230 231/231/231 220/220/220 +f 222/222/222 221/221/221 232/232/232 +f 232/232/232 233/233/233 222/222/222 +f 224/224/224 223/223/223 234/234/234 +f 234/234/234 235/235/235 224/224/224 +f 226/226/226 225/225/225 236/236/236 +f 236/236/236 237/237/237 226/226/226 +f 228/228/228 227/227/227 238/238/238 +f 238/238/238 239/239/239 228/228/228 +f 229/229/229 220/220/220 231/231/231 +f 231/231/231 240/240/240 229/229/229 +f 241/241/241 242/242/242 243/243/243 +f 241/241/241 244/244/244 242/242/242 +f 241/241/241 245/245/245 244/244/244 +f 241/241/241 246/246/246 245/245/245 +f 241/241/241 247/247/247 246/246/246 +f 241/241/241 243/243/243 247/247/247 +f 248/248/248 249/249/249 231/231/231 +f 248/248/248 231/231/231 230/230/230 +f 250/250/250 251/251/251 233/233/233 +f 250/250/250 233/233/233 232/232/232 +f 252/252/252 253/253/253 235/235/235 +f 252/252/252 235/235/235 234/234/234 +f 254/254/254 255/255/255 237/237/237 +f 254/254/254 237/237/237 236/236/236 +f 256/256/256 257/257/257 239/239/239 +f 256/256/256 239/239/239 238/238/238 +f 249/249/249 258/258/258 240/240/240 +f 249/249/249 240/240/240 231/231/231 +f 259/259/259 260/260/260 261/261/261 +f 261/261/261 262/262/262 259/259/259 +f 263/263/263 264/264/264 265/265/265 +f 265/265/265 266/266/266 263/263/263 +f 267/267/267 268/268/268 269/269/269 +f 269/269/269 270/270/270 267/267/267 +f 268/268/268 271/271/271 272/272/272 +f 272/272/272 269/269/269 268/268/268 +f 273/273/273 274/274/274 275/275/275 +f 275/275/275 276/276/276 273/273/273 +f 277/277/277 259/259/259 262/262/262 +f 262/262/262 278/278/278 277/277/277 +f 262/262/262 261/261/261 279/279/279 +f 279/279/279 280/280/280 262/262/262 +f 266/266/266 265/265/265 281/281/281 +f 281/281/281 282/282/282 266/266/266 +f 283/283/283 284/284/284 285/285/285 +f 285/285/285 286/286/286 283/283/283 +f 287/287/287 288/288/288 289/289/289 +f 289/289/289 290/290/290 287/287/287 +f 276/276/276 275/275/275 291/291/291 +f 291/291/291 292/292/292 276/276/276 +f 278/278/278 262/262/262 280/280/280 +f 280/280/280 293/293/293 278/278/278 +f 280/280/280 279/279/279 294/294/294 +f 294/294/294 295/295/295 280/280/280 +f 282/282/282 281/281/281 296/296/296 +f 296/296/296 297/297/297 282/282/282 +f 286/286/286 285/285/285 298/298/298 +f 298/298/298 299/299/299 286/286/286 +f 290/290/290 289/289/289 300/300/300 +f 300/300/300 301/301/301 290/290/290 +f 292/292/292 291/291/291 302/302/302 +f 302/302/302 303/303/303 292/292/292 +f 293/293/293 280/280/280 295/295/295 +f 295/295/295 304/304/304 293/293/293 +f 295/295/295 294/294/294 305/305/305 +f 305/305/305 306/306/306 295/295/295 +f 297/297/297 296/296/296 307/307/307 +f 307/307/307 308/308/308 297/297/297 +f 299/299/299 298/298/298 309/309/309 +f 309/309/309 310/310/310 299/299/299 +f 301/301/301 300/300/300 311/311/311 +f 311/311/311 312/312/312 301/301/301 +f 303/303/303 302/302/302 313/313/313 +f 313/313/313 314/314/314 303/303/303 +f 304/304/304 295/295/295 306/306/306 +f 306/306/306 315/315/315 304/304/304 +f 306/306/306 305/305/305 316/316/316 +f 316/316/316 317/317/317 306/306/306 +f 308/308/308 307/307/307 318/318/318 +f 318/318/318 319/319/319 308/308/308 +f 310/310/310 309/309/309 320/320/320 +f 320/320/320 321/321/321 310/310/310 +f 312/312/312 311/311/311 322/322/322 +f 322/322/322 323/323/323 312/312/312 +f 314/314/314 313/313/313 324/324/324 +f 324/324/324 325/325/325 314/314/314 +f 315/315/315 306/306/306 317/317/317 +f 317/317/317 326/326/326 315/315/315 +f 327/327/327 328/328/328 329/329/329 +f 327/327/327 330/330/330 328/328/328 +f 327/327/327 331/331/331 330/330/330 +f 327/327/327 332/332/332 331/331/331 +f 327/327/327 333/333/333 332/332/332 +f 327/327/327 329/329/329 333/333/333 +f 334/334/334 335/335/335 317/317/317 +f 334/334/334 317/317/317 316/316/316 +f 336/336/336 337/337/337 319/319/319 +f 336/336/336 319/319/319 318/318/318 +f 338/338/338 339/339/339 321/321/321 +f 338/338/338 321/321/321 320/320/320 +f 340/340/340 341/341/341 323/323/323 +f 340/340/340 323/323/323 322/322/322 +f 342/342/342 343/343/343 325/325/325 +f 342/342/342 325/325/325 324/324/324 +f 335/335/335 344/344/344 326/326/326 +f 335/335/335 326/326/326 317/317/317 +f 345/345/345 346/346/346 347/347/347 +f 345/345/345 348/348/348 346/346/346 +f 345/345/345 349/349/349 348/348/348 +f 345/345/345 350/350/350 349/349/349 +f 345/345/345 351/351/351 350/350/350 +f 345/345/345 352/352/352 351/351/351 +f 345/345/345 353/353/353 352/352/352 +f 345/345/345 347/347/347 353/353/353 +f 354/354/354 355/355/355 356/356/356 +f 354/354/354 356/356/356 357/357/357 +f 358/358/358 359/359/359 360/360/360 +f 358/358/358 360/360/360 361/361/361 +f 362/362/362 363/363/363 364/364/364 +f 362/362/362 364/364/364 365/365/365 +f 366/366/366 367/367/367 368/368/368 +f 366/366/366 368/368/368 369/369/369 +f 370/370/370 371/371/371 372/372/372 +f 370/370/370 372/372/372 373/373/373 +f 374/374/374 375/375/375 376/376/376 +f 374/374/374 376/376/376 377/377/377 +f 378/378/378 379/379/379 380/380/380 +f 378/378/378 380/380/380 381/381/381 +f 382/382/382 383/383/383 384/384/384 +f 382/382/382 384/384/384 385/385/385 +f 386/386/386 387/387/387 388/388/388 +f 386/386/386 388/388/388 389/389/389 +f 386/386/386 389/389/389 390/390/390 +f 386/386/386 390/390/390 391/391/391 +f 386/386/386 391/391/391 392/392/392 +f 386/386/386 392/392/392 393/393/393 +f 386/386/386 393/393/393 394/394/394 +f 386/386/386 394/394/394 387/387/387 +f 395/395/395 396/396/396 397/397/397 +f 397/397/397 398/398/398 395/395/395 +f 399/399/399 400/400/400 401/401/401 +f 401/401/401 402/402/402 399/399/399 +f 403/403/403 404/404/404 405/405/405 +f 405/405/405 406/406/406 403/403/403 +f 407/407/407 408/408/408 409/409/409 +f 409/409/409 410/410/410 407/407/407 +f 411/411/411 412/412/412 413/413/413 +f 413/413/413 414/414/414 411/411/411 +f 415/415/415 416/416/416 417/417/417 +f 417/417/417 418/418/418 415/415/415 +f 419/419/419 420/420/420 421/421/421 +f 421/421/421 422/422/422 419/419/419 +f 423/423/423 424/424/424 425/425/425 +f 425/425/425 426/426/426 423/423/423 +f 427/427/427 428/428/428 429/429/429 +f 429/429/429 430/430/430 427/427/427 +f 431/431/431 432/432/432 433/433/433 +f 433/433/433 434/434/434 431/431/431 +f 435/435/435 436/436/436 437/437/437 +f 437/437/437 438/438/438 435/435/435 +f 439/439/439 440/440/440 441/441/441 +f 441/441/441 442/442/442 439/439/439 +f 443/443/443 444/444/444 445/445/445 +f 445/445/445 446/446/446 443/443/443 +f 447/447/447 448/448/448 449/449/449 +f 449/449/449 450/450/450 447/447/447 +f 451/451/451 452/452/452 453/453/453 +f 453/453/453 454/454/454 451/451/451 +f 455/455/455 456/456/456 457/457/457 +f 457/457/457 458/458/458 455/455/455 +f 446/446/446 445/445/445 459/459/459 +f 459/459/459 460/460/460 446/446/446 +f 450/450/450 449/449/449 461/461/461 +f 461/461/461 462/462/462 450/450/450 +f 454/454/454 453/453/453 463/463/463 +f 463/463/463 464/464/464 454/454/454 +f 458/458/458 457/457/457 465/465/465 +f 465/465/465 466/466/466 458/458/458 +f 460/460/460 459/459/459 467/467/467 +f 467/467/467 468/468/468 460/460/460 +f 462/462/462 461/461/461 469/469/469 +f 469/469/469 470/470/470 462/462/462 +f 464/464/464 463/463/463 471/471/471 +f 471/471/471 472/472/472 464/464/464 +f 466/466/466 465/465/465 473/473/473 +f 473/473/473 474/474/474 466/466/466 +f 468/468/468 467/467/467 475/475/475 +f 475/475/475 476/476/476 468/468/468 +f 470/470/470 469/469/469 477/477/477 +f 477/477/477 478/478/478 470/470/470 +f 472/472/472 471/471/471 479/479/479 +f 479/479/479 480/480/480 472/472/472 +f 474/474/474 473/473/473 481/481/481 +f 481/481/481 482/482/482 474/474/474 +f 476/476/476 475/475/475 483/483/483 +f 483/483/483 484/484/484 476/476/476 +f 478/478/478 477/477/477 485/485/485 +f 485/485/485 486/486/486 478/478/478 +f 480/480/480 479/479/479 487/487/487 +f 487/487/487 488/488/488 480/480/480 +f 482/482/482 481/481/481 489/489/489 +f 489/489/489 490/490/490 482/482/482 +f 491/491/491 492/492/492 493/493/493 +f 493/493/493 494/494/494 491/491/491 +f 495/495/495 496/496/496 497/497/497 +f 497/497/497 498/498/498 495/495/495 +f 499/499/499 500/500/500 501/501/501 +f 501/501/501 502/502/502 499/499/499 +f 503/503/503 504/504/504 505/505/505 +f 505/505/505 506/506/506 503/503/503 +f 430/430/430 429/429/429 507/507/507 +f 507/507/507 508/508/508 430/430/430 +f 434/434/434 433/433/433 509/509/509 +f 509/509/509 510/510/510 434/434/434 +f 438/438/438 437/437/437 511/511/511 +f 511/511/511 512/512/512 438/438/438 +f 442/442/442 441/441/441 513/513/513 +f 513/513/513 514/514/514 442/442/442 +f 508/508/508 507/507/507 515/515/515 +f 515/515/515 516/516/516 508/508/508 +f 510/510/510 509/509/509 517/517/517 +f 517/517/517 518/518/518 510/510/510 +f 512/512/512 511/511/511 519/519/519 +f 519/519/519 520/520/520 512/512/512 +f 514/514/514 513/513/513 521/521/521 +f 521/521/521 522/522/522 514/514/514 +f 516/516/516 515/515/515 523/523/523 +f 523/523/523 524/524/524 516/516/516 +f 518/518/518 517/517/517 525/525/525 +f 525/525/525 526/526/526 518/518/518 +f 520/520/520 519/519/519 527/527/527 +f 527/527/527 528/528/528 520/520/520 +f 522/522/522 521/521/521 529/529/529 +f 529/529/529 530/530/530 522/522/522 +f 531/531/531 532/532/532 533/533/533 +f 533/533/533 534/534/534 531/531/531 +f 535/535/535 536/536/536 537/537/537 +f 537/537/537 538/538/538 535/535/535 +f 539/539/539 540/540/540 541/541/541 +f 541/541/541 542/542/542 539/539/539 +f 543/543/543 544/544/544 545/545/545 +f 545/545/545 546/546/546 543/543/543 +f 547/547/547 548/548/548 549/549/549 +f 549/549/549 550/550/550 547/547/547 +f 551/551/551 552/552/552 553/553/553 +f 553/553/553 554/554/554 551/551/551 +f 555/555/555 556/556/556 557/557/557 +f 557/557/557 558/558/558 555/555/555 +f 559/559/559 560/560/560 561/561/561 +f 561/561/561 562/562/562 559/559/559 +f 563/563/563 564/564/564 565/565/565 +f 565/565/565 566/566/566 563/563/563 +f 567/567/567 568/568/568 569/569/569 +f 569/569/569 570/570/570 567/567/567 +f 571/571/571 572/572/572 573/573/573 +f 573/573/573 574/574/574 571/571/571 +f 575/575/575 571/571/571 574/574/574 +f 574/574/574 576/576/576 575/575/575 +f 577/577/577 575/575/575 576/576/576 +f 576/576/576 578/578/578 577/577/577 +f 579/579/579 577/577/577 578/578/578 +f 578/578/578 580/580/580 579/579/579 +f 581/581/581 579/579/579 580/580/580 +f 580/580/580 582/582/582 581/581/581 +f 583/583/583 581/581/581 582/582/582 +f 582/582/582 584/584/584 583/583/583 +f 585/585/585 583/583/583 584/584/584 +f 584/584/584 586/586/586 585/585/585 +f 587/587/587 585/585/585 586/586/586 +f 586/586/586 588/588/588 587/587/587 +f 589/589/589 587/587/587 588/588/588 +f 588/588/588 590/590/590 589/589/589 +f 572/572/572 589/589/589 590/590/590 +f 590/590/590 573/573/573 572/572/572 +f 591/591/591 592/592/592 572/572/572 +f 572/572/572 571/571/571 591/591/591 +f 593/593/593 591/591/591 571/571/571 +f 571/571/571 575/575/575 593/593/593 +f 594/594/594 593/593/593 575/575/575 +f 575/575/575 577/577/577 594/594/594 +f 595/595/595 594/594/594 577/577/577 +f 577/577/577 579/579/579 595/595/595 +f 596/596/596 595/595/595 579/579/579 +f 579/579/579 581/581/581 596/596/596 +f 597/597/597 596/596/596 581/581/581 +f 581/581/581 583/583/583 597/597/597 +f 598/598/598 597/597/597 583/583/583 +f 583/583/583 585/585/585 598/598/598 +f 599/599/599 598/598/598 585/585/585 +f 585/585/585 587/587/587 599/599/599 +f 600/600/600 599/599/599 587/587/587 +f 587/587/587 589/589/589 600/600/600 +f 592/592/592 600/600/600 589/589/589 +f 589/589/589 572/572/572 592/592/592 +f 601/601/601 602/602/602 603/603/603 +f 603/603/603 604/604/604 601/601/601 +f 605/605/605 606/606/606 607/607/607 +f 607/607/607 608/608/608 605/605/605 +f 609/609/609 610/610/610 611/611/611 +f 611/611/611 612/612/612 609/609/609 +f 613/613/613 614/614/614 615/615/615 +f 615/615/615 616/616/616 613/613/613 +f 617/617/617 618/618/618 619/619/619 +f 619/619/619 620/620/620 617/617/617 +f 621/621/621 622/622/622 623/623/623 +f 623/623/623 624/624/624 621/621/621 +f 625/625/625 626/626/626 627/627/627 +f 627/627/627 628/628/628 625/625/625 +f 629/629/629 630/630/630 631/631/631 +f 631/631/631 632/632/632 629/629/629 +f 633/633/633 634/634/634 635/635/635 +f 635/635/635 636/636/636 633/633/633 +f 637/637/637 638/638/638 639/639/639 +f 639/639/639 640/640/640 637/637/637 +f 641/641/641 642/642/642 643/643/643 +f 643/643/643 644/644/644 641/641/641 +f 645/645/645 646/646/646 647/647/647 +f 647/647/647 648/648/648 645/645/645 +f 649/649/649 650/650/650 651/651/651 +f 651/651/651 652/652/652 649/649/649 +f 653/653/653 654/654/654 655/655/655 +f 655/655/655 656/656/656 653/653/653 +f 657/657/657 658/658/658 659/659/659 +f 659/659/659 660/660/660 657/657/657 +f 661/661/661 662/662/662 663/663/663 +f 663/663/663 664/664/664 661/661/661 +f 665/665/665 666/666/666 667/667/667 +f 667/667/667 668/668/668 665/665/665 +f 669/669/669 670/670/670 671/671/671 +f 671/671/671 672/672/672 669/669/669 +f 673/673/673 674/674/674 675/675/675 +f 675/675/675 676/676/676 673/673/673 +f 677/677/677 678/678/678 679/679/679 +f 679/679/679 680/680/680 677/677/677 +f 681/681/681 682/682/682 683/683/683 +f 683/683/683 684/684/684 681/681/681 +f 685/685/685 686/686/686 687/687/687 +f 687/687/687 688/688/688 685/685/685 +f 689/689/689 690/690/690 691/691/691 +f 691/691/691 692/692/692 689/689/689 +f 693/693/693 694/694/694 695/695/695 +f 695/695/695 696/696/696 693/693/693 +f 697/697/697 698/698/698 699/699/699 +f 699/699/699 700/700/700 697/697/697 +f 701/701/701 702/702/702 703/703/703 +f 703/703/703 704/704/704 701/701/701 +f 705/705/705 706/706/706 707/707/707 +f 707/707/707 708/708/708 705/705/705 +f 709/709/709 710/710/710 711/711/711 +f 711/711/711 712/712/712 709/709/709 +f 713/713/713 714/714/714 715/715/715 +f 715/715/715 716/716/716 713/713/713 +f 717/717/717 718/718/718 719/719/719 +f 719/719/719 720/720/720 717/717/717 +f 721/721/721 722/722/722 723/723/723 +f 723/723/723 724/724/724 721/721/721 +f 725/725/725 726/726/726 727/727/727 +f 727/727/727 728/728/728 725/725/725 +f 729/729/729 730/730/730 731/731/731 +f 731/731/731 732/732/732 729/729/729 +f 733/733/733 734/734/734 735/735/735 +f 735/735/735 736/736/736 733/733/733 +f 737/737/737 738/738/738 739/739/739 +f 739/739/739 740/740/740 737/737/737 +f 741/741/741 742/742/742 743/743/743 +f 743/743/743 744/744/744 741/741/741 +f 745/745/745 746/746/746 747/747/747 +f 747/747/747 748/748/748 745/745/745 +f 749/749/749 750/750/750 751/751/751 +f 751/751/751 752/752/752 749/749/749 +f 753/753/753 754/754/754 755/755/755 +f 755/755/755 756/756/756 753/753/753 +f 757/757/757 758/758/758 759/759/759 +f 759/759/759 760/760/760 757/757/757 +f 761/761/761 762/762/762 763/763/763 +f 763/763/763 764/764/764 761/761/761 +f 765/765/765 766/766/766 767/767/767 +f 767/767/767 768/768/768 765/765/765 +f 769/769/769 770/770/770 771/771/771 +f 771/771/771 772/772/772 769/769/769 +f 773/773/773 774/774/774 775/775/775 +f 775/775/775 776/776/776 773/773/773 +f 777/777/777 778/778/778 779/779/779 +f 779/779/779 780/780/780 777/777/777 +f 781/781/781 782/782/782 783/783/783 +f 783/783/783 784/784/784 781/781/781 +f 785/785/785 786/786/786 787/787/787 +f 787/787/787 788/788/788 785/785/785 +f 789/789/789 790/790/790 791/791/791 +f 791/791/791 792/792/792 789/789/789 +f 793/793/793 794/794/794 795/795/795 +f 795/795/795 796/796/796 793/793/793 +f 797/797/797 798/798/798 799/799/799 +f 799/799/799 800/800/800 797/797/797 +f 801/801/801 802/802/802 803/803/803 +f 803/803/803 804/804/804 801/801/801 +f 805/805/805 806/806/806 807/807/807 +f 807/807/807 808/808/808 805/805/805 +f 809/809/809 810/810/810 811/811/811 +f 811/811/811 812/812/812 809/809/809 +f 813/813/813 814/814/814 815/815/815 +f 815/815/815 816/816/816 813/813/813 +f 817/817/817 818/818/818 819/819/819 +f 819/819/819 820/820/820 817/817/817 +f 821/821/821 822/822/822 823/823/823 +f 823/823/823 824/824/824 821/821/821 +f 825/825/825 826/826/826 827/827/827 +f 827/827/827 828/828/828 825/825/825 +f 829/829/829 830/830/830 831/831/831 +f 831/831/831 832/832/832 829/829/829 +f 833/833/833 834/834/834 835/835/835 +f 835/835/835 836/836/836 833/833/833 +f 837/837/837 838/838/838 839/839/839 +f 839/839/839 840/840/840 837/837/837 +f 841/841/841 842/842/842 843/843/843 +f 843/843/843 844/844/844 841/841/841 +f 845/845/845 846/846/846 847/847/847 +f 847/847/847 848/848/848 845/845/845 +f 849/849/849 850/850/850 851/851/851 +f 851/851/851 852/852/852 849/849/849 +f 853/853/853 854/854/854 855/855/855 +f 855/855/855 856/856/856 853/853/853 +f 857/857/857 858/858/858 859/859/859 +f 859/859/859 860/860/860 857/857/857 +f 861/861/861 862/862/862 863/863/863 +f 863/863/863 864/864/864 861/861/861 +f 865/865/865 866/866/866 867/867/867 +f 867/867/867 868/868/868 865/865/865 +f 869/869/869 870/870/870 871/871/871 +f 871/871/871 872/872/872 869/869/869 +f 873/873/873 874/874/874 875/875/875 +f 875/875/875 876/876/876 873/873/873 +f 877/877/877 878/878/878 879/879/879 +f 879/879/879 880/880/880 877/877/877 +f 881/881/881 882/882/882 883/883/883 +f 881/881/881 883/883/883 884/884/884 +f 885/885/885 881/881/881 884/884/884 +f 885/885/885 884/884/884 886/886/886 +f 887/887/887 885/885/885 886/886/886 +f 887/887/887 886/886/886 888/888/888 +f 889/889/889 887/887/887 888/888/888 +f 889/889/889 888/888/888 890/890/890 +f 891/891/891 889/889/889 890/890/890 +f 891/891/891 890/890/890 892/892/892 +f 893/893/893 891/891/891 892/892/892 +f 893/893/893 892/892/892 894/894/894 +f 895/895/895 893/893/893 894/894/894 +f 895/895/895 894/894/894 896/896/896 +f 897/897/897 895/895/895 896/896/896 +f 897/897/897 896/896/896 898/898/898 +f 899/899/899 900/900/900 901/901/901 +f 899/899/899 901/901/901 902/902/902 +f 882/882/882 899/899/899 902/902/902 +f 882/882/882 902/902/902 883/883/883 +f 903/903/903 904/904/904 882/882/882 +f 903/903/903 882/882/882 881/881/881 +f 905/905/905 903/903/903 881/881/881 +f 905/905/905 881/881/881 885/885/885 +f 906/906/906 905/905/905 885/885/885 +f 906/906/906 885/885/885 887/887/887 +f 907/907/907 906/906/906 887/887/887 +f 907/907/907 887/887/887 889/889/889 +f 908/908/908 907/907/907 889/889/889 +f 908/908/908 889/889/889 891/891/891 +f 909/909/909 908/908/908 891/891/891 +f 909/909/909 891/891/891 893/893/893 +f 910/910/910 909/909/909 893/893/893 +f 910/910/910 893/893/893 895/895/895 +f 911/911/911 910/910/910 895/895/895 +f 911/911/911 895/895/895 897/897/897 +f 912/912/912 913/913/913 900/900/900 +f 912/912/912 900/900/900 899/899/899 +f 904/904/904 912/912/912 899/899/899 +f 904/904/904 899/899/899 882/882/882 +f 914/914/914 915/915/915 904/904/904 +f 914/914/914 904/904/904 903/903/903 +f 916/916/916 914/914/914 903/903/903 +f 916/916/916 903/903/903 905/905/905 +f 917/917/917 916/916/916 905/905/905 +f 917/917/917 905/905/905 906/906/906 +f 918/918/918 917/917/917 906/906/906 +f 918/918/918 906/906/906 907/907/907 +f 919/919/919 918/918/918 907/907/907 +f 919/919/919 907/907/907 908/908/908 +f 920/920/920 919/919/919 908/908/908 +f 920/920/920 908/908/908 909/909/909 +f 921/921/921 920/920/920 909/909/909 +f 921/921/921 909/909/909 910/910/910 +f 922/922/922 921/921/921 910/910/910 +f 922/922/922 910/910/910 911/911/911 +f 923/923/923 924/924/924 913/913/913 +f 923/923/923 913/913/913 912/912/912 +f 915/915/915 923/923/923 912/912/912 +f 915/915/915 912/912/912 904/904/904 +f 925/925/925 926/926/926 915/915/915 +f 925/925/925 915/915/915 914/914/914 +f 927/927/927 925/925/925 914/914/914 +f 927/927/927 914/914/914 916/916/916 +f 928/928/928 927/927/927 916/916/916 +f 928/928/928 916/916/916 917/917/917 +f 929/929/929 928/928/928 917/917/917 +f 929/929/929 917/917/917 918/918/918 +f 930/930/930 929/929/929 918/918/918 +f 930/930/930 918/918/918 919/919/919 +f 931/931/931 930/930/930 919/919/919 +f 931/931/931 919/919/919 920/920/920 +f 932/932/932 931/931/931 920/920/920 +f 932/932/932 920/920/920 921/921/921 +f 933/933/933 932/932/932 921/921/921 +f 933/933/933 921/921/921 922/922/922 +f 934/934/934 935/935/935 924/924/924 +f 934/934/934 924/924/924 923/923/923 +f 926/926/926 934/934/934 923/923/923 +f 926/926/926 923/923/923 915/915/915 +f 936/936/936 937/937/937 926/926/926 +f 936/936/936 926/926/926 925/925/925 +f 938/938/938 936/936/936 925/925/925 +f 938/938/938 925/925/925 927/927/927 +f 939/939/939 938/938/938 927/927/927 +f 939/939/939 927/927/927 928/928/928 +f 940/940/940 939/939/939 928/928/928 +f 940/940/940 928/928/928 929/929/929 +f 941/941/941 940/940/940 929/929/929 +f 941/941/941 929/929/929 930/930/930 +f 942/942/942 941/941/941 930/930/930 +f 942/942/942 930/930/930 931/931/931 +f 943/943/943 942/942/942 931/931/931 +f 943/943/943 931/931/931 932/932/932 +f 944/944/944 943/943/943 932/932/932 +f 944/944/944 932/932/932 933/933/933 +f 945/945/945 946/946/946 935/935/935 +f 945/945/945 935/935/935 934/934/934 +f 937/937/937 945/945/945 934/934/934 +f 937/937/937 934/934/934 926/926/926 diff --git a/ObsoleteDemos/ConvexDecompositionDemo/main.cpp b/Demos/ConvexDecompositionDemo/main.cpp similarity index 100% rename from ObsoleteDemos/ConvexDecompositionDemo/main.cpp rename to Demos/ConvexDecompositionDemo/main.cpp diff --git a/ObsoleteDemos/ConvexDecompositionDemo/testFile32Single.bullet b/Demos/ConvexDecompositionDemo/testFile32Single.bullet similarity index 100% rename from ObsoleteDemos/ConvexDecompositionDemo/testFile32Single.bullet rename to Demos/ConvexDecompositionDemo/testFile32Single.bullet diff --git a/ObsoleteDemos/ConvexHullDistance/CMakeLists.txt b/Demos/ConvexHullDistance/CMakeLists.txt similarity index 100% rename from ObsoleteDemos/ConvexHullDistance/CMakeLists.txt rename to Demos/ConvexHullDistance/CMakeLists.txt diff --git a/ObsoleteDemos/ConvexHullDistance/ConvexHullDistanceDemo.cpp b/Demos/ConvexHullDistance/ConvexHullDistanceDemo.cpp similarity index 100% rename from ObsoleteDemos/ConvexHullDistance/ConvexHullDistanceDemo.cpp rename to Demos/ConvexHullDistance/ConvexHullDistanceDemo.cpp diff --git a/ObsoleteDemos/DoublePrecisionDemo/CMakeLists.txt b/Demos/DoublePrecisionDemo/CMakeLists.txt similarity index 100% rename from ObsoleteDemos/DoublePrecisionDemo/CMakeLists.txt rename to Demos/DoublePrecisionDemo/CMakeLists.txt diff --git a/ObsoleteDemos/DoublePrecisionDemo/DoublePrecisionDemo.cpp b/Demos/DoublePrecisionDemo/DoublePrecisionDemo.cpp similarity index 100% rename from ObsoleteDemos/DoublePrecisionDemo/DoublePrecisionDemo.cpp rename to Demos/DoublePrecisionDemo/DoublePrecisionDemo.cpp diff --git a/ObsoleteDemos/DoublePrecisionDemo/DoublePrecisionDemo.h b/Demos/DoublePrecisionDemo/DoublePrecisionDemo.h similarity index 100% rename from ObsoleteDemos/DoublePrecisionDemo/DoublePrecisionDemo.h rename to Demos/DoublePrecisionDemo/DoublePrecisionDemo.h diff --git a/ObsoleteDemos/DynamicControlDemo/CMakeLists.txt b/Demos/DynamicControlDemo/CMakeLists.txt similarity index 100% rename from ObsoleteDemos/DynamicControlDemo/CMakeLists.txt rename to Demos/DynamicControlDemo/CMakeLists.txt diff --git a/ObsoleteDemos/DynamicControlDemo/MotorDemo.cpp b/Demos/DynamicControlDemo/MotorDemo.cpp similarity index 100% rename from ObsoleteDemos/DynamicControlDemo/MotorDemo.cpp rename to Demos/DynamicControlDemo/MotorDemo.cpp diff --git a/ObsoleteDemos/DynamicControlDemo/MotorDemo.h b/Demos/DynamicControlDemo/MotorDemo.h similarity index 100% rename from ObsoleteDemos/DynamicControlDemo/MotorDemo.h rename to Demos/DynamicControlDemo/MotorDemo.h diff --git a/ObsoleteDemos/DynamicControlDemo/main.cpp b/Demos/DynamicControlDemo/main.cpp similarity index 100% rename from ObsoleteDemos/DynamicControlDemo/main.cpp rename to Demos/DynamicControlDemo/main.cpp diff --git a/ObsoleteDemos/EPAPenDepthDemo/PenetrationTestBullet.cpp b/Demos/EPAPenDepthDemo/PenetrationTestBullet.cpp similarity index 100% rename from ObsoleteDemos/EPAPenDepthDemo/PenetrationTestBullet.cpp rename to Demos/EPAPenDepthDemo/PenetrationTestBullet.cpp diff --git a/ObsoleteDemos/FeatherstoneMultiBodyDemo/CMakeLists.txt b/Demos/FeatherstoneMultiBodyDemo/CMakeLists.txt similarity index 100% rename from ObsoleteDemos/FeatherstoneMultiBodyDemo/CMakeLists.txt rename to Demos/FeatherstoneMultiBodyDemo/CMakeLists.txt diff --git a/ObsoleteDemos/FeatherstoneMultiBodyDemo/FeatherstoneMultiBodyDemo.cpp b/Demos/FeatherstoneMultiBodyDemo/FeatherstoneMultiBodyDemo.cpp similarity index 98% rename from ObsoleteDemos/FeatherstoneMultiBodyDemo/FeatherstoneMultiBodyDemo.cpp rename to Demos/FeatherstoneMultiBodyDemo/FeatherstoneMultiBodyDemo.cpp index 412b51315..987928c20 100644 --- a/ObsoleteDemos/FeatherstoneMultiBodyDemo/FeatherstoneMultiBodyDemo.cpp +++ b/Demos/FeatherstoneMultiBodyDemo/FeatherstoneMultiBodyDemo.cpp @@ -394,23 +394,16 @@ btMultiBody* FeatherstoneMultiBodyDemo::createFeatherstoneMultiBody(class btMult if (1) { btCollisionShape* box = new btBoxShape(btVector3(halfExtents[0],halfExtents[1],halfExtents[2])*scaling); - btRigidBody* body = new btRigidBody(mass,0,box,inertia); btMultiBodyLinkCollider* col= new btMultiBodyLinkCollider(bod,-1); - - body->setCollisionShape(box); col->setCollisionShape(box); - btTransform tr; tr.setIdentity(); tr.setOrigin(local_origin[0]); tr.setRotation(btQuaternion(quat[0],quat[1],quat[2],quat[3])); - body->setWorldTransform(tr); col->setWorldTransform(tr); - world->addCollisionObject(col, 2,1+2); col->setFriction(friction); - bod->setBaseCollider(col); - + bod->setBaseCollider(col); } } diff --git a/ObsoleteDemos/FeatherstoneMultiBodyDemo/FeatherstoneMultiBodyDemo.h b/Demos/FeatherstoneMultiBodyDemo/FeatherstoneMultiBodyDemo.h similarity index 100% rename from ObsoleteDemos/FeatherstoneMultiBodyDemo/FeatherstoneMultiBodyDemo.h rename to Demos/FeatherstoneMultiBodyDemo/FeatherstoneMultiBodyDemo.h diff --git a/ObsoleteDemos/FeatherstoneMultiBodyDemo/Makefile.am b/Demos/FeatherstoneMultiBodyDemo/Makefile.am similarity index 100% rename from ObsoleteDemos/FeatherstoneMultiBodyDemo/Makefile.am rename to Demos/FeatherstoneMultiBodyDemo/Makefile.am diff --git a/ObsoleteDemos/FeatherstoneMultiBodyDemo/Win32FeatherstoneMultiBodyDemo.cpp b/Demos/FeatherstoneMultiBodyDemo/Win32FeatherstoneMultiBodyDemo.cpp similarity index 100% rename from ObsoleteDemos/FeatherstoneMultiBodyDemo/Win32FeatherstoneMultiBodyDemo.cpp rename to Demos/FeatherstoneMultiBodyDemo/Win32FeatherstoneMultiBodyDemo.cpp diff --git a/ObsoleteDemos/FeatherstoneMultiBodyDemo/main.cpp b/Demos/FeatherstoneMultiBodyDemo/main.cpp similarity index 100% rename from ObsoleteDemos/FeatherstoneMultiBodyDemo/main.cpp rename to Demos/FeatherstoneMultiBodyDemo/main.cpp diff --git a/ObsoleteDemos/ForkLiftDemo/CMakeLists.txt b/Demos/ForkLiftDemo/CMakeLists.txt similarity index 100% rename from ObsoleteDemos/ForkLiftDemo/CMakeLists.txt rename to Demos/ForkLiftDemo/CMakeLists.txt diff --git a/ObsoleteDemos/ForkLiftDemo/ForkLiftDemo.cpp b/Demos/ForkLiftDemo/ForkLiftDemo.cpp similarity index 100% rename from ObsoleteDemos/ForkLiftDemo/ForkLiftDemo.cpp rename to Demos/ForkLiftDemo/ForkLiftDemo.cpp diff --git a/ObsoleteDemos/ForkLiftDemo/ForkLiftDemo.h b/Demos/ForkLiftDemo/ForkLiftDemo.h similarity index 100% rename from ObsoleteDemos/ForkLiftDemo/ForkLiftDemo.h rename to Demos/ForkLiftDemo/ForkLiftDemo.h diff --git a/ObsoleteDemos/ForkLiftDemo/Makefile.am b/Demos/ForkLiftDemo/Makefile.am similarity index 100% rename from ObsoleteDemos/ForkLiftDemo/Makefile.am rename to Demos/ForkLiftDemo/Makefile.am diff --git a/ObsoleteDemos/ForkLiftDemo/main.cpp b/Demos/ForkLiftDemo/main.cpp similarity index 100% rename from ObsoleteDemos/ForkLiftDemo/main.cpp rename to Demos/ForkLiftDemo/main.cpp diff --git a/ObsoleteDemos/FractureDemo/CMakeLists.txt b/Demos/FractureDemo/CMakeLists.txt similarity index 100% rename from ObsoleteDemos/FractureDemo/CMakeLists.txt rename to Demos/FractureDemo/CMakeLists.txt diff --git a/ObsoleteDemos/FractureDemo/FractureDemo.cpp b/Demos/FractureDemo/FractureDemo.cpp similarity index 100% rename from ObsoleteDemos/FractureDemo/FractureDemo.cpp rename to Demos/FractureDemo/FractureDemo.cpp diff --git a/ObsoleteDemos/FractureDemo/FractureDemo.h b/Demos/FractureDemo/FractureDemo.h similarity index 100% rename from ObsoleteDemos/FractureDemo/FractureDemo.h rename to Demos/FractureDemo/FractureDemo.h diff --git a/ObsoleteDemos/FractureDemo/Win32FractureDemo.cpp b/Demos/FractureDemo/Win32FractureDemo.cpp similarity index 100% rename from ObsoleteDemos/FractureDemo/Win32FractureDemo.cpp rename to Demos/FractureDemo/Win32FractureDemo.cpp diff --git a/ObsoleteDemos/FractureDemo/btFractureBody.cpp b/Demos/FractureDemo/btFractureBody.cpp similarity index 100% rename from ObsoleteDemos/FractureDemo/btFractureBody.cpp rename to Demos/FractureDemo/btFractureBody.cpp diff --git a/ObsoleteDemos/FractureDemo/btFractureBody.h b/Demos/FractureDemo/btFractureBody.h similarity index 100% rename from ObsoleteDemos/FractureDemo/btFractureBody.h rename to Demos/FractureDemo/btFractureBody.h diff --git a/ObsoleteDemos/FractureDemo/btFractureDynamicsWorld.cpp b/Demos/FractureDemo/btFractureDynamicsWorld.cpp similarity index 100% rename from ObsoleteDemos/FractureDemo/btFractureDynamicsWorld.cpp rename to Demos/FractureDemo/btFractureDynamicsWorld.cpp diff --git a/ObsoleteDemos/FractureDemo/btFractureDynamicsWorld.h b/Demos/FractureDemo/btFractureDynamicsWorld.h similarity index 100% rename from ObsoleteDemos/FractureDemo/btFractureDynamicsWorld.h rename to Demos/FractureDemo/btFractureDynamicsWorld.h diff --git a/ObsoleteDemos/FractureDemo/main.cpp b/Demos/FractureDemo/main.cpp similarity index 100% rename from ObsoleteDemos/FractureDemo/main.cpp rename to Demos/FractureDemo/main.cpp diff --git a/ObsoleteDemos/GenericJointDemo/CMakeLists.txt b/Demos/GenericJointDemo/CMakeLists.txt similarity index 100% rename from ObsoleteDemos/GenericJointDemo/CMakeLists.txt rename to Demos/GenericJointDemo/CMakeLists.txt diff --git a/ObsoleteDemos/GenericJointDemo/GenericJointDemo.cpp b/Demos/GenericJointDemo/GenericJointDemo.cpp similarity index 100% rename from ObsoleteDemos/GenericJointDemo/GenericJointDemo.cpp rename to Demos/GenericJointDemo/GenericJointDemo.cpp diff --git a/ObsoleteDemos/GenericJointDemo/GenericJointDemo.h b/Demos/GenericJointDemo/GenericJointDemo.h similarity index 100% rename from ObsoleteDemos/GenericJointDemo/GenericJointDemo.h rename to Demos/GenericJointDemo/GenericJointDemo.h diff --git a/ObsoleteDemos/GenericJointDemo/Ragdoll.cpp b/Demos/GenericJointDemo/Ragdoll.cpp similarity index 100% rename from ObsoleteDemos/GenericJointDemo/Ragdoll.cpp rename to Demos/GenericJointDemo/Ragdoll.cpp diff --git a/ObsoleteDemos/GenericJointDemo/Ragdoll.h b/Demos/GenericJointDemo/Ragdoll.h similarity index 100% rename from ObsoleteDemos/GenericJointDemo/Ragdoll.h rename to Demos/GenericJointDemo/Ragdoll.h diff --git a/ObsoleteDemos/GenericJointDemo/Win32GenericJointDemo.cpp b/Demos/GenericJointDemo/Win32GenericJointDemo.cpp similarity index 100% rename from ObsoleteDemos/GenericJointDemo/Win32GenericJointDemo.cpp rename to Demos/GenericJointDemo/Win32GenericJointDemo.cpp diff --git a/ObsoleteDemos/GenericJointDemo/main.cpp b/Demos/GenericJointDemo/main.cpp similarity index 100% rename from ObsoleteDemos/GenericJointDemo/main.cpp rename to Demos/GenericJointDemo/main.cpp diff --git a/ObsoleteDemos/GimpactTestDemo/BunnyMesh.h b/Demos/GimpactTestDemo/BunnyMesh.h similarity index 100% rename from ObsoleteDemos/GimpactTestDemo/BunnyMesh.h rename to Demos/GimpactTestDemo/BunnyMesh.h diff --git a/ObsoleteDemos/GimpactTestDemo/CMakeLists.txt b/Demos/GimpactTestDemo/CMakeLists.txt similarity index 100% rename from ObsoleteDemos/GimpactTestDemo/CMakeLists.txt rename to Demos/GimpactTestDemo/CMakeLists.txt diff --git a/ObsoleteDemos/GimpactTestDemo/GimpactTestDemo.cpp b/Demos/GimpactTestDemo/GimpactTestDemo.cpp similarity index 100% rename from ObsoleteDemos/GimpactTestDemo/GimpactTestDemo.cpp rename to Demos/GimpactTestDemo/GimpactTestDemo.cpp diff --git a/ObsoleteDemos/GimpactTestDemo/GimpactTestDemo.h b/Demos/GimpactTestDemo/GimpactTestDemo.h similarity index 100% rename from ObsoleteDemos/GimpactTestDemo/GimpactTestDemo.h rename to Demos/GimpactTestDemo/GimpactTestDemo.h diff --git a/ObsoleteDemos/GimpactTestDemo/TorusMesh.h b/Demos/GimpactTestDemo/TorusMesh.h similarity index 100% rename from ObsoleteDemos/GimpactTestDemo/TorusMesh.h rename to Demos/GimpactTestDemo/TorusMesh.h diff --git a/ObsoleteDemos/GimpactTestDemo/Win32GimpactDemo.cpp b/Demos/GimpactTestDemo/Win32GimpactDemo.cpp similarity index 100% rename from ObsoleteDemos/GimpactTestDemo/Win32GimpactDemo.cpp rename to Demos/GimpactTestDemo/Win32GimpactDemo.cpp diff --git a/ObsoleteDemos/GimpactTestDemo/main.cpp b/Demos/GimpactTestDemo/main.cpp similarity index 100% rename from ObsoleteDemos/GimpactTestDemo/main.cpp rename to Demos/GimpactTestDemo/main.cpp diff --git a/ObsoleteDemos/GjkConvexCastDemo/CMakeLists.txt b/Demos/GjkConvexCastDemo/CMakeLists.txt similarity index 100% rename from ObsoleteDemos/GjkConvexCastDemo/CMakeLists.txt rename to Demos/GjkConvexCastDemo/CMakeLists.txt diff --git a/ObsoleteDemos/GjkConvexCastDemo/LinearConvexCastDemo.cpp b/Demos/GjkConvexCastDemo/LinearConvexCastDemo.cpp similarity index 100% rename from ObsoleteDemos/GjkConvexCastDemo/LinearConvexCastDemo.cpp rename to Demos/GjkConvexCastDemo/LinearConvexCastDemo.cpp diff --git a/ObsoleteDemos/GjkConvexCastDemo/LinearConvexCastDemo.h b/Demos/GjkConvexCastDemo/LinearConvexCastDemo.h similarity index 100% rename from ObsoleteDemos/GjkConvexCastDemo/LinearConvexCastDemo.h rename to Demos/GjkConvexCastDemo/LinearConvexCastDemo.h diff --git a/ObsoleteDemos/GjkConvexCastDemo/main.cpp b/Demos/GjkConvexCastDemo/main.cpp similarity index 100% rename from ObsoleteDemos/GjkConvexCastDemo/main.cpp rename to Demos/GjkConvexCastDemo/main.cpp diff --git a/ObsoleteDemos/Glut/GL/freeglut.h b/Demos/Glut/GL/freeglut.h similarity index 100% rename from ObsoleteDemos/Glut/GL/freeglut.h rename to Demos/Glut/GL/freeglut.h diff --git a/ObsoleteDemos/Glut/GL/freeglut_ext.h b/Demos/Glut/GL/freeglut_ext.h similarity index 100% rename from ObsoleteDemos/Glut/GL/freeglut_ext.h rename to Demos/Glut/GL/freeglut_ext.h diff --git a/ObsoleteDemos/Glut/GL/freeglut_std.h b/Demos/Glut/GL/freeglut_std.h similarity index 100% rename from ObsoleteDemos/Glut/GL/freeglut_std.h rename to Demos/Glut/GL/freeglut_std.h diff --git a/ObsoleteDemos/Glut/GL/glew.h b/Demos/Glut/GL/glew.h similarity index 100% rename from ObsoleteDemos/Glut/GL/glew.h rename to Demos/Glut/GL/glew.h diff --git a/ObsoleteDemos/Glut/GL/glext.h b/Demos/Glut/GL/glext.h similarity index 100% rename from ObsoleteDemos/Glut/GL/glext.h rename to Demos/Glut/GL/glext.h diff --git a/ObsoleteDemos/Glut/GL/glut.h b/Demos/Glut/GL/glut.h similarity index 100% rename from ObsoleteDemos/Glut/GL/glut.h rename to Demos/Glut/GL/glut.h diff --git a/ObsoleteDemos/Glut/GL/glxew.h b/Demos/Glut/GL/glxew.h similarity index 100% rename from ObsoleteDemos/Glut/GL/glxew.h rename to Demos/Glut/GL/glxew.h diff --git a/ObsoleteDemos/Glut/GL/glxext.h b/Demos/Glut/GL/glxext.h similarity index 100% rename from ObsoleteDemos/Glut/GL/glxext.h rename to Demos/Glut/GL/glxext.h diff --git a/ObsoleteDemos/Glut/GL/wglew.h b/Demos/Glut/GL/wglew.h similarity index 100% rename from ObsoleteDemos/Glut/GL/wglew.h rename to Demos/Glut/GL/wglew.h diff --git a/ObsoleteDemos/Glut/GL/wglext.h b/Demos/Glut/GL/wglext.h similarity index 100% rename from ObsoleteDemos/Glut/GL/wglext.h rename to Demos/Glut/GL/wglext.h diff --git a/ObsoleteDemos/Glut/btGlutInclude.h b/Demos/Glut/btGlutInclude.h similarity index 100% rename from ObsoleteDemos/Glut/btGlutInclude.h rename to Demos/Glut/btGlutInclude.h diff --git a/ObsoleteDemos/Glut/glew32s.lib b/Demos/Glut/glew32s.lib similarity index 100% rename from ObsoleteDemos/Glut/glew32s.lib rename to Demos/Glut/glew32s.lib diff --git a/ObsoleteDemos/Glut/glew64s.lib b/Demos/Glut/glew64s.lib similarity index 100% rename from ObsoleteDemos/Glut/glew64s.lib rename to Demos/Glut/glew64s.lib diff --git a/ObsoleteDemos/Glut/glut32.lib b/Demos/Glut/glut32.lib similarity index 100% rename from ObsoleteDemos/Glut/glut32.lib rename to Demos/Glut/glut32.lib diff --git a/ObsoleteDemos/Glut/glut64.lib b/Demos/Glut/glut64.lib similarity index 100% rename from ObsoleteDemos/Glut/glut64.lib rename to Demos/Glut/glut64.lib diff --git a/ObsoleteDemos/GyroscopicDemo/CMakeLists.txt b/Demos/GyroscopicDemo/CMakeLists.txt similarity index 100% rename from ObsoleteDemos/GyroscopicDemo/CMakeLists.txt rename to Demos/GyroscopicDemo/CMakeLists.txt diff --git a/ObsoleteDemos/GyroscopicDemo/GyroscopicDemo.cpp b/Demos/GyroscopicDemo/GyroscopicDemo.cpp similarity index 100% rename from ObsoleteDemos/GyroscopicDemo/GyroscopicDemo.cpp rename to Demos/GyroscopicDemo/GyroscopicDemo.cpp diff --git a/ObsoleteDemos/GyroscopicDemo/GyroscopicDemo.h b/Demos/GyroscopicDemo/GyroscopicDemo.h similarity index 100% rename from ObsoleteDemos/GyroscopicDemo/GyroscopicDemo.h rename to Demos/GyroscopicDemo/GyroscopicDemo.h diff --git a/ObsoleteDemos/GyroscopicDemo/Win32GyroscopicDemo.cpp b/Demos/GyroscopicDemo/Win32GyroscopicDemo.cpp similarity index 100% rename from ObsoleteDemos/GyroscopicDemo/Win32GyroscopicDemo.cpp rename to Demos/GyroscopicDemo/Win32GyroscopicDemo.cpp diff --git a/ObsoleteDemos/GyroscopicDemo/main.cpp b/Demos/GyroscopicDemo/main.cpp similarity index 100% rename from ObsoleteDemos/GyroscopicDemo/main.cpp rename to Demos/GyroscopicDemo/main.cpp diff --git a/ObsoleteDemos/HelloWorld/CMakeLists.txt b/Demos/HelloWorld/CMakeLists.txt similarity index 100% rename from ObsoleteDemos/HelloWorld/CMakeLists.txt rename to Demos/HelloWorld/CMakeLists.txt diff --git a/ObsoleteDemos/HelloWorld/HelloWorld.cpp b/Demos/HelloWorld/HelloWorld.cpp similarity index 100% rename from ObsoleteDemos/HelloWorld/HelloWorld.cpp rename to Demos/HelloWorld/HelloWorld.cpp diff --git a/ObsoleteDemos/HelloWorld/premake4.lua b/Demos/HelloWorld/premake4.lua similarity index 100% rename from ObsoleteDemos/HelloWorld/premake4.lua rename to Demos/HelloWorld/premake4.lua diff --git a/ObsoleteDemos/InternalEdgeDemo/CMakeLists.txt b/Demos/InternalEdgeDemo/CMakeLists.txt similarity index 100% rename from ObsoleteDemos/InternalEdgeDemo/CMakeLists.txt rename to Demos/InternalEdgeDemo/CMakeLists.txt diff --git a/ObsoleteDemos/InternalEdgeDemo/InternalEdgeDemo.cpp b/Demos/InternalEdgeDemo/InternalEdgeDemo.cpp similarity index 100% rename from ObsoleteDemos/InternalEdgeDemo/InternalEdgeDemo.cpp rename to Demos/InternalEdgeDemo/InternalEdgeDemo.cpp diff --git a/ObsoleteDemos/InternalEdgeDemo/InternalEdgeDemo.h b/Demos/InternalEdgeDemo/InternalEdgeDemo.h similarity index 100% rename from ObsoleteDemos/InternalEdgeDemo/InternalEdgeDemo.h rename to Demos/InternalEdgeDemo/InternalEdgeDemo.h diff --git a/ObsoleteDemos/InternalEdgeDemo/Taru.mdl b/Demos/InternalEdgeDemo/Taru.mdl similarity index 100% rename from ObsoleteDemos/InternalEdgeDemo/Taru.mdl rename to Demos/InternalEdgeDemo/Taru.mdl diff --git a/ObsoleteDemos/InternalEdgeDemo/Win32InternalEdgeDemo.cpp b/Demos/InternalEdgeDemo/Win32InternalEdgeDemo.cpp similarity index 100% rename from ObsoleteDemos/InternalEdgeDemo/Win32InternalEdgeDemo.cpp rename to Demos/InternalEdgeDemo/Win32InternalEdgeDemo.cpp diff --git a/ObsoleteDemos/InternalEdgeDemo/main.cpp b/Demos/InternalEdgeDemo/main.cpp similarity index 100% rename from ObsoleteDemos/InternalEdgeDemo/main.cpp rename to Demos/InternalEdgeDemo/main.cpp diff --git a/ObsoleteDemos/MovingConcaveDemo/CMakeLists.txt b/Demos/MovingConcaveDemo/CMakeLists.txt similarity index 100% rename from ObsoleteDemos/MovingConcaveDemo/CMakeLists.txt rename to Demos/MovingConcaveDemo/CMakeLists.txt diff --git a/ObsoleteDemos/MovingConcaveDemo/ConcaveDemo.h b/Demos/MovingConcaveDemo/ConcaveDemo.h similarity index 100% rename from ObsoleteDemos/MovingConcaveDemo/ConcaveDemo.h rename to Demos/MovingConcaveDemo/ConcaveDemo.h diff --git a/ObsoleteDemos/MovingConcaveDemo/ConcavePhysicsDemo.cpp b/Demos/MovingConcaveDemo/ConcavePhysicsDemo.cpp similarity index 100% rename from ObsoleteDemos/MovingConcaveDemo/ConcavePhysicsDemo.cpp rename to Demos/MovingConcaveDemo/ConcavePhysicsDemo.cpp diff --git a/ObsoleteDemos/MultiMaterialDemo/CMakeLists.txt b/Demos/MultiMaterialDemo/CMakeLists.txt similarity index 100% rename from ObsoleteDemos/MultiMaterialDemo/CMakeLists.txt rename to Demos/MultiMaterialDemo/CMakeLists.txt diff --git a/ObsoleteDemos/MultiMaterialDemo/MultiMaterialDemo.cpp b/Demos/MultiMaterialDemo/MultiMaterialDemo.cpp similarity index 100% rename from ObsoleteDemos/MultiMaterialDemo/MultiMaterialDemo.cpp rename to Demos/MultiMaterialDemo/MultiMaterialDemo.cpp diff --git a/ObsoleteDemos/MultiMaterialDemo/MultiMaterialDemo.h b/Demos/MultiMaterialDemo/MultiMaterialDemo.h similarity index 100% rename from ObsoleteDemos/MultiMaterialDemo/MultiMaterialDemo.h rename to Demos/MultiMaterialDemo/MultiMaterialDemo.h diff --git a/ObsoleteDemos/MultiMaterialDemo/main.cpp b/Demos/MultiMaterialDemo/main.cpp similarity index 100% rename from ObsoleteDemos/MultiMaterialDemo/main.cpp rename to Demos/MultiMaterialDemo/main.cpp diff --git a/ObsoleteDemos/MultiThreadedDemo/CMakeLists.txt b/Demos/MultiThreadedDemo/CMakeLists.txt similarity index 100% rename from ObsoleteDemos/MultiThreadedDemo/CMakeLists.txt rename to Demos/MultiThreadedDemo/CMakeLists.txt diff --git a/ObsoleteDemos/MultiThreadedDemo/Makefile.am b/Demos/MultiThreadedDemo/Makefile.am similarity index 100% rename from ObsoleteDemos/MultiThreadedDemo/Makefile.am rename to Demos/MultiThreadedDemo/Makefile.am diff --git a/ObsoleteDemos/MultiThreadedDemo/MultiThreadedDemo.cpp b/Demos/MultiThreadedDemo/MultiThreadedDemo.cpp similarity index 100% rename from ObsoleteDemos/MultiThreadedDemo/MultiThreadedDemo.cpp rename to Demos/MultiThreadedDemo/MultiThreadedDemo.cpp diff --git a/ObsoleteDemos/MultiThreadedDemo/MultiThreadedDemo.h b/Demos/MultiThreadedDemo/MultiThreadedDemo.h similarity index 100% rename from ObsoleteDemos/MultiThreadedDemo/MultiThreadedDemo.h rename to Demos/MultiThreadedDemo/MultiThreadedDemo.h diff --git a/ObsoleteDemos/MultiThreadedDemo/main.cpp b/Demos/MultiThreadedDemo/main.cpp similarity index 100% rename from ObsoleteDemos/MultiThreadedDemo/main.cpp rename to Demos/MultiThreadedDemo/main.cpp diff --git a/ObsoleteDemos/NativeClient/bin_html/bind.js b/Demos/NativeClient/bin_html/bind.js similarity index 100% rename from ObsoleteDemos/NativeClient/bin_html/bind.js rename to Demos/NativeClient/bin_html/bind.js diff --git a/ObsoleteDemos/NativeClient/bin_html/dragger.js b/Demos/NativeClient/bin_html/dragger.js similarity index 100% rename from ObsoleteDemos/NativeClient/bin_html/dragger.js rename to Demos/NativeClient/bin_html/dragger.js diff --git a/ObsoleteDemos/NativeClient/bin_html/httpd.cmd b/Demos/NativeClient/bin_html/httpd.cmd similarity index 100% rename from ObsoleteDemos/NativeClient/bin_html/httpd.cmd rename to Demos/NativeClient/bin_html/httpd.cmd diff --git a/ObsoleteDemos/NativeClient/bin_html/httpd.py b/Demos/NativeClient/bin_html/httpd.py similarity index 100% rename from ObsoleteDemos/NativeClient/bin_html/httpd.py rename to Demos/NativeClient/bin_html/httpd.py diff --git a/ObsoleteDemos/NativeClient/bin_html/index.html b/Demos/NativeClient/bin_html/index.html similarity index 100% rename from ObsoleteDemos/NativeClient/bin_html/index.html rename to Demos/NativeClient/bin_html/index.html diff --git a/ObsoleteDemos/NativeClient/bin_html/trackball.js b/Demos/NativeClient/bin_html/trackball.js similarity index 100% rename from ObsoleteDemos/NativeClient/bin_html/trackball.js rename to Demos/NativeClient/bin_html/trackball.js diff --git a/ObsoleteDemos/NativeClient/bin_html/tumbler.js b/Demos/NativeClient/bin_html/tumbler.js similarity index 100% rename from ObsoleteDemos/NativeClient/bin_html/tumbler.js rename to Demos/NativeClient/bin_html/tumbler.js diff --git a/ObsoleteDemos/NativeClient/bin_html/tumbler.nmf b/Demos/NativeClient/bin_html/tumbler.nmf similarity index 100% rename from ObsoleteDemos/NativeClient/bin_html/tumbler.nmf rename to Demos/NativeClient/bin_html/tumbler.nmf diff --git a/ObsoleteDemos/NativeClient/bin_html/vector3.js b/Demos/NativeClient/bin_html/vector3.js similarity index 100% rename from ObsoleteDemos/NativeClient/bin_html/vector3.js rename to Demos/NativeClient/bin_html/vector3.js diff --git a/ObsoleteDemos/NativeClient/callback.h b/Demos/NativeClient/callback.h similarity index 100% rename from ObsoleteDemos/NativeClient/callback.h rename to Demos/NativeClient/callback.h diff --git a/ObsoleteDemos/NativeClient/cube.cc b/Demos/NativeClient/cube.cc similarity index 100% rename from ObsoleteDemos/NativeClient/cube.cc rename to Demos/NativeClient/cube.cc diff --git a/ObsoleteDemos/NativeClient/cube.h b/Demos/NativeClient/cube.h similarity index 100% rename from ObsoleteDemos/NativeClient/cube.h rename to Demos/NativeClient/cube.h diff --git a/ObsoleteDemos/NativeClient/opengl_context.cc b/Demos/NativeClient/opengl_context.cc similarity index 100% rename from ObsoleteDemos/NativeClient/opengl_context.cc rename to Demos/NativeClient/opengl_context.cc diff --git a/ObsoleteDemos/NativeClient/opengl_context.h b/Demos/NativeClient/opengl_context.h similarity index 100% rename from ObsoleteDemos/NativeClient/opengl_context.h rename to Demos/NativeClient/opengl_context.h diff --git a/ObsoleteDemos/NativeClient/opengl_context_ptrs.h b/Demos/NativeClient/opengl_context_ptrs.h similarity index 100% rename from ObsoleteDemos/NativeClient/opengl_context_ptrs.h rename to Demos/NativeClient/opengl_context_ptrs.h diff --git a/ObsoleteDemos/NativeClient/premake4.lua b/Demos/NativeClient/premake4.lua similarity index 100% rename from ObsoleteDemos/NativeClient/premake4.lua rename to Demos/NativeClient/premake4.lua diff --git a/ObsoleteDemos/NativeClient/scripting_bridge.cc b/Demos/NativeClient/scripting_bridge.cc similarity index 100% rename from ObsoleteDemos/NativeClient/scripting_bridge.cc rename to Demos/NativeClient/scripting_bridge.cc diff --git a/ObsoleteDemos/NativeClient/scripting_bridge.h b/Demos/NativeClient/scripting_bridge.h similarity index 100% rename from ObsoleteDemos/NativeClient/scripting_bridge.h rename to Demos/NativeClient/scripting_bridge.h diff --git a/ObsoleteDemos/NativeClient/shader_util.cc b/Demos/NativeClient/shader_util.cc similarity index 100% rename from ObsoleteDemos/NativeClient/shader_util.cc rename to Demos/NativeClient/shader_util.cc diff --git a/ObsoleteDemos/NativeClient/shader_util.h b/Demos/NativeClient/shader_util.h similarity index 100% rename from ObsoleteDemos/NativeClient/shader_util.h rename to Demos/NativeClient/shader_util.h diff --git a/ObsoleteDemos/NativeClient/transforms.cc b/Demos/NativeClient/transforms.cc similarity index 100% rename from ObsoleteDemos/NativeClient/transforms.cc rename to Demos/NativeClient/transforms.cc diff --git a/ObsoleteDemos/NativeClient/transforms.h b/Demos/NativeClient/transforms.h similarity index 100% rename from ObsoleteDemos/NativeClient/transforms.h rename to Demos/NativeClient/transforms.h diff --git a/ObsoleteDemos/NativeClient/tumbler.cc b/Demos/NativeClient/tumbler.cc similarity index 100% rename from ObsoleteDemos/NativeClient/tumbler.cc rename to Demos/NativeClient/tumbler.cc diff --git a/ObsoleteDemos/NativeClient/tumbler.h b/Demos/NativeClient/tumbler.h similarity index 100% rename from ObsoleteDemos/NativeClient/tumbler.h rename to Demos/NativeClient/tumbler.h diff --git a/ObsoleteDemos/NativeClient/tumbler_module.cc b/Demos/NativeClient/tumbler_module.cc similarity index 100% rename from ObsoleteDemos/NativeClient/tumbler_module.cc rename to Demos/NativeClient/tumbler_module.cc diff --git a/ObsoleteDemos/OpenGL/CMakeLists.txt b/Demos/OpenGL/CMakeLists.txt similarity index 100% rename from ObsoleteDemos/OpenGL/CMakeLists.txt rename to Demos/OpenGL/CMakeLists.txt diff --git a/ObsoleteDemos/OpenGL/CommandLineArguments.h b/Demos/OpenGL/CommandLineArguments.h similarity index 100% rename from ObsoleteDemos/OpenGL/CommandLineArguments.h rename to Demos/OpenGL/CommandLineArguments.h diff --git a/ObsoleteDemos/OpenGL/DebugCastResult.h b/Demos/OpenGL/DebugCastResult.h similarity index 100% rename from ObsoleteDemos/OpenGL/DebugCastResult.h rename to Demos/OpenGL/DebugCastResult.h diff --git a/ObsoleteDemos/OpenGL/DemoApplication.cpp b/Demos/OpenGL/DemoApplication.cpp similarity index 97% rename from ObsoleteDemos/OpenGL/DemoApplication.cpp rename to Demos/OpenGL/DemoApplication.cpp index 3baaca44c..a231c8789 100644 --- a/ObsoleteDemos/OpenGL/DemoApplication.cpp +++ b/Demos/OpenGL/DemoApplication.cpp @@ -4,8 +4,8 @@ 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, +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. @@ -14,6 +14,7 @@ subject to the following restrictions: */ + #include "DemoApplication.h" #include "LinearMath/btIDebugDraw.h" #include "BulletDynamics/Dynamics/btDynamicsWorld.h" @@ -43,7 +44,7 @@ btCollisionShape* gShapePtr[maxNumObjects];//1 rigidbody has 1 shape (no re-use extern int gNumClampedCcdMotions; -#ifdef SHOW_NUM_DEEP_PENETRATIONS +#ifdef SHOW_NUM_DEEP_PENETRATIONS extern int gNumDeepPenetrationChecks; extern int gNumSplitImpulseRecoveries; @@ -75,7 +76,7 @@ m_scaleBottom(0.5f), m_scaleFactor(2.f), m_cameraUp(0,1,0), m_forwardAxis(2), -m_zoomStepSize(0.4), +m_zoomStepSize(0.4), m_glutScreenWidth(0), m_glutScreenHeight(0), m_frustumZNear(1.f), @@ -112,6 +113,8 @@ DemoApplication::~DemoApplication() if (m_shapeDrawer) delete m_shapeDrawer; + + //GLDebugResetFont(0,0); } @@ -220,20 +223,20 @@ void DemoApplication::updateCamera() { aspect = m_glutScreenWidth / (btScalar)m_glutScreenHeight; extents.setValue(aspect * 1.0f, 1.0f,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); @@ -243,8 +246,8 @@ void DemoApplication::updateCamera() { glFrustum (-aspect * m_frustumZNear, aspect * m_frustumZNear, -m_frustumZNear, m_frustumZNear, m_frustumZNear, m_frustumZFar); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); - gluLookAt(m_cameraPosition[0], m_cameraPosition[1], m_cameraPosition[2], - m_cameraTargetPosition[0], m_cameraTargetPosition[1], m_cameraTargetPosition[2], + 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()); } @@ -254,32 +257,32 @@ void DemoApplication::updateCamera() { const float STEPSIZE = 5; -void DemoApplication::stepLeft() -{ - m_azi -= STEPSIZE; if (m_azi < 0) m_azi += 360; updateCamera(); +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::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::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::stepBack() +{ + m_ele -= STEPSIZE; if (m_ele < 0) m_ele += 360; updateCamera(); } -void DemoApplication::zoomIn() -{ - m_cameraDistance -= btScalar(m_zoomStepSize); updateCamera(); +void DemoApplication::zoomIn() +{ + m_cameraDistance -= btScalar(m_zoomStepSize); updateCamera(); if (m_cameraDistance < btScalar(0.1)) m_cameraDistance = btScalar(0.1); } -void DemoApplication::zoomOut() -{ - m_cameraDistance += btScalar(m_zoomStepSize); updateCamera(); +void DemoApplication::zoomOut() +{ + m_cameraDistance += btScalar(m_zoomStepSize); updateCamera(); } @@ -292,7 +295,7 @@ void DemoApplication::zoomOut() -void DemoApplication::reshape(int w, int h) +void DemoApplication::reshape(int w, int h) { GLDebugResetFont(w,h); @@ -324,7 +327,7 @@ void DemoApplication::keyboardCallback(unsigned char key, int x, int y) } #endif //BT_NO_PROFILE - switch (key) + switch (key) { case 8: { @@ -337,7 +340,7 @@ void DemoApplication::keyboardCallback(unsigned char key, int x, int y) btRigidBody* body = btRigidBody::upcast(obj); if (body && body->getMotionState()) { - delete body->getMotionState(); + delete body->getMotionState(); } delete obj; @@ -345,7 +348,7 @@ void DemoApplication::keyboardCallback(unsigned char key, int x, int y) } break; } - case 'q' : + case 'q' : #ifdef BT_USE_FREEGLUT //return from glutMainLoop(), detect memory leaks etc. glutLeaveMainLoop(); @@ -418,44 +421,44 @@ void DemoApplication::keyboardCallback(unsigned char key, int x, int y) m_debugMode |= btIDebugDraw::DBG_DrawNormals; break; - case 't' : + case 't' : if (m_debugMode & btIDebugDraw::DBG_DrawText) m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawText); else m_debugMode |= btIDebugDraw::DBG_DrawText; break; - case 'y': + case 'y': if (m_debugMode & btIDebugDraw::DBG_DrawFeaturesText) m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawFeaturesText); else m_debugMode |= btIDebugDraw::DBG_DrawFeaturesText; break; - case 'a': + case 'a': if (m_debugMode & btIDebugDraw::DBG_DrawAabb) m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawAabb); else m_debugMode |= btIDebugDraw::DBG_DrawAabb; break; - case 'c' : + case 'c' : if (m_debugMode & btIDebugDraw::DBG_DrawContactPoints) m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawContactPoints); else m_debugMode |= btIDebugDraw::DBG_DrawContactPoints; break; - case 'C' : + case 'C' : if (m_debugMode & btIDebugDraw::DBG_DrawConstraints) m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawConstraints); else m_debugMode |= btIDebugDraw::DBG_DrawConstraints; break; - case 'L' : + case 'L' : if (m_debugMode & btIDebugDraw::DBG_DrawConstraintLimits) m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawConstraintLimits); else m_debugMode |= btIDebugDraw::DBG_DrawConstraintLimits; break; - case 'd' : + case 'd' : if (m_debugMode & btIDebugDraw::DBG_NoDeactivation) m_debugMode = m_debugMode & (~btIDebugDraw::DBG_NoDeactivation); else @@ -516,7 +519,7 @@ void DemoApplication::keyboardCallback(unsigned char key, int x, int y) if (getDynamicsWorld() && getDynamicsWorld()->getDebugDrawer()) getDynamicsWorld()->getDebugDrawer()->setDebugMode(m_debugMode); - + } @@ -589,7 +592,7 @@ void DemoApplication::shootBox(const btVector3& destination) // printf("shootBox uid=%d\n", body->getBroadphaseHandle()->getUid()); // printf("camPos=%f,%f,%f\n",camPos.getX(),camPos.getY(),camPos.getZ()); // printf("destination=%f,%f,%f\n",destination.getX(),destination.getY(),destination.getZ()); - + } } @@ -604,7 +607,7 @@ btRigidBody* pickedBody = 0;//for deactivation state btVector3 DemoApplication::getRayTo(int x,int y) { - + if (m_ortho) { @@ -613,14 +616,14 @@ btVector3 DemoApplication::getRayTo(int x,int y) btVector3 extents; aspect = m_glutScreenWidth / (btScalar)m_glutScreenHeight; extents.setValue(aspect * 1.0f, 1.0f,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; @@ -654,9 +657,9 @@ btVector3 DemoApplication::getRayTo(int x,int y) vertical *= 2.f * farPlane * tanfov; btScalar aspect; - + aspect = m_glutScreenWidth / (btScalar)m_glutScreenHeight; - + hor*=aspect; @@ -676,7 +679,7 @@ btScalar mousePickClamping = 30.f; void DemoApplication::mouseFunc(int button, int state, int x, int y) { - if (state == 0) + if (state == 0) { m_mouseButtons |= 1<rayTest(rayFrom,rayTo,rayCallback); if (rayCallback.hasHit()) { btVector3 pickPos = rayCallback.m_hitPointWorld; - + pickObject(pickPos, rayCallback.m_collisionObject); - + gOldPickingPos = rayTo; gHitPos = pickPos; @@ -801,7 +804,7 @@ void DemoApplication::mouseFunc(int button, int state, int x, int y) void DemoApplication::pickObject(const btVector3& pickPos, const btCollisionObject* hitObj) { - + btRigidBody* body = (btRigidBody*)btRigidBody::upcast(hitObj); if (body) { @@ -860,15 +863,15 @@ void DemoApplication::pickObject(const btVector3& pickPos, const btCollisionObje p2p->setParam(BT_CONSTRAINT_ERP,0.1,1); p2p->setParam(BT_CONSTRAINT_ERP,0.1,2); */ - + } - + //save mouse position for dragging - + } } - + } void DemoApplication::removePickingConstraint() @@ -979,21 +982,21 @@ void DemoApplication::mouseMotionFunc(int x,int y) if(m_mouseButtons & (2 << 2) && m_mouseButtons & 1) { } - else if(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) + } + else if(m_mouseButtons & 4) { m_cameraDistance -= dy * btScalar(0.02f); if (m_cameraDistancesetContactProcessingThreshold(m_defaultContactProcessingThreshold); #else - btRigidBody* body = new btRigidBody(mass,0,shape,localInertia); + btRigidBody* body = new btRigidBody(mass,0,shape,localInertia); body->setWorldTransform(startTransform); #endif// @@ -1039,13 +1042,13 @@ btRigidBody* DemoApplication::localCreateRigidBody(float mass, const btTransform } //See http://www.lighthouse3d.com/opengl/glut/index.php?bmpfontortho -void DemoApplication::setOrthographicProjection() +void DemoApplication::setOrthographicProjection() { // switch to projection mode glMatrixMode(GL_PROJECTION); - // save previous matrix which contains the + // save previous matrix which contains the //settings for the perspective projection glPushMatrix(); // reset matrix @@ -1063,7 +1066,7 @@ void DemoApplication::setOrthographicProjection() } -void DemoApplication::resetPerspectiveProjection() +void DemoApplication::resetPerspectiveProjection() { glMatrixMode(GL_PROJECTION); @@ -1189,7 +1192,7 @@ void DemoApplication::renderscene(int pass) wireColor += btVector3 (1.f,0.f,0.f); } else - { + { wireColor += btVector3 (.5f,0.f,0.f); } } @@ -1207,7 +1210,7 @@ void DemoApplication::renderscene(int pass) btVector3 aabbMin(0,0,0),aabbMax(0,0,0); //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()); @@ -1235,7 +1238,7 @@ void DemoApplication::renderme() updateCamera(); if (m_dynamicsWorld) - { + { if(m_enableshadows) { glClear(GL_STENCIL_BUFFER_BIT); @@ -1300,7 +1303,7 @@ void DemoApplication::renderme() #ifdef USE_QUICKPROF - + if ( getDebugMode() & btIDebugDraw::DBG_ProfileTimings) { static int counter = 0; @@ -1320,7 +1323,7 @@ void DemoApplication::renderme() #endif //USE_QUICKPROF - + resetPerspectiveProjection(); } @@ -1358,11 +1361,11 @@ void DemoApplication::clientResetScene() m_dynamicsWorld->getConstraint(0)->setEnabled(true); } numObjects = m_dynamicsWorld->getNumCollisionObjects(); - + ///create a copy of the array, not a reference! btCollisionObjectArray copyArray = m_dynamicsWorld->getCollisionObjectArray(); - + for (i=0;ienableTexture(enable)); } bool setShadows(bool enable) { bool p=m_enableshadows;m_enableshadows=enable;return(p); } bool getTexturing() const @@ -145,9 +151,9 @@ public: { return m_debugMode ; } - + void setDebugMode(int mode); - + void setAzi(float azi) { m_azi = azi; @@ -157,7 +163,7 @@ public: { m_ele = ele; } - + void setCameraUp(const btVector3& camUp) { m_cameraUp = camUp; @@ -170,7 +176,7 @@ public: virtual void myinit(); void toggleIdle(); - + virtual void updateCamera(); btVector3 getCameraPosition() @@ -199,9 +205,9 @@ public: } ///glut callbacks - + float getCameraDistance(); - void setCameraDistance(float dist); + void setCameraDistance(float dist); void moveAndDisplay(); virtual void clientMoveAndDisplay() = 0; @@ -217,12 +223,12 @@ public: btRigidBody* localCreateRigidBody(float mass, const btTransform& startTransform,btCollisionShape* shape); - ///callback methods by glut + ///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){} @@ -232,7 +238,7 @@ public: virtual void mouseFunc(int button, int state, int x, int y); virtual void mouseMotionFunc(int x,int y); - + virtual void displayCallback(); virtual void renderme(); diff --git a/ObsoleteDemos/OpenGL/GLDebugDrawer.cpp b/Demos/OpenGL/GLDebugDrawer.cpp similarity index 100% rename from ObsoleteDemos/OpenGL/GLDebugDrawer.cpp rename to Demos/OpenGL/GLDebugDrawer.cpp diff --git a/ObsoleteDemos/OpenGL/GLDebugDrawer.h b/Demos/OpenGL/GLDebugDrawer.h similarity index 100% rename from ObsoleteDemos/OpenGL/GLDebugDrawer.h rename to Demos/OpenGL/GLDebugDrawer.h diff --git a/ObsoleteDemos/OpenGL/GLDebugFont.cpp b/Demos/OpenGL/GLDebugFont.cpp similarity index 99% rename from ObsoleteDemos/OpenGL/GLDebugFont.cpp rename to Demos/OpenGL/GLDebugFont.cpp index 616006810..68ee650e9 100644 --- a/ObsoleteDemos/OpenGL/GLDebugFont.cpp +++ b/Demos/OpenGL/GLDebugFont.cpp @@ -41,7 +41,7 @@ subject to the following restrictions: #include #else #include -#include +#include #endif #endif @@ -59,6 +59,19 @@ static int sScreenHeight = -1; void GLDebugResetFont(int screenWidth,int screenHeight) { + if (screenWidth==0 && screenHeight==0) + { + sScreenWidth = screenWidth; + sScreenHeight = screenHeight; + + if (sTexturesInitialized) + { + glDeleteTextures(1, &sTexture); + glBindTexture(GL_TEXTURE_2D,0); + sTexturesInitialized = false; + } + return; + } if ((sScreenWidth == screenWidth) && (sScreenHeight == screenHeight)) return; diff --git a/ObsoleteDemos/OpenGL/GLDebugFont.h b/Demos/OpenGL/GLDebugFont.h similarity index 100% rename from ObsoleteDemos/OpenGL/GLDebugFont.h rename to Demos/OpenGL/GLDebugFont.h diff --git a/ObsoleteDemos/OpenGL/GL_DialogDynamicsWorld.cpp b/Demos/OpenGL/GL_DialogDynamicsWorld.cpp similarity index 100% rename from ObsoleteDemos/OpenGL/GL_DialogDynamicsWorld.cpp rename to Demos/OpenGL/GL_DialogDynamicsWorld.cpp diff --git a/ObsoleteDemos/OpenGL/GL_DialogDynamicsWorld.h b/Demos/OpenGL/GL_DialogDynamicsWorld.h similarity index 100% rename from ObsoleteDemos/OpenGL/GL_DialogDynamicsWorld.h rename to Demos/OpenGL/GL_DialogDynamicsWorld.h diff --git a/ObsoleteDemos/OpenGL/GL_DialogWindow.cpp b/Demos/OpenGL/GL_DialogWindow.cpp similarity index 100% rename from ObsoleteDemos/OpenGL/GL_DialogWindow.cpp rename to Demos/OpenGL/GL_DialogWindow.cpp diff --git a/ObsoleteDemos/OpenGL/GL_DialogWindow.h b/Demos/OpenGL/GL_DialogWindow.h similarity index 100% rename from ObsoleteDemos/OpenGL/GL_DialogWindow.h rename to Demos/OpenGL/GL_DialogWindow.h diff --git a/ObsoleteDemos/OpenGL/GL_ShapeDrawer.cpp b/Demos/OpenGL/GL_ShapeDrawer.cpp similarity index 99% rename from ObsoleteDemos/OpenGL/GL_ShapeDrawer.cpp rename to Demos/OpenGL/GL_ShapeDrawer.cpp index f9acd1250..c23355503 100644 --- a/ObsoleteDemos/OpenGL/GL_ShapeDrawer.cpp +++ b/Demos/OpenGL/GL_ShapeDrawer.cpp @@ -515,8 +515,8 @@ void GL_ShapeDrawer::drawOpenGL(btScalar* m, const btCollisionShape* shape, cons 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_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); diff --git a/ObsoleteDemos/OpenGL/GL_ShapeDrawer.h b/Demos/OpenGL/GL_ShapeDrawer.h similarity index 100% rename from ObsoleteDemos/OpenGL/GL_ShapeDrawer.h rename to Demos/OpenGL/GL_ShapeDrawer.h diff --git a/ObsoleteDemos/OpenGL/GL_Simplex1to4.cpp b/Demos/OpenGL/GL_Simplex1to4.cpp similarity index 100% rename from ObsoleteDemos/OpenGL/GL_Simplex1to4.cpp rename to Demos/OpenGL/GL_Simplex1to4.cpp diff --git a/ObsoleteDemos/OpenGL/GL_Simplex1to4.h b/Demos/OpenGL/GL_Simplex1to4.h similarity index 100% rename from ObsoleteDemos/OpenGL/GL_Simplex1to4.h rename to Demos/OpenGL/GL_Simplex1to4.h diff --git a/ObsoleteDemos/OpenGL/GlutDemoApplication.cpp b/Demos/OpenGL/GlutDemoApplication.cpp similarity index 100% rename from ObsoleteDemos/OpenGL/GlutDemoApplication.cpp rename to Demos/OpenGL/GlutDemoApplication.cpp diff --git a/ObsoleteDemos/OpenGL/GlutDemoApplication.h b/Demos/OpenGL/GlutDemoApplication.h similarity index 100% rename from ObsoleteDemos/OpenGL/GlutDemoApplication.h rename to Demos/OpenGL/GlutDemoApplication.h diff --git a/ObsoleteDemos/OpenGL/GlutStuff.cpp b/Demos/OpenGL/GlutStuff.cpp similarity index 98% rename from ObsoleteDemos/OpenGL/GlutStuff.cpp rename to Demos/OpenGL/GlutStuff.cpp index 95658f1f2..c40de30e5 100644 --- a/ObsoleteDemos/OpenGL/GlutStuff.cpp +++ b/Demos/OpenGL/GlutStuff.cpp @@ -13,7 +13,7 @@ subject to the following restrictions: 3. This notice may not be removed or altered from any source distribution. */ -#ifndef _WINDOWS +#ifndef DONT_USE_GLUT #include "DemoApplication.h" @@ -71,6 +71,7 @@ static void glutDisplayCallback(void) gDemoApplication->displayCallback(); } +//#include int glutmain(int argc, char **argv,int width,int height,const char* title,DemoApplication* demoApp) { @@ -117,4 +118,4 @@ CGLSetParameter(cgl_context, kCGLCPSwapInterval, &swap_interval); } -#endif //_WINDOWS +#endif //DONT_USE_GLUT diff --git a/ObsoleteDemos/OpenGL/GlutStuff.h b/Demos/OpenGL/GlutStuff.h similarity index 50% rename from ObsoleteDemos/OpenGL/GlutStuff.h rename to Demos/OpenGL/GlutStuff.h index 76435ceeb..0cf19c304 100644 --- a/ObsoleteDemos/OpenGL/GlutStuff.h +++ b/Demos/OpenGL/GlutStuff.h @@ -15,50 +15,72 @@ subject to the following restrictions: #ifndef GLUT_STUFF_H #define GLUT_STUFF_H +#ifdef DONT_USE_GLUT #ifdef _WIN32//for glut.h #include #endif +#endif //DONT_USE_GLUT //think different #if defined(__APPLE__) && !defined (VMDMESA) #include #include #include -#include -#else +#ifndef DONT_USE_GLUT + #include +#endif//DONT_USE_GLUT +#else//(__APPLE__) && !defined (VMDMESA) + #ifdef _WINDOWS -#include -#include -#include -#else -#include -#include -#endif //_WINDOWS -#endif //APPLE + #include + #include + #include +#else //_WINDOWS + +#ifdef DONT_USE_GLUT + #include + #include +#else//DONT_USE_GLUT + #ifdef _WIN32 + #include + #endif//_WIN32 + #include + #include + +#endif//DONT_USE_GLUT +#endif//_WINDOWS +#endif //(__APPLE__) && !defined (VMDMESA) #ifdef _WINDOWS -#define BT_ACTIVE_ALT VK_LMENU -#define BT_ACTIVE_SHIFT VK_LSHIFT -#else -#define BT_KEY_K 'k' -#define BT_KEY_LEFT GLUT_KEY_LEFT -#define BT_KEY_RIGHT GLUT_KEY_RIGHT -#define BT_KEY_UP GLUT_KEY_UP -#define BT_KEY_DOWN GLUT_KEY_DOWN -#define BT_KEY_F1 GLUT_KEY_F1 -#define BT_KEY_F2 GLUT_KEY_F2 -#define BT_KEY_F3 GLUT_KEY_F3 -#define BT_KEY_F4 GLUT_KEY_F4 -#define BT_KEY_F5 GLUT_KEY_F5 -#define BT_KEY_PAGEUP GLUT_KEY_PAGE_UP -#define BT_KEY_PAGEDOWN GLUT_KEY_PAGE_DOWN -#define BT_KEY_END GLUT_KEY_END -#define BT_KEY_HOME GLUT_KEY_HOME -#define BT_ACTIVE_ALT GLUT_ACTIVE_ALT -#define BT_ACTIVE_CTRL GLUT_ACTIVE_ALT -#define BT_ACTIVE_SHIFT GLUT_ACTIVE_SHIFT + #define BT_ACTIVE_ALT VK_LMENU + #define BT_ACTIVE_SHIFT VK_LSHIFT + #define BT_ACTIVE_CTRL VK_LCONTROL +#else //_WINDOWS +#ifdef DONT_USE_GLUT + #define BT_ACTIVE_ALT 8192 + #define BT_ACTIVE_SHIFT 8193 + #define BT_ACTIVE_CTRL 8194 +#else//DONT_USE_GLUT + #define BT_KEY_K 'k' + #define BT_KEY_LEFT GLUT_KEY_LEFT + #define BT_KEY_RIGHT GLUT_KEY_RIGHT + #define BT_KEY_UP GLUT_KEY_UP + #define BT_KEY_DOWN GLUT_KEY_DOWN + #define BT_KEY_F1 GLUT_KEY_F1 + #define BT_KEY_F2 GLUT_KEY_F2 + #define BT_KEY_F3 GLUT_KEY_F3 + #define BT_KEY_F4 GLUT_KEY_F4 + #define BT_KEY_F5 GLUT_KEY_F5 + #define BT_KEY_PAGEUP GLUT_KEY_PAGE_UP + #define BT_KEY_PAGEDOWN GLUT_KEY_PAGE_DOWN + #define BT_KEY_END GLUT_KEY_END + #define BT_KEY_HOME GLUT_KEY_HOME + #define BT_ACTIVE_ALT GLUT_ACTIVE_ALT + #define BT_ACTIVE_CTRL GLUT_ACTIVE_ALT + #define BT_ACTIVE_SHIFT GLUT_ACTIVE_SHIFT +#endif #endif #if BT_USE_FREEGLUT diff --git a/ObsoleteDemos/OpenGL/Makefile.am b/Demos/OpenGL/Makefile.am similarity index 100% rename from ObsoleteDemos/OpenGL/Makefile.am rename to Demos/OpenGL/Makefile.am diff --git a/ObsoleteDemos/OpenGL/RenderTexture.cpp b/Demos/OpenGL/RenderTexture.cpp similarity index 100% rename from ObsoleteDemos/OpenGL/RenderTexture.cpp rename to Demos/OpenGL/RenderTexture.cpp diff --git a/ObsoleteDemos/OpenGL/RenderTexture.h b/Demos/OpenGL/RenderTexture.h similarity index 96% rename from ObsoleteDemos/OpenGL/RenderTexture.h rename to Demos/OpenGL/RenderTexture.h index 1aee51d79..1153018a1 100644 --- a/ObsoleteDemos/OpenGL/RenderTexture.h +++ b/Demos/OpenGL/RenderTexture.h @@ -36,6 +36,11 @@ public: ///rgba input is in range [0..1] for each component inline void setPixel(int x,int y,const btVector4& rgba) { + btAssert(x>=0); + btAssert(y>=0); + btAssert(x0.) continue; - + btCollisionObject* colObj0 = (btCollisionObject*)manifold->getBody0(); btCollisionObject* colObj1 = (btCollisionObject*)manifold->getBody1(); // int tag0 = (colObj0)->getIslandTag(); @@ -133,13 +133,13 @@ void SerializeDemo::keyboardCallback(unsigned char key, int x, int y) for (int i=0;i<6;i++) dof6->setLimit(i,0,0); getDynamicsWorld()->addConstraint(dof6,true); - + } } } } - - } + + } for (int i=0;istepSimulation(ms / 1000000.f); - + #ifdef DESERIALIZE_SOFT_BODIES if (fSoftBodySolver) fSoftBodySolver->copyBackToSoftBodies(); @@ -192,8 +192,8 @@ void SerializeDemo::clientMoveAndDisplay() #endif //DESERIALIZE_SOFT_BODIES } - - renderme(); + + renderme(); glFlush(); @@ -209,7 +209,7 @@ class CachingCLFuncs : public CLFunctions public: - CachingCLFuncs (cl_command_queue cqCommandQue, cl_context cxMainContext, cl_device_id device) + CachingCLFuncs (cl_command_queue cqCommandQue, cl_context cxMainContext, cl_device_id device) :CLFunctions(cqCommandQue,cxMainContext), m_device(device) { @@ -220,14 +220,14 @@ class CachingCLFuncs : public CLFunctions cl_int pErrNum; cl_program prog; - + prog = btOpenCLUtils::compileCLProgramFromFile( m_cxMainContext,m_device, &pErrNum,additionalMacros ,srcFileNameForCaching); if (!prog) { printf("Using embedded kernel source instead:\n"); prog = btOpenCLUtils::compileCLProgramFromString( m_cxMainContext,m_device, kernelSource, &pErrNum,additionalMacros); } - + return btOpenCLUtils::compileCLKernelFromString( m_cxMainContext,m_device, kernelSource, kernelName, &pErrNum, prog,additionalMacros); } @@ -237,8 +237,8 @@ class CachingCLFuncs : public CLFunctions void SerializeDemo::displayCallback(void) { - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + if (m_dynamicsWorld->getWorldType()==BT_SOFT_RIGID_DYNAMICS_WORLD) { #ifdef DESERIALIZE_SOFT_BODIES @@ -293,7 +293,7 @@ void SerializeDemo::setupEmptyDynamicsWorld() btGImpactCollisionAlgorithm::registerAlgorithm(m_dispatcher); m_broadphase = new btDbvtBroadphase(); - + ///the default constraint solver. For parallel processing you can use a different solver (see Extras/BulletMultiThreaded) btSequentialImpulseConstraintSolver* sol = new btSequentialImpulseConstraintSolver; @@ -301,7 +301,7 @@ void SerializeDemo::setupEmptyDynamicsWorld() #ifdef DESERIALIZE_SOFT_BODIES - + #ifdef USE_AMD_OPENCL @@ -309,16 +309,16 @@ void SerializeDemo::setupEmptyDynamicsWorld() if ( 1 ) { switch (solverAccel) - { + { case kSolverAccelerationOpenCL_GPU: { btOpenCLSoftBodySolverSIMDAware* softSolv= new btOpenCLSoftBodySolverSIMDAware( g_cqCommandQue, g_cxMainContext ); //btOpenCLSoftBodySolver* softSolv= new btOpenCLSoftBodySolver( g_cqCommandQue, g_cxMainContext); fSoftBodySolver = softSolv; - + CLFunctions* funcs = new CachingCLFuncs(g_cqCommandQue, g_cxMainContext,g_cdDevice); softSolv->setCLFunctions(funcs); - + break; } @@ -334,21 +334,21 @@ void SerializeDemo::setupEmptyDynamicsWorld() } }; } - else + else { - if ( solverAccel != kSolverAccelerationNone ) + if ( solverAccel != kSolverAccelerationNone ) { } - else + else { } fSoftBodySolver = NULL; } #else - + fSoftBodySolver = NULL; #endif - + btSoftRigidDynamicsWorld* world = new btSoftRigidDynamicsWorld(m_dispatcher, m_broadphase, m_solver, m_collisionConfiguration, fSoftBodySolver); m_dynamicsWorld = world; @@ -380,7 +380,7 @@ class MySoftBulletWorldImporter : public btBulletWorldImporter btHashMap m_clusterBodyMap; btHashMap m_softBodyMap; - + public: @@ -394,7 +394,7 @@ public: virtual ~MySoftBulletWorldImporter() { - + } virtual bool convertAllObjects( bParse::btBulletFile* bulletFile2) @@ -413,8 +413,8 @@ public: btSoftBodyFloatData* softBodyData = (btSoftBodyFloatData*)bulletFile2->m_softBodies[i]; int i; int numNodes = softBodyData->m_numNodes; - - + + btSoftBody* psb=new btSoftBody(&m_softRigidWorld->getWorldInfo()); m_softBodyMap.insert(softBodyData,psb); @@ -462,11 +462,11 @@ public: { printf("no mat?\n"); } - + node->m_n.deSerializeFloat(nodeData.m_normal); node->m_q = node->m_x; node->m_v.deSerializeFloat(nodeData.m_velocity); - + } for (i=0;im_numLinks;i++) @@ -501,7 +501,7 @@ public: face->m_ra = faceData.m_restArea; } - + //anchors for (i=0;im_numAnchors;i++) @@ -526,7 +526,7 @@ public: psb->m_pose.m_bframe = (softBodyData->m_pose->m_bframe!=0); psb->m_pose.m_bvolume = (softBodyData->m_pose->m_bvolume!=0); psb->m_pose.m_com.deSerializeFloat(softBodyData->m_pose->m_com); - + psb->m_pose.m_pos.resize(softBodyData->m_pose->m_numPositions); for (i=0;im_pose->m_numPositions;i++) { @@ -547,7 +547,7 @@ public: psb->m_cfg.diterations=softBodyData->m_config.m_driftIterations; psb->m_cfg.citerations=softBodyData->m_config.m_clusterIterations; psb->m_cfg.viterations=softBodyData->m_config.m_velocityIterations; - + //psb->setTotalMass(0.1); psb->m_cfg.aeromodel = (btSoftBody::eAeroModel::_)softBodyData->m_config.m_aeroModel; psb->m_cfg.kLF = softBodyData->m_config.m_lift; @@ -619,7 +619,7 @@ public: psb->m_clusters[i]->m_selfCollisionImpulseFactor = softBodyData->m_clusters[i].m_selfCollisionImpulseFactor; psb->m_clusters[i]->m_vimpulses[0].deSerializeFloat(softBodyData->m_clusters[i].m_vimpulses[0]); psb->m_clusters[i]->m_vimpulses[1].deSerializeFloat(softBodyData->m_clusters[i].m_vimpulses[1]); - + } //psb->initializeClusters(); //psb->updateClusters(); @@ -641,7 +641,7 @@ public: psb->updateConstants(); m_softRigidWorld->getWorldInfo().m_dispatcher = m_softRigidWorld->getDispatcher(); - + m_softRigidWorld->addSoftBody(psb); @@ -742,7 +742,7 @@ m_fileName("testFile.bullet") SerializeDemo::~SerializeDemo() { m_fileLoader->deleteAllData(); - delete m_fileLoader; + delete m_fileLoader; exitPhysics(); } @@ -754,18 +754,39 @@ void SerializeDemo::initPhysics() setCameraDistance(btScalar(SCALING*30.)); setupEmptyDynamicsWorld(); - + #ifdef DESERIALIZE_SOFT_BODIES m_fileLoader = new MySoftBulletWorldImporter((btSoftRigidDynamicsWorld*)m_dynamicsWorld); #else m_fileLoader = new btBulletWorldImporter(m_dynamicsWorld); #endif //DESERIALIZE_SOFT_BODIES - + m_fileLoader->setVerboseMode(m_verboseMode); - + + const char* filename = "testFile.bullet"; + + const char* prefix[]={"./","../","../../","../../../","../../../../", "SerializeDemo/", "Demos/SerializeDemo/", + "../Demos/SerializeDemo/","../../Demos/SerializeDemo/"}; + int numPrefixes = sizeof(prefix)/sizeof(const char*); + char relativeFileName[1024]; + bool fileFound = false; + + for (int i=0;iloadFile("testFile.bullet", "testFileSwappedEndianness.bullet")) + + + if (!m_fileLoader->loadFile(relativeFileName, "testFileSwappedEndianness.bullet")) // if (!m_fileLoader->loadFile("../SoftDemo/testFile.bullet")) { ///create a few basic rigid bodies and save them to testFile.bullet @@ -773,7 +794,7 @@ void SerializeDemo::initPhysics() // btCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0,1,0),50); btCollisionObject* groundObject = 0; - + m_collisionShapes.push_back(groundShape); btTransform groundTransform; @@ -846,12 +867,12 @@ void SerializeDemo::initPhysics() btScalar(20+2.0*k + start_y), btScalar(2.0*j + start_z))); - + //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); - + m_dynamicsWorld->addRigidBody(body); //body->setActivationState(ISLAND_SLEEPING); } @@ -869,14 +890,14 @@ void SerializeDemo::initPhysics() 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); @@ -892,7 +913,7 @@ void SerializeDemo::initPhysics() //clientResetScene(); } - + void SerializeDemo::exitPhysics() { @@ -931,16 +952,16 @@ void SerializeDemo::exitPhysics() m_collisionShapes.clear(); delete m_dynamicsWorld; - + delete m_solver; - + delete m_broadphase; - + delete m_dispatcher; delete m_collisionConfiguration; - + } diff --git a/ObsoleteDemos/SerializeDemo/SerializeDemo.h b/Demos/SerializeDemo/SerializeDemo.h similarity index 100% rename from ObsoleteDemos/SerializeDemo/SerializeDemo.h rename to Demos/SerializeDemo/SerializeDemo.h diff --git a/ObsoleteDemos/SerializeDemo/Win32SerializeDemo.cpp b/Demos/SerializeDemo/Win32SerializeDemo.cpp similarity index 100% rename from ObsoleteDemos/SerializeDemo/Win32SerializeDemo.cpp rename to Demos/SerializeDemo/Win32SerializeDemo.cpp diff --git a/ObsoleteDemos/SerializeDemo/main.cpp b/Demos/SerializeDemo/main.cpp similarity index 100% rename from ObsoleteDemos/SerializeDemo/main.cpp rename to Demos/SerializeDemo/main.cpp diff --git a/ObsoleteDemos/SerializeDemo/testFile.bullet b/Demos/SerializeDemo/testFile.bullet similarity index 100% rename from ObsoleteDemos/SerializeDemo/testFile.bullet rename to Demos/SerializeDemo/testFile.bullet diff --git a/ObsoleteDemos/SerializeDemo/testFileCloth.bullet b/Demos/SerializeDemo/testFileCloth.bullet similarity index 100% rename from ObsoleteDemos/SerializeDemo/testFileCloth.bullet rename to Demos/SerializeDemo/testFileCloth.bullet diff --git a/ObsoleteDemos/SimplexDemo/CMakeLists.txt b/Demos/SimplexDemo/CMakeLists.txt similarity index 100% rename from ObsoleteDemos/SimplexDemo/CMakeLists.txt rename to Demos/SimplexDemo/CMakeLists.txt diff --git a/ObsoleteDemos/SimplexDemo/SimplexDemo.cpp b/Demos/SimplexDemo/SimplexDemo.cpp similarity index 100% rename from ObsoleteDemos/SimplexDemo/SimplexDemo.cpp rename to Demos/SimplexDemo/SimplexDemo.cpp diff --git a/ObsoleteDemos/SimplexDemo/SimplexDemo.h b/Demos/SimplexDemo/SimplexDemo.h similarity index 100% rename from ObsoleteDemos/SimplexDemo/SimplexDemo.h rename to Demos/SimplexDemo/SimplexDemo.h diff --git a/ObsoleteDemos/SliderConstraintDemo/CMakeLists.txt b/Demos/SliderConstraintDemo/CMakeLists.txt similarity index 100% rename from ObsoleteDemos/SliderConstraintDemo/CMakeLists.txt rename to Demos/SliderConstraintDemo/CMakeLists.txt diff --git a/ObsoleteDemos/SliderConstraintDemo/SliderConstraintDemo.cpp b/Demos/SliderConstraintDemo/SliderConstraintDemo.cpp similarity index 100% rename from ObsoleteDemos/SliderConstraintDemo/SliderConstraintDemo.cpp rename to Demos/SliderConstraintDemo/SliderConstraintDemo.cpp diff --git a/ObsoleteDemos/SliderConstraintDemo/SliderConstraintDemo.h b/Demos/SliderConstraintDemo/SliderConstraintDemo.h similarity index 100% rename from ObsoleteDemos/SliderConstraintDemo/SliderConstraintDemo.h rename to Demos/SliderConstraintDemo/SliderConstraintDemo.h diff --git a/ObsoleteDemos/SliderConstraintDemo/main.cpp b/Demos/SliderConstraintDemo/main.cpp similarity index 100% rename from ObsoleteDemos/SliderConstraintDemo/main.cpp rename to Demos/SliderConstraintDemo/main.cpp diff --git a/ObsoleteDemos/SoftDemo/AMD/premake4.lua b/Demos/SoftDemo/AMD/premake4.lua similarity index 100% rename from ObsoleteDemos/SoftDemo/AMD/premake4.lua rename to Demos/SoftDemo/AMD/premake4.lua diff --git a/ObsoleteDemos/SoftDemo/CMakeLists.txt b/Demos/SoftDemo/CMakeLists.txt similarity index 100% rename from ObsoleteDemos/SoftDemo/CMakeLists.txt rename to Demos/SoftDemo/CMakeLists.txt diff --git a/ObsoleteDemos/SoftDemo/Makefile.am b/Demos/SoftDemo/Makefile.am similarity index 100% rename from ObsoleteDemos/SoftDemo/Makefile.am rename to Demos/SoftDemo/Makefile.am diff --git a/ObsoleteDemos/SoftDemo/SoftDemo.cpp b/Demos/SoftDemo/SoftDemo.cpp similarity index 99% rename from ObsoleteDemos/SoftDemo/SoftDemo.cpp rename to Demos/SoftDemo/SoftDemo.cpp index 2413c0211..1928b36bf 100644 --- a/ObsoleteDemos/SoftDemo/SoftDemo.cpp +++ b/Demos/SoftDemo/SoftDemo.cpp @@ -752,11 +752,13 @@ static void Init_Aero2(SoftDemo* pdemo) { //TRACEDEMO const btScalar s=5; + //psb->getWorldInfo()->m_gravity.setValue(0,0,0); + const int segments=10; const int count=5; btVector3 pos(-s*segments, 0, 0); btScalar gap = 0.5; - + for(int i=0;im_softBodyWorldInfo,btVector3(-s,0,-s*3), @@ -793,7 +795,12 @@ static void Init_Aero2(SoftDemo* pdemo) trs.setRotation(rot); psb->transform(trs); psb->setTotalMass(2.0); + + + //this could help performance in some cases + btSoftBodyHelpers::ReoptimizeLinkOrder(psb); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); } diff --git a/ObsoleteDemos/SoftDemo/SoftDemo.h b/Demos/SoftDemo/SoftDemo.h similarity index 100% rename from ObsoleteDemos/SoftDemo/SoftDemo.h rename to Demos/SoftDemo/SoftDemo.h diff --git a/ObsoleteDemos/SoftDemo/bunny.inl b/Demos/SoftDemo/bunny.inl similarity index 100% rename from ObsoleteDemos/SoftDemo/bunny.inl rename to Demos/SoftDemo/bunny.inl diff --git a/ObsoleteDemos/SoftDemo/cube.inl b/Demos/SoftDemo/cube.inl similarity index 100% rename from ObsoleteDemos/SoftDemo/cube.inl rename to Demos/SoftDemo/cube.inl diff --git a/ObsoleteDemos/SoftDemo/main.cpp b/Demos/SoftDemo/main.cpp similarity index 100% rename from ObsoleteDemos/SoftDemo/main.cpp rename to Demos/SoftDemo/main.cpp diff --git a/ObsoleteDemos/TerrainDemo/Makefile.am b/Demos/TerrainDemo/Makefile.am similarity index 100% rename from ObsoleteDemos/TerrainDemo/Makefile.am rename to Demos/TerrainDemo/Makefile.am diff --git a/ObsoleteDemos/TerrainDemo/TerrainDemo.cpp b/Demos/TerrainDemo/TerrainDemo.cpp similarity index 100% rename from ObsoleteDemos/TerrainDemo/TerrainDemo.cpp rename to Demos/TerrainDemo/TerrainDemo.cpp diff --git a/ObsoleteDemos/TerrainDemo/TerrainDemo.h b/Demos/TerrainDemo/TerrainDemo.h similarity index 100% rename from ObsoleteDemos/TerrainDemo/TerrainDemo.h rename to Demos/TerrainDemo/TerrainDemo.h diff --git a/ObsoleteDemos/TerrainDemo/main.cpp b/Demos/TerrainDemo/main.cpp similarity index 100% rename from ObsoleteDemos/TerrainDemo/main.cpp rename to Demos/TerrainDemo/main.cpp diff --git a/ObsoleteDemos/ThreadingDemo/CMakeLists.txt b/Demos/ThreadingDemo/CMakeLists.txt similarity index 100% rename from ObsoleteDemos/ThreadingDemo/CMakeLists.txt rename to Demos/ThreadingDemo/CMakeLists.txt diff --git a/ObsoleteDemos/ThreadingDemo/main.cpp b/Demos/ThreadingDemo/main.cpp similarity index 100% rename from ObsoleteDemos/ThreadingDemo/main.cpp rename to Demos/ThreadingDemo/main.cpp diff --git a/ObsoleteDemos/UserCollisionAlgorithm/CMakeLists.txt b/Demos/UserCollisionAlgorithm/CMakeLists.txt similarity index 100% rename from ObsoleteDemos/UserCollisionAlgorithm/CMakeLists.txt rename to Demos/UserCollisionAlgorithm/CMakeLists.txt diff --git a/ObsoleteDemos/UserCollisionAlgorithm/UserCollisionAlgorithm.cpp b/Demos/UserCollisionAlgorithm/UserCollisionAlgorithm.cpp similarity index 100% rename from ObsoleteDemos/UserCollisionAlgorithm/UserCollisionAlgorithm.cpp rename to Demos/UserCollisionAlgorithm/UserCollisionAlgorithm.cpp diff --git a/ObsoleteDemos/UserCollisionAlgorithm/UserCollisionAlgorithm.h b/Demos/UserCollisionAlgorithm/UserCollisionAlgorithm.h similarity index 100% rename from ObsoleteDemos/UserCollisionAlgorithm/UserCollisionAlgorithm.h rename to Demos/UserCollisionAlgorithm/UserCollisionAlgorithm.h diff --git a/ObsoleteDemos/VehicleDemo/CMakeLists.txt b/Demos/VehicleDemo/CMakeLists.txt similarity index 100% rename from ObsoleteDemos/VehicleDemo/CMakeLists.txt rename to Demos/VehicleDemo/CMakeLists.txt diff --git a/ObsoleteDemos/VehicleDemo/Makefile.am b/Demos/VehicleDemo/Makefile.am similarity index 100% rename from ObsoleteDemos/VehicleDemo/Makefile.am rename to Demos/VehicleDemo/Makefile.am diff --git a/ObsoleteDemos/VehicleDemo/VehicleDemo.cpp b/Demos/VehicleDemo/VehicleDemo.cpp similarity index 100% rename from ObsoleteDemos/VehicleDemo/VehicleDemo.cpp rename to Demos/VehicleDemo/VehicleDemo.cpp diff --git a/ObsoleteDemos/VehicleDemo/VehicleDemo.h b/Demos/VehicleDemo/VehicleDemo.h similarity index 100% rename from ObsoleteDemos/VehicleDemo/VehicleDemo.h rename to Demos/VehicleDemo/VehicleDemo.h diff --git a/ObsoleteDemos/VehicleDemo/heightfield128x128.cpp b/Demos/VehicleDemo/heightfield128x128.cpp similarity index 100% rename from ObsoleteDemos/VehicleDemo/heightfield128x128.cpp rename to Demos/VehicleDemo/heightfield128x128.cpp diff --git a/ObsoleteDemos/VehicleDemo/main.cpp b/Demos/VehicleDemo/main.cpp similarity index 100% rename from ObsoleteDemos/VehicleDemo/main.cpp rename to Demos/VehicleDemo/main.cpp diff --git a/ObsoleteDemos/VoronoiFractureDemo/CMakeLists.txt b/Demos/VoronoiFractureDemo/CMakeLists.txt similarity index 100% rename from ObsoleteDemos/VoronoiFractureDemo/CMakeLists.txt rename to Demos/VoronoiFractureDemo/CMakeLists.txt diff --git a/ObsoleteDemos/VoronoiFractureDemo/Makefile.am b/Demos/VoronoiFractureDemo/Makefile.am similarity index 100% rename from ObsoleteDemos/VoronoiFractureDemo/Makefile.am rename to Demos/VoronoiFractureDemo/Makefile.am diff --git a/ObsoleteDemos/VoronoiFractureDemo/VoronoiFractureDemo.cpp b/Demos/VoronoiFractureDemo/VoronoiFractureDemo.cpp similarity index 100% rename from ObsoleteDemos/VoronoiFractureDemo/VoronoiFractureDemo.cpp rename to Demos/VoronoiFractureDemo/VoronoiFractureDemo.cpp diff --git a/ObsoleteDemos/VoronoiFractureDemo/VoronoiFractureDemo.h b/Demos/VoronoiFractureDemo/VoronoiFractureDemo.h similarity index 100% rename from ObsoleteDemos/VoronoiFractureDemo/VoronoiFractureDemo.h rename to Demos/VoronoiFractureDemo/VoronoiFractureDemo.h diff --git a/ObsoleteDemos/VoronoiFractureDemo/Win32VoronoiFractureDemo.cpp b/Demos/VoronoiFractureDemo/Win32VoronoiFractureDemo.cpp similarity index 100% rename from ObsoleteDemos/VoronoiFractureDemo/Win32VoronoiFractureDemo.cpp rename to Demos/VoronoiFractureDemo/Win32VoronoiFractureDemo.cpp diff --git a/ObsoleteDemos/VoronoiFractureDemo/main.cpp b/Demos/VoronoiFractureDemo/main.cpp similarity index 100% rename from ObsoleteDemos/VoronoiFractureDemo/main.cpp rename to Demos/VoronoiFractureDemo/main.cpp diff --git a/ObsoleteDemos/premake4.lua b/Demos/premake4.lua similarity index 92% rename from ObsoleteDemos/premake4.lua rename to Demos/premake4.lua index 65c3ab34f..89ad341de 100644 --- a/ObsoleteDemos/premake4.lua +++ b/Demos/premake4.lua @@ -8,21 +8,27 @@ function createDemos( demos, incdirs, linknames) kind "ConsoleApp" targetdir ".." + + configuration {} includedirs {incdirs} - + links { + linknames + } + configuration { "Windows" } defines { "GLEW_STATIC"} - links { "opengl32" } - includedirs{ "../Glut" } - libdirs {"../Glut"} - files { "../build/bullet.rc" } + links { "opengl32","glu32","winmm"} + includedirs{ "Glut" } + libdirs {"Glut"} + files { "../build3/bullet.rc" } configuration {"Windows", "x32"} links {"glew32s","glut32"} configuration {"Windows", "x64"} links {"glew64s", "glut64"} - + + configuration {"MacOSX"} --print "hello" linkoptions { "-framework Carbon -framework OpenGL -framework AGL -framework Glut" } @@ -31,9 +37,6 @@ function createDemos( demos, incdirs, linknames) links {"GL","GLU","glut"} configuration{} - links { - linknames - } files { "./" .. name .. "/*.cpp" , diff --git a/Demos3/AllBullet2Demos/BulletDemoEntries.h b/Demos3/AllBullet2Demos/BulletDemoEntries.h index c603a2785..75a7945d1 100644 --- a/Demos3/AllBullet2Demos/BulletDemoEntries.h +++ b/Demos3/AllBullet2Demos/BulletDemoEntries.h @@ -5,15 +5,46 @@ #include "BulletDemoInterface.h" #include "../bullet2/BasicDemo/BasicDemo.h" #include "../bullet2/BasicDemo/HingeDemo.h" +#include "../bullet2/BasicDemo/HingeDemo.h" + #include "../bullet2/FeatherstoneMultiBodyDemo/BulletMultiBodyDemos.h" #include "../bullet2/FeatherstoneMultiBodyDemo/MultiDofDemo.h" #include "../bullet2/RagdollDemo/RagdollDemo.h" #include "../bullet2/LuaDemo/LuaDemo.h" #include "../bullet2/ChainDemo/ChainDemo.h" +#include "../../Demos/CcdPhysicsDemo/CcdPhysicsSetup.h" +#include "../../Demos/ConstraintDemo/ConstraintPhysicsSetup.h" +#include "../ImportURDFDemo/ImportURDFSetup.h" + + +static BulletDemoInterface* MyCcdPhysicsDemoCreateFunc(SimpleOpenGL3App* app) +{ + CommonPhysicsSetup* physicsSetup = new CcdPhysicsSetup(); + return new BasicDemo(app, physicsSetup); +} + +static BulletDemoInterface* MyKinematicObjectCreateFunc(SimpleOpenGL3App* app) +{ + CommonPhysicsSetup* physicsSetup = new KinematicObjectSetup(); + return new BasicDemo(app, physicsSetup); +} + +static BulletDemoInterface* MyConstraintCreateFunc(SimpleOpenGL3App* app) +{ + CommonPhysicsSetup* physicsSetup = new ConstraintPhysicsSetup(); + return new BasicDemo(app, physicsSetup); +} + +static BulletDemoInterface* MyImportUrdfCreateFunc(SimpleOpenGL3App* app) +{ + CommonPhysicsSetup* physicsSetup = new ImportUrdfDemo(); + return new BasicDemo(app, physicsSetup); +} struct BulletDemoEntry { + int m_menuLevel; const char* m_name; BulletDemoInterface::CreateFunc* m_createFunc; }; @@ -23,23 +54,30 @@ static BulletDemoEntry allDemos[]= { //{"emptydemo",EmptyBulletDemo::MyCreateFunc}, - {"BasicDemo",BasicDemo::MyCreateFunc}, - - - {"ChainDemo",ChainDemo::MyCreateFunc}, - {"SIHingeDemo",HingeDemo::SICreateFunc}, - {"PGSHingeDemo",HingeDemo::PGSCreateFunc}, - {"DantzigHingeDemo",HingeDemo::DantzigCreateFunc}, - {"LemkeHingeDemo",HingeDemo::LemkeCreateFunc}, - {"InertiaHingeDemo",HingeDemo::InertiaCreateFunc}, - {"ABMHingeDemo",HingeDemo::FeatherstoneCreateFunc}, - - - {"Ragdoll",RagDollDemo::MyCreateFunc}, - {"MultiBody1",FeatherstoneDemo1::MyCreateFunc}, -// {"MultiBody2",FeatherstoneDemo2::MyCreateFunc}, + {0,"API Demos", 0}, - {"MultiDofDemo",MultiDofDemo::MyCreateFunc}, + {1,"BasicDemo",BasicDemo::MyCreateFunc}, + { 1, "CcdDemo", MyCcdPhysicsDemoCreateFunc }, + { 1, "Kinematic", MyKinematicObjectCreateFunc }, + { 1, "Constraints", MyConstraintCreateFunc }, + { 1, "URDF", MyImportUrdfCreateFunc }, + +/* {1,"ChainDemo",ChainDemo::MyCreateFunc}, +// {0, "Stress tests", 0 }, + + {1,"SIHingeDemo",HingeDemo::SICreateFunc}, + {1,"PGSHingeDemo",HingeDemo::PGSCreateFunc}, + {1,"DantzigHingeDemo",HingeDemo::DantzigCreateFunc}, + {1,"LemkeHingeDemo",HingeDemo::LemkeCreateFunc}, + {1,"InertiaHingeDemo",HingeDemo::InertiaCreateFunc}, + {1,"ABMHingeDemo",HingeDemo::FeatherstoneCreateFunc}, + + {1,"Ragdoll",RagDollDemo::MyCreateFunc}, + */ + { 0, "Multibody" ,0}, + {1,"MultiBody1",FeatherstoneDemo1::MyCreateFunc}, +// {"MultiBody2",FeatherstoneDemo2::MyCreateFunc}, + {1,"MultiDofDemo",MultiDofDemo::MyCreateFunc}, // {"LuaDemo",LuaDemo::MyCreateFunc} }; diff --git a/Demos3/AllBullet2Demos/BulletDemoInterface.h b/Demos3/AllBullet2Demos/BulletDemoInterface.h index 8e69b05bd..188e8e437 100644 --- a/Demos3/AllBullet2Demos/BulletDemoInterface.h +++ b/Demos3/AllBullet2Demos/BulletDemoInterface.h @@ -12,11 +12,12 @@ public: virtual ~BulletDemoInterface() { } - + virtual void initPhysics()=0; virtual void exitPhysics()=0; virtual void stepSimulation(float deltaTime)=0; virtual void renderScene()=0; + virtual void physicsDebugDraw()=0; virtual bool mouseMoveCallback(float x,float y)=0; virtual bool mouseButtonCallback(int button, int state, float x, float y)=0; virtual bool keyboardCallback(int key, int state)=0; @@ -43,6 +44,9 @@ public: virtual void renderScene() { } + virtual void physicsDebugDraw() + { + } virtual bool mouseMoveCallback(float x,float y) { return false; diff --git a/Demos3/AllBullet2Demos/CMakeLists.txt b/Demos3/AllBullet2Demos/CMakeLists.txt index 29cfb6d24..965e634ea 100644 --- a/Demos3/AllBullet2Demos/CMakeLists.txt +++ b/Demos3/AllBullet2Demos/CMakeLists.txt @@ -10,30 +10,65 @@ SET(App_AllBullet2Demos_SRCS main.cpp BulletDemoInterface.h BulletDemoEntries.h + GwenParameterInterface.cpp + GwenParameterInterface.h ../bullet2/BasicDemo/Bullet2RigidBodyDemo.cpp ../bullet2/BasicDemo/Bullet2RigidBodyDemo.h + ../../Demos/BasicDemo/BasicDemoPhysicsSetup.cpp + ../../Demos/BasicDemo/BasicDemoPhysicsSetup.h + ../../Demos/CcdPhysicsDemo/CcdPhysicsSetup.cpp + ../../Demos/CcdPhysicsDemo/CcdPhysicsSetup.h + ../../Demos/ConstraintDemo/ConstraintPhysicsSetup.cpp + ../../Demos/ConstraintDemo/ConstraintPhysicsSetup.h ../bullet2/FeatherstoneMultiBodyDemo/BulletMultiBodyDemos.cpp ../bullet2/FeatherstoneMultiBodyDemo/BulletMultiBodyDemos.h ../bullet2/FeatherstoneMultiBodyDemo/MultiDofDemo.cpp ../bullet2/FeatherstoneMultiBodyDemo/MultiDofDemo.h ../bullet2/BasicDemo/BasicDemo.cpp ../bullet2/BasicDemo/BasicDemo.h - ../bullet2/BasicDemo/HingeDemo.cpp - ../bullet2/BasicDemo/HingeDemo.h - ../bullet2/ChainDemo/ChainDemo.cpp - ../bullet2/ChainDemo/ChainDemo.h - ../bullet2/RagdollDemo/RagdollDemo.cpp - ../bullet2/RagdollDemo/RagdollDemo.h +# the next few demos are not converted to 'newer' structure yet +# target is to convert all Bullet 2 demos in new structure but need to settle down on features +# ../bullet2/BasicDemo/HingeDemo.cpp +# ../bullet2/BasicDemo/HingeDemo.h +# ../bullet2/ChainDemo/ChainDemo.cpp +# ../bullet2/ChainDemo/ChainDemo.h +# ../bullet2/RagdollDemo/RagdollDemo.cpp +# ../bullet2/RagdollDemo/RagdollDemo.h # ../bullet2/LuaDemo/LuaDemo.cpp # ../bullet2/LuaDemo/LuaDemo.h ../GpuDemos/gwenUserInterface.cpp ../GpuDemos/gwenUserInterface.h + ../ImportURDFDemo/ImportURDFSetup.cpp + ../ImportURDFDemo/ImportURDFSetup.h ../../btgui/Timing/b3Clock.cpp ../../btgui/Timing/b3Clock.h - + ../../btgui/urdf/urdfdom/urdf_parser/src/pose.cpp + ../../btgui/urdf/urdfdom/urdf_parser/src/model.cpp + ../../btgui/urdf/urdfdom/urdf_parser/src/link.cpp + ../../btgui/urdf/urdfdom/urdf_parser/src/joint.cpp + ../../btgui/urdf/urdfdom/urdf_parser/include/urdf_parser/urdf_parser.h + ../../btgui/urdf/urdfdom_headers/urdf_exception/include/urdf_exception/exception.h + ../../btgui/urdf/urdfdom_headers/urdf_model/include/urdf_model/pose.h + ../../btgui/urdf/urdfdom_headers/urdf_model/include/urdf_model/model.h + ../../btgui/urdf/urdfdom_headers/urdf_model/include/urdf_model/link.h + ../../btgui/urdf/urdfdom_headers/urdf_model/include/urdf_model/joint.h + ../../btgui/tinyxml/tinystr.cpp + ../../btgui/tinyxml/tinyxml.cpp + ../../btgui/tinyxml/tinyxmlerror.cpp + ../../btgui/tinyxml/tinyxmlparser.cpp + ../../btgui/urdf/boost_replacement/lexical_cast.h + ../../btgui/urdf/boost_replacement/shared_ptr.h + ../../btgui/urdf/boost_replacement/printf_console.cpp + ../../btgui/urdf/boost_replacement/printf_console.h + ../../btgui/urdf/boost_replacement/string_split.cpp + ../../btgui/urdf/boost_replacement/string_split.h ${BULLET_PHYSICS_SOURCE_DIR}/build3/bullet.rc ) +LINK_LIBRARIES( + Bullet3Common BulletSoftBody BulletDynamics BulletCollision LinearMath OpenGLWindow gwen ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} +) + IF (WIN32) SET(App_AllBullet2Demos_SRCS ${App_AllBullet2Demos_SRCS} ${App_AllBullet2Demos_Common_SRCS}) INCLUDE_DIRECTORIES( @@ -41,16 +76,17 @@ IF (WIN32) ) ADD_DEFINITIONS(-DGLEW_STATIC) ELSE(WIN32) - IF(NOT APPLE) - LINK_LIBRARIES( GLEW) - ENDIF(NOT APPLE) + IF(APPLE) + find_library(COCOA NAMES Cocoa) + MESSAGE(${COCOA}) + link_libraries(${COCOA}) + ELSE(APPLE) + LINK_LIBRARIES( pthread GLEW) + ENDIF(APPLE) ENDIF(WIN32) -LINK_LIBRARIES( - Bullet3Common BulletSoftBody BulletDynamics BulletCollision LinearMath OpenGLWindow gwen ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} -) ADD_EXECUTABLE(App_AllBullet2Demos ${App_AllBullet2Demos_SRCS} @@ -61,4 +97,4 @@ IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) SET_TARGET_PROPERTIES(App_AllBullet2Demos PROPERTIES DEBUG_POSTFIX "_Debug") SET_TARGET_PROPERTIES(App_AllBullet2Demos PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel") SET_TARGET_PROPERTIES(App_AllBullet2Demos PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo") -ENDIF(INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) \ No newline at end of file +ENDIF(INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) diff --git a/Demos3/AllBullet2Demos/GwenParameterInterface.cpp b/Demos3/AllBullet2Demos/GwenParameterInterface.cpp new file mode 100644 index 000000000..6df0a26d3 --- /dev/null +++ b/Demos3/AllBullet2Demos/GwenParameterInterface.cpp @@ -0,0 +1,142 @@ +#include "GwenParameterInterface.h" +#include "../GpuDemos/gwenInternalData.h" + + +template +struct MySliderEventHandler : public Gwen::Event::Handler +{ + Gwen::Controls::TextBox* m_label; + Gwen::Controls::Slider* m_pSlider; + char m_variableName[1024]; + T* m_targetValue; + + MySliderEventHandler(const char* varName, Gwen::Controls::TextBox* label, Gwen::Controls::Slider* pSlider,T* target) + :m_label(label), + m_pSlider(pSlider), + m_targetValue(target) + { + memcpy(m_variableName,varName,strlen(varName)+1); + } + + + void SliderMoved( Gwen::Controls::Base* pControl ) + { + Gwen::Controls::Slider* pSlider = (Gwen::Controls::Slider*)pControl; + //printf("value = %f\n", pSlider->GetValue());//UnitPrint( Utility::Format( L"Slider Value: %.2f", pSlider->GetValue() ) ); + float bla = pSlider->GetValue(); + T v = T(bla); + SetValue(v); + + } + + void SetValue(T v) + { + if (v < m_pSlider->GetRangeMin()) + { + printf("?\n"); + } + + if (v > m_pSlider->GetRangeMax()) + { + printf("?\n"); + + } + m_pSlider->SetValue(v,true); + (*m_targetValue) = v; + float val = float(v);//todo: specialize on template type + char txt[1024]; + sprintf(txt,"%s : %.3f", m_variableName,val); + m_label->SetText(txt); + + } +}; + + +struct GwenParameters +{ + b3AlignedObjectArray*> m_sliderEventHandlers; + b3AlignedObjectArray m_sliders; + b3AlignedObjectArray m_textLabels; + int m_savedYposition; +}; + +GwenParameterInterface::GwenParameterInterface(GwenInternalData* gwenInternalData) +:m_gwenInternalData(gwenInternalData) +{ + m_paramInternalData = new GwenParameters; + m_paramInternalData->m_savedYposition = m_gwenInternalData->m_curYposition; + +} + +GwenParameterInterface::~GwenParameterInterface() +{ + + removeAllParameters(); + delete m_paramInternalData; +} + + + +#include +void GwenParameterInterface::registerSliderFloatParameter(SliderParams& params) +{ + Gwen::Controls::TextBox* label = new Gwen::Controls::TextBox(m_gwenInternalData->m_demoPage->GetPage()); + m_paramInternalData->m_textLabels.push_back(label); + //m_data->m_myControls.push_back(label); + label->SetText( params.m_name); + label->SetPos( 10, 10 + 25 ); + label->SetWidth(110); + label->SetPos(10,m_gwenInternalData->m_curYposition); + m_gwenInternalData->m_curYposition+=22; + + Gwen::Controls::HorizontalSlider* pSlider = new Gwen::Controls::HorizontalSlider( m_gwenInternalData->m_demoPage->GetPage()); + m_paramInternalData->m_sliders.push_back(pSlider); + //m_data->m_myControls.push_back(pSlider); + pSlider->SetPos( 10, m_gwenInternalData->m_curYposition ); + pSlider->SetSize( 100, 20 ); + pSlider->SetRange( params.m_minVal, params.m_maxVal); + pSlider->SetNotchCount(20);//float(params.m_maxVal-params.m_minVal)/100.f); + pSlider->SetClampToNotches( params.m_clampToNotches ); + pSlider->SetValue( *params.m_paramValuePointer);//dimensions[i] ); + char labelName[1024]; + sprintf(labelName,"%s",params.m_name);//axisNames[0]); + MySliderEventHandler* handler = new MySliderEventHandler(labelName,label,pSlider,params.m_paramValuePointer); + m_paramInternalData->m_sliderEventHandlers.push_back(handler); + + pSlider->onValueChanged.Add( handler, &MySliderEventHandler::SliderMoved ); + handler->SliderMoved(pSlider); + float v = pSlider->GetValue(); + m_gwenInternalData->m_curYposition+=22; +} + +void GwenParameterInterface::syncParameters() +{ + for (int i=0;im_sliderEventHandlers.size();i++) + { + MySliderEventHandler* handler = m_paramInternalData->m_sliderEventHandlers[i]; + handler->m_pSlider->SetValue(*handler->m_targetValue,true); + } +} + +void GwenParameterInterface::removeAllParameters() +{ + for (int i=0;im_sliders.size();i++) + { + delete m_paramInternalData->m_sliders[i]; + } + m_paramInternalData->m_sliders.clear(); + + for (int i=0;im_sliderEventHandlers.size();i++) + { + delete m_paramInternalData->m_sliderEventHandlers[i]; + } + m_paramInternalData->m_sliderEventHandlers.clear(); + + for (int i=0;im_textLabels.size();i++) + { + delete m_paramInternalData->m_textLabels[i]; + } + m_paramInternalData->m_textLabels.clear(); + + m_gwenInternalData->m_curYposition = this->m_paramInternalData->m_savedYposition; +} \ No newline at end of file diff --git a/Demos3/AllBullet2Demos/GwenParameterInterface.h b/Demos3/AllBullet2Demos/GwenParameterInterface.h new file mode 100644 index 000000000..a36741dd9 --- /dev/null +++ b/Demos3/AllBullet2Demos/GwenParameterInterface.h @@ -0,0 +1,20 @@ +#ifndef GWEN_PARAMETER_INTERFACE_H +#define GWEN_PARAMETER_INTERFACE_H + +#include "../../Demos/CommonParameterInterface.h" + +struct GwenParameterInterface : public CommonParameterInterface +{ + struct GwenInternalData* m_gwenInternalData; + + struct GwenParameters* m_paramInternalData; + + GwenParameterInterface(struct GwenInternalData* gwenInternalData); + virtual ~GwenParameterInterface(); + virtual void registerSliderFloatParameter(SliderParams& params); + virtual void syncParameters(); + virtual void removeAllParameters(); + +}; + +#endif//GWEN_PARAMETER_INTERFACE_H diff --git a/Demos3/AllBullet2Demos/main.cpp b/Demos3/AllBullet2Demos/main.cpp index 3bae9da6f..8432752df 100644 --- a/Demos3/AllBullet2Demos/main.cpp +++ b/Demos3/AllBullet2Demos/main.cpp @@ -2,17 +2,21 @@ #include "Bullet3Common/b3Vector3.h" #include "assert.h" #include - +#include "../GpuDemos/gwenInternalData.h" #include "../GpuDemos/gwenUserInterface.h" #include "BulletDemoEntries.h" #include "../../btgui/Timing/b3Clock.h" +#include "GwenParameterInterface.h" + #define DEMO_SELECTION_COMBOBOX 13 const char* startFileName = "bulletDemo.txt"; static SimpleOpenGL3App* app=0; static GwenUserInterface* gui = 0; static int sCurrentDemoIndex = 0; +static int sCurrentHightlighted = 0; static BulletDemoInterface* sCurrentDemo = 0; static b3AlignedObjectArray allNames; +double motorA=0,motorB=0; bool drawGUI=true; @@ -22,11 +26,18 @@ static bool pauseSimulation=false; void MyKeyboardCallback(int key, int state) { + //printf("key=%d, state=%d\n", key, state); bool handled = false; - if (sCurrentDemo) + if (gui) + { + + handled = gui->keyboardCallback(key, state); + } + if (!handled && sCurrentDemo) { handled = sCurrentDemo->keyboardCallback(key,state); } + //checkout: is it desired to ignore keys, if the demo already handles them? //if (handled) // return; @@ -56,9 +67,9 @@ void MyKeyboardCallback(int key, int state) { app->m_window->setRequestExit(); } - + b3DefaultKeyboardCallback(key,state); - + } static void MyMouseMoveCallback( float x, float y) @@ -90,10 +101,12 @@ static void MyMouseButtonCallback(int button, int state, float x, float y) void selectDemo(int demoIndex) { sCurrentDemoIndex = demoIndex; + sCurrentHightlighted = demoIndex; int numDemos = sizeof(allDemos)/sizeof(BulletDemoEntry); if (demoIndex>numDemos) + { demoIndex = 0; - + } if (sCurrentDemo) { sCurrentDemo->exitPhysics(); @@ -101,19 +114,21 @@ void selectDemo(int demoIndex) delete sCurrentDemo; sCurrentDemo=0; } - if (allDemos[demoIndex].m_createFunc && app) { + app->m_parameterInterface->removeAllParameters(); sCurrentDemo = (*allDemos[demoIndex].m_createFunc)(app); if (sCurrentDemo) + { sCurrentDemo->initPhysics(); - + } } + } void MyComboBoxCallback(int comboId, const char* item) { - printf("comboId = %d, item = %s\n",comboId, item); + //printf("comboId = %d, item = %s\n",comboId, item); if (comboId==DEMO_SELECTION_COMBOBOX) { //find selected item @@ -127,11 +142,97 @@ void MyComboBoxCallback(int comboId, const char* item) } } } - + } + +struct MyMenuItemHander :public Gwen::Event::Handler +{ + int m_buttonId; + + MyMenuItemHander( int buttonId) + :m_buttonId(buttonId) + { + } + + void onButtonA(Gwen::Controls::Base* pControl) + { + const Gwen::String& name = pControl->GetName(); + Gwen::Controls::TreeNode* node = (Gwen::Controls::TreeNode*)pControl; + Gwen::Controls::Label* l = node->GetButton(); + + Gwen::UnicodeString la = node->GetButton()->GetText();// node->GetButton()->GetName();// GetText(); + Gwen::String laa = Gwen::Utility::UnicodeToString(la); + const char* ha = laa.c_str(); + + //printf("selected %s\n", ha); + //int dep = but->IsDepressed(); + //int tog = but->GetToggleState(); +// if (m_data->m_toggleButtonCallback) + // (*m_data->m_toggleButtonCallback)(m_buttonId, tog); + } + void onButtonB(Gwen::Controls::Base* pControl) + { + Gwen::Controls::Label* label = (Gwen::Controls::Label*) pControl; + Gwen::UnicodeString la = label->GetText();// node->GetButton()->GetName();// GetText(); + Gwen::String laa = Gwen::Utility::UnicodeToString(la); + const char* ha = laa.c_str(); + + + selectDemo(sCurrentHightlighted); + saveCurrentDemoEntry(sCurrentDemoIndex, startFileName); + } + void onButtonC(Gwen::Controls::Base* pControl) + { + Gwen::Controls::Label* label = (Gwen::Controls::Label*) pControl; + Gwen::UnicodeString la = label->GetText();// node->GetButton()->GetName();// GetText(); + Gwen::String laa = Gwen::Utility::UnicodeToString(la); + const char* ha = laa.c_str(); + + +// printf("onButtonC ! %s\n", ha); + } + void onButtonD(Gwen::Controls::Base* pControl) + { +/* Gwen::Controls::Label* label = (Gwen::Controls::Label*) pControl; + Gwen::UnicodeString la = label->GetText();// node->GetButton()->GetName();// GetText(); + Gwen::String laa = Gwen::Utility::UnicodeToString(la); + const char* ha = laa.c_str(); + */ + + // printf("onKeyReturn ! \n"); + selectDemo(sCurrentHightlighted); + saveCurrentDemoEntry(sCurrentDemoIndex, startFileName); + + } + + void onButtonE(Gwen::Controls::Base* pControl) + { + // printf("select %d\n",m_buttonId); + sCurrentHightlighted = m_buttonId; + } + + void onButtonF(Gwen::Controls::Base* pControl) + { + //printf("selection changed!\n"); + } + + void onButtonG(Gwen::Controls::Base* pControl) + { + //printf("onButtonG !\n"); + } + + + +}; + + + +extern float shadowMapWorldSize; int main(int argc, char* argv[]) { + shadowMapWorldSize = 25; + b3Clock clock; float dt = 1./120.f; @@ -145,50 +246,105 @@ int main(int argc, char* argv[]) app->m_window->setMouseMoveCallback(MyMouseMoveCallback); app->m_window->setMouseButtonCallback(MyMouseButtonCallback); app->m_window->setKeyboardCallback(MyKeyboardCallback); + GLint err = glGetError(); assert(err==GL_NO_ERROR); - + sth_stash* fontstash=app->getFontStash(); gui = new GwenUserInterface; gui->init(width,height,fontstash,app->m_window->getRetinaScale()); +// gui->getInternalData()->m_explorerPage + Gwen::Controls::TreeControl* tree = gui->getInternalData()->m_explorerTreeCtrl; + + + + app->m_parameterInterface = new GwenParameterInterface(gui->getInternalData()); + + //gui->getInternalData()->m_demoPage; int numDemos = sizeof(allDemos)/sizeof(BulletDemoEntry); - - for (int i=0;ionReturnKeyDown.Add(handler2, &MyMenuItemHander::onButtonD); + + for (int d = 0; dAddNode(nodeUText); + if (d == selectedDemo) + { + pNode->SetSelected(true); + tree->ExpandAll(); + selectDemo(d); + + + } + MyMenuItemHander* handler = new MyMenuItemHander(d); + pNode->onNamePress.Add(handler, &MyMenuItemHander::onButtonA); + pNode->GetButton()->onDoubleClick.Add(handler, &MyMenuItemHander::onButtonB); + pNode->GetButton()->onDown.Add(handler, &MyMenuItemHander::onButtonC); + pNode->onSelect.Add(handler, &MyMenuItemHander::onButtonE); + pNode->onReturnKeyDown.Add(handler, &MyMenuItemHander::onButtonG); + pNode->onSelectChange.Add(handler, &MyMenuItemHander::onButtonF); +// pNode->onKeyReturn.Add(handler, &MyMenuItemHander::onButtonD); +// pNode->GetButton()->onKeyboardReturn.Add(handler, &MyMenuItemHander::onButtonD); + // pNode->onNamePress.Add(handler, &MyMenuItemHander::onButtonD); +// pNode->onKeyboardPressed.Add(handler, &MyMenuItemHander::onButtonD); +// pNode->OnKeyPress + } + else + { + curNode = tree->AddNode(nodeUText); + } + } + +/* for (int i=0;iregisterComboBox(DEMO_SELECTION_COMBOBOX,allNames.size(),&allNames[0],sCurrentDemoIndex); - + //const char* names2[] = {"comboF", "comboG","comboH"}; //gui->registerComboBox(2,3,&names2[0],0); gui->setComboBoxCallback(MyComboBoxCallback); - + */ unsigned long int prevTimeInMicroseconds = clock.getTimeMicroseconds(); + do { GLint err = glGetError(); assert(err==GL_NO_ERROR); app->m_instancingRenderer->init(); - app->m_instancingRenderer->updateCamera(); - - app->drawGrid(); - + DrawGridData dg; +// dg.upAxis = 2; + + app->m_instancingRenderer->updateCamera(dg.upAxis); + app->drawGrid(dg); + static int frameCount = 0; frameCount++; if (0) { char bla[1024]; - + sprintf(bla,"Simple test frame %d", frameCount); - + app->drawText(bla,10,10); } @@ -206,6 +362,7 @@ int main(int argc, char* argv[]) prevTimeInMicroseconds = curTimeInMicroseconds; } sCurrentDemo->renderScene(); + sCurrentDemo->physicsDebugDraw(); } static int toggle = 1; @@ -214,10 +371,11 @@ int main(int argc, char* argv[]) gui->draw(app->m_instancingRenderer->getScreenWidth(),app->m_instancingRenderer->getScreenHeight()); } toggle=1-toggle; + app->m_parameterInterface->syncParameters(); app->swapBuffer(); } while (!app->m_window->requestedExit()); - selectDemo(0); +// selectDemo(0); delete gui; delete app; return 0; diff --git a/Demos3/AllBullet2Demos/premake4.lua b/Demos3/AllBullet2Demos/premake4.lua index eeac13583..91ad53dd4 100644 --- a/Demos3/AllBullet2Demos/premake4.lua +++ b/Demos3/AllBullet2Demos/premake4.lua @@ -13,31 +13,58 @@ "../../btgui/lua-5.2.3/src" } - initOpenGL() - initGlew() links{"gwen", "OpenGL_Window","OpenGL_TrueTypeFont","BulletSoftBody","BulletDynamics","BulletCollision","LinearMath","lua-5.2.3"} - + initOpenGL() + initGlew() + files { "**.cpp", "**.h", "../bullet2/BasicDemo/Bullet2RigidBodyDemo.cpp", "../bullet2/BasicDemo/Bullet2RigidBodyDemo.h", + "../../Demos/BasicDemo/BasicDemoPhysicsSetup.cpp", + "../../Demos/BasicDemo/BasicDemoPhysicsSetup.h", + "../../Demos/CcdPhysicsDemo/CcdPhysicsSetup.cpp", + "../../Demos/CcdPhysicsDemo/CcdPhysicsSetup.h", + "../../Demos/ConstraintDemo/ConstraintPhysicsSetup.cpp", + "../../Demos/ConstraintDemo/ConstraintPhysicsSetup.h", + "../ImportURDFDemo/ImportURDFSetup.cpp", + "../../btgui/urdf/urdfdom/urdf_parser/src/pose.cpp", + "../../btgui/urdf/urdfdom/urdf_parser/src/model.cpp", + "../../btgui/urdf/urdfdom/urdf_parser/src/link.cpp", + "../../btgui/urdf/urdfdom/urdf_parser/src/joint.cpp", + "../../btgui/urdf/urdfdom/urdf_parser/include/urdf_parser/urdf_parser.h", + "../../btgui/urdf/urdfdom_headers/urdf_exception/include/urdf_exception/exception.h", + "../../btgui/urdf/urdfdom_headers/urdf_model/include/urdf_model/pose.h", + "../../btgui/urdf/urdfdom_headers/urdf_model/include/urdf_model/model.h", + "../../btgui/urdf/urdfdom_headers/urdf_model/include/urdf_model/link.h", + "../../btgui/urdf/urdfdom_headers/urdf_model/include/urdf_model/joint.h", + "../../btgui/tinyxml/tinystr.cpp", + "../../btgui/tinyxml/tinyxml.cpp", + "../../btgui/tinyxml/tinyxmlerror.cpp", + "../../btgui/tinyxml/tinyxmlparser.cpp", + "../../btgui/urdf/boost_replacement/lexical_cast.h", + "../../btgui/urdf/boost_replacement/shared_ptr.h", + "../../btgui/urdf/boost_replacement/printf_console.cpp", + "../../btgui/urdf/boost_replacement/printf_console.h", + "../../btgui/urdf/boost_replacement/string_split.cpp", + "../../btgui/urdf/boost_replacement/string_split.h", "../bullet2/FeatherstoneMultiBodyDemo/BulletMultiBodyDemos.cpp", "../bullet2/FeatherstoneMultiBodyDemo/BulletMultiBodyDemos.h", "../bullet2/FeatherstoneMultiBodyDemo/MultiDofDemo.cpp", "../bullet2/FeatherstoneMultiBodyDemo/MultiDofDemo.h", "../bullet2/BasicDemo/BasicDemo.cpp", "../bullet2/BasicDemo/BasicDemo.h", - "../bullet2/BasicDemo/HingeDemo.cpp", - "../bullet2/BasicDemo/HingeDemo.h", - "../bullet2/ChainDemo/ChainDemo.cpp", - "../bullet2/ChainDemo/ChainDemo.h", +-- "../bullet2/BasicDemo/HingeDemo.cpp", +-- "../bullet2/BasicDemo/HingeDemo.h", +-- "../bullet2/ChainDemo/ChainDemo.cpp", +-- "../bullet2/ChainDemo/ChainDemo.h", - "../bullet2/RagdollDemo/RagdollDemo.cpp", - "../bullet2/RagdollDemo/RagdollDemo.h", - "../bullet2/LuaDemo/LuaDemo.cpp", - "../bullet2/LuaDemo/LuaDemo.h", +-- "../bullet2/RagdollDemo/RagdollDemo.cpp", +-- "../bullet2/RagdollDemo/RagdollDemo.h", +-- "../bullet2/LuaDemo/LuaDemo.cpp", +-- "../bullet2/LuaDemo/LuaDemo.h", "../../src/Bullet3Common/**.cpp", @@ -48,7 +75,7 @@ "../GpuDemos/gwenUserInterface.h" } -if os.is("Linux") then links{"X11"} end +if os.is("Linux") then links{"X11","pthread"} end if os.is("MacOSX") then links{"Cocoa.framework"} end diff --git a/Demos3/BasicDemoConsole/main.cpp b/Demos3/BasicDemoConsole/main.cpp new file mode 100644 index 000000000..b54118527 --- /dev/null +++ b/Demos3/BasicDemoConsole/main.cpp @@ -0,0 +1,14 @@ + +#include +#include "../../Demos/BasicDemo/BasicDemoPhysicsSetup.h" + +int main(int argc, char* argv[]) +{ + BasicDemoPhysicsSetup physicsSetup; + GraphicsPhysicsBridge br; + physicsSetup.initPhysics(br); + physicsSetup.stepSimulation(1./60.); + physicsSetup.exitPhysics(); + + printf("hello\n"); +} \ No newline at end of file diff --git a/Demos3/BasicDemoConsole/premake4.lua b/Demos3/BasicDemoConsole/premake4.lua new file mode 100644 index 000000000..330128b24 --- /dev/null +++ b/Demos3/BasicDemoConsole/premake4.lua @@ -0,0 +1,26 @@ +project "App_BasicDemoConsole" + + kind "ConsoleApp" + targetdir "../../bin" + + includedirs {"../../src"} + configuration { "Windows" } +-- links { "opengl32","glu32","gdi32","winmm", "user32" } + files { "../../build3/bullet.rc" } +-- configuration {"MacOSX"} + --print "hello" + -- linkoptions { "-framework Carbon -framework OpenGL -framework AGL -framework Glut" } +-- configuration {"not Windows", "not MacOSX"} +-- links {"GL","GLU","glut"} + configuration{} + + links { + "BulletDynamics", "BulletCollision", "LinearMath" + } + + files { + "*.cpp" , + "*.h", + "../../Demos/BasicDemo/BasicDemoPhysicsSetup.cpp", + "../../Demos/BasicDemo/BasicDemoPhysicsSetup.h" + } diff --git a/Demos3/BasicDemoCustomOpenGL2/main.cpp b/Demos3/BasicDemoCustomOpenGL2/main.cpp new file mode 100644 index 000000000..e23b1d250 --- /dev/null +++ b/Demos3/BasicDemoCustomOpenGL2/main.cpp @@ -0,0 +1,255 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2014 Erwin Coumans http://bulletphysics.org + +//This file is Copyright (c) 2014 Google 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. +*/ + +///This main.cpp replaces glut by Bullet 3 own platform management for OpenGL and input devices + +#include +#include "../../Demos/BasicDemo/BasicDemoPhysicsSetup.h" + + +#ifdef __APPLE__ +#include "OpenGLWindow/MacOpenGLWindow.h" +#else + +#include "GL/glew.h" +#ifdef _WIN32 +#include "OpenGLWindow/Win32OpenGLWindow.h" +#else +//let's cross the fingers it is Linux/X11 +#include "OpenGLWindow/X11OpenGLWindow.h" +#endif //_WIN32 +#endif//__APPLE__ + +#include "../../Demos/OpenGL/DemoApplication.h" +#include "../../Demos/OpenGL/GLDebugDrawer.h" + +int sWidth = 800; +int sHeight = 600; +DemoApplication* gApp = 0; +bool isShiftPressed = false; +bool isCtrlPressed = false; +bool isAltPressed = false; + +/* +todo: add wheel callback +typedef void (*b3WheelCallback)(float deltax, float deltay); +*/ + +void MyKeyboardCallback(int orgKeycode, int state) +{ + int keycode = orgKeycode; + + if (gApp) + { + + switch (orgKeycode) + { + case B3G_SHIFT: + { + isShiftPressed = (state==1); + break; + } + case B3G_ALT: + { + isAltPressed = (state==1); + break; + } + case B3G_CONTROL: + { + isCtrlPressed = (state==1); + break; + } + default: + { + } + }; + + if (state) + { + gApp->keyboardCallback(keycode,0,0); + } else + { + gApp->keyboardUpCallback(keycode,0,0); + } + } +} +void MyMouseMoveCallback( float x, float y) +{ + if (gApp) + { + //printf("mouseMotionFunc %f,%f\n",x,y); + gApp->mouseMotionFunc(x,y); + } +} + +void MyMouseButtonCallback(int button, int state, float x, float y) +{ + if (gApp) + { + //printf("mouseFunc %d,%d, %f,%f\n",button,state,x,y); + gApp->mouseFunc(button,1-state,x,y); + } +} + +void MyResizeCallback(float width, float height) +{ + sWidth = width; + sHeight = height; + if (gApp) + { + gApp->reshape(width,height); + } +} + +int main(int argc, char* argv[]) +{ + + b3gDefaultOpenGLWindow* window = new b3gDefaultOpenGLWindow(); + //window->setKeyboardCallback(keyCallback); + b3gWindowConstructionInfo wci; + wci.m_openglVersion = 2; + wci.m_width = sWidth; + wci.m_height = sHeight; + // wci.m_resizeCallback = MyResizeCallback; + + window->createWindow(wci); + window->setResizeCallback(MyResizeCallback); + window->setMouseButtonCallback(MyMouseButtonCallback); + + window->setMouseMoveCallback(MyMouseMoveCallback); + window->setKeyboardCallback(MyKeyboardCallback); + +// window->setWindowTitle("render test"); + + int majorGlVersion, minorGlVersion; + + if (!sscanf((const char*)glGetString(GL_VERSION), "%d.%d", &majorGlVersion, &minorGlVersion)==2) + { + printf("Exit: Error cannot extract OpenGL version from GL_VERSION string\n"); + exit(0); + } + if (majorGlVersion>=3 && wci.m_openglVersion>=3) + { + float retinaScale = 1.f; + +#ifndef __APPLE__ +#ifndef _WIN32 + //we need glewExperimental on Linux + glewExperimental = GL_TRUE; +#endif // _WIN32 + glewInit(); +#endif + + //we ned to call glGetError twice, because of some Ubuntu/Intel/OpenGL issue + + GLuint err = glGetError(); + err = glGetError(); + btAssert(err==GL_NO_ERROR); + + + retinaScale = window->getRetinaScale(); + + //primRenderer = new GLPrimitiveRenderer(sWidth,sHeight); + //sth_stash* font = initFont(primRenderer ); + //gwenRenderer = new GwenOpenGL3CoreRenderer(primRenderer,font,sWidth,sHeight,retinaScale); + + } else + { + //OpenGL 2.x + /*gwenRenderer = new Gwen::Renderer::OpenGL_DebugFont(); + skin.SetRender( gwenRenderer ); + + pCanvas = new Gwen::Controls::Canvas( &skin ); + pCanvas->SetSize( sWidth, sHeight); + pCanvas->SetDrawBackground( true ); + pCanvas->SetBackgroundColor( Gwen::Color( 150, 170, 170, 255 ) ); + */ + + } + + +// glClearColor(0.2,0.2,0.2,1); + + + + BasicDemoPhysicsSetup physicsSetup; + GraphicsPhysicsBridge br; + physicsSetup.initPhysics(br); + + + struct MyAppie : public DemoApplication + { + virtual void initPhysics() + { + } + virtual void clientMoveAndDisplay() + { + } + virtual void swapBuffers() + { + } + virtual void updateModifierKeys() + { + m_modifierKeys = 0; + if (isAltPressed) + m_modifierKeys |= BT_ACTIVE_ALT; + + if (isCtrlPressed) + m_modifierKeys |= BT_ACTIVE_CTRL; + + if (isShiftPressed) + m_modifierKeys |= BT_ACTIVE_SHIFT; + + } + + }; + + { + MyAppie appie; + appie.setDynamicsWorld(physicsSetup.m_dynamicsWorld); + appie.reshape(sWidth,sHeight); + appie.setShadows(true); + gApp = &appie; + GLDebugDrawer draw; + physicsSetup.m_dynamicsWorld->setDebugDrawer(&draw); + btClock timer; + unsigned long prevTime = timer.getTimeMicroseconds(); + + do + { + unsigned long curTime = timer.getTimeMicroseconds(); + if (!appie.isIdle()) + { + physicsSetup.stepSimulation((curTime-prevTime)*(1./1000000.)); + } + prevTime = curTime; + window->startRendering(); + br.syncPhysicsToGraphics(physicsSetup.m_dynamicsWorld); + appie.renderme(); + physicsSetup.m_dynamicsWorld->debugDrawWorld(); + window->endRendering(); + + } while (!window->requestedExit()); + } + window->closeWindow(); + delete window; + + physicsSetup.exitPhysics(); + + + printf("hello\n"); +} diff --git a/Demos3/BasicDemoCustomOpenGL2/premake4.lua b/Demos3/BasicDemoCustomOpenGL2/premake4.lua new file mode 100644 index 000000000..e59c3e9ab --- /dev/null +++ b/Demos3/BasicDemoCustomOpenGL2/premake4.lua @@ -0,0 +1,39 @@ +project "App_BasicDemoCustomOpenGL2" + + kind "ConsoleApp" + targetdir "../../bin" + + includedirs { + "../../src", + "../../btgui" + } + + defines { "DONT_USE_GLUT"} + + initOpenGL() + initGlew() + + links { + "OpenGL_Window","BulletDynamics", "BulletCollision", "LinearMath" + } + + files { + "*.cpp" , + "*.h", + "../../Demos/BasicDemo/BasicDemoPhysicsSetup.cpp", + "../../Demos/BasicDemo/BasicDemoPhysicsSetup.h", + "../../Demos/OpenGL/DemoApplication.cpp", + "../../Demos/OpenGL/DemoApplication.h", + "../../Demos/OpenGL/GL_ShapeDrawer.cpp", + "../../Demos/OpenGL/GL_ShapeDrawer.h", + "../../Demos/OpenGL/GL_ShapeDrawer.cpp", + "../../Demos/OpenGL/GLDebugDrawer.cpp", + "../../Demos/OpenGL/GLDebugDrawer.h", + "../../Demos/OpenGL/GLDebugFont.cpp", + "../../Demos/OpenGL/GLDebugFont.h" + } +if os.is("Linux") then links{"X11","pthread"} end + +if os.is("MacOSX") then + links{"Cocoa.framework"} +end diff --git a/Demos3/BasicGpuDemo/b3GpuDynamicsWorld.cpp b/Demos3/BasicGpuDemo/b3GpuDynamicsWorld.cpp index 594caa023..faeb09f97 100644 --- a/Demos3/BasicGpuDemo/b3GpuDynamicsWorld.cpp +++ b/Demos3/BasicGpuDemo/b3GpuDynamicsWorld.cpp @@ -54,7 +54,7 @@ b3GpuDynamicsWorld::~b3GpuDynamicsWorld() } -#include +#include int b3GpuDynamicsWorld::stepSimulation( btScalar timeStepUnused, int maxSubStepsUnused, btScalar fixedTimeStep) { diff --git a/Demos3/CMakeLists.txt b/Demos3/CMakeLists.txt index aaa6a1713..edc1c06dc 100644 --- a/Demos3/CMakeLists.txt +++ b/Demos3/CMakeLists.txt @@ -1,2 +1,3 @@ -SUBDIRS( GpuDemos SimpleOpenGL3 AllBullet2Demos ) -#SUBDIRS( SimpleOpenGL3 AllBullet2Demos ) +if (BUILD_BULLET3_DEMOS) + SUBDIRS( AllBullet2Demos GpuDemos SimpleOpenGL3 ) +endif(BUILD_BULLET3_DEMOS) diff --git a/Demos3/CpuDemos/main_opengl3core.cpp b/Demos3/CpuDemos/main_opengl3core.cpp index 540585b02..5de834f00 100644 --- a/Demos3/CpuDemos/main_opengl3core.cpp +++ b/Demos3/CpuDemos/main_opengl3core.cpp @@ -2,7 +2,7 @@ //#include "GpuDemo.h" #ifdef _WIN32 -#include //for GetLocalTime/GetSystemTime +#include //for GetLocalTime/GetSystemTime #else #include //gettimeofday #endif diff --git a/Demos3/GpuDemos/CMakeLists.txt b/Demos3/GpuDemos/CMakeLists.txt index c63783f7f..b6fadf82e 100644 --- a/Demos3/GpuDemos/CMakeLists.txt +++ b/Demos3/GpuDemos/CMakeLists.txt @@ -7,10 +7,9 @@ INCLUDE_DIRECTORIES( ${BULLET_PHYSICS_SOURCE_DIR}/btgui ) - + SET(App_Bullet3_OpenCL_Demos_SRCS ../../src/clew/clew.c - ../../btgui/OpenGLWindow/GlewWindows/glew.c GpuDemo.cpp gwenUserInterface.cpp main_opengl3core.cpp @@ -34,23 +33,27 @@ SET(App_Bullet3_OpenCL_Demos_SRCS ${BULLET_PHYSICS_SOURCE_DIR}/build3/bullet.rc ) +LINK_LIBRARIES( + Bullet2FileLoader Bullet3OpenCL_clew Bullet3Dynamics Bullet3Collision Bullet3Geometry Bullet3Common OpenGLWindow gwen ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} +) + + IF (WIN32) - SET(App_Bullet3_OpenCL_Demos_SRCS ${App_Bullet3_OpenCL_Demos_SRCS} ${App_Bullet3_OpenCL_Demos_Common_SRCS}) + SET(App_Bullet3_OpenCL_Demos_SRCS ${App_Bullet3_OpenCL_Demos_SRCS} ${App_Bullet3_OpenCL_Demos_Common_SRCS} ../../btgui/OpenGLWindow/GlewWindows/glew.c) INCLUDE_DIRECTORIES( ${BULLET_PHYSICS_SOURCE_DIR}/btgui/OpenGLWindow/GlewWindows ) ADD_DEFINITIONS(-DGLEW_STATIC) ELSE(WIN32) - IF(NOT APPLE) - LINK_LIBRARIES( GLEW) - ENDIF(NOT APPLE) + IF(APPLE) + find_library(COCOA NAMES Cocoa) + MESSAGE(${COCOA}) + link_libraries(${COCOA}) + ELSE(APPLE) + LINK_LIBRARIES( GLEW X11 pthread dl) + ENDIF(APPLE) ENDIF(WIN32) - - -LINK_LIBRARIES( - Bullet2FileLoader Bullet3OpenCL_clew Bullet3Dynamics Bullet3Collision Bullet3Geometry Bullet3Common OpenGLWindow gwen ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} -) ADD_EXECUTABLE(App_Bullet3_OpenCL_Demos ${App_Bullet3_OpenCL_Demos_SRCS} @@ -61,4 +64,4 @@ IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) SET_TARGET_PROPERTIES(App_Bullet3_OpenCL_Demos PROPERTIES DEBUG_POSTFIX "_Debug") SET_TARGET_PROPERTIES(App_Bullet3_OpenCL_Demos PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel") SET_TARGET_PROPERTIES(App_Bullet3_OpenCL_Demos PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo") -ENDIF(INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) \ No newline at end of file +ENDIF(INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) diff --git a/Demos3/GpuDemos/broadphase/PairBench.cpp b/Demos3/GpuDemos/broadphase/PairBench.cpp index 9c445417c..021f7e688 100644 --- a/Demos3/GpuDemos/broadphase/PairBench.cpp +++ b/Demos3/GpuDemos/broadphase/PairBench.cpp @@ -9,6 +9,7 @@ #include "OpenGLWindow/b3gWindowInterface.h" #include "Bullet3OpenCL/BroadphaseCollision/b3GpuSapBroadphase.h" #include "Bullet3OpenCL/BroadphaseCollision/b3GpuGridBroadphase.h" +#include "Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvhBroadphase.h" #include "../GpuDemoInternalData.h" #include "Bullet3OpenCL/Initialize/b3OpenCLUtils.h" @@ -108,6 +109,7 @@ static int curSelectedBroadphase = 0; static BroadphaseEntry allBroadphases[]= { {"Gpu Grid",b3GpuGridBroadphase::CreateFunc}, + {"Parallel Linear BVH",b3GpuParallelLinearBvhBroadphase::CreateFunc}, {"CPU Brute Force",b3GpuSapBroadphase::CreateFuncBruteForceCpu}, {"GPU Brute Force",b3GpuSapBroadphase::CreateFuncBruteForceGpu}, {"GPU 1-SAP Original",b3GpuSapBroadphase::CreateFuncOriginal}, @@ -119,6 +121,7 @@ static BroadphaseEntry allBroadphases[]= struct PairBenchInternalData { b3GpuBroadphaseInterface* m_broadphaseGPU; + b3GpuBroadphaseInterface* m_validationBroadphase; cl_kernel m_moveObjectsKernel; cl_kernel m_sineWaveKernel; @@ -154,6 +157,8 @@ PairBench::PairBench() m_window(0) { m_data = new PairBenchInternalData; + + m_data->m_validationBroadphase = 0; } PairBench::~PairBench() { @@ -505,7 +510,16 @@ void PairBench::initPhysics(const ConstructionInfo& ci) m_data->m_sineWaveKernel = b3OpenCLUtils::compileCLKernelFromString(m_clData->m_clContext,m_clData->m_clDevice,pairsKernelsCL,"sineWaveKernel",&errNum,pairBenchProg); m_data->m_colorPairsKernel = b3OpenCLUtils::compileCLKernelFromString(m_clData->m_clContext,m_clData->m_clDevice,pairsKernelsCL,"colorPairsKernel2",&errNum,pairBenchProg); m_data->m_updateAabbSimple = b3OpenCLUtils::compileCLKernelFromString(m_clData->m_clContext,m_clData->m_clDevice,pairsKernelsCL,"updateAabbSimple",&errNum,pairBenchProg); - + + //Method for validating the overlapping pairs requires that the + //reference broadphase does not maintain internal state aside from AABB data. + //That is, overwriting the AABB state in the broadphase using + // b3GpuBroadphaseInterface::getAllAabbsGPU(), + // b3GpuBroadphaseInterface::getSmallAabbIndicesGPU(), and + // b3GpuBroadphaseInterface::getLargeAabbIndicesGPU() + //and then calling b3GpuBroadphaseInterface::calculateOverlappingPairs() should + //always produce the same result regardless of the current state of the broadphase. + m_data->m_validationBroadphase = b3GpuParallelLinearBvhBroadphase::CreateFunc(m_clData->m_clContext,m_clData->m_clDevice,m_clData->m_clQueue); } if (ci.m_window) @@ -741,6 +755,12 @@ void PairBench::deleteBroadphase() void PairBench::exitPhysics() { + if(m_data->m_validationBroadphase) + { + delete m_data->m_validationBroadphase; + m_data->m_validationBroadphase = 0; + } + #ifdef B3_USE_MIDI if (m_data->m_midiIn) { @@ -768,6 +788,17 @@ void PairBench::renderScene() m_instancingRenderer->renderScene(); } +struct OverlappingPairSortPredicate +{ + inline bool operator() (const b3Int4& a, const b3Int4& b) const + { + if(a.x != b.x) return (a.x < b.x); + if(a.y != b.y) return (a.y < b.y); + if(a.z != b.z) return (a.z < b.z); + return (a.w < b.w); + } +}; + void PairBench::clientMoveAndDisplay() { //color all objects blue @@ -901,7 +932,10 @@ void PairBench::clientMoveAndDisplay() } } - + + int prealloc = 3*1024*1024; + int maxOverlap = b3Min(prealloc,16*numObjects); + unsigned long dt = 0; if (numObjects) { @@ -910,16 +944,104 @@ void PairBench::clientMoveAndDisplay() B3_PROFILE("calculateOverlappingPairs"); int sz = sizeof(b3Int4)*64*numObjects; - int prealloc = 3*1024*1024; - - int maxOverlap = b3Min(prealloc,16*numObjects); m_data->m_broadphaseGPU->calculateOverlappingPairs(maxOverlap); int numPairs = m_data->m_broadphaseGPU->getNumOverlap(); //printf("numPairs = %d\n", numPairs); dt = cl.getTimeMicroseconds()-dt; + } + const bool VALIDATE_BROADPHASE = false; //Check that overlapping pairs of 2 broadphases are the same + if(numObjects && VALIDATE_BROADPHASE) + { + B3_PROFILE("validate broadphases"); + + { + B3_PROFILE("calculateOverlappingPairs m_validationBroadphase"); + //m_data->m_validationBroadphase->getAllAabbsCPU() = m_data->m_broadphaseGPU->getAllAabbsCPU(); + + m_data->m_validationBroadphase->getAllAabbsGPU().copyFromOpenCLArray( m_data->m_broadphaseGPU->getAllAabbsGPU() ); + m_data->m_validationBroadphase->getSmallAabbIndicesGPU().copyFromOpenCLArray( m_data->m_broadphaseGPU->getSmallAabbIndicesGPU() ); + m_data->m_validationBroadphase->getLargeAabbIndicesGPU().copyFromOpenCLArray( m_data->m_broadphaseGPU->getLargeAabbIndicesGPU() ); + + m_data->m_validationBroadphase->calculateOverlappingPairs(maxOverlap); + } + + static b3AlignedObjectArray overlappingPairs; + static b3AlignedObjectArray overlappingPairsReference; + m_data->m_broadphaseGPU->getOverlappingPairsGPU().copyToHost(overlappingPairs); + m_data->m_validationBroadphase->getOverlappingPairsGPU().copyToHost(overlappingPairsReference); + + //Reorder pairs so that (pair.x < pair.y) is always true + { + B3_PROFILE("reorder pairs"); + + for(int i = 0; i < overlappingPairs.size(); ++i) + { + b3Int4 pair = overlappingPairs[i]; + if(pair.x > pair.y) + { + b3Swap(pair.x, pair.y); + b3Swap(pair.z, pair.w); + overlappingPairs[i] = pair; + } + } + for(int i = 0; i < overlappingPairsReference.size(); ++i) + { + b3Int4 pair = overlappingPairsReference[i]; + if(pair.x > pair.y) + { + b3Swap(pair.x, pair.y); + b3Swap(pair.z, pair.w); + overlappingPairsReference[i] = pair; + } + } + } + + // + { + B3_PROFILE("Sort overlapping pairs from most to least significant bit"); + + overlappingPairs.quickSort( OverlappingPairSortPredicate() ); + overlappingPairsReference.quickSort( OverlappingPairSortPredicate() ); + } + + //Compare + { + B3_PROFILE("compare pairs"); + + int numPairs = overlappingPairs.size(); + int numPairsReference = overlappingPairsReference.size(); + + bool success = true; + + if(numPairs == numPairsReference) + { + for(int i = 0; i < numPairsReference; ++i) + { + const b3Int4& pairA = overlappingPairs[i]; + const b3Int4& pairB = overlappingPairsReference[i]; + if( pairA.x != pairB.x + || pairA.y != pairB.y + || pairA.z != pairB.z + || pairA.w != pairB.w ) + { + b3Error("Error: one or more overlappingPairs differs from reference.\n"); + success = false; + break; + } + } + } + else + { + b3Error("Error: numPairs %d != numPairsReference %d \n", numPairs, numPairsReference); + success = false; + } + + printf("Broadphase validation: %d \n", success); + } + } if (m_data->m_gui) { diff --git a/Demos3/GpuDemos/gwenInternalData.h b/Demos3/GpuDemos/gwenInternalData.h index 5643f2316..11b6be228 100644 --- a/Demos3/GpuDemos/gwenInternalData.h +++ b/Demos3/GpuDemos/gwenInternalData.h @@ -26,6 +26,7 @@ #include "Gwen/Controls/ListBox.h" #include "Gwen/Skins/Simple.h" //#include "Gwen/Skins/TexturedBase.h" +#include "gwenUserInterface.h" struct GwenInternalData @@ -36,12 +37,14 @@ struct GwenInternalData Gwen::Controls::Canvas* pCanvas; GLPrimitiveRenderer* m_primRenderer; Gwen::Controls::TabButton* m_demoPage; + Gwen::Controls::TabButton* m_explorerPage; + Gwen::Controls::TreeControl* m_explorerTreeCtrl; + int m_curYposition; Gwen::Controls::Label* m_rightStatusBar; Gwen::Controls::Label* m_leftStatusBar; - - b3AlignedObjectArray m_handlers; + b3AlignedObjectArray m_handlers; b3ToggleButtonCallback m_toggleButtonCallback; b3ComboBoxCallback m_comboBoxCallback; diff --git a/Demos3/GpuDemos/gwenUserInterface.cpp b/Demos3/GpuDemos/gwenUserInterface.cpp index 2a9ed96b4..0646b59e6 100644 --- a/Demos3/GpuDemos/gwenUserInterface.cpp +++ b/Demos3/GpuDemos/gwenUserInterface.cpp @@ -31,7 +31,19 @@ GwenUserInterface::~GwenUserInterface() delete coreRend; } - + +class MyMenuItems : public Gwen::Controls::Base +{ +public: + + MyMenuItems() :Gwen::Controls::Base(0) + { + } + void myQuitApp( Gwen::Controls::Base* pControl ) + { + exit(0); + } +}; struct MyTestMenuBar : public Gwen::Controls::MenuStrip { @@ -43,8 +55,10 @@ struct MyTestMenuBar : public Gwen::Controls::MenuStrip { // Gwen::Controls::MenuStrip* menu = new Gwen::Controls::MenuStrip( pParent ); { +MyMenuItems* menuItems = new MyMenuItems; + Gwen::Controls::MenuItem* pRoot = AddItem( L"File" ); - + pRoot->GetMenu()->AddItem(L"Quit",menuItems,(Gwen::Event::Handler::Function)&MyMenuItems::myQuitApp); pRoot = AddItem( L"View" ); // Gwen::Event::Handler* handler = GWEN_MCALL(&MyTestMenuBar::MenuItemSelect ); pRoot->GetMenu()->AddItem( L"Profiler");//,,m_profileWindow,(Gwen::Event::Handler::Function)&MyProfileWindow::MenuItemSelect); @@ -151,29 +165,22 @@ void GwenUserInterface::init(int width, int height,struct sth_stash* stash,float //m_data->m_leftStatusBar->SetText( L"Label Added to Left" ); m_data->m_leftStatusBar->SetWidth(width/2); bar->AddControl( m_data->m_leftStatusBar,false); - + //Gwen::KeyboardFocus /*Gwen::Controls::GroupBox* box = new Gwen::Controls::GroupBox(m_data->pCanvas); box->SetText("text"); box->SetName("name"); box->SetHeight(500); */ - Gwen::Controls::ScrollControl* windowLeft= new Gwen::Controls::ScrollControl(m_data->pCanvas); - windowLeft->Dock(Gwen::Pos::Right); - windowLeft->SetWidth(150); - windowLeft->SetHeight(250); - windowLeft->SetScroll(false,true); + Gwen::Controls::ScrollControl* windowRight= new Gwen::Controls::ScrollControl(m_data->pCanvas); + windowRight->Dock(Gwen::Pos::Right); + windowRight->SetWidth(150); + windowRight->SetHeight(250); + windowRight->SetScroll(false,true); + - /*Gwen::Controls::WindowControl* windowLeft = new Gwen::Controls::WindowControl(m_data->pCanvas); - windowLeft->Dock(Gwen::Pos::Left); - windowLeft->SetTitle("title"); - windowLeft->SetWidth(150); - windowLeft->SetClosable(false); - windowLeft->SetShouldDrawBackground(true); - windowLeft->SetTabable(true); - */ //windowLeft->SetSkin( - Gwen::Controls::TabControl* tab = new Gwen::Controls::TabControl(windowLeft); + Gwen::Controls::TabControl* tab = new Gwen::Controls::TabControl(windowRight); //tab->SetHeight(300); tab->SetWidth(140); @@ -182,7 +189,7 @@ void GwenUserInterface::init(int width, int height,struct sth_stash* stash,float tab->Dock( Gwen::Pos::Fill ); //tab->SetMargin( Gwen::Margin( 2, 2, 2, 2 ) ); - Gwen::UnicodeString str1(L"Main"); + Gwen::UnicodeString str1(L"Params"); m_data->m_demoPage = tab->AddPage(str1); @@ -217,6 +224,39 @@ void GwenUserInterface::init(int width, int height,struct sth_stash* stash,float */ + + Gwen::Controls::ScrollControl* windowLeft = new Gwen::Controls::ScrollControl(m_data->pCanvas); + windowLeft->Dock(Gwen::Pos::Left); + // windowLeft->SetTitle("title"); + windowLeft->SetScroll(false, false); + windowLeft->SetWidth(250); + windowLeft->SetPos(50, 50); + windowLeft->SetHeight(500); + //windowLeft->SetClosable(false); + // windowLeft->SetShouldDrawBackground(true); + windowLeft->SetTabable(true); + + Gwen::Controls::TabControl* explorerTab = new Gwen::Controls::TabControl(windowLeft); + + //tab->SetHeight(300); +// explorerTab->SetWidth(230); + explorerTab->SetHeight(250); + //tab->Dock(Gwen::Pos::Left); + explorerTab->Dock(Gwen::Pos::Fill); + + Gwen::UnicodeString explorerStr1(L"Explorer"); + m_data->m_explorerPage = explorerTab->AddPage(explorerStr1); + Gwen::UnicodeString shapesStr1(L"Shapes"); + explorerTab->AddPage(shapesStr1); + Gwen::UnicodeString testStr1(L"Test"); + explorerTab->AddPage(testStr1); + + Gwen::Controls::TreeControl* ctrl = new Gwen::Controls::TreeControl(m_data->m_explorerPage->GetPage()); + m_data->m_explorerTreeCtrl = ctrl; + ctrl->SetKeyboardInputEnabled(true); + ctrl->Focus(); + ctrl->SetBounds(2, 10, 236, 400); + } b3ToggleButtonCallback GwenUserInterface::getToggleButtonCallback() @@ -292,7 +332,7 @@ void GwenUserInterface::draw(int width, int height) { m_data->pCanvas->SetSize(width,height); m_data->m_primRenderer->setScreenSize(width,height); - m_data->pRenderer->resize(width,height); + m_data->pRenderer->Resize(width,height); m_data->pCanvas->RenderCanvas(); //restoreOpenGLState(); } @@ -318,6 +358,47 @@ bool GwenUserInterface::mouseMoveCallback( float x, float y) return handled; } +#include "OpenGLWindow/b3gWindowInterface.h" + +bool GwenUserInterface::keyboardCallback(int bulletKey, int state) +{ + int key = -1; + if (m_data->pCanvas) + { + //convert 'Bullet' keys into 'Gwen' keys + switch (bulletKey) + { + case B3G_RETURN: + { + key = Gwen::Key::Return; + break; + } + case B3G_LEFT_ARROW: + key = Gwen::Key::Left; + break; + case B3G_RIGHT_ARROW: + key = Gwen::Key::Right; + break; + + case B3G_UP_ARROW: + key = Gwen::Key::Up; + break; + case B3G_DOWN_ARROW: + key = Gwen::Key::Down; + break; + default: + { + + } + }; + bool bDown = (state == 1); + + return m_data->pCanvas->InputKey(key, bDown); + } + return false; +} + + bool GwenUserInterface::mouseButtonCallback(int button, int state, float x, float y) { bool handled = false; @@ -327,7 +408,7 @@ bool GwenUserInterface::mouseButtonCallback(int button, int state, float x, floa if (button>=0) { - handled = m_data->pCanvas->InputMouseButton(button,state); + handled = m_data->pCanvas->InputMouseButton(button,(bool)state); if (handled) { //if (!state) diff --git a/Demos3/GpuDemos/gwenUserInterface.h b/Demos3/GpuDemos/gwenUserInterface.h index 4c32376bf..75f24cb5e 100644 --- a/Demos3/GpuDemos/gwenUserInterface.h +++ b/Demos3/GpuDemos/gwenUserInterface.h @@ -6,6 +6,8 @@ struct GwenInternalData; typedef void (*b3ComboBoxCallback) (int combobox, const char* item); typedef void (*b3ToggleButtonCallback)(int button, int state); + + class GwenUserInterface { GwenInternalData* m_data; @@ -24,6 +26,8 @@ class GwenUserInterface bool mouseMoveCallback( float x, float y); bool mouseButtonCallback(int button, int state, float x, float y); + bool keyboardCallback(int key, int state); + void setToggleButtonCallback(b3ToggleButtonCallback callback); b3ToggleButtonCallback getToggleButtonCallback(); @@ -33,7 +37,7 @@ class GwenUserInterface void setComboBoxCallback(b3ComboBoxCallback callback); b3ComboBoxCallback getComboBoxCallback(); void registerComboBox(int buttonId, int numItems, const char** items, int startItem = 0); - + void setStatusBarMessage(const char* message, bool isLeft=true); GwenInternalData* getInternalData() diff --git a/Demos3/GpuDemos/main_opengl3core.cpp b/Demos3/GpuDemos/main_opengl3core.cpp index 0be3fdfcd..fde95d530 100644 --- a/Demos3/GpuDemos/main_opengl3core.cpp +++ b/Demos3/GpuDemos/main_opengl3core.cpp @@ -2,7 +2,7 @@ //#include "GpuDemo.h" #ifdef _WIN32 -#include //for GetLocalTime/GetSystemTime +#include //for GetLocalTime/GetSystemTime #else #include //gettimeofday #endif diff --git a/Demos3/GpuDemos/premake4.lua b/Demos3/GpuDemos/premake4.lua index 24ca2eaf2..77e2f7119 100644 --- a/Demos3/GpuDemos/premake4.lua +++ b/Demos3/GpuDemos/premake4.lua @@ -91,7 +91,7 @@ function createProject(vendor) } end if os.is("Linux") then - links{"X11"} + links{"X11","pthread"} files { "../../btgui/OpenGLWindow/X11OpenGLWindow.cpp", "../../btgui/OpenGLWindow/X11OpenGLWindows.h" diff --git a/Demos3/GpuDemos/raytrace/RaytracedShadowDemo.cpp b/Demos3/GpuDemos/raytrace/RaytracedShadowDemo.cpp index b114b4511..5c75d12e0 100644 --- a/Demos3/GpuDemos/raytrace/RaytracedShadowDemo.cpp +++ b/Demos3/GpuDemos/raytrace/RaytracedShadowDemo.cpp @@ -187,6 +187,10 @@ void GpuRaytraceScene::renderScene() void GpuRaytraceScene::renderScene2() { + //If using the BVH to accelerate raycasting, the AABBs need to be updated or else they will + //not match the actual rigid body positions after integration. The result is that rigid bodies + //are not drawn or appear clipped, especially if they are moving quickly. + m_data->m_rigidBodyPipeline->setupGpuAabbsFull(); // GpuBoxPlaneScene::renderScene(); // return; @@ -308,7 +312,7 @@ void GpuRaytraceScene::renderScene2() { B3_PROFILE("cast primary rays"); //m_raycaster->castRaysHost(primaryRays, hits, this->m_data->m_np->getNumRigidBodies(), m_data->m_np->getBodiesCpu(), m_data->m_np->getNumCollidablesGpu(), m_data->m_np->getCollidablesCpu(),m_data->m_np->getInternalData()); - m_raycaster->castRays(primaryRays, hits, this->m_data->m_np->getNumRigidBodies(), m_data->m_np->getBodiesCpu(), m_data->m_np->getNumCollidablesGpu(), m_data->m_np->getCollidablesCpu(), m_data->m_np->getInternalData()); + m_raycaster->castRays(primaryRays, hits, this->m_data->m_np->getNumRigidBodies(), m_data->m_np->getBodiesCpu(), m_data->m_np->getNumCollidablesGpu(), m_data->m_np->getCollidablesCpu(), m_data->m_np->getInternalData(), m_data->m_bp); } @@ -350,7 +354,7 @@ void GpuRaytraceScene::renderScene2() { B3_PROFILE("cast shadow rays"); //m_raycaster->castRaysHost(primaryRays, hits, this->m_data->m_np->getNumRigidBodies(), m_data->m_np->getBodiesCpu(), m_data->m_np->getNumCollidablesGpu(), m_data->m_np->getCollidablesCpu()); - m_raycaster->castRays(shadowRays, shadowHits, this->m_data->m_np->getNumRigidBodies(), m_data->m_np->getBodiesCpu(), m_data->m_np->getNumCollidablesGpu(), m_data->m_np->getCollidablesCpu(), m_data->m_np->getInternalData()); + m_raycaster->castRays(shadowRays, shadowHits, this->m_data->m_np->getNumRigidBodies(), m_data->m_np->getBodiesCpu(), m_data->m_np->getNumCollidablesGpu(), m_data->m_np->getCollidablesCpu(), m_data->m_np->getInternalData(), m_data->m_bp); } { diff --git a/Demos3/GpuDemos/softbody/GpuSoftBodyDemo.cpp b/Demos3/GpuDemos/softbody/GpuSoftBodyDemo.cpp index cd15924fc..3eb54ceaf 100644 --- a/Demos3/GpuDemos/softbody/GpuSoftBodyDemo.cpp +++ b/Demos3/GpuDemos/softbody/GpuSoftBodyDemo.cpp @@ -1,4 +1,6 @@ + #include "GpuSoftBodyDemo.h" +#define USE_BARREL_VERTICES #include "OpenGLWindow/ShapeData.h" #include "OpenGLWindow/GLInstancingRenderer.h" #include "Bullet3Common/b3Quaternion.h" @@ -414,4 +416,4 @@ void GpuSoftClothDemo::setupScene(const ConstructionInfo& ci) err = glGetError(); assert(err==GL_NO_ERROR); -} \ No newline at end of file +} diff --git a/Demos3/GpuGuiInitialize/premake4.lua b/Demos3/GpuGuiInitialize/premake4.lua index 696235966..b36da7dd5 100644 --- a/Demos3/GpuGuiInitialize/premake4.lua +++ b/Demos3/GpuGuiInitialize/premake4.lua @@ -68,7 +68,7 @@ function createProject(vendor) } end if os.is("Linux") then - links {"X11"} + links {"X11","pthread"} files { "../../btgui/OpenGLWindow/X11OpenGLWindow.cpp", "../../btgui/OpenGLWindow/X11OpenGLWindows.h" diff --git a/Demos3/ImplicitCloth/main.cpp b/Demos3/ImplicitCloth/main.cpp index be95c76a2..e51062816 100644 --- a/Demos3/ImplicitCloth/main.cpp +++ b/Demos3/ImplicitCloth/main.cpp @@ -29,7 +29,11 @@ void drawCloth(class GLInstancingRenderer* renderer) err = glGetError(); assert(err==GL_NO_ERROR); float pointColor[4]={1,0.4,0.4,1}; - renderer->drawPoints(&cloth->X[0].x,pointColor,total_points,sizeof(float3),6); + + glDisable(GL_DEPTH_TEST); + renderer->drawPoints(&cloth->X[0].x,pointColor,total_points,sizeof(float3),3); + glEnable(GL_DEPTH_TEST); + err = glGetError(); assert(err==GL_NO_ERROR); diff --git a/Demos3/ImplicitCloth/premake4.lua b/Demos3/ImplicitCloth/premake4.lua index 8eea82ce3..beb20168d 100644 --- a/Demos3/ImplicitCloth/premake4.lua +++ b/Demos3/ImplicitCloth/premake4.lua @@ -61,6 +61,7 @@ if os.is("Windows") then "../../btgui/OpenGLWindow/X11OpenGLWindow.h", "../../btgui/OpenGLWindow/X11OpenGLWindow.cpp" } + links{"pthread"} end if os.is("MacOSX") then links{"Cocoa.framework"} diff --git a/Demos3/ImplicitCloth/stan/Cloth.cpp b/Demos3/ImplicitCloth/stan/Cloth.cpp index e713f8eec..35859e686 100644 --- a/Demos3/ImplicitCloth/stan/Cloth.cpp +++ b/Demos3/ImplicitCloth/stan/Cloth.cpp @@ -66,7 +66,7 @@ int cloth_tess = 20; float3 cloth_spawnpoint(0,3,5.0f); - +/* static void ClothDrawSprings(Cloth *cloth) { static const float3 color[3]={float3(1,1,0),float3(1,0,1),float3(0,1,1)}; @@ -78,7 +78,7 @@ static void ClothDrawSprings(Cloth *cloth) Line(X[s.a],X[s.b],color[s.type]); } } - +*/ int cloth_showsprings=0; void DoCloths() @@ -93,4 +93,4 @@ void DoCloths() // ClothDrawSprings(cloth); // debug visualization } -} \ No newline at end of file +} diff --git a/Demos3/ImportURDFDemo/ImportURDFSetup.cpp b/Demos3/ImportURDFDemo/ImportURDFSetup.cpp new file mode 100644 index 000000000..3db2ed3f0 --- /dev/null +++ b/Demos3/ImportURDFDemo/ImportURDFSetup.cpp @@ -0,0 +1,297 @@ +#include "ImportURDFSetup.h" + +ImportUrdfDemo::ImportUrdfDemo() +{ + +} + +ImportUrdfDemo::~ImportUrdfDemo() +{ + +} + + + + +#include "urdf/urdfdom/urdf_parser/include/urdf_parser/urdf_parser.h" +#include +#include + +using namespace urdf; + +void printTree(my_shared_ptr link,int level = 0) +{ + level+=2; + int count = 0; + for (std::vector >::const_iterator child = link->child_links.begin(); child != link->child_links.end(); child++) + { + if (*child) + { + for(int j=0;jname << std::endl; + // first grandchild + printTree(*child,level); + } + else + { + for(int j=0;jname << " has a null child!" << *child << std::endl; + } + } + +} + + +#define MSTRINGIFY(A) #A + + +const char* urdf_char2 = MSTRINGIFY( + + + + + + + + + + + + + + + + + + + + + ); + +const char* urdf_char1 = MSTRINGIFY( + + + + + + + + + + + ); + +const char* urdf_char3 = MSTRINGIFY( + + + + + + + + + + + + + + + + + + + + + + + ); + +const char* urdf_char = MSTRINGIFY( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); + + +#include "BulletCollision/CollisionShapes/btCylinderShape.h" + +void URDFvisual2BulletCollisionShape(my_shared_ptr link, GraphicsPhysicsBridge& gfxBridge) +{ + btCollisionShape* shape = 0; + + { + printf("converting link %s",link->name.c_str()); + + for (int v=0;vvisual_array.size();v++) + { + const Visual* visual = link->visual_array[v].get(); + + + switch (visual->geometry->type) + { + // , BOX, CYLINDER, MESH: + case Geometry::CYLINDER: + { + printf("processing a cylinder\n"); + urdf::Cylinder* cyl = (urdf::Cylinder*)visual->geometry.get(); + btVector3 halfExtents(cyl->radius,cyl->radius,cyl->length); + btCylinderShapeZ* cylZShape = new btCylinderShapeZ(halfExtents); + shape = cylZShape; + break; + } + case Geometry::BOX: + { + printf("processing a box\n"); + urdf::Box* box = (urdf::Box*)visual->geometry.get(); + btVector3 halfExtents(box->dim.x,box->dim.y,box->dim.z); + btBoxShape* boxShape = new btBoxShape(halfExtents); + shape = boxShape; + break; + } + case Geometry::SPHERE: + { + break; + } + case Geometry::MESH: + { + break; + } + default: + { + printf("Error: unknown visual geometry type\n"); + } + } + + if (shape) + { + gfxBridge.createCollisionShapeGraphicsObject(shape); + + btVector3 color(0,0,1); + if (visual->material.get()) + { + color.setValue(visual->material->color.r,visual->material->color.g,visual->material->color.b);//,visual->material->color.a); + } + // btScalar mass, btMotionState* motionState, btCollisionShape* collisionShape, const btVector3& localInertia=btVector3(0,0,0)): + btScalar mass = 0.f; + btVector3 localInertia(0,0,0); + if (mass) + { + shape->calculateLocalInertia(mass,localInertia); + } + btRigidBody::btRigidBodyConstructionInfo rbci(mass,0,shape,localInertia); + btRigidBody* body = new btRigidBody(rbci); + gfxBridge.createRigidBodyGraphicsObject(body,color); + } + } + } + + for (std::vector >::const_iterator child = link->child_links.begin(); child != link->child_links.end(); child++) + { + if (*child) + { + URDFvisual2BulletCollisionShape(*child,gfxBridge); + + } + else + { + std::cout << "root link: " << link->name << " has a null child!" << *child << std::endl; + } + } + + + + +} +void ImportUrdfDemo::initPhysics(GraphicsPhysicsBridge& gfxBridge) +{ + int argc=0; + char* filename="somefile.urdf"; + + std::string xml_string; + + if (argc < 2){ + std::cerr << "No URDF file name provided, using a dummy test URDF" << std::endl; + + xml_string = std::string(urdf_char); + + } else + { + + + std::fstream xml_file(filename, std::fstream::in); + while ( xml_file.good() ) + { + std::string line; + std::getline( xml_file, line); + xml_string += (line + "\n"); + } + xml_file.close(); + } + + my_shared_ptr robot = parseURDF(xml_string); + if (!robot){ + std::cerr << "ERROR: Model Parsing the xml failed" << std::endl; + return ; + } + std::cout << "robot name is: " << robot->getName() << std::endl; + + // get info from parser + std::cout << "---------- Successfully Parsed XML ---------------" << std::endl; + // get root link + my_shared_ptr root_link=robot->getRoot(); + if (!root_link) return ; + + std::cout << "root Link: " << root_link->name << " has " << root_link->child_links.size() << " child(ren)" << std::endl; + + // print entire tree + printTree(root_link); + + { + URDFvisual2BulletCollisionShape(root_link, gfxBridge); + } + + +} diff --git a/Demos3/ImportURDFDemo/ImportURDFSetup.h b/Demos3/ImportURDFDemo/ImportURDFSetup.h new file mode 100644 index 000000000..043c6f438 --- /dev/null +++ b/Demos3/ImportURDFDemo/ImportURDFSetup.h @@ -0,0 +1,16 @@ +#ifndef IMPORT_URDF_SETUP_H +#define IMPORT_URDF_SETUP_H + + +#include "../../Demos/CommonRigidBodySetup.h" + +class ImportUrdfDemo : public CommonRigidBodySetup +{ +public: + ImportUrdfDemo(); + virtual ~ImportUrdfDemo(); + + virtual void initPhysics(GraphicsPhysicsBridge& gfxBridge); +}; + +#endif //IMPORT_URDF_SETUP_H diff --git a/Demos3/SimpleOpenGL3/CMakeLists.txt b/Demos3/SimpleOpenGL3/CMakeLists.txt index e144a2ce4..417cef45a 100644 --- a/Demos3/SimpleOpenGL3/CMakeLists.txt +++ b/Demos3/SimpleOpenGL3/CMakeLists.txt @@ -11,6 +11,10 @@ SET(AppSimpleOpenGL3_SRCS ${BULLET_PHYSICS_SOURCE_DIR}/build3/bullet.rc ) +LINK_LIBRARIES( + gwen OpenGLWindow Bullet3Common ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} +) + IF (WIN32) SET(AppSimpleOpenGL3_SRCS ${AppSimpleOpenGL3_SRCS} ${AppSimpleOpenGL3_Common_SRCS}) INCLUDE_DIRECTORIES( @@ -18,16 +22,15 @@ IF (WIN32) ) ADD_DEFINITIONS(-DGLEW_STATIC) ELSE(WIN32) - IF(NOT APPLE) - LINK_LIBRARIES( GLEW) - ENDIF(NOT APPLE) + IF(APPLE) + find_library(COCOA NAMES Cocoa) + MESSAGE(${COCOA}) + link_libraries(${COCOA}) + ELSE(APPLE) + LINK_LIBRARIES( GLEW X11 pthread dl Xext) + ENDIF(APPLE) ENDIF(WIN32) - - -LINK_LIBRARIES( - Bullet3Common OpenGLWindow gwen ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} -) ADD_EXECUTABLE(AppSimpleOpenGL3 ${AppSimpleOpenGL3_SRCS} @@ -38,4 +41,4 @@ IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) SET_TARGET_PROPERTIES(AppSimpleOpenGL3 PROPERTIES DEBUG_POSTFIX "_Debug") SET_TARGET_PROPERTIES(AppSimpleOpenGL3 PROPERTIES MINSIZEREL_POSTFIX "_MinsizeRel") SET_TARGET_PROPERTIES(AppSimpleOpenGL3 PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo") -ENDIF(INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) \ No newline at end of file +ENDIF(INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES) diff --git a/Demos3/SimpleOpenGL3/main.cpp b/Demos3/SimpleOpenGL3/main.cpp index 91faf454a..530d2b9a5 100644 --- a/Demos3/SimpleOpenGL3/main.cpp +++ b/Demos3/SimpleOpenGL3/main.cpp @@ -1,13 +1,18 @@ -#include "../../btgui/OpenGLWindow/SimpleOpenGL3App.h" +#include "OpenGLWindow/SimpleOpenGL3App.h" #include "Bullet3Common/b3Vector3.h" +#include "Bullet3Common/b3CommandLineArgs.h" #include "assert.h" #include +char* gVideoFileName = 0; +char* gPngFileName = 0; + int main(int argc, char* argv[]) { - + b3CommandLineArgs myArgs(argc,argv); + float dt = 1./120.f; - + SimpleOpenGL3App* app = new SimpleOpenGL3App("SimpleOpenGL3App",1024,768); app->m_instancingRenderer->setCameraDistance(13); app->m_instancingRenderer->setCameraPitch(0); @@ -15,25 +20,40 @@ int main(int argc, char* argv[]) GLint err = glGetError(); assert(err==GL_NO_ERROR); - + + myArgs.GetCmdLineArgument("mp4_file",gVideoFileName); + if (gVideoFileName) + app->dumpFramesToVideo(gVideoFileName); + + myArgs.GetCmdLineArgument("png_file",gPngFileName); + char fileName[1024]; + do { + static int frameCount = 0; + frameCount++; + if (gPngFileName) + { + printf("gPngFileName=%s\n",gPngFileName); + + sprintf(fileName,"%s%d.png",gPngFileName,frameCount++); + app->dumpNextFrameToPng(fileName); + } + GLint err = glGetError(); assert(err==GL_NO_ERROR); app->m_instancingRenderer->init(); app->m_instancingRenderer->updateCamera(); - + app->drawGrid(); char bla[1024]; - static int frameCount = 0; - frameCount++; sprintf(bla,"Simple test frame %d", frameCount); - + app->drawText(bla,10,10); app->swapBuffer(); } while (!app->m_window->requestedExit()); - + delete app; return 0; } diff --git a/Demos3/SimpleOpenGL3/premake4.lua b/Demos3/SimpleOpenGL3/premake4.lua index 2ab575f07..57a2a04f7 100644 --- a/Demos3/SimpleOpenGL3/premake4.lua +++ b/Demos3/SimpleOpenGL3/premake4.lua @@ -27,7 +27,7 @@ } -if os.is("Linux") then links {"X11"} end +if os.is("Linux") then links {"X11","pthread"} end if os.is("MacOSX") then links{"Cocoa.framework"} diff --git a/Demos3/bullet2/BasicDemo/BasicDemo.cpp b/Demos3/bullet2/BasicDemo/BasicDemo.cpp index 92147c16d..71fb75a11 100644 --- a/Demos3/bullet2/BasicDemo/BasicDemo.cpp +++ b/Demos3/bullet2/BasicDemo/BasicDemo.cpp @@ -14,8 +14,8 @@ static const float scaling=0.35f; -BasicDemo::BasicDemo(SimpleOpenGL3App* app) -:Bullet2RigidBodyDemo(app) +BasicDemo::BasicDemo(SimpleOpenGL3App* app, CommonPhysicsSetup* physicsSetup) +:Bullet2RigidBodyDemo(app,physicsSetup) { } @@ -25,148 +25,6 @@ BasicDemo::~BasicDemo() void BasicDemo::createGround(int cubeShapeId) { - { - float color[]={0.3,0.3,1,1}; - float halfExtents[]={50,50,50,1}; - btTransform groundTransform; - groundTransform.setIdentity(); - groundTransform.setOrigin(btVector3(0,-50,0)); - m_glApp->m_instancingRenderer->registerGraphicsInstance(cubeShapeId,groundTransform.getOrigin(),groundTransform.getRotation(),color,halfExtents); - btBoxShape* groundShape = new btBoxShape(btVector3(btScalar(halfExtents[0]),btScalar(halfExtents[1]),btScalar(halfExtents[2]))); - //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); - } - } -} -void BasicDemo::initPhysics() -{ -// Bullet2RigidBodyDemo::initPhysics(); - - m_config = new btDefaultCollisionConfiguration; - m_dispatcher = new btCollisionDispatcher(m_config); - m_bp = new btDbvtBroadphase(); - m_solver = new btNNCGConstraintSolver(); - m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_bp,m_solver,m_config); - - int curColor=0; - //create ground - int cubeShapeId = m_glApp->registerCubeShape(); - float pos[]={0,0,0}; - float orn[]={0,0,0,1}; - - - createGround(cubeShapeId); - - - { - float halfExtents[]={scaling,scaling,scaling,1}; - btVector4 colors[4] = - { - btVector4(1,0,0,1), - btVector4(0,1,0,1), - btVector4(0,1,1,1), - btVector4(1,1,0,1), - }; - - - - btTransform startTransform; - startTransform.setIdentity(); - btScalar mass = 1.f; - btVector3 localInertia; - btBoxShape* colShape = new btBoxShape(btVector3(halfExtents[0],halfExtents[1],halfExtents[2])); - colShape ->calculateLocalInertia(mass,localInertia); - - for (int k=0;km_instancingRenderer->registerGraphicsInstance(cubeShapeId,startTransform.getOrigin(),startTransform.getRotation(),color,halfExtents); - - //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); - - - m_dynamicsWorld->addRigidBody(body); - } - } - } - } - - m_glApp->m_instancingRenderer->writeTransforms(); -} -void BasicDemo::exitPhysics() -{ - - Bullet2RigidBodyDemo::exitPhysics(); -} -void BasicDemo::renderScene() -{ - //sync graphics -> physics world transforms - { - for (int i=0;igetNumCollisionObjects();i++) - { - btVector3 pos = m_dynamicsWorld->getCollisionObjectArray()[i]->getWorldTransform().getOrigin(); - btQuaternion orn = m_dynamicsWorld->getCollisionObjectArray()[i]->getWorldTransform().getRotation(); - m_glApp->m_instancingRenderer->writeSingleInstanceTransformToCPU(pos,orn,i); - } - m_glApp->m_instancingRenderer->writeTransforms(); - } - - m_glApp->m_instancingRenderer->renderScene(); -} - - -void BasicDemo::stepSimulation(float dt) -{ - m_dynamicsWorld->stepSimulation(dt); - - /* - //print applied force - //contact points - for (int i=0;igetDispatcher()->getNumManifolds();i++) - { - btPersistentManifold* contact = m_dynamicsWorld->getDispatcher()->getManifoldByIndexInternal(i); - for (int c=0;cgetNumContacts();c++) - { - btManifoldPoint& pt = contact->getContactPoint(c); - btScalar dist = pt.getDistance(); - if (dist< contact->getContactProcessingThreshold()) - { - printf("normalImpulse[%d.%d] = %f\n",i,c,pt.m_appliedImpulse); - - } else - { - printf("?\n"); - } - } - } - */ } diff --git a/Demos3/bullet2/BasicDemo/BasicDemo.h b/Demos3/bullet2/BasicDemo/BasicDemo.h index 456dc4f27..7bc77b306 100644 --- a/Demos3/bullet2/BasicDemo/BasicDemo.h +++ b/Demos3/bullet2/BasicDemo/BasicDemo.h @@ -4,27 +4,29 @@ #include "LinearMath/btVector3.h" #include "Bullet2RigidBodyDemo.h" +#include "../../../Demos/BasicDemo/BasicDemoPhysicsSetup.h" + + class BasicDemo : public Bullet2RigidBodyDemo { + + public: static BulletDemoInterface* MyCreateFunc(SimpleOpenGL3App* app) { - return new BasicDemo(app); + CommonPhysicsSetup* physicsSetup = new BasicDemoPhysicsSetup(); + return new BasicDemo(app, physicsSetup); } - BasicDemo(SimpleOpenGL3App* app); + BasicDemo(SimpleOpenGL3App* app, CommonPhysicsSetup* physicsSetup); virtual ~BasicDemo(); void createGround(int cubeShapeId); - virtual void initPhysics(); - virtual void exitPhysics(); - virtual void renderScene(); - virtual void stepSimulation(float dt); }; diff --git a/Demos3/bullet2/BasicDemo/Bullet2RigidBodyDemo.cpp b/Demos3/bullet2/BasicDemo/Bullet2RigidBodyDemo.cpp index 517a9d08b..4ef48ddc0 100644 --- a/Demos3/bullet2/BasicDemo/Bullet2RigidBodyDemo.cpp +++ b/Demos3/bullet2/BasicDemo/Bullet2RigidBodyDemo.cpp @@ -1,53 +1,199 @@ #include "Bullet2RigidBodyDemo.h" #include "btBulletDynamicsCommon.h" #include "OpenGLWindow/SimpleOpenGL3App.h" - -Bullet2RigidBodyDemo::Bullet2RigidBodyDemo(SimpleOpenGL3App* app) - :m_glApp(app), - m_pickedBody(0), - m_pickedConstraint(0) +#include "BulletCollision/CollisionShapes/btShapeHull.h"//to create a tesselation of a generic btConvexShape +#include "MyDebugDrawer.h" +struct GraphicsVertex { - m_config = 0; - m_dispatcher = 0; - m_bp = 0; - m_solver = 0; - m_dynamicsWorld = 0; + float pos[4]; + float normal[3]; + float texcoord[2]; +}; + + +struct MyGraphicsPhysicsBridge : public GraphicsPhysicsBridge +{ + SimpleOpenGL3App* m_glApp; + MyDebugDrawer* m_debugDraw; + + MyGraphicsPhysicsBridge(SimpleOpenGL3App* glApp) + :m_glApp(glApp), m_debugDraw(0) + { + } + virtual void createRigidBodyGraphicsObject(btRigidBody* body, const btVector3& color) + { + btCollisionShape* shape = body->getCollisionShape(); + btTransform startTransform = body->getWorldTransform(); + int graphicsShapeId = shape->getUserIndex(); + btAssert(graphicsShapeId >= 0); + btVector3 localScaling = shape->getLocalScaling(); + int graphicsInstanceId = m_glApp->m_instancingRenderer->registerGraphicsInstance(graphicsShapeId, startTransform.getOrigin(), startTransform.getRotation(), color, localScaling); + body->setUserIndex(graphicsInstanceId); + } + virtual void createCollisionShapeGraphicsObject(btCollisionShape* collisionShape) + { + //todo: support all collision shape types + switch (collisionShape->getShapeType()) + { + case BOX_SHAPE_PROXYTYPE: + { + btBoxShape* box = (btBoxShape*)collisionShape; + btVector3 halfExtents = box->getHalfExtentsWithMargin(); + int cubeShapeId = m_glApp->registerCubeShape(halfExtents.x(), halfExtents.y(), halfExtents.z()); + box->setUserIndex(cubeShapeId); + break; + } + + default: + { + if (collisionShape->isConvex()) + { + btConvexShape* convex = (btConvexShape*)collisionShape; + { + btShapeHull* hull = new btShapeHull(convex); + hull->buildHull(0.0); + + { + //int strideInBytes = 9*sizeof(float); + //int numVertices = hull->numVertices(); + //int numIndices =hull->numIndices(); + + btAlignedObjectArray gvertices; + btAlignedObjectArray indices; + + for (int t=0;tnumTriangles();t++) + { + + btVector3 triNormal; + + int index0 = hull->getIndexPointer()[t*3+0]; + int index1 = hull->getIndexPointer()[t*3+1]; + int index2 = hull->getIndexPointer()[t*3+2]; + btVector3 pos0 =hull->getVertexPointer()[index0]; + btVector3 pos1 =hull->getVertexPointer()[index1]; + btVector3 pos2 =hull->getVertexPointer()[index2]; + triNormal = (pos1-pos0).cross(pos2-pos0); + triNormal.normalize(); + + for (int v=0;v<3;v++) + { + int index = hull->getIndexPointer()[t*3+v]; + GraphicsVertex vtx; + btVector3 pos =hull->getVertexPointer()[index]; + vtx.pos[0] = pos.x(); + vtx.pos[1] = pos.y(); + vtx.pos[2] = pos.z(); + vtx.pos[3] = 0.f; + + vtx.normal[0] =triNormal.x(); + vtx.normal[1] =triNormal.y(); + vtx.normal[2] =triNormal.z(); + + vtx.texcoord[0] = 0.5f; + vtx.texcoord[1] = 0.5f; + + indices.push_back(gvertices.size()); + gvertices.push_back(vtx); + } + } + + + int shapeId = m_glApp->m_instancingRenderer->registerShape(&gvertices[0].pos[0],gvertices.size(),&indices[0],indices.size()); + convex->setUserIndex(shapeId); + } + } + } else + { + btAssert(0); + } + } + }; + } + virtual void syncPhysicsToGraphics(const btDiscreteDynamicsWorld* rbWorld) + { + int numCollisionObjects = rbWorld->getNumCollisionObjects(); + for (int i = 0; igetCollisionObjectArray()[i]; + btVector3 pos = colObj->getWorldTransform().getOrigin(); + btQuaternion orn = colObj->getWorldTransform().getRotation(); + int index = colObj->getUserIndex(); + if (index >= 0) + { + m_glApp->m_instancingRenderer->writeSingleInstanceTransformToCPU(pos, orn, index); + } + } + m_glApp->m_instancingRenderer->writeTransforms(); + } + + virtual void createPhysicsDebugDrawer(btDiscreteDynamicsWorld* rbWorld) + { + btAssert(rbWorld); + m_debugDraw = new MyDebugDrawer(m_glApp); + rbWorld->setDebugDrawer(m_debugDraw ); + + + m_debugDraw->setDebugMode( + btIDebugDraw::DBG_DrawWireframe + +btIDebugDraw::DBG_DrawAabb + //btIDebugDraw::DBG_DrawContactPoints + ); + + } + + virtual CommonParameterInterface* getParameterInterface() + { + return m_glApp->m_parameterInterface; + } +}; + +Bullet2RigidBodyDemo::Bullet2RigidBodyDemo(SimpleOpenGL3App* app, CommonPhysicsSetup* physicsSetup) + : m_physicsSetup(physicsSetup), + m_controlPressed(false), + m_altPressed(false), + m_glApp(app) +{ + } void Bullet2RigidBodyDemo::initPhysics() { - m_config = new btDefaultCollisionConfiguration; - m_dispatcher = new btCollisionDispatcher(m_config); - m_bp = new btDbvtBroadphase(); - m_solver = new btSequentialImpulseConstraintSolver(); - m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_bp,m_solver,m_config); + MyGraphicsPhysicsBridge glBridge(m_glApp); + m_physicsSetup->initPhysics(glBridge); + m_glApp->m_instancingRenderer->writeTransforms(); + } void Bullet2RigidBodyDemo::exitPhysics() { - delete m_dynamicsWorld; - m_dynamicsWorld=0; - delete m_solver; - m_solver=0; - delete m_bp; - m_bp=0; - delete m_dispatcher; - m_dispatcher=0; - delete m_config; - m_config=0; + + m_physicsSetup->exitPhysics(); + } void Bullet2RigidBodyDemo::stepSimulation(float deltaTime) { - m_dynamicsWorld->stepSimulation(deltaTime); + m_physicsSetup->stepSimulation(deltaTime); + +} + +void Bullet2RigidBodyDemo::renderScene() +{ + //sync graphics -> physics world transforms + + MyGraphicsPhysicsBridge glBridge(m_glApp); + m_physicsSetup->syncPhysicsToGraphics(glBridge); + + m_glApp->m_instancingRenderer->renderScene(); + +} + +void Bullet2RigidBodyDemo::physicsDebugDraw() +{ + m_physicsSetup->debugDraw(); } Bullet2RigidBodyDemo::~Bullet2RigidBodyDemo() { - btAssert(m_config == 0); - btAssert(m_dispatcher == 0); - btAssert(m_bp == 0); - btAssert(m_solver == 0); - btAssert(m_dynamicsWorld == 0); } btVector3 Bullet2RigidBodyDemo::getRayTo(int x,int y) @@ -95,7 +241,7 @@ btVector3 Bullet2RigidBodyDemo::getRayTo(int x,int y) float height = m_glApp->m_instancingRenderer->getScreenHeight(); aspect = width / height; - + hor*=aspect; @@ -110,32 +256,14 @@ btVector3 Bullet2RigidBodyDemo::getRayTo(int x,int y) return rayTo; } - + bool Bullet2RigidBodyDemo::mouseMoveCallback(float x,float y) { -// if (m_data->m_altPressed!=0 || m_data->m_controlPressed!=0) -// return false; - - if (m_pickedBody && m_pickedConstraint) - { - btPoint2PointConstraint* pickCon = static_cast(m_pickedConstraint); - if (pickCon) - { - //keep it at the same picking distance - btVector3 newRayTo = getRayTo(x,y); - btVector3 rayFrom; - btVector3 oldPivotInB = pickCon->getPivotInB(); - btVector3 newPivotB; - m_glApp->m_instancingRenderer->getCameraPosition(rayFrom); - btVector3 dir = newRayTo-rayFrom; - dir.normalize(); - dir *= m_oldPickingDist; + btVector3 rayTo = getRayTo(x, y); + btVector3 rayFrom; + m_glApp->m_instancingRenderer->getCameraPosition(rayFrom); + m_physicsSetup->movePickedBody(rayFrom,rayTo); - newPivotB = rayFrom + dir; - pickCon->setPivotB(newPivotB); - } - } - return false; } bool Bullet2RigidBodyDemo::mouseButtonCallback(int button, int state, float x, float y) @@ -143,7 +271,7 @@ bool Bullet2RigidBodyDemo::mouseButtonCallback(int button, int state, float x, f if (state==1) { - if(button==0)// && (m_data->m_altPressed==0 && m_data->m_controlPressed==0)) + if(button==0 && (!m_altPressed && !m_controlPressed)) { btVector3 camPos; m_glApp->m_instancingRenderer->getCameraPosition(camPos); @@ -151,53 +279,16 @@ bool Bullet2RigidBodyDemo::mouseButtonCallback(int button, int state, float x, f btVector3 rayFrom = camPos; btVector3 rayTo = getRayTo(x,y); - btCollisionWorld::ClosestRayResultCallback rayCallback(rayFrom,rayTo); - m_dynamicsWorld->rayTest(rayFrom,rayTo,rayCallback); - if (rayCallback.hasHit()) - { - btVector3 pickPos = rayCallback.m_hitPointWorld; - btRigidBody* body = (btRigidBody*)btRigidBody::upcast(rayCallback.m_collisionObject); - if (body) - { - //other exclusions? - if (!(body->isStaticObject() || body->isKinematicObject())) - { - m_pickedBody = body; - m_pickedBody->setActivationState(DISABLE_DEACTIVATION); - //printf("pickPos=%f,%f,%f\n",pickPos.getX(),pickPos.getY(),pickPos.getZ()); - btVector3 localPivot = body->getCenterOfMassTransform().inverse() * pickPos; - btPoint2PointConstraint* p2p = new btPoint2PointConstraint(*body,localPivot); - m_dynamicsWorld->addConstraint(p2p,true); - m_pickedConstraint = p2p; - btScalar mousePickClamping = 30.f; - p2p->m_setting.m_impulseClamp = mousePickClamping; - //very weak constraint for picking - p2p->m_setting.m_tau = 0.001f; - } - } + m_physicsSetup->pickBody(rayFrom, rayTo); -// pickObject(pickPos, rayCallback.m_collisionObject); - m_oldPickingPos = rayTo; - m_hitPos = pickPos; - m_oldPickingDist = (pickPos-rayFrom).length(); -// printf("hit !\n"); - //add p2p - } - } } else { if (button==0) { - if (m_pickedConstraint) - { - m_dynamicsWorld->removeConstraint(m_pickedConstraint); - delete m_pickedConstraint; - m_pickedConstraint=0; - m_pickedBody = 0; - } + m_physicsSetup->removePickingConstraint(); //remove p2p } } diff --git a/Demos3/bullet2/BasicDemo/Bullet2RigidBodyDemo.h b/Demos3/bullet2/BasicDemo/Bullet2RigidBodyDemo.h index 53ddbb17b..7cf7a85a4 100644 --- a/Demos3/bullet2/BasicDemo/Bullet2RigidBodyDemo.h +++ b/Demos3/bullet2/BasicDemo/Bullet2RigidBodyDemo.h @@ -5,29 +5,33 @@ #include "../../AllBullet2Demos/BulletDemoInterface.h" +#include "OpenGLWindow/b3gWindowInterface.h" +#include "../../../Demos/CommonPhysicsSetup.h" + + class Bullet2RigidBodyDemo : public BulletDemoInterface { -public: - class btDiscreteDynamicsWorld* m_dynamicsWorld; - class btCollisionDispatcher* m_dispatcher; - class btBroadphaseInterface* m_bp; - class btCollisionConfiguration* m_config; - class btConstraintSolver* m_solver; - - class btRigidBody* m_pickedBody; - class btTypedConstraint* m_pickedConstraint; - btVector3 m_oldPickingPos; - btVector3 m_hitPos; - btScalar m_oldPickingDist; - + CommonPhysicsSetup* m_physicsSetup; public: - class SimpleOpenGL3App* m_glApp; + bool m_controlPressed; + bool m_altPressed; - Bullet2RigidBodyDemo(SimpleOpenGL3App* app); +public: + + struct SimpleOpenGL3App* m_glApp; + + Bullet2RigidBodyDemo(SimpleOpenGL3App* app, CommonPhysicsSetup* physicsSetup); virtual void initPhysics(); virtual void exitPhysics(); + virtual void renderScene(); + virtual void physicsDebugDraw(); + virtual void stepSimulation(float dt); + virtual CommonPhysicsSetup* getPhysicsSetup() + { + return m_physicsSetup; + } virtual ~Bullet2RigidBodyDemo(); btVector3 getRayTo(int x,int y); @@ -35,10 +39,17 @@ public: virtual bool mouseButtonCallback(int button, int state, float x, float y); virtual bool keyboardCallback(int key, int state) { + if (key==B3G_CONTROL) + { + m_controlPressed = (state==1); + } + if (key==B3G_ALT) + { + m_altPressed = (state==1); + } return false; } - virtual void stepSimulation(float deltaTime); }; diff --git a/Demos3/bullet2/BasicDemo/MyDebugDrawer.h b/Demos3/bullet2/BasicDemo/MyDebugDrawer.h index 411815452..54c4387e8 100644 --- a/Demos3/bullet2/BasicDemo/MyDebugDrawer.h +++ b/Demos3/bullet2/BasicDemo/MyDebugDrawer.h @@ -2,22 +2,60 @@ #define MY_DEBUG_DRAWER_H #include "LinearMath/btIDebugDraw.h" +#include "LinearMath/btAlignedObjectArray.h" +#define BT_LINE_BATCH_SIZE 512 +struct MyDebugVec3 +{ + MyDebugVec3(const btVector3& org) + :x(org.x()), + y(org.y()), + z(org.z()) + { + } + + float x; + float y; + float z; +}; class MyDebugDrawer : public btIDebugDraw { SimpleOpenGL3App* m_glApp; int m_debugMode; + + btAlignedObjectArray m_linePoints; + btAlignedObjectArray m_lineIndices; + btVector3 m_currentLineColor; + public: MyDebugDrawer(SimpleOpenGL3App* app) : m_glApp(app) - ,m_debugMode(btIDebugDraw::DBG_DrawWireframe|btIDebugDraw::DBG_DrawAabb) + ,m_debugMode(btIDebugDraw::DBG_DrawWireframe|btIDebugDraw::DBG_DrawAabb), + m_currentLineColor(-1,-1,-1) { } - virtual void drawLine(const btVector3& from,const btVector3& to,const btVector3& color) + virtual void drawLine(const btVector3& from1,const btVector3& to1,const btVector3& color1) { - m_glApp->m_instancingRenderer->drawLine(from,to,color); + //float from[4] = {from1[0],from1[1],from1[2],from1[3]}; + //float to[4] = {to1[0],to1[1],to1[2],to1[3]}; + //float color[4] = {color1[0],color1[1],color1[2],color1[3]}; + //m_glApp->m_instancingRenderer->drawLine(from,to,color); + if (m_currentLineColor!=color1 || m_linePoints.size() >= BT_LINE_BATCH_SIZE) + { + flushLines(); + m_currentLineColor = color1; + } + MyDebugVec3 from(from1); + MyDebugVec3 to(to1); + + m_linePoints.push_back(from); + m_linePoints.push_back(to); + + m_lineIndices.push_back(m_lineIndices.size()); + m_lineIndices.push_back(m_lineIndices.size()); + } virtual void drawContactPoint(const btVector3& PointOnB,const btVector3& normalOnB,btScalar distance,int lifeTime,const btVector3& color) @@ -31,17 +69,36 @@ public: virtual void draw3dText(const btVector3& location,const char* textString) { } - + virtual void setDebugMode(int debugMode) { m_debugMode = debugMode; } - + virtual int getDebugMode() const { return m_debugMode; } + virtual void flushLines() + { + int sz = m_linePoints.size(); + if (sz) + { + float debugColor[4]; + debugColor[0] = m_currentLineColor.x(); + debugColor[1] = m_currentLineColor.y(); + debugColor[2] = m_currentLineColor.z(); + debugColor[3] = 1.f; + m_glApp->m_instancingRenderer->drawLines(&m_linePoints[0].x,debugColor, + m_linePoints.size(),sizeof(MyDebugVec3), + &m_lineIndices[0], + m_lineIndices.size(), + 1); + m_linePoints.clear(); + m_lineIndices.clear(); + } + } }; diff --git a/Demos3/bullet2/ChainDemo/ChainDemo.cpp b/Demos3/bullet2/ChainDemo/ChainDemo.cpp index 4c353a01b..71032cb7c 100644 --- a/Demos3/bullet2/ChainDemo/ChainDemo.cpp +++ b/Demos3/bullet2/ChainDemo/ChainDemo.cpp @@ -26,8 +26,8 @@ ChainDemo::~ChainDemo() void ChainDemo::createGround(int cubeShapeId) { { - float color[]={0.3,0.3,1,1}; - float halfExtents[]={50,1,50,1}; + btVector4 color(0.3,0.3,1,1); + btVector4 halfExtents(50,1,50,1); btTransform groundTransform; groundTransform.setIdentity(); groundTransform.setOrigin(btVector3(0,-5,0)); @@ -85,7 +85,7 @@ void ChainDemo::initPhysics() int sphereShapeId = m_glApp->registerGraphicsSphereShape(radius,false); { - float halfExtents[]={scaling,scaling,scaling,1}; + btVector4 halfExtents(scaling,scaling,scaling,1); btVector4 colors[4] = { btVector4(1,0,0,1), diff --git a/Demos3/bullet2/FeatherstoneMultiBodyDemo/BulletMultiBodyDemos.cpp b/Demos3/bullet2/FeatherstoneMultiBodyDemo/BulletMultiBodyDemos.cpp index e03afcdd9..81b1dc718 100644 --- a/Demos3/bullet2/FeatherstoneMultiBodyDemo/BulletMultiBodyDemos.cpp +++ b/Demos3/bullet2/FeatherstoneMultiBodyDemo/BulletMultiBodyDemos.cpp @@ -38,12 +38,12 @@ struct GraphicsVertex float texcoord[2]; }; -static b3Vector4 colors[4] = +static btVector4 colors[4] = { - b3MakeVector4(1,0,0,1), - b3MakeVector4(0,1,0,1), - b3MakeVector4(0,1,1,1), - b3MakeVector4(1,1,0,1), + btVector4(1,0,0,1), + btVector4(0,1,0,1), + btVector4(0,1,1,1), + btVector4(1,1,0,1), }; @@ -435,8 +435,8 @@ btMultiBody* FeatherstoneDemo1::createFeatherstoneMultiBody(class btMultiBodyDyn world_to_local[0] = bod->getWorldToBaseRot(); local_origin[0] = bod->getBasePos(); //float halfExtents[3]={7.5,0.05,4.5}; - float halfExtents[3]={7.5,0.45,4.5}; - { + btVector4 halfExtents(7.5,0.45,4.5,1); + { float pos[4]={local_origin[0].x(),local_origin[0].y(),local_origin[0].z(),1}; float quat[4]={-world_to_local[0].x(),-world_to_local[0].y(),-world_to_local[0].z(),world_to_local[0].w()}; @@ -455,7 +455,7 @@ btMultiBody* FeatherstoneDemo1::createFeatherstoneMultiBody(class btMultiBodyDyn tr.setRotation(btQuaternion(quat[0],quat[1],quat[2],quat[3])); col->setWorldTransform(tr); - b3Vector4 color = colors[curColor++]; + btVector4 color = colors[curColor++]; curColor&=3; int index = m_glApp->m_instancingRenderer->registerGraphicsInstance(cubeShapeId,tr.getOrigin(),tr.getRotation(),color,halfExtents); @@ -500,7 +500,7 @@ btMultiBody* FeatherstoneDemo1::createFeatherstoneMultiBody(class btMultiBodyDyn col->setFriction(friction); - b3Vector4 color = colors[curColor++]; + btVector4 color = colors[curColor++]; curColor&=3; int index = m_glApp->m_instancingRenderer->registerGraphicsInstance(cubeShapeId,tr.getOrigin(),tr.getRotation(),color,halfExtents); @@ -536,8 +536,8 @@ void FeatherstoneDemo1::createGround() { - float color[]={0.3,0.3,1,1}; - float halfExtents[]={50,50,50,1}; + btVector4 color(0.3,0.3,1,1); + btVector4 halfExtents(50,50,50,1); btTransform groundTransform; groundTransform.setIdentity(); groundTransform.setOrigin(btVector3(0,-50,0)); @@ -607,6 +607,13 @@ void FeatherstoneDemo1::renderScene() m_glApp->m_instancingRenderer->renderScene(); } +void FeatherstoneDemo1::physicsDebugDraw() +{ + if (m_dynamicsWorld) + { + m_dynamicsWorld->debugDrawWorld(); + } +} void FeatherstoneDemo1::stepSimulation(float deltaTime) { diff --git a/Demos3/bullet2/FeatherstoneMultiBodyDemo/BulletMultiBodyDemos.h b/Demos3/bullet2/FeatherstoneMultiBodyDemo/BulletMultiBodyDemos.h index 76c0b62c7..928691fd1 100644 --- a/Demos3/bullet2/FeatherstoneMultiBodyDemo/BulletMultiBodyDemos.h +++ b/Demos3/bullet2/FeatherstoneMultiBodyDemo/BulletMultiBodyDemos.h @@ -89,6 +89,8 @@ public: virtual void initPhysics(); virtual void exitPhysics(); virtual void renderScene(); + virtual void physicsDebugDraw(); + virtual void stepSimulation(float deltaTime); }; diff --git a/Demos3/bullet2/RagdollDemo/RagdollDemo.cpp b/Demos3/bullet2/RagdollDemo/RagdollDemo.cpp index 2ca5976e6..155d84dd4 100644 --- a/Demos3/bullet2/RagdollDemo/RagdollDemo.cpp +++ b/Demos3/bullet2/RagdollDemo/RagdollDemo.cpp @@ -343,17 +343,6 @@ public: -RagDollDemo::RagDollDemo(SimpleOpenGL3App* app) -:BasicDemo(app) -{ - -} -RagDollDemo::~RagDollDemo() -{ - -} - - void RagDollDemo::initPhysics() diff --git a/Demos3/bullet2/RagdollDemo/RagdollDemo.h b/Demos3/bullet2/RagdollDemo/RagdollDemo.h index 1ed88b38f..e42379565 100644 --- a/Demos3/bullet2/RagdollDemo/RagdollDemo.h +++ b/Demos3/bullet2/RagdollDemo/RagdollDemo.h @@ -2,21 +2,24 @@ #define RAGDOLL_DEMO_H +#include "../../../Demos/CommonRigidBodySetup.h" #include "../BasicDemo/BasicDemo.h" -class RagDollDemo : public BasicDemo +struct BulletDemoInterface; +struct SimpleOpenGL3App; + +class RagDollSetup : public CommonRigidBodySetup { public: - RagDollDemo(SimpleOpenGL3App* app); - virtual ~RagDollDemo(); - static BulletDemoInterface* MyCreateFunc(SimpleOpenGL3App* app) { - return new RagDollDemo(app); + CommonPhysicsSetup* physicsSetup = new RagDollSetup(); + return new BasicDemo(app, physicsSetup); + } - void initPhysics(); + void initPhysics(GraphicsPhysicsBridge& gfxBridge); }; diff --git a/Extras/CMakeLists.txt b/Extras/CMakeLists.txt index a92f64720..24fc0f159 100644 --- a/Extras/CMakeLists.txt +++ b/Extras/CMakeLists.txt @@ -2,6 +2,6 @@ SUBDIRS( Serialize ConvexDecomposition HACD GIMPACTUtils ) #Maya Dynamica plugin is moved to http://dynamica.googlecode.com -IF (USE_GLUT AND GLUT_FOUND) - SUBDIRS (glui) -ENDIF () +#IF (USE_GLUT AND GLUT_FOUND) +# SUBDIRS (glui) +#ENDIF () diff --git a/Extras/HACD/hacdICHull.cpp b/Extras/HACD/hacdICHull.cpp index 4f99c4d64..4ab5cfaf9 100644 --- a/Extras/HACD/hacdICHull.cpp +++ b/Extras/HACD/hacdICHull.cpp @@ -14,6 +14,8 @@ */ #include "hacdICHull.h" #include +#include + namespace HACD { const long ICHull::sc_dummyIndex = std::numeric_limits::max(); diff --git a/ObsoleteDemos/BasicDemo/BasicDemo.cpp b/ObsoleteDemos/BasicDemo/BasicDemo.cpp deleted file mode 100644 index fc38f27dd..000000000 --- a/ObsoleteDemos/BasicDemo/BasicDemo.cpp +++ /dev/null @@ -1,273 +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. -*/ - - -///create 125 (5x5x5) dynamic object -#define ARRAY_SIZE_X 10 -#define ARRAY_SIZE_Y 10 -#define ARRAY_SIZE_Z 10 - -//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" - -#include //printf debugging -#include "GLDebugDrawer.h" -#include "LinearMath/btAabbUtil2.h" - -static GLDebugDrawer gDebugDraw; - -///The MyOverlapCallback is used to show how to collect object that overlap with a given bounding box defined by aabbMin and aabbMax. -///See m_dynamicsWorld->getBroadphase()->aabbTest. -struct MyOverlapCallback : public btBroadphaseAabbCallback -{ - btVector3 m_queryAabbMin; - btVector3 m_queryAabbMax; - - int m_numOverlap; - MyOverlapCallback(const btVector3& aabbMin, const btVector3& aabbMax ) : m_queryAabbMin(aabbMin),m_queryAabbMax(aabbMax),m_numOverlap(0) {} - virtual bool process(const btBroadphaseProxy* proxy) - { - btVector3 proxyAabbMin,proxyAabbMax; - btCollisionObject* colObj0 = (btCollisionObject*)proxy->m_clientObject; - colObj0->getCollisionShape()->getAabb(colObj0->getWorldTransform(),proxyAabbMin,proxyAabbMax); - if (TestAabbAgainstAabb2(proxyAabbMin,proxyAabbMax,m_queryAabbMin,m_queryAabbMax)) - { - m_numOverlap++; - } - return true; - } -}; - -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(); - - btVector3 aabbMin(1,1,1); - btVector3 aabbMax(2,2,2); - - MyOverlapCallback aabbOverlap(aabbMin,aabbMax); - m_dynamicsWorld->getBroadphase()->aabbTest(aabbMin,aabbMax,aabbOverlap); - - if (aabbOverlap.m_numOverlap) - printf("#aabb overlap = %d\n", aabbOverlap.m_numOverlap); - } - - 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->setDebugDrawer(&gDebugDraw); - - m_dynamicsWorld->setGravity(btVector3(0,-10,0)); - - ///create a few basic rigid bodies - btBoxShape* groundShape = new btBoxShape(btVector3(btScalar(50.),btScalar(50.),btScalar(50.))); - //groundShape->initializePolyhedralFeatures(); -// 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 - - btBoxShape* 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;kaddRigidBody(body); - } - } - } - } - - -} -void BasicDemo::clientResetScene() -{ - exitPhysics(); - initPhysics(); -} - - -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;jOnChildBoundsChanged( oldBounds, this ); + if ( m_Bounds.w != oldBounds.w || m_Bounds.h != oldBounds.h ) { + if ( GetParent() ) + GetParent()->OnChildBoundsChanged( oldBounds, this ); Invalidate(); } @@ -694,6 +703,8 @@ void Base::Layout( Skin::Base* skin ) skin->GetRender()->GetCTT()->CreateControlCacheTexture( this ); } +int avoidUpdate = -15; + void Base::RecurseLayout( Skin::Base* skin ) { if ( m_Skin ) skin = m_Skin; @@ -704,6 +715,10 @@ void Base::RecurseLayout( Skin::Base* skin ) m_bNeedsLayout = false; Layout( skin ); } + + + if (avoidUpdate>0) + return; Gwen::Rect rBounds = GetRenderBounds(); @@ -713,13 +728,21 @@ void Base::RecurseLayout( Skin::Base* skin ) rBounds.y += m_Padding.top; rBounds.h -= m_Padding.top + m_Padding.bottom; + int sz = Children.size(); + if (sz>100) + { +// printf("!\n"); + + } + int curChild = 0; for (Base::List::iterator iter = Children.begin(); iter != Children.end(); ++iter) { Base* pChild = *iter; - + curChild++; if ( pChild->Hidden() ) continue; + int iDock = pChild->GetDock(); if ( iDock & Pos::Fill ) @@ -768,10 +791,12 @@ void Base::RecurseLayout( Skin::Base* skin ) } pChild->RecurseLayout( skin ); + } m_InnerBounds = rBounds; + curChild = 0; // // Fill uses the left over space, so do that now. // @@ -779,10 +804,12 @@ void Base::RecurseLayout( Skin::Base* skin ) { Base* pChild = *iter; int iDock = pChild->GetDock(); - + curChild++; if ( !(iDock & Pos::Fill) ) continue; + + const Margin& margin = pChild->GetMargin(); pChild->SetBounds( rBounds.x + margin.left, rBounds.y + margin.top, rBounds.w - margin.left - margin.right, rBounds.h - margin.top - margin.bottom ); diff --git a/btgui/Gwen/Controls/Base.h b/btgui/Gwen/Controls/Base.h index 46a4104c8..011a9e7bf 100644 --- a/btgui/Gwen/Controls/Base.h +++ b/btgui/Gwen/Controls/Base.h @@ -164,19 +164,43 @@ namespace Gwen virtual void RestrictToParent( bool restrict ) { m_bRestrictToParent = restrict; } virtual bool ShouldRestrictToParent() { return m_bRestrictToParent; } - virtual int X() const { return m_Bounds.x; } - virtual int Y() const { return m_Bounds.y; } - virtual int Width() const { return m_Bounds.w; } - virtual int Height() const { return m_Bounds.h; } - virtual int Bottom() const { return m_Bounds.y + m_Bounds.h + m_Margin.bottom; } - virtual int Right() const { return m_Bounds.x + m_Bounds.w + m_Margin.right; } + virtual int X() const + { + return m_Bounds.x; + } + virtual int Y() const + { + return m_Bounds.y; + } + virtual int Width() const + { + return m_Bounds.w; + } + virtual int Height() const + { + return m_Bounds.h; + } + virtual int Bottom() const + { + return m_Bounds.y + m_Bounds.h + m_Margin.bottom; + } + virtual int Right() const + { + return m_Bounds.x + m_Bounds.w + m_Margin.right; + } virtual const Margin& GetMargin() const { return m_Margin; } virtual const Padding& GetPadding() const { return m_Padding; } virtual void SetPos( int x, int y ); - virtual void SetWidth( int w ) { SetSize( w, Height()); } - virtual void SetHeight( int h ) { SetSize( Width(), h); } + virtual void SetWidth( int w ) + { + SetSize( w, Height()); + } + virtual void SetHeight( int h ) + { +SetSize( Width(), h); + } virtual bool SetSize( int w, int h ); virtual bool SetBounds( int x, int y, int w, int h ); virtual bool SetBounds( const Gwen::Rect& bounds ); @@ -188,7 +212,10 @@ namespace Gwen virtual void MoveTo (int x, int y ); virtual void MoveBy (int x, int y ); - virtual const Gwen::Rect& GetBounds() const { return m_Bounds; } + virtual const Gwen::Rect& GetBounds() const + { + return m_Bounds; + } virtual Controls::Base* GetControlAt( int x, int y ); diff --git a/btgui/Gwen/Controls/Button.h b/btgui/Gwen/Controls/Button.h index c4e35a85c..4e9d3358e 100644 --- a/btgui/Gwen/Controls/Button.h +++ b/btgui/Gwen/Controls/Button.h @@ -49,17 +49,28 @@ namespace Gwen virtual void SetImage( const TextObject& strName, bool bCenter = false ); // You can use this to trigger OnPress directly from other controls using GWEN_CALL_EX - virtual void ReceiveEventPress( Base* /*pControl*/ ){ OnPress(); } + virtual void ReceiveEventPress( Base* /*pControl*/ ) + { + OnPress(); + } virtual void SizeToContents(); virtual void Layout( Skin::Base* pSkin ); + virtual bool OnKeyReturn(bool bDown) + { + onKeyboardReturn.Call(this); + return true; + } + public: Gwen::Event::Caller onPress; Gwen::Event::Caller onDown; Gwen::Event::Caller onUp; Gwen::Event::Caller onDoubleClick; + Gwen::Event::Caller onKeyboardReturn; + Gwen::Event::Caller onToggle; Gwen::Event::Caller onToggleOn; Gwen::Event::Caller onToggleOff; diff --git a/btgui/Gwen/Controls/ScrollBar.h b/btgui/Gwen/Controls/ScrollBar.h index d6175dabe..a0cd02c42 100644 --- a/btgui/Gwen/Controls/ScrollBar.h +++ b/btgui/Gwen/Controls/ScrollBar.h @@ -61,6 +61,16 @@ namespace Gwen Gwen::Event::Caller onBarMoved; + float getContentSize() + { + return m_fContentSize; + } + float getViewableContentSize() const + { + + return m_fViewableContentSize; + } + protected: ControlsInternal::ScrollBarButton* m_ScrollButton[2]; diff --git a/btgui/Gwen/Controls/TreeControl.cpp b/btgui/Gwen/Controls/TreeControl.cpp index 0a4fb123f..972ec8456 100644 --- a/btgui/Gwen/Controls/TreeControl.cpp +++ b/btgui/Gwen/Controls/TreeControl.cpp @@ -42,9 +42,14 @@ void TreeControl::Render( Skin::Base* skin ) skin->DrawTreeControl( this ); } +void TreeControl::ForceUpdateScrollBars() +{ + m_ScrollControl->UpdateScrollBars(); +} + void TreeControl::OnChildBoundsChanged( Gwen::Rect /*oldChildBounds*/, Base* /*pChild*/ ) { - m_ScrollControl->UpdateScrollBars(); + //m_ScrollControl->UpdateScrollBars(); } void TreeControl::Clear() @@ -67,14 +72,16 @@ void TreeControl::OnNodeAdded( TreeNode* pNode ) pNode->onNamePress.Add( this, &TreeControl::OnNodeSelection ); } + void TreeControl::OnNodeSelection( Controls::Base* /*control*/ ) { + //printf("TreeControl::OnNodeSelection\n"); if ( !m_bAllowMultipleSelection || !Gwen::Input::IsKeyDown( Key::Control ) ) DeselectAll(); } -void TreeControl::iterate(int action, int* curIndex, int* targetIndex) +void TreeControl::iterate(int action, int* maxItem, int* curItem) { Base::List& children = m_InnerPanel->GetChildren(); @@ -83,7 +90,7 @@ void TreeControl::iterate(int action, int* curIndex, int* targetIndex) TreeNode* pChild = (*iter)->DynamicCastTreeNode(); if ( !pChild ) continue; - pChild->iterate(action ,curIndex, targetIndex); + pChild->iterate(action ,maxItem, curItem); } } @@ -93,26 +100,52 @@ bool TreeControl::OnKeyUp( bool bDown ) { if (bDown) { + ForceUpdateScrollBars(); int maxIndex = 0; int newIndex = 0; - int curIndex=0; - int targetIndex=-1; - iterate(ITERATE_ACTION_FIND_SELECTED_INDEX,&curIndex,&targetIndex); - maxIndex = curIndex; - if (targetIndex>0) + int maxItem=0; + int curItem=-1; + iterate(ITERATE_ACTION_FIND_SELECTED_INDEX,&maxItem,&curItem); + maxIndex = maxItem; + int targetItem = curItem; + if (curItem>0) { - curIndex=0; - int deselectIndex = targetIndex; - targetIndex--; - newIndex = targetIndex; - iterate(ITERATE_ACTION_SELECT,&curIndex,&targetIndex); - if (targetIndex<0) + maxItem=0; + int deselectIndex = targetItem; + targetItem--; + newIndex = targetItem; + iterate(ITERATE_ACTION_SELECT,&maxItem,&targetItem); + if (targetItem<0) { - curIndex=0; - iterate(ITERATE_ACTION_DESELECT_INDEX,&curIndex,&deselectIndex); + maxItem=0; + iterate(ITERATE_ACTION_DESELECT_INDEX,&maxItem,&deselectIndex); } + curItem = newIndex; float amount = float(newIndex)/float(maxIndex); - m_ScrollControl->m_VerticalScrollBar->SetScrolledAmount(amount,true); + float viewSize = m_ScrollControl->m_VerticalScrollBar->getViewableContentSize(); + float contSize = m_ScrollControl->m_VerticalScrollBar->getContentSize(); + + float curAmount = m_ScrollControl->m_VerticalScrollBar->GetScrolledAmount(); + float minCoordViewableWindow = curAmount*contSize; + float maxCoordViewableWindow = minCoordViewableWindow+viewSize; + float minCoordSelectedItem = curItem*16.f; + float maxCoordSelectedItem = (curItem+1)*16.f; + { + float newAmount = float(minCoordSelectedItem)/(contSize-viewSize); + if (newAmountm_VerticalScrollBar->SetScrolledAmount(newAmount,true); + } + } + { + int numItems = (viewSize)/16-1; + float newAmount = float((curItem-numItems)*16)/(contSize-viewSize); + + if (newAmount>curAmount) + { + m_ScrollControl->m_VerticalScrollBar->SetScrolledAmount(newAmount,true); + } + } } } return true; @@ -123,42 +156,95 @@ bool TreeControl::OnKeyDown( bool bDown ) { if (bDown) { + ForceUpdateScrollBars(); int maxIndex = 0; int newIndex = 0; - int curIndex=0; - int targetIndex=-1; - iterate(ITERATE_ACTION_FIND_SELECTED_INDEX,&curIndex,&targetIndex); - maxIndex = curIndex; - if (targetIndex>=0) + int maxItem=0; + int curItem=-1; + iterate(ITERATE_ACTION_FIND_SELECTED_INDEX,&maxItem,&curItem); + maxIndex = maxItem; + int targetItem = curItem; + if (curItem>=0) { - curIndex=0; - int deselectIndex = targetIndex; - targetIndex++; - newIndex = targetIndex; - iterate(ITERATE_ACTION_SELECT,&curIndex,&targetIndex); - if (targetIndex<0) + maxItem=0; + int deselectIndex = targetItem; + targetItem++; + newIndex = targetItem; + iterate(ITERATE_ACTION_SELECT,&maxItem,&targetItem); + if (targetItem<0) { - curIndex=0; - iterate(ITERATE_ACTION_DESELECT_INDEX,&curIndex,&deselectIndex); + maxItem=0; + iterate(ITERATE_ACTION_DESELECT_INDEX,&maxItem,&deselectIndex); + } + curItem= newIndex; + float amount = (int)float(newIndex)/float(maxIndex); + float viewSize = m_ScrollControl->m_VerticalScrollBar->getViewableContentSize(); + float contSize = m_ScrollControl->m_VerticalScrollBar->getContentSize(); + + float curAmount = m_ScrollControl->m_VerticalScrollBar->GetScrolledAmount(); + float minCoordViewableWindow = curAmount*contSize; + float maxCoordViewableWindow = minCoordViewableWindow+viewSize; + float minCoordSelectedItem = curItem*16.f; + float maxCoordSelectedItem = (curItem+1)*16.f; + { + float newAmount = float(minCoordSelectedItem)/(contSize-viewSize); + if (newAmountm_VerticalScrollBar->SetScrolledAmount(newAmount,true); + } + } + { + int numItems = (viewSize)/16-1; + float newAmount = float((curItem-numItems)*16)/(contSize-viewSize); + + if (newAmount>curAmount) + { + m_ScrollControl->m_VerticalScrollBar->SetScrolledAmount(newAmount,true); + } } - float amount = float(newIndex)/float(maxIndex); - m_ScrollControl->m_VerticalScrollBar->SetScrolledAmount(amount,true); } } return true; } - +extern int avoidUpdate; bool TreeControl::OnKeyRight( bool bDown ) { if (bDown) { + + avoidUpdate = -3; + ForceUpdateScrollBars(); iterate(ITERATE_ACTION_OPEN,0,0); - int curIndex=0; - int targetIndex=0; - iterate(ITERATE_ACTION_FIND_SELECTED_INDEX,&curIndex,&targetIndex); - float amount = float(targetIndex)/float(curIndex); - m_ScrollControl->m_VerticalScrollBar->SetScrolledAmount(amount,true); + int maxItem=0; + int curItem=0; + iterate(ITERATE_ACTION_FIND_SELECTED_INDEX,&maxItem,&curItem); + float amount = float(curItem)/float(maxItem); + float viewSize = m_ScrollControl->m_VerticalScrollBar->getViewableContentSize(); + float contSize = m_ScrollControl->m_VerticalScrollBar->getContentSize(); + + float curAmount = m_ScrollControl->m_VerticalScrollBar->GetScrolledAmount(); + float minCoordViewableWindow = curAmount*contSize; + float maxCoordViewableWindow = minCoordViewableWindow+viewSize; + float minCoordSelectedItem = curItem*16.f; + float maxCoordSelectedItem = (curItem+1)*16.f; + { + float newAmount = float(minCoordSelectedItem)/(contSize-viewSize); + if (newAmountm_VerticalScrollBar->SetScrolledAmount(newAmount,true); + } + } + { + int numItems = (viewSize)/16-1; + float newAmount = float((curItem-numItems)*16)/(contSize-viewSize); + + if (newAmount>curAmount) + { + m_ScrollControl->m_VerticalScrollBar->SetScrolledAmount(newAmount,true); + } + } + Invalidate(); } return true; } @@ -166,13 +252,51 @@ bool TreeControl::OnKeyLeft( bool bDown ) { if (bDown) { + + avoidUpdate = -3; + + ForceUpdateScrollBars(); + iterate(ITERATE_ACTION_CLOSE,0,0); - int curIndex=0; - int targetIndex=0; - iterate(ITERATE_ACTION_FIND_SELECTED_INDEX,&curIndex,&targetIndex); - float amount = float(targetIndex)/float(curIndex); - m_ScrollControl->m_VerticalScrollBar->SetScrolledAmount(amount,true); + int maxItems=0; + int curItem=0; + iterate(ITERATE_ACTION_FIND_SELECTED_INDEX,&maxItems,&curItem); + float amount = float(curItem)/float(maxItems); + + // m_ScrollControl->m_VerticalScrollBar->SetScrolledAmount(amount,true); + float viewSize = m_ScrollControl->m_VerticalScrollBar->getViewableContentSize(); + float contSize = m_ScrollControl->m_VerticalScrollBar->getContentSize(); + + float curAmount = m_ScrollControl->m_VerticalScrollBar->GetScrolledAmount(); + float minCoordViewableWindow = curAmount*contSize; + float maxCoordViewableWindow = minCoordViewableWindow+viewSize; + float minCoordSelectedItem = curItem*16.f; + float maxCoordSelectedItem = (curItem+1)*16.f; + + { + float newAmount = float(minCoordSelectedItem)/(contSize-viewSize); + if (newAmountm_VerticalScrollBar->SetScrolledAmount(newAmount,true); + } + } + { + int numItems = (viewSize)/16-1; + float newAmount = float((curItem-numItems)*16)/(contSize-viewSize); + + if (newAmount>curAmount) + { + m_ScrollControl->m_VerticalScrollBar->SetScrolledAmount(newAmount,true); + } + Invalidate(); + } + //viewSize/contSize + + printf("!\n"); + + //this->Layout(0); + } return true; diff --git a/btgui/Gwen/Controls/TreeControl.h b/btgui/Gwen/Controls/TreeControl.h index 7ab963185..79de3e9ff 100644 --- a/btgui/Gwen/Controls/TreeControl.h +++ b/btgui/Gwen/Controls/TreeControl.h @@ -43,6 +43,7 @@ namespace Gwen virtual void iterate(int action,int* curIndex, int* resultIndex); + virtual void ForceUpdateScrollBars(); private: diff --git a/btgui/Gwen/Controls/TreeNode.cpp b/btgui/Gwen/Controls/TreeNode.cpp index 732ef037d..ba694567c 100644 --- a/btgui/Gwen/Controls/TreeNode.cpp +++ b/btgui/Gwen/Controls/TreeNode.cpp @@ -73,6 +73,7 @@ void TreeNode::Render( Skin::Base* skin ) TreeNode* TreeNode::AddNode( const UnicodeString& strLabel ) { + int sz = sizeof(TreeNode); TreeNode* node = new TreeNode( this ); node->SetText( strLabel ); node->Dock( Pos::Top ); @@ -112,9 +113,16 @@ void TreeNode::Layout( Skin::Base* skin ) BaseClass::Layout( skin ); } - +//too many calls to PostLayout... +//int numCalls = 0xfd; void TreeNode::PostLayout( Skin::Base* /*skin*/ ) { + + //int bla = numCalls&0xffff; + //if (bla==0) + // printf("TreeNode::PostLayout numCalls = %d\n", numCalls); + + //numCalls++; if ( SizeToChildren( false, true ) ) { InvalidateParent(); @@ -124,6 +132,13 @@ void TreeNode::PostLayout( Skin::Base* /*skin*/ ) void TreeNode::SetText( const UnicodeString& text ){ m_Title->SetText( text ); }; void TreeNode::SetText( const String& text ){ m_Title->SetText( text ); }; +UnicodeString TreeNode::GetText() const +{ + UnicodeString bla = m_Title->GetText(); + return bla; +} + + void TreeNode::Open() { m_InnerPanel->Show(); diff --git a/btgui/Gwen/Controls/TreeNode.h b/btgui/Gwen/Controls/TreeNode.h index 6355a8724..cfeb7b11b 100644 --- a/btgui/Gwen/Controls/TreeNode.h +++ b/btgui/Gwen/Controls/TreeNode.h @@ -38,6 +38,7 @@ namespace Gwen virtual void SetText( const UnicodeString& text ); virtual void SetText( const String& text ); + UnicodeString GetText() const; virtual void Open(); virtual void Close(); @@ -60,7 +61,18 @@ namespace Gwen virtual void DeselectAll(); virtual void iterate(int action, int* curIndex, int* resultIndex); - + virtual bool OnKeyReturn(bool bDown) + { + static bool prevDown = false; + if (!prevDown && bDown) + { + onReturnKeyDown.Call(this); + } + prevDown = bDown; + return Base::OnKeyReturn(bDown); + } + + Event::Caller onReturnKeyDown; Event::Caller onNamePress; Event::Caller onSelectChange; diff --git a/btgui/Gwen/Macros.h b/btgui/Gwen/Macros.h index e0669f163..5204a2b0f 100644 --- a/btgui/Gwen/Macros.h +++ b/btgui/Gwen/Macros.h @@ -17,7 +17,9 @@ #ifdef _WIN32 - #define NOMINMAX + #ifndef NOMINMAX + #define NOMINMAX + #endif #include #define GwenUtil_VSNPrintFSafe( _DstBuf, _DstSize, _MaxCount, _Format, _ArgList ) vsnprintf_s( _DstBuf, _DstSize, _MaxCount, _Format, _ArgList ) @@ -79,4 +81,4 @@ namespace Gwen } } -#endif \ No newline at end of file +#endif diff --git a/btgui/Gwen/Renderers/OpenGL_DebugFont.cpp b/btgui/Gwen/Renderers/OpenGL_DebugFont.cpp new file mode 100644 index 000000000..078598791 --- /dev/null +++ b/btgui/Gwen/Renderers/OpenGL_DebugFont.cpp @@ -0,0 +1,405 @@ + +#include "OpenGL_DebugFont.h" +#include "Gwen/Utility.h" +#include "Gwen/Font.h" +#include "Gwen/Texture.h" + +#include +#include "OpenGLWindow/GlewWindows/GL/glew.h" + +#include "FontData.h" + + //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]; + GLboolean m_texGenS; + GLboolean m_texGenT; + GLboolean m_texGenR; + + + + void 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(); + if (m_texGenS) + glEnable(GL_TEXTURE_GEN_S); + else + glDisable(GL_TEXTURE_GEN_S); + + if (m_texGenT) + glEnable(GL_TEXTURE_GEN_T); + else + glDisable(GL_TEXTURE_GEN_T); + + if (m_texGenR) + glEnable(GL_TEXTURE_GEN_R); + else + glDisable(GL_TEXTURE_GEN_R); + + + + } + + void saveOpenGLState(int screenWidth, int screenHeight) + { + glPushAttrib(GL_ALL_ATTRIB_BITS); + glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS); + + glMatrixMode(GL_TEXTURE); + glPushMatrix(); + glLoadIdentity(); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + GLint Vp[4]; + glGetIntegerv(GL_VIEWPORT, Vp); + if (screenWidth>0 && screenHeight>0) + { + Vp[0] = 0; + Vp[1] = 0; + Vp[2] = screenWidth-1; + Vp[3] = 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); + + glGetBooleanv(GL_TEXTURE_GEN_S,&m_texGenS); + glGetBooleanv(GL_TEXTURE_GEN_T,&m_texGenT); + glGetBooleanv(GL_TEXTURE_GEN_R,&m_texGenR); + + glDisable(GL_TEXTURE_GEN_S); + glDisable(GL_TEXTURE_GEN_T); + glDisable(GL_TEXTURE_GEN_R); + + 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); + + } + + +namespace Gwen +{ + namespace Renderer + { + OpenGL_DebugFont::OpenGL_DebugFont() + { + m_iVertNum = 0; + + for ( int i=0; idata = pglTexture; + m_pFontTexture->width = 256; + m_pFontTexture->height = 256; + + + // Create the opengl texture + glGenTextures( 1, pglTexture ); + glBindTexture( GL_TEXTURE_2D, *pglTexture ); + //glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); + //glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + GLenum format = GL_RGB; + unsigned char* texdata = new unsigned char[256*256*4]; + for (int i=0;i<256*256;i++) + { + texdata[i*4] = sGwenFontData[i]; + texdata[i*4+1] = sGwenFontData[i]; + texdata[i*4+2] = sGwenFontData[i]; + texdata[i*4+3] = sGwenFontData[i]; + } + glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, m_pFontTexture->width, m_pFontTexture->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (const GLvoid*)texdata ); + delete[]texdata; + } + + OpenGL_DebugFont::~OpenGL_DebugFont() + { + FreeTexture( m_pFontTexture ); + delete m_pFontTexture; + } + + + + + + void OpenGL_DebugFont::Begin() + { + glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); + glAlphaFunc( GL_GREATER, 1.0f ); + glEnable ( GL_BLEND ); + } + + void OpenGL_DebugFont::End() + { + if ( m_iVertNum == 0 ) return; + + glVertexPointer( 3, GL_FLOAT, sizeof(Vertex), (void*) &m_Vertices[0].x ); + glEnableClientState( GL_VERTEX_ARRAY ); + + glColorPointer( 4, GL_UNSIGNED_BYTE, sizeof(Vertex), (void*)&m_Vertices[0].r ); + glEnableClientState( GL_COLOR_ARRAY ); + + glTexCoordPointer( 2, GL_FLOAT, sizeof(Vertex), (void*) &m_Vertices[0].u ); + glEnableClientState( GL_TEXTURE_COORD_ARRAY ); + + glDrawArrays( GL_TRIANGLES, 0, (GLsizei) m_iVertNum ); + + m_iVertNum = 0; + glFlush(); + } + + void OpenGL_DebugFont::Flush() + { + if ( m_iVertNum == 0 ) return; + + glVertexPointer( 3, GL_FLOAT, sizeof(Vertex), (void*) &m_Vertices[0].x ); + glEnableClientState( GL_VERTEX_ARRAY ); + + glColorPointer( 4, GL_UNSIGNED_BYTE, sizeof(Vertex), (void*)&m_Vertices[0].r ); + glEnableClientState( GL_COLOR_ARRAY ); + + glTexCoordPointer( 2, GL_FLOAT, sizeof(Vertex), (void*) &m_Vertices[0].u ); + glEnableClientState( GL_TEXTURE_COORD_ARRAY ); + + glDrawArrays( GL_TRIANGLES, 0, (GLsizei) m_iVertNum ); + + m_iVertNum = 0; + glFlush(); + } + + void OpenGL_DebugFont::AddVert( int x, int y, float u, float v ) + { + if ( m_iVertNum >= MaxVerts-1 ) + { + Flush(); + } + + m_Vertices[ m_iVertNum ].x = (float)x; + m_Vertices[ m_iVertNum ].y = (float)y; + m_Vertices[ m_iVertNum ].u = u; + m_Vertices[ m_iVertNum ].v = v; + + m_Vertices[ m_iVertNum ].r = m_Color.r; + m_Vertices[ m_iVertNum ].g = m_Color.g; + m_Vertices[ m_iVertNum ].b = m_Color.b; + m_Vertices[ m_iVertNum ].a = m_Color.a; + + m_iVertNum++; + } + + void OpenGL_DebugFont::DrawFilledRect( Gwen::Rect rect ) + { + GLboolean texturesOn; + + glGetBooleanv(GL_TEXTURE_2D, &texturesOn); + if ( texturesOn ) + { + Flush(); + glDisable(GL_TEXTURE_2D); + } + + Translate( rect ); + + AddVert( rect.x, rect.y ); + AddVert( rect.x+rect.w, rect.y ); + AddVert( rect.x, rect.y + rect.h ); + + AddVert( rect.x+rect.w, rect.y ); + AddVert( rect.x+rect.w, rect.y+rect.h ); + AddVert( rect.x, rect.y + rect.h ); + } + + void OpenGL_DebugFont::SetDrawColor(Gwen::Color color) + { + glColor4ubv( (GLubyte*)&color ); + m_Color = color; + } + + void OpenGL_DebugFont::StartClip() + { + Flush(); + Gwen::Rect rect = ClipRegion(); + + // OpenGL's coords are from the bottom left + // so we need to translate them here. + { + GLint view[4]; + glGetIntegerv( GL_VIEWPORT, &view[0] ); + rect.y = view[3] - (rect.y + rect.h); + } + + glScissor( rect.x * Scale(), rect.y * Scale(), rect.w * Scale(), rect.h * Scale() ); + glEnable( GL_SCISSOR_TEST ); + }; + + void OpenGL_DebugFont::EndClip() + { + + Flush(); + glDisable( GL_SCISSOR_TEST ); + + }; + + void OpenGL_DebugFont::RenderText( Gwen::Font* pFont, Gwen::Point pos, const Gwen::UnicodeString& text ) + { + + float fSize = pFont->size * Scale(); + + if ( !text.length() ) + return; + + Gwen::String converted_string = Gwen::Utility::UnicodeToString( text ); + + float yOffset=0.0f; + for ( int i=0; i= 0 ) + { + float cx= (ch%16)/16.0; + float cy= (ch/16)/16.0; + uv_texcoords[0] = cx; + uv_texcoords[1] = cy; + uv_texcoords[4] = float(cx+1.0f/16.0f); + uv_texcoords[5] = float(cy+1.0f/16.0f); + } + + DrawTexturedRect( m_pFontTexture, r, uv_texcoords[0], uv_texcoords[5], uv_texcoords[4], uv_texcoords[1] ); + yOffset+=curSpacing; + } + else + { + DrawFilledRect( r ); + yOffset+=curSpacing; + + } + } + + } + + void OpenGL_DebugFont::DrawTexturedRect( Gwen::Texture* pTexture, Gwen::Rect rect, float u1, float v1, float u2, float v2 ) + { + GLuint* tex = (GLuint*)pTexture->data; + + // Missing image, not loaded properly? + if ( !tex ) + { + return DrawMissingImage( rect ); + } + + Translate( rect ); + GLuint boundtex; + + GLboolean texturesOn; + glGetBooleanv(GL_TEXTURE_2D, &texturesOn); + glGetIntegerv(GL_TEXTURE_BINDING_2D, (GLint *)&boundtex); + if ( !texturesOn || *tex != boundtex ) + { + Flush(); + glBindTexture( GL_TEXTURE_2D, *tex ); + glEnable(GL_TEXTURE_2D); + } + + AddVert( rect.x, rect.y, u1, v1 ); + AddVert( rect.x+rect.w, rect.y, u2, v1 ); + AddVert( rect.x, rect.y + rect.h, u1, v2 ); + + AddVert( rect.x+rect.w, rect.y, u2, v1 ); + AddVert( rect.x+rect.w, rect.y+rect.h, u2, v2 ); + AddVert( rect.x, rect.y + rect.h, u1, v2 ); + } + + Gwen::Point OpenGL_DebugFont::MeasureText( Gwen::Font* pFont, const Gwen::UnicodeString& text ) + { + Gwen::Point p; + float fSize = pFont->size * Scale(); + + Gwen::String converted_string = Gwen::Utility::UnicodeToString( text ); + float spacing = 0.0f; + + for ( int i=0; isize * Scale() * m_fFontScale[1]; + return p; + } + + } +} \ No newline at end of file diff --git a/btgui/Gwen/Renderers/OpenGL_DebugFont.h b/btgui/Gwen/Renderers/OpenGL_DebugFont.h index 4fd995892..fa625a30a 100644 --- a/btgui/Gwen/Renderers/OpenGL_DebugFont.h +++ b/btgui/Gwen/Renderers/OpenGL_DebugFont.h @@ -53,6 +53,8 @@ namespace Gwen void Flush(); void AddVert( int x, int y, float u = 0.0f , float v = 0.0f ); + virtual void Resize(int width, int height) {} + protected: diff --git a/btgui/GwenOpenGLTest/OpenGLSample.cpp b/btgui/GwenOpenGLTest/OpenGLSample.cpp index 218a50d22..5a2ee8d4a 100644 --- a/btgui/GwenOpenGLTest/OpenGLSample.cpp +++ b/btgui/GwenOpenGLTest/OpenGLSample.cpp @@ -7,6 +7,7 @@ extern char OpenSansData[]; +#include "Gwen/Renderers/OpenGL_DebugFont.h" #ifdef __APPLE__ #include "OpenGLWindow/MacOpenGLWindow.h" #else @@ -27,6 +28,7 @@ extern char OpenSansData[]; #include Gwen::Controls::Canvas* pCanvas = NULL; +Gwen::Skin::Simple skin; void MyMouseMoveCallback( float x, float y) { @@ -66,10 +68,12 @@ void MyMouseButtonCallback(int button, int state, float x, float y) } } -int sWidth = 1050; -int sHeight = 768; +int sWidth = 800;//1050; +int sHeight = 600;//768; GLPrimitiveRenderer* primRenderer=0; -GwenOpenGL3CoreRenderer* gwenRenderer=0; +//GwenOpenGL3CoreRenderer* gwenRenderer=0; +Gwen::Renderer::Base* gwenRenderer =0; + static void MyResizeCallback( float width, float height) { sWidth = width; @@ -81,7 +85,7 @@ static void MyResizeCallback( float width, float height) } if (gwenRenderer) { - gwenRenderer->resize(width,height); + gwenRenderer->Resize(width,height); } if (pCanvas) { @@ -103,7 +107,7 @@ sth_stash* initFont(GLPrimitiveRenderer* primRenderer) stash = sth_create(512,512,renderCallbacks);//256,256);//,1024);//512,512); err = glGetError(); assert(err==GL_NO_ERROR); - + if (!stash) { fprintf(stderr, "Could not create stash.\n"); @@ -117,7 +121,7 @@ sth_stash* initFont(GLPrimitiveRenderer* primRenderer) float sx,sy,dx,dy,lh; GLuint texture; - + const char* fontPaths[]={ "./", @@ -127,16 +131,16 @@ sth_stash* initFont(GLPrimitiveRenderer* primRenderer) }; int numPaths=sizeof(fontPaths)/sizeof(char*); - + // Load the first truetype font from memory (just because we can). - + FILE* fp = 0; const char* fontPath ="./"; char fullFontFileName[1024]; for (int i=0;iInputKey(key,value==1); - + int gwenKey = -1; @@ -274,8 +278,8 @@ void keyCallback(int key, int value) gwenKey = Gwen::Key::Control; break; } - - + + default: { @@ -296,32 +300,74 @@ void keyCallback(int key, int value) } } +extern int avoidUpdate; + int main() { - float retinaScale = 1.f; - b3gDefaultOpenGLWindow* window = new b3gDefaultOpenGLWindow(); window->setKeyboardCallback(keyCallback); b3gWindowConstructionInfo wci; + wci.m_openglVersion = 3; wci.m_width = sWidth; wci.m_height = sHeight; - + // wci.m_resizeCallback = MyResizeCallback; + window->createWindow(wci); window->setResizeCallback(MyResizeCallback); window->setWindowTitle("render test"); + + int majorGlVersion, minorGlVersion; + + if (!sscanf((const char*)glGetString(GL_VERSION), "%d.%d", &majorGlVersion, &minorGlVersion)==2) + { + printf("Exit: Error cannot extract OpenGL version from GL_VERSION string\n"); + exit(0); + } + if (majorGlVersion>=3 && wci.m_openglVersion>=3) + { + float retinaScale = 1.f; + #ifndef __APPLE__ - glewInit(); +#ifndef _WIN32 + //we need glewExperimental on Linux + glewExperimental = GL_TRUE; +#endif // _WIN32 + glewInit(); #endif - retinaScale = window->getRetinaScale(); + //we ned to call glGetError twice, because of some Ubuntu/Intel/OpenGL issue - primRenderer = new GLPrimitiveRenderer(sWidth,sHeight); + GLuint err = glGetError(); + err = glGetError(); + assert(err==GL_NO_ERROR); - sth_stash* font = initFont(primRenderer ); - - - gwenRenderer = new GwenOpenGL3CoreRenderer(primRenderer,font,sWidth,sHeight,retinaScale); + + retinaScale = window->getRetinaScale(); + + primRenderer = new GLPrimitiveRenderer(sWidth,sHeight); + + sth_stash* font = initFont(primRenderer ); + + + gwenRenderer = new GwenOpenGL3CoreRenderer(primRenderer,font,sWidth,sHeight,retinaScale); + + } else + { + //OpenGL 2.x + gwenRenderer = new Gwen::Renderer::OpenGL_DebugFont(); + + + skin.SetRender( gwenRenderer ); + + pCanvas = new Gwen::Controls::Canvas( &skin ); + pCanvas->SetSize( sWidth, sHeight); + pCanvas->SetDrawBackground( true ); + pCanvas->SetBackgroundColor( Gwen::Color( 150, 170, 170, 255 ) ); + + glClearColor(1,0,0,1); + + } @@ -333,14 +379,13 @@ int main() // // Create a GWEN skin // - + #ifdef USE_TEXTURED_SKIN Gwen::Skin::TexturedBase skin; skin.SetRender( pRenderer ); skin.Init("DefaultSkin.png"); #else - Gwen::Skin::Simple skin; skin.SetRender( gwenRenderer ); #endif @@ -364,7 +409,7 @@ int main() pUnit->SetPos( 10, 10 ); // - // Create a Windows Control helper + // Create a Windows Control helper // (Processes Windows MSG's and fires input at GWEN) // //Gwen::Input::Windows GwenInput; @@ -376,6 +421,11 @@ int main() // MSG msg; while( !window->requestedExit() ) { + if (majorGlVersion<3 || wci.m_openglVersion<3) + { + saveOpenGLState(sWidth,sHeight); + } + // Skip out if the window is closed //if ( !IsWindowVisible( g_pHWND ) ) //break; @@ -398,7 +448,7 @@ int main() } window->startRendering(); - + // Main OpenGL Render Loop { glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); @@ -408,33 +458,33 @@ int main() assert(err==GL_NO_ERROR); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - + err = glGetError(); assert(err==GL_NO_ERROR); err = glGetError(); assert(err==GL_NO_ERROR); - + glDisable(GL_DEPTH_TEST); err = glGetError(); assert(err==GL_NO_ERROR); - + //glColor4ub(255,0,0,255); - + err = glGetError(); assert(err==GL_NO_ERROR); - - + + err = glGetError(); assert(err==GL_NO_ERROR); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); // saveOpenGLState(width,height);//m_glutScreenWidth,m_glutScreenHeight); - + err = glGetError(); assert(err==GL_NO_ERROR); - + err = glGetError(); assert(err==GL_NO_ERROR); @@ -446,25 +496,32 @@ int main() err = glGetError(); assert(err==GL_NO_ERROR); - + glEnable(GL_BLEND); - + err = glGetError(); assert(err==GL_NO_ERROR); - - + + pCanvas->RenderCanvas(); + if (avoidUpdate<=0) + avoidUpdate++; + // SwapBuffers( GetDC( g_pHWND ) ); } window->endRendering(); + if (majorGlVersion<3 || wci.m_openglVersion<3) + { + restoreOpenGLState(); + } } window->closeWindow(); delete window; - + } diff --git a/btgui/GwenOpenGLTest/UnitTest.cpp b/btgui/GwenOpenGLTest/UnitTest.cpp index f2f0b0741..677d32884 100644 --- a/btgui/GwenOpenGLTest/UnitTest.cpp +++ b/btgui/GwenOpenGLTest/UnitTest.cpp @@ -84,8 +84,10 @@ GWEN_CONTROL_CONSTRUCTOR( UnitTest ) ctrl->Focus(); ctrl->SetKeyboardInputEnabled(true); - ctrl->SetBounds( 30, 30, 200, 200 ); - ctrl->ExpandAll(); + ctrl->SetBounds( 30, 30, 200, 30+16*10 ); + //ctrl->ExpandAll(); + ctrl->ForceUpdateScrollBars(); + ctrl->OnKeyDown(true); } diff --git a/btgui/GwenOpenGLTest/premake4.lua b/btgui/GwenOpenGLTest/premake4.lua index fb39dcbfe..1bca96bc8 100644 --- a/btgui/GwenOpenGLTest/premake4.lua +++ b/btgui/GwenOpenGLTest/premake4.lua @@ -55,6 +55,7 @@ "../OpenGLWindow/X11OpenGLWindow.h", "../OpenGLWindow/X11OpenGLWindow.cpp" } + links{"pthread"} end if os.is("MacOSX") then links{"Cocoa.framework"} diff --git a/btgui/MidiTest/cmidiin.cpp b/btgui/MidiTest/cmidiin.cpp index bc5e3aaf9..9de7ab83c 100644 --- a/btgui/MidiTest/cmidiin.cpp +++ b/btgui/MidiTest/cmidiin.cpp @@ -58,7 +58,8 @@ int main( int argc, char *argv[] ) std::cout << "\nReading MIDI input ... press to quit.\n"; char input; std::cin.get(input); -// getchar(); + std::cin.get(input); + cleanup: diff --git a/btgui/MidiTest/premake4.lua b/btgui/MidiTest/premake4.lua index 639f23223..e09468e6a 100644 --- a/btgui/MidiTest/premake4.lua +++ b/btgui/MidiTest/premake4.lua @@ -26,6 +26,8 @@ end if os.is("Linux") then + defines {"__LINUX_ALSA__"} + links {"asound","pthread"} end if os.is("MacOSX") then diff --git a/btgui/OpenGLTrueTypeFont/fontstash.cpp b/btgui/OpenGLTrueTypeFont/fontstash.cpp index 02b552b8b..8a2bf3de8 100644 --- a/btgui/OpenGLTrueTypeFont/fontstash.cpp +++ b/btgui/OpenGLTrueTypeFont/fontstash.cpp @@ -22,8 +22,7 @@ #include #include #ifdef _WIN32 -#include - +#include #endif #include "fontstash.h" @@ -354,7 +353,7 @@ static struct sth_glyph* get_glyph(struct sth_stash* stash, struct sth_font* fnt float scale; struct sth_texture* texture = NULL; struct sth_glyph* glyph = NULL; - unsigned char* bmp = NULL; + unsigned int h; float size = isize/10.0f; int rh; @@ -495,10 +494,10 @@ static int get_quad(struct sth_stash* stash, struct sth_font* fnt, struct sth_gl ry = (*y + scale * float(glyph->yoff)); q->x0 = rx; - q->y0 = ry + 1.5*0.5f*float(isize)/10.f; + q->y0 = ry + 1.5f*0.5f*float(isize)/10.f; q->x1 = rx + scale * float(glyph->x1 - glyph->x0_); - q->y1 = ry + scale * float(glyph->y1 - glyph->y0)+ 1.5*0.5f*float(isize)/10.f; + q->y1 = ry + scale * float(glyph->y1 - glyph->y0)+ 1.5f*0.5f*float(isize)/10.f; q->s0 = float(glyph->x0_) * stash->itw; q->t0 = float(glyph->y0) * stash->ith; @@ -638,13 +637,13 @@ void sth_draw_texture(struct sth_stash* stash, q.x1 = q.x0+width; q.y1 = q.y0+height; - v = setv(v, q.x0, q.y0, 0,0,screenwidth,screenheight); - v = setv(v, q.x1, q.y0, 1,0,screenwidth,screenheight); - v = setv(v, q.x1, q.y1, 1,1,screenwidth,screenheight); + v = setv(v, q.x0, q.y0, 0,0,(float)screenwidth,(float)screenheight); + v = setv(v, q.x1, q.y0, 1,0,(float)screenwidth,(float)screenheight); + v = setv(v, q.x1, q.y1, 1,1,(float)screenwidth,(float)screenheight); - v = setv(v, q.x0, q.y0, 0,0,screenwidth,screenheight); - v = setv(v, q.x1, q.y1, 1,1,screenwidth,screenheight); - v = setv(v, q.x0, q.y1, 0,1,screenwidth,screenheight); + v = setv(v, q.x0, q.y0, 0,0,(float)screenwidth,(float)screenheight); + v = setv(v, q.x1, q.y1, 1,1,(float)screenwidth,(float)screenheight); + v = setv(v, q.x0, q.y1, 0,1,(float)screenwidth,(float)screenheight); texture->nverts += 6; } @@ -704,13 +703,13 @@ void sth_draw_text(struct sth_stash* stash, { v = &texture->newverts[texture->nverts]; - v = setv(v, q.x0, q.y0, q.s0, q.t0,screenwidth,screenheight); - v = setv(v, q.x1, q.y0, q.s1, q.t0,screenwidth,screenheight); - v = setv(v, q.x1, q.y1, q.s1, q.t1,screenwidth,screenheight); + v = setv(v, q.x0, q.y0, q.s0, q.t0,(float)screenwidth,(float)screenheight); + v = setv(v, q.x1, q.y0, q.s1, q.t0,(float)screenwidth,(float)screenheight); + v = setv(v, q.x1, q.y1, q.s1, q.t1,(float)screenwidth,(float)screenheight); - v = setv(v, q.x0, q.y0, q.s0, q.t0,screenwidth,screenheight); - v = setv(v, q.x1, q.y1, q.s1, q.t1,screenwidth,screenheight); - v = setv(v, q.x0, q.y1, q.s0, q.t1,screenwidth,screenheight); + v = setv(v, q.x0, q.y0, q.s0, q.t0,(float)screenwidth,(float)screenheight); + v = setv(v, q.x1, q.y1, q.s1, q.t1,(float)screenwidth,(float)screenheight); + v = setv(v, q.x0, q.y1, q.s0, q.t1,(float)screenwidth,(float)screenheight); texture->nverts += 6; } diff --git a/btgui/OpenGLTrueTypeFont/opengl_fontstashcallbacks.cpp b/btgui/OpenGLTrueTypeFont/opengl_fontstashcallbacks.cpp index e1554bf08..d15485219 100644 --- a/btgui/OpenGLTrueTypeFont/opengl_fontstashcallbacks.cpp +++ b/btgui/OpenGLTrueTypeFont/opengl_fontstashcallbacks.cpp @@ -180,7 +180,7 @@ void InternalOpenGL2RenderCallbacks::updateTexture(sth_texture* texture, sth_gly glDeleteTextures(1, id); //delete id; - delete texture->m_userData; + delete id;//texture->m_userData; texture->m_userData = 0; } @@ -220,6 +220,7 @@ void InternalOpenGL2RenderCallbacks::render(sth_texture* texture) glBindBuffer(GL_ARRAY_BUFFER, s_vertexBuffer); glBindVertexArray(s_vertexArrayObject); glBufferData(GL_ARRAY_BUFFER, texture->nverts * sizeof(Vertex), &texture->newverts[0].position.p[0], GL_DYNAMIC_DRAW); + err = glGetError(); assert(err==GL_NO_ERROR); diff --git a/btgui/OpenGLTrueTypeFont/stb_truetype.h b/btgui/OpenGLTrueTypeFont/stb_truetype.h index c02c578d6..1d1e55d64 100644 --- a/btgui/OpenGLTrueTypeFont/stb_truetype.h +++ b/btgui/OpenGLTrueTypeFont/stb_truetype.h @@ -813,7 +813,7 @@ int stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codepoint) stbtt_uint16 searchRange = ttUSHORT(data+index_map+8) >> 1; stbtt_uint16 entrySelector = ttUSHORT(data+index_map+10); stbtt_uint16 rangeShift = ttUSHORT(data+index_map+12) >> 1; - stbtt_uint16 item, offset, start, end; + stbtt_uint16 item, offset, start; // do a binary search of the segments stbtt_uint32 endCount = index_map + 14; @@ -830,11 +830,8 @@ int stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codepoint) // now decrement to bias correctly to find smallest search -= 2; while (entrySelector) { - stbtt_uint16 start, end; + stbtt_uint16 end; searchRange >>= 1; - start = ttUSHORT(data + search + 2 + segcount*2 + 2); - end = ttUSHORT(data + search + 2); - start = ttUSHORT(data + search + searchRange*2 + segcount*2 + 2); end = ttUSHORT(data + search + searchRange*2); if (unicode_codepoint > end) search += searchRange*2; @@ -846,7 +843,7 @@ int stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codepoint) STBTT_assert(unicode_codepoint <= ttUSHORT(data + endCount + 2*item)); start = ttUSHORT(data + index_map + 14 + segcount*2 + 2 + 2*item); - end = ttUSHORT(data + index_map + 14 + 2 + 2*item); + if (unicode_codepoint < start) return 0; @@ -858,7 +855,7 @@ int stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codepoint) } else if (format == 12 || format == 13) { stbtt_uint32 ngroups = ttULONG(data+index_map+12); stbtt_int32 low,high; - stbtt_uint16 g = 0; + //stbtt_uint16 g = 0; low = 0; high = (stbtt_int32)ngroups; // Binary search the right group. while (low < high) { @@ -966,7 +963,7 @@ int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, stbtt_verte if (numberOfContours > 0) { stbtt_uint8 flags=0,flagcount; - stbtt_int32 ins, i,j=0,m,n, next_move, was_off=0, off, start_off=0, curve_end=0; + stbtt_int32 ins, i,j=0,m,n, next_move, was_off=0, off, start_off=0; stbtt_int32 x,y,cx,cy,sx,sy, scx,scy; scx=0; scy=0; diff --git a/btgui/OpenGLWindow/CMakeLists.txt b/btgui/OpenGLWindow/CMakeLists.txt index e12a1008b..4af098ac0 100644 --- a/btgui/OpenGLWindow/CMakeLists.txt +++ b/btgui/OpenGLWindow/CMakeLists.txt @@ -38,4 +38,14 @@ ENDIF() ADD_LIBRARY(OpenGLWindow ${OpenGLWindow_SRCS} ${OpenGLWindow_HDRS}) +if (UNIX AND NOT APPLE) + target_link_libraries(OpenGLWindow X11) +elseif (APPLE) + target_link_libraries(OpenGLWindow ${COCOA_LIBRARY}) +endif () +if (BUILD_SHARED_LIBS) + target_link_libraries(OpenGLWindow Bullet3Common) +endif() + +target_link_libraries(OpenGLWindow ${OPENGL_gl_LIBRARY}) diff --git a/btgui/OpenGLWindow/GLInstancingRenderer.cpp b/btgui/OpenGLWindow/GLInstancingRenderer.cpp index ecf66c6a8..f64c65232 100644 --- a/btgui/OpenGLWindow/GLInstancingRenderer.cpp +++ b/btgui/OpenGLWindow/GLInstancingRenderer.cpp @@ -1,10 +1,10 @@ /* -Copyright (c) 2012 Advanced Micro Devices, Inc. +Copyright (c) 2012 Advanced Micro Devices, 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, +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. @@ -15,21 +15,31 @@ subject to the following restrictions: ///todo: make this configurable in the gui -bool useShadowMap=true; +bool useShadowMap=true;//false;//true; float shadowMapWidth=8192; float shadowMapHeight=8192; float shadowMapWorldSize=100; float WHEEL_MULTIPLIER=0.01f; float MOUSE_MOVE_MULTIPLIER = 0.4f; +#define MAX_POINTS_IN_BATCH 1024 +#define MAX_LINES_IN_BATCH 1024 + #include "OpenGLInclude.h" #include "b3gWindowInterface.h" #include "Bullet3Common/b3MinMax.h" +#ifndef __APPLE__ +#ifndef glVertexAttribDivisor +#define glVertexAttribDivisor glVertexAttribDivisorARB +#endif //glVertexAttribDivisor +#ifndef GL_COMPARE_REF_TO_TEXTURE +#define GL_COMPARE_REF_TO_TEXTURE GL_COMPARE_R_TO_TEXTURE +#endif //GL_COMPARE_REF_TO_TEXTURE #ifndef glDrawElementsInstanced #define glDrawElementsInstanced glDrawElementsInstancedARB #endif - +#endif //__APPLE__ #include "GLInstancingRenderer.h" #include @@ -65,6 +75,7 @@ float MOUSE_MOVE_MULTIPLIER = 0.4f; static InternalDataRenderer* sData2; GLint lineWidthRange[2]={1,1}; +static b3Vector3 gLightPos=b3MakeVector3(-5,200,-40); struct b3GraphicsInstance { @@ -76,12 +87,21 @@ struct b3GraphicsInstance int m_numVertices; int m_numGraphicsInstances; - + int m_instanceOffset; int m_vertexArrayOffset; int m_primitiveType; - b3GraphicsInstance() :m_cube_vao(-1),m_index_vbo(-1),m_numIndices(-1),m_numVertices(-1),m_numGraphicsInstances(0),m_instanceOffset(0),m_vertexArrayOffset(0),m_primitiveType(B3_GL_TRIANGLES),m_texturehandle(0) + b3GraphicsInstance() + :m_cube_vao(-1), + m_index_vbo(-1), + m_texturehandle(0), + m_numIndices(-1), + m_numVertices(-1), + m_numGraphicsInstances(0), + m_instanceOffset(0), + m_vertexArrayOffset(0), + m_primitiveType(B3_GL_TRIANGLES) { } @@ -95,7 +115,7 @@ bool m_ortho = false; static GLfloat projectionMatrix[16]; static GLfloat modelviewMatrix[16]; -static GLfloat depthLightModelviewMatrix[16]; +//static GLfloat depthLightModelviewMatrix[16]; static void checkError(const char *functionName) { @@ -136,16 +156,17 @@ struct InternalDataRenderer : public GLInstanceRendererInternalData int m_leftMouseButton; int m_middleMouseButton; int m_rightMouseButton; - - int m_altPressed; - int m_controlPressed; - + + + GLuint m_defaultTexturehandle; b3AlignedObjectArray m_textureHandles; GLRenderToTexture* m_shadowMap; GLuint m_shadowTexture; + int m_altPressed; + int m_controlPressed; InternalDataRenderer() : m_cameraPosition(b3MakeVector3(0,0,0)), @@ -164,7 +185,7 @@ struct InternalDataRenderer : public GLInstanceRendererInternalData m_altPressed(0), m_controlPressed(0) { - + } @@ -175,7 +196,7 @@ struct InternalDataRenderer : public GLInstanceRendererInternalData if (deltay<0 || m_cameraDistance>1) { - m_cameraDistance -= deltay*0.1; + m_cameraDistance -= deltay*0.1f; if (m_cameraDistance<1) m_cameraDistance=1; } else @@ -207,7 +228,7 @@ struct InternalDataRenderer : public GLInstanceRendererInternalData { float xDelta = x-m_mouseXpos; float yDelta = y-m_mouseYpos; - + if (m_leftMouseButton) { // if (b3Fabs(xDelta)>b3Fabs(yDelta)) @@ -222,7 +243,7 @@ struct InternalDataRenderer : public GLInstanceRendererInternalData { m_cameraTargetPosition += m_cameraUp * yDelta*0.01; - + b3Vector3 fwd = m_cameraTargetPosition-m_cameraPosition; b3Vector3 side = m_cameraUp.cross(fwd); side.normalize(); @@ -231,8 +252,8 @@ struct InternalDataRenderer : public GLInstanceRendererInternalData } if (m_rightMouseButton) { - m_cameraDistance -= xDelta*0.01; - m_cameraDistance -= yDelta*0.01; + m_cameraDistance -= xDelta*0.01f; + m_cameraDistance -= yDelta*0.01f; if (m_cameraDistance<1) m_cameraDistance=1; if (m_cameraDistance>1000) @@ -250,7 +271,7 @@ struct InternalDataRenderer : public GLInstanceRendererInternalData void mouseButtonCallback(int button, int state, float x, float y) { - + if (button==0) m_leftMouseButton=state; if (button==1) @@ -258,7 +279,7 @@ struct InternalDataRenderer : public GLInstanceRendererInternalData if (button==2) m_rightMouseButton=state; - + m_mouseXpos = x; m_mouseYpos = y; m_mouseInitialized = true; @@ -314,7 +335,7 @@ static GLuint instancingShaderPointSprite; // The point spr -static bool done = false; +//static bool done = false; static GLint lines_ModelViewMatrix=0; static GLint lines_ProjectionMatrix=0; @@ -324,10 +345,14 @@ GLuint lineVertexBufferObject=0; GLuint lineVertexArrayObject=0; GLuint lineIndexVbo = 0; +GLuint linesVertexBufferObject=0; +GLuint linesVertexArrayObject=0; +GLuint linesIndexVbo = 0; static GLint useShadow_ModelViewMatrix=0; static GLint useShadow_MVP=0; +static GLint useShadow_lightDirIn=0; static GLint useShadow_ProjectionMatrix=0; static GLint useShadow_DepthBiasModelViewMatrix=0; @@ -338,13 +363,13 @@ static GLint createShadow_depthMVP=0; static GLint ModelViewMatrix=0; static GLint ProjectionMatrix=0; -static GLint DepthModelViewMatrix=0; + static GLint uniform_texture_diffuse = 0; static GLint screenWidthPointSprite=0; static GLint ModelViewMatrixPointSprite=0; static GLint ProjectionMatrixPointSprite=0; -static GLint uniform_texture_diffusePointSprite= 0; +//static GLint uniform_texture_diffusePointSprite= 0; @@ -484,20 +509,20 @@ void GLInstancingRenderer::writeSingleInstanceTransformToGPU(float* position, fl void GLInstancingRenderer::writeTransforms() { - GLint err = glGetError(); - b3Assert(err==GL_NO_ERROR); - + b3Assert(glGetError() ==GL_NO_ERROR); + + glBindBuffer(GL_ARRAY_BUFFER, m_data->m_vbo); glFlush(); - err = glGetError(); - b3Assert(err==GL_NO_ERROR); + b3Assert(glGetError() ==GL_NO_ERROR); + char* orgBase = (char*)glMapBuffer( GL_ARRAY_BUFFER,GL_READ_WRITE); if (orgBase) { - + int totalNumInstances= 0; @@ -514,7 +539,7 @@ void GLInstancingRenderer::writeTransforms() //int k=0; b3GraphicsInstance* gfxObj = m_graphicsInstances[k]; - + int POSITION_BUFFER_SIZE = (totalNumInstances*sizeof(float)*4); int ORIENTATION_BUFFER_SIZE = (totalNumInstances*sizeof(float)*4); @@ -555,15 +580,14 @@ void GLInstancingRenderer::writeTransforms() scaling[srcIndex*3]=m_data->m_instance_scale_ptr[srcIndex*3]; scaling[srcIndex*3+1]=m_data->m_instance_scale_ptr[srcIndex*3+1]; scaling[srcIndex*3+2]=m_data->m_instance_scale_ptr[srcIndex*3+2]; - + } } } else { b3Error("ERROR glMapBuffer failed\n"); } - err = glGetError(); - b3Assert(err==GL_NO_ERROR); + b3Assert(glGetError() ==GL_NO_ERROR); glUnmapBuffer( GL_ARRAY_BUFFER); //if this glFinish is removed, the animation is not always working/blocks @@ -571,9 +595,17 @@ void GLInstancingRenderer::writeTransforms() glFlush(); glBindBuffer(GL_ARRAY_BUFFER, 0);//m_data->m_vbo); - err = glGetError(); - b3Assert(err==GL_NO_ERROR); - + b3Assert(glGetError() ==GL_NO_ERROR); + +} + +int GLInstancingRenderer::registerGraphicsInstance(int shapeIndex, const double* pos1, const double* orn1, const double* color1, const double* scaling1) +{ + float pos[4] = {(float)pos1[0],(float)pos1[1],(float)pos1[2],(float)pos1[3]}; + float orn[4] = {(float)orn1[0],(float)orn1[1],(float)orn1[2],(float)orn1[3]}; + float color[4] = {(float)color1[0],(float)color1[1],(float)color1[2],(float)color1[3]}; + float scaling[4] = {(float)scaling1[0],(float)scaling1[1],(float)scaling1[2],(float)scaling1[3]}; + return registerGraphicsInstance(shapeIndex,pos,orn,color,scaling); } @@ -585,7 +617,7 @@ int GLInstancingRenderer::registerGraphicsInstance(int shapeIndex, const float* b3GraphicsInstance* gfxObj = m_graphicsInstances[shapeIndex]; int index = gfxObj->m_numGraphicsInstances + gfxObj->m_instanceOffset; - + int maxElements = m_data->m_instance_positions_ptr.size(); if (index*4m_textureHandles.size(); const GLubyte* image= (const GLubyte*)texels; GLuint textureHandle; glGenTextures(1,(GLuint*)&textureHandle); glBindTexture(GL_TEXTURE_2D,textureHandle); - - err = glGetError(); - b3Assert(err==GL_NO_ERROR); - err = glGetError(); - b3Assert(err==GL_NO_ERROR); + + b3Assert(glGetError() ==GL_NO_ERROR); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width,height,0,GL_RGB,GL_UNSIGNED_BYTE,image); - - - err = glGetError(); - b3Assert(err==GL_NO_ERROR); + + + b3Assert(glGetError() ==GL_NO_ERROR); glGenerateMipmap(GL_TEXTURE_2D); - err = glGetError(); - b3Assert(err==GL_NO_ERROR); + b3Assert(glGetError() ==GL_NO_ERROR); + - m_data->m_textureHandles.push_back(textureHandle); return textureIndex; } @@ -664,14 +691,14 @@ void GLInstancingRenderer::updateShape(int shapeIndex, const float* vertices) int GLInstancingRenderer::registerShape(const float* vertices, int numvertices, const int* indices, int numIndices,int primitiveType, int textureId) { b3GraphicsInstance* gfxObj = new b3GraphicsInstance; - + if (textureId>=0) { gfxObj->m_texturehandle = m_data->m_textureHandles[textureId]; } - + gfxObj->m_primitiveType = primitiveType; - + if (m_graphicsInstances.size()) { b3GraphicsInstance* prevObj = m_graphicsInstances[m_graphicsInstances.size()-1]; @@ -685,15 +712,17 @@ int GLInstancingRenderer::registerShape(const float* vertices, int numvertices, m_graphicsInstances.push_back(gfxObj); gfxObj->m_numIndices = numIndices; gfxObj->m_numVertices = numvertices; - - + + glBindBuffer(GL_ARRAY_BUFFER, m_data->m_vbo); char* dest= (char*)glMapBuffer( GL_ARRAY_BUFFER,GL_WRITE_ONLY);//GL_WRITE_ONLY int vertexStrideInBytes = 9*sizeof(float); int sz = numvertices*vertexStrideInBytes; +#ifdef B3_DEBUG int totalUsed = vertexStrideInBytes*gfxObj->m_vertexArrayOffset+sz; b3Assert(totalUsedm_maxShapeCapacityInBytes); - +#endif//B3_DEBUG + memcpy(dest+vertexStrideInBytes*gfxObj->m_vertexArrayOffset,vertices,sz); glUnmapBuffer( GL_ARRAY_BUFFER); @@ -705,7 +734,7 @@ int GLInstancingRenderer::registerShape(const float* vertices, int numvertices, glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexBufferSizeInBytes, NULL, GL_STATIC_DRAW); glBufferSubData(GL_ELEMENT_ARRAY_BUFFER,0,indexBufferSizeInBytes,indices); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); - + glGenVertexArrays(1, &gfxObj->m_cube_vao); glBindVertexArray(gfxObj->m_cube_vao); glBindBuffer(GL_ARRAY_BUFFER, m_data->m_vbo); @@ -713,7 +742,7 @@ int GLInstancingRenderer::registerShape(const float* vertices, int numvertices, glBindBuffer(GL_ARRAY_BUFFER,0); glBindVertexArray(0); - + return m_graphicsInstances.size()-1; } @@ -722,7 +751,7 @@ int GLInstancingRenderer::registerShape(const float* vertices, int numvertices, void GLInstancingRenderer::InitShaders() { - + int POSITION_BUFFER_SIZE = (m_maxNumObjectCapacity*sizeof(float)*4); int ORIENTATION_BUFFER_SIZE = (m_maxNumObjectCapacity*sizeof(float)*4); int COLOR_BUFFER_SIZE = (m_maxNumObjectCapacity*sizeof(float)*4); @@ -735,24 +764,44 @@ void GLInstancingRenderer::InitShaders() lines_position=glGetAttribLocation(linesShader, "position"); glLinkProgram(linesShader); glUseProgram(linesShader); - - - glGenVertexArrays(1, &lineVertexArrayObject); - glBindVertexArray(lineVertexArrayObject); - glGenBuffers(1, &lineVertexBufferObject); - glGenBuffers(1, &lineIndexVbo); - glBindVertexArray(0); - - + { + glGenVertexArrays(1, &linesVertexArrayObject); + glBindVertexArray(linesVertexArrayObject); + + glGenBuffers(1, &linesVertexBufferObject); + glGenBuffers(1, &linesIndexVbo); + + int sz = MAX_LINES_IN_BATCH*sizeof(b3Vector3); + glBindVertexArray(linesVertexArrayObject); + glBindBuffer(GL_ARRAY_BUFFER, linesVertexBufferObject); + glBufferData(GL_ARRAY_BUFFER, sz, 0, GL_DYNAMIC_DRAW); + + glBindVertexArray(0); + } + { + glGenVertexArrays(1, &lineVertexArrayObject); + glBindVertexArray(lineVertexArrayObject); + + glGenBuffers(1, &lineVertexBufferObject); + glGenBuffers(1, &lineIndexVbo); + + int sz = MAX_POINTS_IN_BATCH*sizeof(b3Vector3); + glBindVertexArray(lineVertexArrayObject); + glBindBuffer(GL_ARRAY_BUFFER, lineVertexBufferObject); + glBufferData(GL_ARRAY_BUFFER, sz, 0, GL_DYNAMIC_DRAW); + + glBindVertexArray(0); + } + //glGetIntegerv(GL_ALIASED_LINE_WIDTH_RANGE, range); glGetIntegerv(GL_SMOOTH_LINE_WIDTH_RANGE, lineWidthRange); - - + + useShadowMapInstancingShader = gltLoadShaderPair(useShadowMapInstancingVertexShader,useShadowMapInstancingFragmentShader); - + glLinkProgram(useShadowMapInstancingShader); glUseProgram(useShadowMapInstancingShader); useShadow_ModelViewMatrix = glGetUniformLocation(useShadowMapInstancingShader, "ModelViewMatrix"); @@ -761,16 +810,15 @@ void GLInstancingRenderer::InitShaders() useShadow_DepthBiasModelViewMatrix = glGetUniformLocation(useShadowMapInstancingShader, "DepthBiasModelViewProjectionMatrix"); useShadow_uniform_texture_diffuse = glGetUniformLocation(useShadowMapInstancingShader, "Diffuse"); useShadow_shadowMap = glGetUniformLocation(useShadowMapInstancingShader,"shadowMap"); - + useShadow_lightDirIn = glGetUniformLocation(useShadowMapInstancingShader,"lightDirIn"); createShadowMapInstancingShader = gltLoadShaderPair(createShadowMapInstancingVertexShader,createShadowMapInstancingFragmentShader); glLinkProgram(createShadowMapInstancingShader); glUseProgram(createShadowMapInstancingShader); createShadow_depthMVP = glGetUniformLocation(createShadowMapInstancingShader, "depthMVP"); - glUseProgram(0); - + instancingShader = gltLoadShaderPair(instancingVertexShader,instancingFragmentShader); glLinkProgram(instancingShader); glUseProgram(instancingShader); @@ -778,13 +826,13 @@ void GLInstancingRenderer::InitShaders() ProjectionMatrix = glGetUniformLocation(instancingShader, "ProjectionMatrix"); uniform_texture_diffuse = glGetUniformLocation(instancingShader, "Diffuse"); glUseProgram(0); - + instancingShaderPointSprite = gltLoadShaderPair(pointSpriteVertexShader,pointSpriteFragmentShader); glUseProgram(instancingShaderPointSprite); ModelViewMatrixPointSprite = glGetUniformLocation(instancingShaderPointSprite, "ModelViewMatrix"); ProjectionMatrixPointSprite = glGetUniformLocation(instancingShaderPointSprite, "ProjectionMatrix"); screenWidthPointSprite = glGetUniformLocation(instancingShaderPointSprite, "screenWidth"); - + glUseProgram(0); //GLuint offset = 0; @@ -804,7 +852,7 @@ void GLInstancingRenderer::InitShaders() glBindVertexArray(0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); - + } @@ -813,27 +861,21 @@ void GLInstancingRenderer::InitShaders() void GLInstancingRenderer::init() { - GLint err = glGetError(); - b3Assert(err==GL_NO_ERROR); - - err = glGetError(); - b3Assert(err==GL_NO_ERROR); - + b3Assert(glGetError() ==GL_NO_ERROR); + + glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); - err = glGetError(); - b3Assert(err==GL_NO_ERROR); - -// glClearColor(float(0.),float(0.),float(0.4),float(0)); - - err = glGetError(); - b3Assert(err==GL_NO_ERROR); + b3Assert(glGetError() ==GL_NO_ERROR); + +// glClearColor(float(0.),float(0.),float(0.4),float(0)); + + b3Assert(glGetError() ==GL_NO_ERROR); + + + b3Assert(glGetError() ==GL_NO_ERROR); - - err = glGetError(); - b3Assert(err==GL_NO_ERROR); - { B3_PROFILE("texture"); if(m_textureenabled) @@ -863,7 +905,7 @@ void GLInstancingRenderer::init() /* const int s=x>>5; - const GLubyte b=180; + const GLubyte b=180; GLubyte c=b+((s+t&1)&1)*(255-b); pi[0]=c; pi[1]=c; @@ -876,63 +918,32 @@ void GLInstancingRenderer::init() glGenTextures(1,(GLuint*)&m_data->m_defaultTexturehandle); glBindTexture(GL_TEXTURE_2D,m_data->m_defaultTexturehandle); - err = glGetError(); - b3Assert(err==GL_NO_ERROR); - #if 0 + b3Assert(glGetError() ==GL_NO_ERROR); - glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE); - err = glGetError(); - b3Assert(err==GL_NO_ERROR); - - glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR); - err = glGetError(); - b3Assert(err==GL_NO_ERROR); - - glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); - err = glGetError(); - b3Assert(err==GL_NO_ERROR); - - glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); - err = glGetError(); - b3Assert(err==GL_NO_ERROR); - - glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT); - err = glGetError(); - b3Assert(err==GL_NO_ERROR); - - - #endif - err = glGetError(); - b3Assert(err==GL_NO_ERROR); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 256,256,0,GL_RGB,GL_UNSIGNED_BYTE,image); glGenerateMipmap(GL_TEXTURE_2D); - - err = glGetError(); - b3Assert(err==GL_NO_ERROR); - + + b3Assert(glGetError() ==GL_NO_ERROR); + delete[] image; m_textureinitialized=true; } - - err = glGetError(); - b3Assert(err==GL_NO_ERROR); - + + b3Assert(glGetError() ==GL_NO_ERROR); + glBindTexture(GL_TEXTURE_2D,m_data->m_defaultTexturehandle); - err = glGetError(); - b3Assert(err==GL_NO_ERROR); - + b3Assert(glGetError() ==GL_NO_ERROR); + } else { glDisable(GL_TEXTURE_2D); - err = glGetError(); - b3Assert(err==GL_NO_ERROR); + b3Assert(glGetError() ==GL_NO_ERROR); } } //glEnable(GL_COLOR_MATERIAL); - - err = glGetError(); - b3Assert(err==GL_NO_ERROR); + + b3Assert(glGetError() ==GL_NO_ERROR); // glEnable(GL_CULL_FACE); // glCullFace(GL_BACK); @@ -948,27 +959,27 @@ void b3CreateFrustum( float farVal, float frustum[16]) { - + frustum[0*4+0] = (float(2) * nearVal) / (right - left); frustum[0*4+1] = float(0); frustum[0*4+2] = float(0); frustum[0*4+3] = float(0); - + frustum[1*4+0] = float(0); frustum[1*4+1] = (float(2) * nearVal) / (top - bottom); frustum[1*4+2] = float(0); frustum[1*4+3] = float(0); - + frustum[2*4+0] = (right + left) / (right - left); frustum[2*4+1] = (top + bottom) / (top - bottom); frustum[2*4+2] = -(farVal + nearVal) / (farVal - nearVal); frustum[2*4+3] = float(-1); - + frustum[3*4+0] = float(0); frustum[3*4+1] = float(0); frustum[3*4+2] = -(float(2) * farVal * nearVal) / (farVal - nearVal); frustum[3*4+3] = float(0); - + } @@ -1022,11 +1033,11 @@ void b3CreateLookAt(const b3Vector3& eye, const b3Vector3& center,const b3Vec b3Vector3 u = up.normalized(); b3Vector3 s = (f.cross(u)).normalized(); u = s.cross(f); - + result[0*4+0] = s.x; result[1*4+0] = s.y; result[2*4+0] = s.z; - + result[0*4+1] = u.x; result[1*4+1] = u.y; result[2*4+1] = u.z; @@ -1034,7 +1045,7 @@ void b3CreateLookAt(const b3Vector3& eye, const b3Vector3& center,const b3Vec result[0*4+2] =-f.x; result[1*4+2] =-f.y; result[2*4+2] =-f.z; - + result[0*4+3] = 0.f; result[1*4+3] = 0.f; result[2*4+3] = 0.f; @@ -1052,18 +1063,32 @@ void GLInstancingRenderer::resize(int width, int height) m_screenHeight = height; } -void GLInstancingRenderer::updateCamera() +void GLInstancingRenderer::updateCamera(int upAxis) { - GLint err = glGetError(); - b3Assert(err==GL_NO_ERROR); - + b3Assert(glGetError() ==GL_NO_ERROR); + + int m_forwardAxis(-1); + switch (upAxis) + { + case 1: + m_forwardAxis = 2; + m_data->m_cameraUp = b3MakeVector3(0,1,0); + gLightPos = b3MakeVector3(-50.f,100,30); + break; + case 2: + m_forwardAxis = 1; + m_data->m_cameraUp = b3MakeVector3(0,0,1); + gLightPos = b3MakeVector3(-50.f,30,100); + break; + default: + b3Assert(0); + }; - int m_forwardAxis(2); float m_frustumZNear=1; float m_frustumZFar=10000.f; - + // m_azi=m_azi+0.01; b3Scalar rele = m_data->m_ele * b3Scalar(0.01745329251994329547);// rads per deg @@ -1072,8 +1097,7 @@ void GLInstancingRenderer::updateCamera() b3Quaternion rot(m_data->m_cameraUp,razi); - - b3Vector3 eyePos = b3MakeVector3(0,0,0); + b3Vector3 eyePos = b3MakeVector3(0,0,0); eyePos[m_forwardAxis] = -m_data->m_cameraDistance; b3Vector3 forward = b3MakeVector3(eyePos[0],eyePos[1],eyePos[2]); @@ -1100,7 +1124,7 @@ void GLInstancingRenderer::updateCamera() aspect = m_screenWidth / (b3Scalar)m_screenHeight; extents.setValue(aspect * 1.0f, 1.0f,0); - + if (m_screenWidth > m_screenHeight) { b3CreateFrustum(-aspect * m_frustumZNear, aspect * m_frustumZNear, -m_frustumZNear, m_frustumZNear, m_frustumZNear, m_frustumZFar,projectionMatrix); @@ -1110,8 +1134,8 @@ void GLInstancingRenderer::updateCamera() } b3CreateLookAt(m_data->m_cameraPosition,m_data->m_cameraTargetPosition,m_data->m_cameraUp,modelviewMatrix); - - + + } @@ -1179,7 +1203,7 @@ void GLInstancingRenderer::getMouseDirection(float* dir, int x, int y) float farPlane = 10000.f; rayForward*= farPlane; - b3Vector3 rightOffset; +// b3Vector3 rightOffset; b3Vector3 vertical = m_data->m_cameraUp; b3Vector3 hor; @@ -1195,9 +1219,9 @@ void GLInstancingRenderer::getMouseDirection(float* dir, int x, int y) vertical *= 2.f * farPlane * tanfov; b3Scalar aspect; - + aspect = m_screenWidth / (b3Scalar)m_screenHeight; - + hor*=aspect; @@ -1222,19 +1246,15 @@ void GLInstancingRenderer::getMouseDirection(float* dir, int x, int y) #include "OpenGLTrueTypeFont/stb_image_write.h" void writeTextureToPng(int textureWidth, int textureHeight, const char* fileName, int numComponents) { - GLuint err; - err = glGetError(); - b3Assert(err==GL_NO_ERROR); + b3Assert(glGetError() ==GL_NO_ERROR); glPixelStorei(GL_PACK_ALIGNMENT,4); - + glReadBuffer(GL_NONE); float* orgPixels = (float*)malloc(textureWidth*textureHeight*numComponents*4); char* pixels = (char*)malloc(textureWidth*textureHeight*numComponents*4); glReadPixels(0,0,textureWidth, textureHeight, GL_DEPTH_COMPONENT, GL_FLOAT, orgPixels); - err = glGetError(); - b3Assert(err==GL_NO_ERROR); - + b3Assert(glGetError() ==GL_NO_ERROR); for (int j=0;jm_vbo); - GLint err = glGetError(); - b3Assert(err==GL_NO_ERROR); - + b3Assert(glGetError() ==GL_NO_ERROR); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); - + glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D,0); - int curOffset = 0; - err = glGetError(); - b3Assert(err==GL_NO_ERROR); - glUseProgram(linesShader); + + b3Assert(glGetError() ==GL_NO_ERROR);glUseProgram(linesShader); glUniformMatrix4fv(lines_ProjectionMatrix, 1, false, &projectionMatrix[0]); glUniformMatrix4fv(lines_ModelViewMatrix, 1, false, &modelviewMatrix[0]); glUniform4f(lines_colour,color[0],color[1],color[2],color[3]); - + // glPointSize(pointDrawSize); - glBindVertexArray(lineVertexArrayObject); - - err = glGetError(); - b3Assert(err==GL_NO_ERROR); - - glBindBuffer(GL_ARRAY_BUFFER, lineVertexBufferObject); - glBufferData(GL_ARRAY_BUFFER, numPoints*pointStrideInBytes, positions, GL_STATIC_DRAW); - err = glGetError(); - b3Assert(err==GL_NO_ERROR); + glBindVertexArray(linesVertexArrayObject); - glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindBuffer(GL_ARRAY_BUFFER, lineVertexBufferObject); - glEnableVertexAttribArray(0); - - err = glGetError(); - b3Assert(err==GL_NO_ERROR); + b3Assert(glGetError() ==GL_NO_ERROR); + glBindBuffer(GL_ARRAY_BUFFER, linesVertexBufferObject); - int numFloats = pointStrideInBytes/sizeof(float); - glVertexAttribPointer(0, numFloats, GL_FLOAT, GL_FALSE, 0, 0); - err = glGetError(); - b3Assert(err==GL_NO_ERROR); + { + + glBufferData(GL_ARRAY_BUFFER, numPoints*pointStrideInBytes, 0,GL_DYNAMIC_DRAW); + + glBufferSubData(GL_ARRAY_BUFFER, 0, numPoints*pointStrideInBytes, positions); + b3Assert(glGetError() ==GL_NO_ERROR); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindBuffer(GL_ARRAY_BUFFER, linesVertexBufferObject); + glEnableVertexAttribArray(0); + + b3Assert(glGetError() ==GL_NO_ERROR); + int numFloats = 3; + glVertexAttribPointer(0, numFloats, GL_FLOAT, GL_FALSE, pointStrideInBytes, 0); + b3Assert(glGetError() ==GL_NO_ERROR); + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, linesIndexVbo); + int indexBufferSizeInBytes = numIndices*sizeof(int); + + glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexBufferSizeInBytes, NULL, GL_DYNAMIC_DRAW); + glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, indexBufferSizeInBytes, indices); + + glDrawElements(GL_LINES, numIndices, GL_UNSIGNED_INT, 0); + } - - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, lineIndexVbo); - int indexBufferSizeInBytes = numIndices*sizeof(int); - - glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexBufferSizeInBytes, NULL, GL_STATIC_DRAW); - glBufferSubData(GL_ELEMENT_ARRAY_BUFFER,0,indexBufferSizeInBytes,indices); - - glDrawElements(GL_LINES, numIndices, GL_UNSIGNED_INT,0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); glBindBuffer(GL_ARRAY_BUFFER, 0); // for (int i=0;im_shadowMap) { glActiveTexture(GL_TEXTURE0); @@ -1532,7 +1563,7 @@ void GLInstancingRenderer::renderSceneInternal(int renderMode) //glTexImage2D(GL_TEXTURE_2D,0,GL_DEPTH_COMPONENT16,m_screenWidth,m_screenHeight,0,GL_DEPTH_COMPONENT,GL_FLOAT,0); //glTexImage2D(GL_TEXTURE_2D,0,GL_DEPTH_COMPONENT32,m_screenWidth,m_screenHeight,0,GL_DEPTH_COMPONENT,GL_FLOAT,0); glTexImage2D(GL_TEXTURE_2D, 0,GL_DEPTH_COMPONENT16, shadowMapWidth, shadowMapHeight, 0,GL_DEPTH_COMPONENT, GL_FLOAT, 0); - + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); @@ -1543,7 +1574,7 @@ void GLInstancingRenderer::renderSceneInternal(int renderMode) // glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); // glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE); m_data->m_shadowMap=new GLRenderToTexture(); m_data->m_shadowMap->init(shadowMapWidth, shadowMapHeight,m_data->m_shadowTexture,RENDERTEXTURE_DEPTH); @@ -1559,33 +1590,31 @@ void GLInstancingRenderer::renderSceneInternal(int renderMode) // glEnable(GL_CULL_FACE); // glCullFace(GL_BACK); // Cull back-facing triangles -> draw only front-facing triangles - GLint err = glGetError(); - b3Assert(err==GL_NO_ERROR); + b3Assert(glGetError() ==GL_NO_ERROR); } else { glDisable(GL_CULL_FACE); //glCullFace(GL_BACK); - + } - static b3Vector3 lightPos = b3MakeVector3(-5.f,200,-40);//20,15,10);//-13,6,2);// = b3Vector3(0.5f,2,2); -// lightPos.y+=0.1f; + b3CreateOrtho(-shadowMapWorldSize,shadowMapWorldSize,-shadowMapWorldSize,shadowMapWorldSize,1,300,depthProjectionMatrix);//-14,14,-14,14,1,200, depthProjectionMatrix); float depthViewMatrix[4][4]; b3Vector3 center = b3MakeVector3(0,0,0); b3Vector3 up =b3MakeVector3(0,1,0); - b3CreateLookAt(lightPos,center,up,&depthViewMatrix[0][0]); + b3CreateLookAt(gLightPos,center,up,&depthViewMatrix[0][0]); //b3CreateLookAt(lightPos,m_data->m_cameraTargetPosition,b3Vector3(0,1,0),(float*)depthModelViewMatrix2); GLfloat depthModelMatrix[4][4]; b3CreateDiagonalMatrix(1.f,depthModelMatrix); b3Matrix4x4Mul(depthViewMatrix, depthModelMatrix, depthModelViewMatrix); - + GLfloat depthMVP[4][4]; b3Matrix4x4Mul(depthProjectionMatrix,depthModelViewMatrix,depthMVP); - + GLfloat biasMatrix[4][4]={ - 0.5, 0.0, 0.0, 0.0, + 0.5, 0.0, 0.0, 0.0, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.5, 0.0, 0.5, 0.5, 0.5, 1.0 @@ -1594,25 +1623,23 @@ void GLInstancingRenderer::renderSceneInternal(int renderMode) GLfloat depthBiasMVP[4][4]; b3Matrix4x4Mul(biasMatrix,depthMVP,depthBiasMVP); - + //float m_frustumZNear=0.1; //float m_frustumZFar=100.f; - + //b3CreateFrustum(-m_frustumZNear, m_frustumZNear, -m_frustumZNear, m_frustumZNear, m_frustumZNear, m_frustumZFar,(float*)depthProjectionMatrix); - + //b3CreateLookAt(lightPos,m_data->m_cameraTargetPosition,b3Vector3(0,0,1),(float*)depthModelViewMatrix); { B3_PROFILE("updateCamera"); - updateCamera(); + // updateCamera(); } - err = glGetError(); - b3Assert(err==GL_NO_ERROR); - +b3Assert(glGetError() ==GL_NO_ERROR); // glBindBuffer(GL_ARRAY_BUFFER, 0); @@ -1622,9 +1649,7 @@ void GLInstancingRenderer::renderSceneInternal(int renderMode) glBindBuffer(GL_ARRAY_BUFFER, m_data->m_vbo); glFlush(); } - err = glGetError(); - b3Assert(err==GL_NO_ERROR); - +b3Assert(glGetError() ==GL_NO_ERROR); int totalNumInstances = 0; @@ -1634,12 +1659,12 @@ void GLInstancingRenderer::renderSceneInternal(int renderMode) } int curOffset = 0; - GLuint lastBindTexture = 0; + //GLuint lastBindTexture = 0; for (int i=0;im_numGraphicsInstances) { @@ -1650,14 +1675,14 @@ void GLInstancingRenderer::renderSceneInternal(int renderMode) else curBindTexture = m_data->m_defaultTexturehandle; +//disable lazy evaluation, it just leads to bugs //if (lastBindTexture != curBindTexture) { glBindTexture(GL_TEXTURE_2D,curBindTexture); } - lastBindTexture = curBindTexture; + //lastBindTexture = curBindTexture; - err = glGetError(); - b3Assert(err==GL_NO_ERROR); +b3Assert(glGetError() ==GL_NO_ERROR); // int myOffset = gfxObj->m_instanceOffset*4*sizeof(float); int POSITION_BUFFER_SIZE = (totalNumInstances*sizeof(float)*4); @@ -1667,18 +1692,24 @@ void GLInstancingRenderer::renderSceneInternal(int renderMode) glBindVertexArray(gfxObj->m_cube_vao); - - int vertexStride = 9*sizeof(float); - int vertexBase = gfxObj->m_vertexArrayOffset*vertexStride; - glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 9*sizeof(float), (GLvoid*)vertexBase); + int vertexStride = 9*sizeof(float); + PointerCaster vertex; + vertex.m_baseIndex = gfxObj->m_vertexArrayOffset*vertexStride; + + + glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 9*sizeof(float), vertex.m_pointer); glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, (GLvoid *)(curOffset*4*sizeof(float)+m_maxShapeCapacityInBytes)); glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, 0, (GLvoid *)(curOffset*4*sizeof(float)+m_maxShapeCapacityInBytes+POSITION_BUFFER_SIZE)); - int uvoffset = 7*sizeof(float)+vertexBase; - int normaloffset = 4*sizeof(float)+vertexBase; - glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, 9*sizeof(float), (GLvoid *)uvoffset); - glVertexAttribPointer(4, 3, GL_FLOAT, GL_FALSE, 9*sizeof(float), (GLvoid *)normaloffset); + PointerCaster uv; + uv.m_baseIndex = 7*sizeof(float)+vertex.m_baseIndex; + + PointerCaster normal; + normal.m_baseIndex = 4*sizeof(float)+vertex.m_baseIndex; + + glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, 9*sizeof(float), uv.m_pointer); + glVertexAttribPointer(4, 3, GL_FLOAT, GL_FALSE, 9*sizeof(float), normal.m_pointer); glVertexAttribPointer(5, 4, GL_FLOAT, GL_FALSE, 0, (GLvoid *)(curOffset*4*sizeof(float)+m_maxShapeCapacityInBytes+POSITION_BUFFER_SIZE+ORIENTATION_BUFFER_SIZE)); glVertexAttribPointer(6, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid *)(curOffset*3*sizeof(float)+m_maxShapeCapacityInBytes+POSITION_BUFFER_SIZE+ORIENTATION_BUFFER_SIZE+COLOR_BUFFER_SIZE)); @@ -1689,37 +1720,36 @@ void GLInstancingRenderer::renderSceneInternal(int renderMode) glEnableVertexAttribArray(4); glEnableVertexAttribArray(5); glEnableVertexAttribArray(6); - glVertexAttribDivisorARB(0, 0); - glVertexAttribDivisorARB(1, 1); - glVertexAttribDivisorARB(2, 1); - glVertexAttribDivisorARB(3, 0); - glVertexAttribDivisorARB(4, 0); - glVertexAttribDivisorARB(5, 1); - glVertexAttribDivisorARB(6, 1); - - - + glVertexAttribDivisor(0, 0); + glVertexAttribDivisor(1, 1); + glVertexAttribDivisor(2, 1); + glVertexAttribDivisor(3, 0); + glVertexAttribDivisor(4, 0); + glVertexAttribDivisor(5, 1); + glVertexAttribDivisor(6, 1); + + + + + - - int indexCount = gfxObj->m_numIndices; - int indexOffset = 0; + GLvoid* indexOffset = 0; glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, gfxObj->m_index_vbo); { B3_PROFILE("glDrawElementsInstanced"); - + if (gfxObj->m_primitiveType==B3_GL_POINTS) { glUseProgram(instancingShaderPointSprite); glUniformMatrix4fv(ProjectionMatrixPointSprite, 1, false, &projectionMatrix[0]); glUniformMatrix4fv(ModelViewMatrixPointSprite, 1, false, &modelviewMatrix[0]); glUniform1f(screenWidthPointSprite,m_screenWidth); - + //glUniform1i(uniform_texture_diffusePointSprite, 0); - err = glGetError(); - b3Assert(err==GL_NO_ERROR); - glPointSize(20); + b3Assert(glGetError() ==GL_NO_ERROR); + glPointSize(20); #ifndef __APPLE__ glEnable(GL_POINT_SPRITE_ARB); @@ -1727,7 +1757,7 @@ void GLInstancingRenderer::renderSceneInternal(int renderMode) #endif glEnable(GL_VERTEX_PROGRAM_POINT_SIZE); - glDrawElementsInstanced(GL_POINTS, indexCount, GL_UNSIGNED_INT, (void*)indexOffset, gfxObj->m_numGraphicsInstances); + glDrawElementsInstanced(GL_POINTS, indexCount, GL_UNSIGNED_INT, indexOffset, gfxObj->m_numGraphicsInstances); } else { switch (renderMode) @@ -1739,14 +1769,20 @@ void GLInstancingRenderer::renderSceneInternal(int renderMode) glUniformMatrix4fv(ProjectionMatrix, 1, false, &projectionMatrix[0]); glUniformMatrix4fv(ModelViewMatrix, 1, false, &modelviewMatrix[0]); glUniform1i(uniform_texture_diffuse, 0); - glDrawElementsInstanced(GL_TRIANGLES, indexCount, GL_UNSIGNED_INT, (void*)indexOffset, gfxObj->m_numGraphicsInstances); + glDrawElementsInstanced(GL_TRIANGLES, indexCount, GL_UNSIGNED_INT, indexOffset, gfxObj->m_numGraphicsInstances); break; } case B3_CREATE_SHADOWMAP_RENDERMODE: { + /*printf("createShadowMapInstancingShader=%d\n",createShadowMapInstancingShader); + printf("createShadow_depthMVP=%d\n",createShadow_depthMVP); + printf("indexOffset=%d\n",indexOffset); + printf("gfxObj->m_numGraphicsInstances=%d\n",gfxObj->m_numGraphicsInstances); + printf("indexCount=%d\n",indexCount); + */ glUseProgram(createShadowMapInstancingShader); glUniformMatrix4fv(createShadow_depthMVP, 1, false, &depthMVP[0][0]); - glDrawElementsInstanced(GL_TRIANGLES, indexCount, GL_UNSIGNED_INT, (void*)indexOffset, gfxObj->m_numGraphicsInstances); + glDrawElementsInstanced(GL_TRIANGLES, indexCount, GL_UNSIGNED_INT, indexOffset, gfxObj->m_numGraphicsInstances); break; } @@ -1758,11 +1794,14 @@ void GLInstancingRenderer::renderSceneInternal(int renderMode) float MVP[16]; b3Matrix4x4Mul16(projectionMatrix,modelviewMatrix,MVP); glUniformMatrix4fv(useShadow_MVP, 1, false, &MVP[0]); + b3Vector3 gLightDir = gLightPos; + gLightDir.normalize(); + glUniform3f(useShadow_lightDirIn,gLightDir[0],gLightDir[1],gLightDir[2]); glUniformMatrix4fv(useShadow_DepthBiasModelViewMatrix, 1, false, &depthBiasMVP[0][0]); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, m_data->m_shadowTexture); glUniform1i(useShadow_shadowMap,1); - glDrawElementsInstanced(GL_TRIANGLES, indexCount, GL_UNSIGNED_INT, (void*)indexOffset, gfxObj->m_numGraphicsInstances); + glDrawElementsInstanced(GL_TRIANGLES, indexCount, GL_UNSIGNED_INT, indexOffset, gfxObj->m_numGraphicsInstances); break; } default: @@ -1772,7 +1811,7 @@ void GLInstancingRenderer::renderSceneInternal(int renderMode) }; } - + //glDrawElementsInstanced(GL_LINE_LOOP, indexCount, GL_UNSIGNED_INT, (void*)indexOffset, gfxObj->m_numGraphicsInstances); } } @@ -1791,21 +1830,18 @@ void GLInstancingRenderer::renderSceneInternal(int renderMode) } - err = glGetError(); - b3Assert(err==GL_NO_ERROR); + b3Assert(glGetError() ==GL_NO_ERROR); { B3_PROFILE("glUseProgram(0);"); glUseProgram(0); glBindBuffer(GL_ARRAY_BUFFER,0); glBindVertexArray(0); } - - - err = glGetError(); - b3Assert(err==GL_NO_ERROR); - + + + b3Assert(glGetError() ==GL_NO_ERROR); } diff --git a/btgui/OpenGLWindow/GLInstancingRenderer.h b/btgui/OpenGLWindow/GLInstancingRenderer.h index fd64a57e7..4c8ac49af 100644 --- a/btgui/OpenGLWindow/GLInstancingRenderer.h +++ b/btgui/OpenGLWindow/GLInstancingRenderer.h @@ -77,10 +77,26 @@ public: ///position x,y,z, quaternion x,y,z,w, color r,g,b,a, scaling x,y,z int registerGraphicsInstance(int shapeIndex, const float* position, const float* quaternion, const float* color, const float* scaling); + int registerGraphicsInstance(int shapeIndex, const double* position, const double* quaternion, const double* color, const double* scaling); void writeTransforms(); void writeSingleInstanceTransformToCPU(const float* position, const float* orientation, int srcIndex); + void writeSingleInstanceTransformToCPU(const double* position, const double* orientation, int srcIndex) + { + float pos[4]; + float orn[4]; + pos[0] = (float)position[0]; + pos[1] = (float)position[1]; + pos[2] = (float)position[2]; + pos[3] = (float)position[3]; + orn[0] =(float)orientation[0]; + orn[1] =(float)orientation[1]; + orn[2] =(float)orientation[2]; + orn[3] =(float)orientation[3]; + writeSingleInstanceTransformToCPU(pos,orn,srcIndex); + + } void writeSingleInstanceTransformToGPU(float* position, float* orientation, int srcIndex); @@ -94,15 +110,35 @@ public: void drawLines(const float* positions, const float color[4], int numPoints, int pointStrideInBytes, const unsigned int* indices, int numIndices, float pointDrawSize); void drawPoints(const float* positions, const float color[4], int numPoints, int pointStrideInBytes, float pointDrawSize); void drawPoint(const float* position, const float color[4], float pointSize=1); - void updateCamera(); + void updateCamera(int upAxis=1); void getCameraPosition(float cameraPos[4]); + void getCameraPosition(double cameraPos[4]) + { + float campos[4]; + getCameraPosition(campos); + cameraPos[0] = campos[0]; + cameraPos[1] = campos[1]; + cameraPos[2] = campos[2]; + cameraPos[3] = campos[3]; + } + void setCameraDistance(float dist); float getCameraDistance() const; //set the camera 'target' void setCameraTargetPosition(float cameraPos[4]); void getCameraTargetPosition(float cameraPos[4]) const; + void getCameraTargetPosition(double cameraPos[4]) const + { + float campos[4]; + getCameraTargetPosition(campos); + cameraPos[0] = campos[0]; + cameraPos[1] = campos[1]; + cameraPos[2] = campos[2]; + cameraPos[3] = campos[3]; + + } void setCameraYaw(float yaw); void setCameraPitch(float pitch); diff --git a/btgui/OpenGLWindow/GLPrimitiveRenderer.cpp b/btgui/OpenGLWindow/GLPrimitiveRenderer.cpp index a3024a21e..e1c424659 100644 --- a/btgui/OpenGLWindow/GLPrimitiveRenderer.cpp +++ b/btgui/OpenGLWindow/GLPrimitiveRenderer.cpp @@ -130,7 +130,7 @@ void GLPrimitiveRenderer::loadBufferData() glGenBuffers(1, &m_data->m_vertexBuffer); glBindBuffer(GL_ARRAY_BUFFER, m_data->m_vertexBuffer); - glBufferData(GL_ARRAY_BUFFER, 4 * sizeof(Vertex), vertexData, GL_STATIC_DRAW); + glBufferData(GL_ARRAY_BUFFER, 4 * sizeof(Vertex), vertexData, GL_DYNAMIC_DRAW); GLuint err = glGetError(); assert(err==GL_NO_ERROR); @@ -269,7 +269,7 @@ void GLPrimitiveRenderer::drawTexturedRect(float x0, float y0, float x1, float y { vec4( -1.+2.*x1/float(m_screenWidth), 1.-2.*y0/float(m_screenHeight), 1, 0 ), vec4( color[0], color[1], color[2], color[3] ) ,vec2(u1,v0)} }; - glBufferData(GL_ARRAY_BUFFER, 4 * sizeof(Vertex), vertexData, GL_STATIC_DRAW); + glBufferSubData(GL_ARRAY_BUFFER, 0,4 * sizeof(Vertex), vertexData); diff --git a/btgui/OpenGLWindow/GLRenderToTexture.cpp b/btgui/OpenGLWindow/GLRenderToTexture.cpp index 332967e5e..3ca338eba 100644 --- a/btgui/OpenGLWindow/GLRenderToTexture.cpp +++ b/btgui/OpenGLWindow/GLRenderToTexture.cpp @@ -1,25 +1,42 @@ ///See http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-14-render-to-texture/ + #include "GLRenderToTexture.h" #include "Bullet3Common/b3Scalar.h" // for b3Assert +#include +#include + +bool gIntelLinuxglDrawBufferWorkaround=false; + GLRenderToTexture::GLRenderToTexture() :m_framebufferName(0) { +#if !defined(_WIN32) && !defined(__APPLE__) + const GLubyte* ven = glGetString(GL_VENDOR); + printf("ven = %s\n",ven); + + if (strncmp((const char*)ven,"Intel",5)==0) + { + printf("Workaround for some crash in the Intel OpenGL driver on Linux/Ubuntu\n"); + gIntelLinuxglDrawBufferWorkaround=true; + } +#endif//!defined(_WIN32) && !defined(__APPLE__) + } - + void GLRenderToTexture::init(int width, int height, GLuint textureId, int renderTextureType) { m_renderTextureType = renderTextureType; glGenFramebuffers(1, &m_framebufferName); glBindFramebuffer(GL_FRAMEBUFFER, m_framebufferName); - - + + // The depth buffer // glGenRenderbuffers(1, &m_depthrenderbuffer); - + // glBindRenderbuffer(GL_RENDERBUFFER, m_depthrenderbuffer); // glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height); // glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_depthrenderbuffer); @@ -54,7 +71,7 @@ bool GLRenderToTexture::enable() glBindFramebuffer(GL_FRAMEBUFFER, m_framebufferName); - + switch (m_renderTextureType) { case RENDERTEXTURE_COLOR: @@ -66,7 +83,15 @@ bool GLRenderToTexture::enable() } case RENDERTEXTURE_DEPTH: { - glDrawBuffer(GL_NONE); + //Intel OpenGL driver crashes when using GL_NONE for glDrawBuffer on Linux, so use a workaround + if (gIntelLinuxglDrawBufferWorkaround) + { + GLenum drawBuffers[2] = { GL_COLOR_ATTACHMENT0,0}; + glDrawBuffers(1, drawBuffers); + } else + { + glDrawBuffer(GL_NONE); + } break; } default: @@ -91,7 +116,7 @@ void GLRenderToTexture::disable() { glBindFramebuffer( GL_FRAMEBUFFER, 0 ); } - + GLRenderToTexture::~GLRenderToTexture() { glBindFramebuffer( GL_FRAMEBUFFER, 0 ); @@ -103,7 +128,7 @@ GLRenderToTexture::~GLRenderToTexture() if( m_framebufferName) - { + { glDeleteFramebuffers(1, &m_framebufferName); } } diff --git a/btgui/OpenGLWindow/GLRenderToTexture.h b/btgui/OpenGLWindow/GLRenderToTexture.h index 513f3e157..d1c913e95 100644 --- a/btgui/OpenGLWindow/GLRenderToTexture.h +++ b/btgui/OpenGLWindow/GLRenderToTexture.h @@ -17,7 +17,6 @@ struct GLRenderToTexture bool m_initialized; int m_renderTextureType; public: - GLRenderToTexture(); void init(int width, int height, GLuint textureId, int renderTextureType=RENDERTEXTURE_COLOR); diff --git a/btgui/OpenGLWindow/GlewWindows/GL/glew.h b/btgui/OpenGLWindow/GlewWindows/GL/glew.h index 9e1f25ec8..f33e7d458 100644 --- a/btgui/OpenGLWindow/GlewWindows/GL/glew.h +++ b/btgui/OpenGLWindow/GlewWindows/GL/glew.h @@ -4,24 +4,24 @@ ** Copyright (C) 2002-2008, Marcelo E. Magallon ** Copyright (C) 2002, Lev Povalahev ** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without +** +** 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, +** +** * 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 +** * 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 +** * 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 +** 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 +** 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) @@ -29,6 +29,10 @@ ** THE POSSIBILITY OF SUCH DAMAGE. */ +#define GLEW_NO_GLU +//#define GLEW_INIT_OPENGL11_FUNCTIONS 1 +//#define GLEW_DYNAMIC_LOAD_ALL_GLX_FUNCTIONS 1 + /* * Mesa 3-D graphics library * Version: 7.0 @@ -55,7 +59,7 @@ /* ** Copyright (c) 2007 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 @@ -63,10 +67,10 @@ ** 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. @@ -80,11 +84,15 @@ #define __glew_h__ #define __GLEW_H__ -#define GLEW_STATIC 1 - #if defined(__gl_h_) || defined(__GL_H__) || defined(__X_GL_H) #error gl.h included before glew.h #endif +#if defined(__gl2_h_) +#error gl2.h included before glew.h +#endif +#if defined(__gltypes_h_) +#error gltypes.h included before glew.h +#endif #if defined(__REGAL_H__) #error Regal.h included before glew.h #endif @@ -96,7 +104,9 @@ #endif #define __gl_h_ +#define __gl2_h_ #define __GL_H__ +#define __gltypes_h_ #define __REGAL_H__ #define __X_GL_H #define __glext_h_ @@ -831,6 +841,685 @@ typedef char GLchar; #define GL_ALL_ATTRIB_BITS 0x000fffff #define GL_CLIENT_ALL_ATTRIB_BITS 0xffffffff +#ifdef GLEW_INIT_OPENGL11_FUNCTIONS + +typedef void (GLAPIENTRY * PFNGLACCUMPROC) (GLenum op, GLfloat value); +typedef void (GLAPIENTRY * PFNGLALPHAFUNCPROC) (GLenum func, GLclampf ref); +typedef GLboolean (GLAPIENTRY * PFNGLARETEXTURESRESIDENTPROC) (GLsizei n, const GLuint *textures, GLboolean *residences); +typedef void (GLAPIENTRY * PFNGLARRAYELEMENTPROC) (GLint i); +typedef void (GLAPIENTRY * PFNGLBEGINPROC) (GLenum mode); +typedef void (GLAPIENTRY * PFNGLBINDTEXTUREPROC) (GLenum target, GLuint texture); +typedef void (GLAPIENTRY * PFNGLBITMAPPROC) (GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap); +typedef void (GLAPIENTRY * PFNGLBLENDFUNCPROC) (GLenum sfactor, GLenum dfactor); +typedef void (GLAPIENTRY * PFNGLCALLLISTPROC) (GLuint list); +typedef void (GLAPIENTRY * PFNGLCALLLISTSPROC) (GLsizei n, GLenum type, const GLvoid *lists); +typedef void (GLAPIENTRY * PFNGLCLEARPROC) (GLbitfield mask); +typedef void (GLAPIENTRY * PFNGLCLEARACCUMPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +typedef void (GLAPIENTRY * PFNGLCLEARCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +typedef void (GLAPIENTRY * PFNGLCLEARDEPTHPROC) (GLclampd depth); +typedef void (GLAPIENTRY * PFNGLCLEARINDEXPROC) (GLfloat c); +typedef void (GLAPIENTRY * PFNGLCLEARSTENCILPROC) (GLint s); +typedef void (GLAPIENTRY * PFNGLCLIPPLANEPROC) (GLenum plane, const GLdouble *equation); +typedef void (GLAPIENTRY * PFNGLCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (GLAPIENTRY * PFNGLCOLOR3BVPROC) (const GLbyte *v); +typedef void (GLAPIENTRY * PFNGLCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (GLAPIENTRY * PFNGLCOLOR3DVPROC) (const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (GLAPIENTRY * PFNGLCOLOR3FVPROC) (const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLCOLOR3IPROC) (GLint red, GLint green, GLint blue); +typedef void (GLAPIENTRY * PFNGLCOLOR3IVPROC) (const GLint *v); +typedef void (GLAPIENTRY * PFNGLCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (GLAPIENTRY * PFNGLCOLOR3SVPROC) (const GLshort *v); +typedef void (GLAPIENTRY * PFNGLCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (GLAPIENTRY * PFNGLCOLOR3UBVPROC) (const GLubyte *v); +typedef void (GLAPIENTRY * PFNGLCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (GLAPIENTRY * PFNGLCOLOR3UIVPROC) (const GLuint *v); +typedef void (GLAPIENTRY * PFNGLCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (GLAPIENTRY * PFNGLCOLOR3USVPROC) (const GLushort *v); +typedef void (GLAPIENTRY * PFNGLCOLOR4BPROC) (GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); +typedef void (GLAPIENTRY * PFNGLCOLOR4BVPROC) (const GLbyte *v); +typedef void (GLAPIENTRY * PFNGLCOLOR4DPROC) (GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); +typedef void (GLAPIENTRY * PFNGLCOLOR4DVPROC) (const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLCOLOR4FPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +typedef void (GLAPIENTRY * PFNGLCOLOR4FVPROC) (const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLCOLOR4IPROC) (GLint red, GLint green, GLint blue, GLint alpha); +typedef void (GLAPIENTRY * PFNGLCOLOR4IVPROC) (const GLint *v); +typedef void (GLAPIENTRY * PFNGLCOLOR4SPROC) (GLshort red, GLshort green, GLshort blue, GLshort alpha); +typedef void (GLAPIENTRY * PFNGLCOLOR4SVPROC) (const GLshort *v); +typedef void (GLAPIENTRY * PFNGLCOLOR4UBPROC) (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); +typedef void (GLAPIENTRY * PFNGLCOLOR4UBVPROC) (const GLubyte *v); +typedef void (GLAPIENTRY * PFNGLCOLOR4UIPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha); +typedef void (GLAPIENTRY * PFNGLCOLOR4UIVPROC) (const GLuint *v); +typedef void (GLAPIENTRY * PFNGLCOLOR4USPROC) (GLushort red, GLushort green, GLushort blue, GLushort alpha); +typedef void (GLAPIENTRY * PFNGLCOLOR4USVPROC) (const GLushort *v); +typedef void (GLAPIENTRY * PFNGLCOLORMASKPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +typedef void (GLAPIENTRY * PFNGLCOLORMATERIALPROC) (GLenum face, GLenum mode); +typedef void (GLAPIENTRY * PFNGLCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (GLAPIENTRY * PFNGLCOPYPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); +typedef void (GLAPIENTRY * PFNGLCOPYTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (GLAPIENTRY * PFNGLCOPYTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLCULLFACEPROC) (GLenum mode); +typedef void (GLAPIENTRY * PFNGLDELETELISTSPROC) (GLuint list, GLsizei range); +typedef void (GLAPIENTRY * PFNGLDELETETEXTURESPROC) (GLsizei n, const GLuint *textures); +typedef void (GLAPIENTRY * PFNGLDEPTHFUNCPROC) (GLenum func); +typedef void (GLAPIENTRY * PFNGLDEPTHMASKPROC) (GLboolean flag); +typedef void (GLAPIENTRY * PFNGLDEPTHRANGEPROC) (GLclampd zNear, GLclampd zFar); +typedef void (GLAPIENTRY * PFNGLDISABLEPROC) (GLenum cap); +typedef void (GLAPIENTRY * PFNGLDISABLECLIENTSTATEPROC) (GLenum array); +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (GLAPIENTRY * PFNGLDRAWBUFFERPROC) (GLenum mode); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); +typedef void (GLAPIENTRY * PFNGLDRAWPIXELSPROC) (GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLEDGEFLAGPROC) (GLboolean flag); +typedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTERPROC) (GLsizei stride, const GLvoid *pointer); +typedef void (GLAPIENTRY * PFNGLEDGEFLAGVPROC) (const GLboolean *flag); +typedef void (GLAPIENTRY * PFNGLENABLEPROC) (GLenum cap); +typedef void (GLAPIENTRY * PFNGLENABLECLIENTSTATEPROC) (GLenum array); +typedef void (GLAPIENTRY * PFNGLENDPROC) (void); +typedef void (GLAPIENTRY * PFNGLENDLISTPROC) (void); +typedef void (GLAPIENTRY * PFNGLEVALCOORD1DPROC) (GLdouble u); +typedef void (GLAPIENTRY * PFNGLEVALCOORD1DVPROC) (const GLdouble *u); +typedef void (GLAPIENTRY * PFNGLEVALCOORD1FPROC) (GLfloat u); +typedef void (GLAPIENTRY * PFNGLEVALCOORD1FVPROC) (const GLfloat *u); +typedef void (GLAPIENTRY * PFNGLEVALCOORD2DPROC) (GLdouble u, GLdouble v); +typedef void (GLAPIENTRY * PFNGLEVALCOORD2DVPROC) (const GLdouble *u); +typedef void (GLAPIENTRY * PFNGLEVALCOORD2FPROC) (GLfloat u, GLfloat v); +typedef void (GLAPIENTRY * PFNGLEVALCOORD2FVPROC) (const GLfloat *u); +typedef void (GLAPIENTRY * PFNGLEVALMESH1PROC) (GLenum mode, GLint i1, GLint i2); +typedef void (GLAPIENTRY * PFNGLEVALMESH2PROC) (GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); +typedef void (GLAPIENTRY * PFNGLEVALPOINT1PROC) (GLint i); +typedef void (GLAPIENTRY * PFNGLEVALPOINT2PROC) (GLint i, GLint j); +typedef void (GLAPIENTRY * PFNGLFEEDBACKBUFFERPROC) (GLsizei size, GLenum type, GLfloat *buffer); +typedef void (GLAPIENTRY * PFNGLFINISHPROC) (void); +typedef void (GLAPIENTRY * PFNGLFLUSHPROC) (void); +typedef void (GLAPIENTRY * PFNGLFOGFPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLFOGFVPROC) (GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRY * PFNGLFOGIPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLFOGIVPROC) (GLenum pname, const GLint *params); +typedef void (GLAPIENTRY * PFNGLFRONTFACEPROC) (GLenum mode); +typedef void (GLAPIENTRY * PFNGLFRUSTUMPROC) (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +typedef GLuint (GLAPIENTRY * PFNGLGENLISTSPROC) (GLsizei range); +typedef void (GLAPIENTRY * PFNGLGENTEXTURESPROC) (GLsizei n, GLuint *textures); +typedef void (GLAPIENTRY * PFNGLGETBOOLEANVPROC) (GLenum pname, GLboolean *params); +typedef void (GLAPIENTRY * PFNGLGETCLIPPLANEPROC) (GLenum plane, GLdouble *equation); +typedef void (GLAPIENTRY * PFNGLGETDOUBLEVPROC) (GLenum pname, GLdouble *params); +typedef GLenum (GLAPIENTRY * PFNGLGETERRORPROC) (void); +typedef void (GLAPIENTRY * PFNGLGETFLOATVPROC) (GLenum pname, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLGETINTEGERVPROC) (GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETLIGHTFVPROC) (GLenum light, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLGETLIGHTIVPROC) (GLenum light, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETMAPDVPROC) (GLenum target, GLenum query, GLdouble *v); +typedef void (GLAPIENTRY * PFNGLGETMAPFVPROC) (GLenum target, GLenum query, GLfloat *v); +typedef void (GLAPIENTRY * PFNGLGETMAPIVPROC) (GLenum target, GLenum query, GLint *v); +typedef void (GLAPIENTRY * PFNGLGETMATERIALFVPROC) (GLenum face, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLGETMATERIALIVPROC) (GLenum face, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETPIXELMAPFVPROC) (GLenum map, GLfloat *values); +typedef void (GLAPIENTRY * PFNGLGETPIXELMAPUIVPROC) (GLenum map, GLuint *values); +typedef void (GLAPIENTRY * PFNGLGETPIXELMAPUSVPROC) (GLenum map, GLushort *values); +typedef void (GLAPIENTRY * PFNGLGETPOINTERVPROC) (GLenum pname, GLvoid* *params); +typedef void (GLAPIENTRY * PFNGLGETPOLYGONSTIPPLEPROC) (GLubyte *mask); +typedef GLubyte* (GLAPIENTRY * PFNGLGETSTRINGPROC) (GLenum s); +typedef void (GLAPIENTRY * PFNGLGETTEXENVFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLGETTEXENVIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETTEXGENDVPROC) (GLenum coord, GLenum pname, GLdouble *params); +typedef void (GLAPIENTRY * PFNGLGETTEXGENFVPROC) (GLenum coord, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLGETTEXGENIVPROC) (GLenum coord, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETTEXIMAGEPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLGETTEXLEVELPARAMETERFVPROC) (GLenum target, GLint level, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLGETTEXLEVELPARAMETERIVPROC) (GLenum target, GLint level, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLHINTPROC) (GLenum target, GLenum mode); +typedef void (GLAPIENTRY * PFNGLINDEXMASKPROC) (GLuint mask); +typedef void (GLAPIENTRY * PFNGLINDEXPOINTERPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (GLAPIENTRY * PFNGLINDEXDPROC) (GLdouble c); +typedef void (GLAPIENTRY * PFNGLINDEXDVPROC) (const GLdouble *c); +typedef void (GLAPIENTRY * PFNGLINDEXFPROC) (GLfloat c); +typedef void (GLAPIENTRY * PFNGLINDEXFVPROC) (const GLfloat *c); +typedef void (GLAPIENTRY * PFNGLINDEXIPROC) (GLint c); +typedef void (GLAPIENTRY * PFNGLINDEXIVPROC) (const GLint *c); +typedef void (GLAPIENTRY * PFNGLINDEXSPROC) (GLshort c); +typedef void (GLAPIENTRY * PFNGLINDEXSVPROC) (const GLshort *c); +typedef void (GLAPIENTRY * PFNGLINDEXUBPROC) (GLubyte c); +typedef void (GLAPIENTRY * PFNGLINDEXUBVPROC) (const GLubyte *c); +typedef void (GLAPIENTRY * PFNGLINITNAMESPROC) (void); +typedef void (GLAPIENTRY * PFNGLINTERLEAVEDARRAYSPROC) (GLenum format, GLsizei stride, const GLvoid *pointer); +typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDPROC) (GLenum cap); +typedef GLboolean (GLAPIENTRY * PFNGLISLISTPROC) (GLuint list); +typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREPROC) (GLuint texture); +typedef void (GLAPIENTRY * PFNGLLIGHTMODELFPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLLIGHTMODELFVPROC) (GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRY * PFNGLLIGHTMODELIPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLLIGHTMODELIVPROC) (GLenum pname, const GLint *params); +typedef void (GLAPIENTRY * PFNGLLIGHTFPROC) (GLenum light, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLLIGHTFVPROC) (GLenum light, GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRY * PFNGLLIGHTIPROC) (GLenum light, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLLIGHTIVPROC) (GLenum light, GLenum pname, const GLint *params); +typedef void (GLAPIENTRY * PFNGLLINESTIPPLEPROC) (GLint factor, GLushort pattern); +typedef void (GLAPIENTRY * PFNGLLINEWIDTHPROC) (GLfloat width); +typedef void (GLAPIENTRY * PFNGLLISTBASEPROC) (GLuint base); +typedef void (GLAPIENTRY * PFNGLLOADIDENTITYPROC) (void); +typedef void (GLAPIENTRY * PFNGLLOADMATRIXDPROC) (const GLdouble *m); +typedef void (GLAPIENTRY * PFNGLLOADMATRIXFPROC) (const GLfloat *m); +typedef void (GLAPIENTRY * PFNGLLOADNAMEPROC) (GLuint name); +typedef void (GLAPIENTRY * PFNGLLOGICOPPROC) (GLenum opcode); +typedef void (GLAPIENTRY * PFNGLMAP1DPROC) (GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); +typedef void (GLAPIENTRY * PFNGLMAP1FPROC) (GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); +typedef void (GLAPIENTRY * PFNGLMAP2DPROC) (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); +typedef void (GLAPIENTRY * PFNGLMAP2FPROC) (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); +typedef void (GLAPIENTRY * PFNGLMAPGRID1DPROC) (GLint un, GLdouble u1, GLdouble u2); +typedef void (GLAPIENTRY * PFNGLMAPGRID1FPROC) (GLint un, GLfloat u1, GLfloat u2); +typedef void (GLAPIENTRY * PFNGLMAPGRID2DPROC) (GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); +typedef void (GLAPIENTRY * PFNGLMAPGRID2FPROC) (GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); +typedef void (GLAPIENTRY * PFNGLMATERIALFPROC) (GLenum face, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLMATERIALFVPROC) (GLenum face, GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRY * PFNGLMATERIALIPROC) (GLenum face, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLMATERIALIVPROC) (GLenum face, GLenum pname, const GLint *params); +typedef void (GLAPIENTRY * PFNGLMATRIXMODEPROC) (GLenum mode); +typedef void (GLAPIENTRY * PFNGLMULTMATRIXDPROC) (const GLdouble *m); +typedef void (GLAPIENTRY * PFNGLMULTMATRIXFPROC) (const GLfloat *m); +typedef void (GLAPIENTRY * PFNGLNEWLISTPROC) (GLuint list, GLenum mode); +typedef void (GLAPIENTRY * PFNGLNORMAL3BPROC) (GLbyte nx, GLbyte ny, GLbyte nz); +typedef void (GLAPIENTRY * PFNGLNORMAL3BVPROC) (const GLbyte *v); +typedef void (GLAPIENTRY * PFNGLNORMAL3DPROC) (GLdouble nx, GLdouble ny, GLdouble nz); +typedef void (GLAPIENTRY * PFNGLNORMAL3DVPROC) (const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLNORMAL3FPROC) (GLfloat nx, GLfloat ny, GLfloat nz); +typedef void (GLAPIENTRY * PFNGLNORMAL3FVPROC) (const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLNORMAL3IPROC) (GLint nx, GLint ny, GLint nz); +typedef void (GLAPIENTRY * PFNGLNORMAL3IVPROC) (const GLint *v); +typedef void (GLAPIENTRY * PFNGLNORMAL3SPROC) (GLshort nx, GLshort ny, GLshort nz); +typedef void (GLAPIENTRY * PFNGLNORMAL3SVPROC) (const GLshort *v); +typedef void (GLAPIENTRY * PFNGLNORMALPOINTERPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (GLAPIENTRY * PFNGLORTHOPROC) (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +typedef void (GLAPIENTRY * PFNGLPASSTHROUGHPROC) (GLfloat token); +typedef void (GLAPIENTRY * PFNGLPIXELMAPFVPROC) (GLenum map, GLsizei mapsize, const GLfloat *values); +typedef void (GLAPIENTRY * PFNGLPIXELMAPUIVPROC) (GLenum map, GLsizei mapsize, const GLuint *values); +typedef void (GLAPIENTRY * PFNGLPIXELMAPUSVPROC) (GLenum map, GLsizei mapsize, const GLushort *values); +typedef void (GLAPIENTRY * PFNGLPIXELSTOREFPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLPIXELSTOREIPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFERFPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFERIPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLPIXELZOOMPROC) (GLfloat xfactor, GLfloat yfactor); +typedef void (GLAPIENTRY * PFNGLPOINTSIZEPROC) (GLfloat size); +typedef void (GLAPIENTRY * PFNGLPOLYGONMODEPROC) (GLenum face, GLenum mode); +typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETPROC) (GLfloat factor, GLfloat units); +typedef void (GLAPIENTRY * PFNGLPOLYGONSTIPPLEPROC) (const GLubyte *mask); +typedef void (GLAPIENTRY * PFNGLPOPATTRIBPROC) (void); +typedef void (GLAPIENTRY * PFNGLPOPCLIENTATTRIBPROC) (void); +typedef void (GLAPIENTRY * PFNGLPOPMATRIXPROC) (void); +typedef void (GLAPIENTRY * PFNGLPOPNAMEPROC) (void); +typedef void (GLAPIENTRY * PFNGLPRIORITIZETEXTURESPROC) (GLsizei n, const GLuint *textures, const GLclampf *priorities); +typedef void (GLAPIENTRY * PFNGLPUSHATTRIBPROC) (GLbitfield mask); +typedef void (GLAPIENTRY * PFNGLPUSHCLIENTATTRIBPROC) (GLbitfield mask); +typedef void (GLAPIENTRY * PFNGLPUSHMATRIXPROC) (void); +typedef void (GLAPIENTRY * PFNGLPUSHNAMEPROC) (GLuint name); +typedef void (GLAPIENTRY * PFNGLRASTERPOS2DPROC) (GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLRASTERPOS2DVPROC) (const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLRASTERPOS2FPROC) (GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLRASTERPOS2FVPROC) (const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLRASTERPOS2IPROC) (GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLRASTERPOS2IVPROC) (const GLint *v); +typedef void (GLAPIENTRY * PFNGLRASTERPOS2SPROC) (GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLRASTERPOS2SVPROC) (const GLshort *v); +typedef void (GLAPIENTRY * PFNGLRASTERPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLRASTERPOS3DVPROC) (const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLRASTERPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLRASTERPOS3FVPROC) (const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLRASTERPOS3IPROC) (GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLRASTERPOS3IVPROC) (const GLint *v); +typedef void (GLAPIENTRY * PFNGLRASTERPOS3SPROC) (GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLRASTERPOS3SVPROC) (const GLshort *v); +typedef void (GLAPIENTRY * PFNGLRASTERPOS4DPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLRASTERPOS4DVPROC) (const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLRASTERPOS4FPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLRASTERPOS4FVPROC) (const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLRASTERPOS4IPROC) (GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLRASTERPOS4IVPROC) (const GLint *v); +typedef void (GLAPIENTRY * PFNGLRASTERPOS4SPROC) (GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRY * PFNGLRASTERPOS4SVPROC) (const GLshort *v); +typedef void (GLAPIENTRY * PFNGLREADBUFFERPROC) (GLenum mode); +typedef void (GLAPIENTRY * PFNGLREADPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLRECTDPROC) (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); +typedef void (GLAPIENTRY * PFNGLRECTDVPROC) (const GLdouble *v1, const GLdouble *v2); +typedef void (GLAPIENTRY * PFNGLRECTFPROC) (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); +typedef void (GLAPIENTRY * PFNGLRECTFVPROC) (const GLfloat *v1, const GLfloat *v2); +typedef void (GLAPIENTRY * PFNGLRECTIPROC) (GLint x1, GLint y1, GLint x2, GLint y2); +typedef void (GLAPIENTRY * PFNGLRECTIVPROC) (const GLint *v1, const GLint *v2); +typedef void (GLAPIENTRY * PFNGLRECTSPROC) (GLshort x1, GLshort y1, GLshort x2, GLshort y2); +typedef void (GLAPIENTRY * PFNGLRECTSVPROC) (const GLshort *v1, const GLshort *v2); +typedef GLint (GLAPIENTRY * PFNGLRENDERMODEPROC) (GLenum mode); +typedef void (GLAPIENTRY * PFNGLROTATEDPROC) (GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLROTATEFPROC) (GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLSCALEDPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLSCALEFPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLSCISSORPROC) (GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLSELECTBUFFERPROC) (GLsizei size, GLuint *buffer); +typedef void (GLAPIENTRY * PFNGLSHADEMODELPROC) (GLenum mode); +typedef void (GLAPIENTRY * PFNGLSTENCILFUNCPROC) (GLenum func, GLint ref, GLuint mask); +typedef void (GLAPIENTRY * PFNGLSTENCILMASKPROC) (GLuint mask); +typedef void (GLAPIENTRY * PFNGLSTENCILOPPROC) (GLenum fail, GLenum zfail, GLenum zpass); +typedef void (GLAPIENTRY * PFNGLTEXCOORD1DPROC) (GLdouble s); +typedef void (GLAPIENTRY * PFNGLTEXCOORD1DVPROC) (const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD1FPROC) (GLfloat s); +typedef void (GLAPIENTRY * PFNGLTEXCOORD1FVPROC) (const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD1IPROC) (GLint s); +typedef void (GLAPIENTRY * PFNGLTEXCOORD1IVPROC) (const GLint *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD1SPROC) (GLshort s); +typedef void (GLAPIENTRY * PFNGLTEXCOORD1SVPROC) (const GLshort *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2DPROC) (GLdouble s, GLdouble t); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2DVPROC) (const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FPROC) (GLfloat s, GLfloat t); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FVPROC) (const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2IPROC) (GLint s, GLint t); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2IVPROC) (const GLint *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2SPROC) (GLshort s, GLshort t); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2SVPROC) (const GLshort *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD3DPROC) (GLdouble s, GLdouble t, GLdouble r); +typedef void (GLAPIENTRY * PFNGLTEXCOORD3DVPROC) (const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD3FPROC) (GLfloat s, GLfloat t, GLfloat r); +typedef void (GLAPIENTRY * PFNGLTEXCOORD3FVPROC) (const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD3IPROC) (GLint s, GLint t, GLint r); +typedef void (GLAPIENTRY * PFNGLTEXCOORD3IVPROC) (const GLint *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD3SPROC) (GLshort s, GLshort t, GLshort r); +typedef void (GLAPIENTRY * PFNGLTEXCOORD3SVPROC) (const GLshort *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4DPROC) (GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4DVPROC) (const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4FPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4FVPROC) (const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4IPROC) (GLint s, GLint t, GLint r, GLint q); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4IVPROC) (const GLint *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4SPROC) (GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4SVPROC) (const GLshort *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (GLAPIENTRY * PFNGLTEXENVFPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLTEXENVFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRY * PFNGLTEXENVIPROC) (GLenum target, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLTEXENVIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GLAPIENTRY * PFNGLTEXGENDPROC) (GLenum coord, GLenum pname, GLdouble param); +typedef void (GLAPIENTRY * PFNGLTEXGENDVPROC) (GLenum coord, GLenum pname, const GLdouble *params); +typedef void (GLAPIENTRY * PFNGLTEXGENFPROC) (GLenum coord, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLTEXGENFVPROC) (GLenum coord, GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRY * PFNGLTEXGENIPROC) (GLenum coord, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLTEXGENIVPROC) (GLenum coord, GLenum pname, const GLint *params); +typedef void (GLAPIENTRY * PFNGLTEXIMAGE1DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLTEXIMAGE2DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLTRANSLATEDPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLTRANSLATEFPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLVERTEX2DPROC) (GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLVERTEX2DVPROC) (const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLVERTEX2FPROC) (GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLVERTEX2FVPROC) (const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLVERTEX2IPROC) (GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLVERTEX2IVPROC) (const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEX2SPROC) (GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLVERTEX2SVPROC) (const GLshort *v); +typedef void (GLAPIENTRY * PFNGLVERTEX3DPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLVERTEX3DVPROC) (const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLVERTEX3FPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLVERTEX3FVPROC) (const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLVERTEX3IPROC) (GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLVERTEX3IVPROC) (const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEX3SPROC) (GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLVERTEX3SVPROC) (const GLshort *v); +typedef void (GLAPIENTRY * PFNGLVERTEX4DPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLVERTEX4DVPROC) (const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLVERTEX4FPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLVERTEX4FVPROC) (const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLVERTEX4IPROC) (GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLVERTEX4IVPROC) (const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEX4SPROC) (GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRY * PFNGLVERTEX4SVPROC) (const GLshort *v); +typedef void (GLAPIENTRY * PFNGLVERTEXPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (GLAPIENTRY * PFNGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height); + +#define glAccum GLEW_GET_FUN(__glewAccum) +#define glAlphaFunc GLEW_GET_FUN(__glewAlphaFunc) +#define glAreTexturesResident GLEW_GET_FUN(__glewAreTexturesResident) +#define glArrayElement GLEW_GET_FUN(__glewArrayElement) +#define glBegin GLEW_GET_FUN(__glewBegin) +#define glBindTexture GLEW_GET_FUN(__glewBindTexture) +#define glBitmap GLEW_GET_FUN(__glewBitmap) +#define glBlendFunc GLEW_GET_FUN(__glewBlendFunc) +#define glCallList GLEW_GET_FUN(__glewCallList) +#define glCallLists GLEW_GET_FUN(__glewCallLists) +#define glClear GLEW_GET_FUN(__glewClear) +#define glClearAccum GLEW_GET_FUN(__glewClearAccum) +#define glClearColor GLEW_GET_FUN(__glewClearColor) +#define glClearDepth GLEW_GET_FUN(__glewClearDepth) +#define glClearIndex GLEW_GET_FUN(__glewClearIndex) +#define glClearStencil GLEW_GET_FUN(__glewClearStencil) +#define glClipPlane GLEW_GET_FUN(__glewClipPlane) +#define glColor3b GLEW_GET_FUN(__glewColor3b) +#define glColor3bv GLEW_GET_FUN(__glewColor3bv) +#define glColor3d GLEW_GET_FUN(__glewColor3d) +#define glColor3dv GLEW_GET_FUN(__glewColor3dv) +#define glColor3f GLEW_GET_FUN(__glewColor3f) +#define glColor3fv GLEW_GET_FUN(__glewColor3fv) +#define glColor3i GLEW_GET_FUN(__glewColor3i) +#define glColor3iv GLEW_GET_FUN(__glewColor3iv) +#define glColor3s GLEW_GET_FUN(__glewColor3s) +#define glColor3sv GLEW_GET_FUN(__glewColor3sv) +#define glColor3ub GLEW_GET_FUN(__glewColor3ub) +#define glColor3ubv GLEW_GET_FUN(__glewColor3ubv) +#define glColor3ui GLEW_GET_FUN(__glewColor3ui) +#define glColor3uiv GLEW_GET_FUN(__glewColor3uiv) +#define glColor3us GLEW_GET_FUN(__glewColor3us) +#define glColor3usv GLEW_GET_FUN(__glewColor3usv) +#define glColor4b GLEW_GET_FUN(__glewColor4b) +#define glColor4bv GLEW_GET_FUN(__glewColor4bv) +#define glColor4d GLEW_GET_FUN(__glewColor4d) +#define glColor4dv GLEW_GET_FUN(__glewColor4dv) +#define glColor4f GLEW_GET_FUN(__glewColor4f) +#define glColor4fv GLEW_GET_FUN(__glewColor4fv) +#define glColor4i GLEW_GET_FUN(__glewColor4i) +#define glColor4iv GLEW_GET_FUN(__glewColor4iv) +#define glColor4s GLEW_GET_FUN(__glewColor4s) +#define glColor4sv GLEW_GET_FUN(__glewColor4sv) +#define glColor4ub GLEW_GET_FUN(__glewColor4ub) +#define glColor4ubv GLEW_GET_FUN(__glewColor4ubv) +#define glColor4ui GLEW_GET_FUN(__glewColor4ui) +#define glColor4uiv GLEW_GET_FUN(__glewColor4uiv) +#define glColor4us GLEW_GET_FUN(__glewColor4us) +#define glColor4usv GLEW_GET_FUN(__glewColor4usv) +#define glColorMask GLEW_GET_FUN(__glewColorMask) +#define glColorMaterial GLEW_GET_FUN(__glewColorMaterial) +#define glColorPointer GLEW_GET_FUN(__glewColorPointer) +#define glCopyPixels GLEW_GET_FUN(__glewCopyPixels) +#define glCopyTexImage1D GLEW_GET_FUN(__glewCopyTexImage1D) +#define glCopyTexImage2D GLEW_GET_FUN(__glewCopyTexImage2D) +#define glCopyTexSubImage1D GLEW_GET_FUN(__glewCopyTexSubImage1D) +#define glCopyTexSubImage2D GLEW_GET_FUN(__glewCopyTexSubImage2D) +#define glCullFace GLEW_GET_FUN(__glewCullFace) +#define glDeleteLists GLEW_GET_FUN(__glewDeleteLists) +#define glDeleteTextures GLEW_GET_FUN(__glewDeleteTextures) +#define glDepthFunc GLEW_GET_FUN(__glewDepthFunc) +#define glDepthMask GLEW_GET_FUN(__glewDepthMask) +#define glDepthRange GLEW_GET_FUN(__glewDepthRange) +#define glDisable GLEW_GET_FUN(__glewDisable) +#define glDisableClientState GLEW_GET_FUN(__glewDisableClientState) +#define glDrawArrays GLEW_GET_FUN(__glewDrawArrays) +#define glDrawBuffer GLEW_GET_FUN(__glewDrawBuffer) +#define glDrawElements GLEW_GET_FUN(__glewDrawElements) +#define glDrawPixels GLEW_GET_FUN(__glewDrawPixels) +#define glEdgeFlag GLEW_GET_FUN(__glewEdgeFlag) +#define glEdgeFlagPointer GLEW_GET_FUN(__glewEdgeFlagPointer) +#define glEdgeFlagv GLEW_GET_FUN(__glewEdgeFlagv) +#define glEnable GLEW_GET_FUN(__glewEnable) +#define glEnableClientState GLEW_GET_FUN(__glewEnableClientState) +#define glEnd GLEW_GET_FUN(__glewEnd) +#define glEndList GLEW_GET_FUN(__glewEndList) +#define glEvalCoord1d GLEW_GET_FUN(__glewEvalCoord1d) +#define glEvalCoord1dv GLEW_GET_FUN(__glewEvalCoord1dv) +#define glEvalCoord1f GLEW_GET_FUN(__glewEvalCoord1f) +#define glEvalCoord1fv GLEW_GET_FUN(__glewEvalCoord1fv) +#define glEvalCoord2d GLEW_GET_FUN(__glewEvalCoord2d) +#define glEvalCoord2dv GLEW_GET_FUN(__glewEvalCoord2dv) +#define glEvalCoord2f GLEW_GET_FUN(__glewEvalCoord2f) +#define glEvalCoord2fv GLEW_GET_FUN(__glewEvalCoord2fv) +#define glEvalMesh1 GLEW_GET_FUN(__glewEvalMesh1) +#define glEvalMesh2 GLEW_GET_FUN(__glewEvalMesh2) +#define glEvalPoint1 GLEW_GET_FUN(__glewEvalPoint1) +#define glEvalPoint2 GLEW_GET_FUN(__glewEvalPoint2) +#define glFeedbackBuffer GLEW_GET_FUN(__glewFeedbackBuffer) +#define glFinish GLEW_GET_FUN(__glewFinish) +#define glFlush GLEW_GET_FUN(__glewFlush) +#define glFogf GLEW_GET_FUN(__glewFogf) +#define glFogfv GLEW_GET_FUN(__glewFogfv) +#define glFogi GLEW_GET_FUN(__glewFogi) +#define glFogiv GLEW_GET_FUN(__glewFogiv) +#define glFrontFace GLEW_GET_FUN(__glewFrontFace) +#define glFrustum GLEW_GET_FUN(__glewFrustum) +#define glGenLists GLEW_GET_FUN(__glewGenLists) +#define glGenTextures GLEW_GET_FUN(__glewGenTextures) +#define glGetBooleanv GLEW_GET_FUN(__glewGetBooleanv) +#define glGetClipPlane GLEW_GET_FUN(__glewGetClipPlane) +#define glGetDoublev GLEW_GET_FUN(__glewGetDoublev) +#define glGetError GLEW_GET_FUN(__glewGetError) +#define glGetFloatv GLEW_GET_FUN(__glewGetFloatv) +#define glGetIntegerv GLEW_GET_FUN(__glewGetIntegerv) +#define glGetLightfv GLEW_GET_FUN(__glewGetLightfv) +#define glGetLightiv GLEW_GET_FUN(__glewGetLightiv) +#define glGetMapdv GLEW_GET_FUN(__glewGetMapdv) +#define glGetMapfv GLEW_GET_FUN(__glewGetMapfv) +#define glGetMapiv GLEW_GET_FUN(__glewGetMapiv) +#define glGetMaterialfv GLEW_GET_FUN(__glewGetMaterialfv) +#define glGetMaterialiv GLEW_GET_FUN(__glewGetMaterialiv) +#define glGetPixelMapfv GLEW_GET_FUN(__glewGetPixelMapfv) +#define glGetPixelMapuiv GLEW_GET_FUN(__glewGetPixelMapuiv) +#define glGetPixelMapusv GLEW_GET_FUN(__glewGetPixelMapusv) +#define glGetPointerv GLEW_GET_FUN(__glewGetPointerv) +#define glGetPolygonStipple GLEW_GET_FUN(__glewGetPolygonStipple) +#define glGetString GLEW_GET_FUN(__glewGetString) +#define glGetTexEnvfv GLEW_GET_FUN(__glewGetTexEnvfv) +#define glGetTexEnviv GLEW_GET_FUN(__glewGetTexEnviv) +#define glGetTexGendv GLEW_GET_FUN(__glewGetTexGendv) +#define glGetTexGenfv GLEW_GET_FUN(__glewGetTexGenfv) +#define glGetTexGeniv GLEW_GET_FUN(__glewGetTexGeniv) +#define glGetTexImage GLEW_GET_FUN(__glewGetTexImage) +#define glGetTexLevelParameterfv GLEW_GET_FUN(__glewGetTexLevelParameterfv) +#define glGetTexLevelParameteriv GLEW_GET_FUN(__glewGetTexLevelParameteriv) +#define glGetTexParameterfv GLEW_GET_FUN(__glewGetTexParameterfv) +#define glGetTexParameteriv GLEW_GET_FUN(__glewGetTexParameteriv) +#define glHint GLEW_GET_FUN(__glewHint) +#define glIndexMask GLEW_GET_FUN(__glewIndexMask) +#define glIndexPointer GLEW_GET_FUN(__glewIndexPointer) +#define glIndexd GLEW_GET_FUN(__glewIndexd) +#define glIndexdv GLEW_GET_FUN(__glewIndexdv) +#define glIndexf GLEW_GET_FUN(__glewIndexf) +#define glIndexfv GLEW_GET_FUN(__glewIndexfv) +#define glIndexi GLEW_GET_FUN(__glewIndexi) +#define glIndexiv GLEW_GET_FUN(__glewIndexiv) +#define glIndexs GLEW_GET_FUN(__glewIndexs) +#define glIndexsv GLEW_GET_FUN(__glewIndexsv) +#define glIndexub GLEW_GET_FUN(__glewIndexub) +#define glIndexubv GLEW_GET_FUN(__glewIndexubv) +#define glInitNames GLEW_GET_FUN(__glewInitNames) +#define glInterleavedArrays GLEW_GET_FUN(__glewInterleavedArrays) +#define glIsEnabled GLEW_GET_FUN(__glewIsEnabled) +#define glIsList GLEW_GET_FUN(__glewIsList) +#define glIsTexture GLEW_GET_FUN(__glewIsTexture) +#define glLightModelf GLEW_GET_FUN(__glewLightModelf) +#define glLightModelfv GLEW_GET_FUN(__glewLightModelfv) +#define glLightModeli GLEW_GET_FUN(__glewLightModeli) +#define glLightModeliv GLEW_GET_FUN(__glewLightModeliv) +#define glLightf GLEW_GET_FUN(__glewLightf) +#define glLightfv GLEW_GET_FUN(__glewLightfv) +#define glLighti GLEW_GET_FUN(__glewLighti) +#define glLightiv GLEW_GET_FUN(__glewLightiv) +#define glLineStipple GLEW_GET_FUN(__glewLineStipple) +#define glLineWidth GLEW_GET_FUN(__glewLineWidth) +#define glListBase GLEW_GET_FUN(__glewListBase) +#define glLoadIdentity GLEW_GET_FUN(__glewLoadIdentity) +#define glLoadMatrixd GLEW_GET_FUN(__glewLoadMatrixd) +#define glLoadMatrixf GLEW_GET_FUN(__glewLoadMatrixf) +#define glLoadName GLEW_GET_FUN(__glewLoadName) +#define glLogicOp GLEW_GET_FUN(__glewLogicOp) +#define glMap1d GLEW_GET_FUN(__glewMap1d) +#define glMap1f GLEW_GET_FUN(__glewMap1f) +#define glMap2d GLEW_GET_FUN(__glewMap2d) +#define glMap2f GLEW_GET_FUN(__glewMap2f) +#define glMapGrid1d GLEW_GET_FUN(__glewMapGrid1d) +#define glMapGrid1f GLEW_GET_FUN(__glewMapGrid1f) +#define glMapGrid2d GLEW_GET_FUN(__glewMapGrid2d) +#define glMapGrid2f GLEW_GET_FUN(__glewMapGrid2f) +#define glMaterialf GLEW_GET_FUN(__glewMaterialf) +#define glMaterialfv GLEW_GET_FUN(__glewMaterialfv) +#define glMateriali GLEW_GET_FUN(__glewMateriali) +#define glMaterialiv GLEW_GET_FUN(__glewMaterialiv) +#define glMatrixMode GLEW_GET_FUN(__glewMatrixMode) +#define glMultMatrixd GLEW_GET_FUN(__glewMultMatrixd) +#define glMultMatrixf GLEW_GET_FUN(__glewMultMatrixf) +#define glNewList GLEW_GET_FUN(__glewNewList) +#define glNormal3b GLEW_GET_FUN(__glewNormal3b) +#define glNormal3bv GLEW_GET_FUN(__glewNormal3bv) +#define glNormal3d GLEW_GET_FUN(__glewNormal3d) +#define glNormal3dv GLEW_GET_FUN(__glewNormal3dv) +#define glNormal3f GLEW_GET_FUN(__glewNormal3f) +#define glNormal3fv GLEW_GET_FUN(__glewNormal3fv) +#define glNormal3i GLEW_GET_FUN(__glewNormal3i) +#define glNormal3iv GLEW_GET_FUN(__glewNormal3iv) +#define glNormal3s GLEW_GET_FUN(__glewNormal3s) +#define glNormal3sv GLEW_GET_FUN(__glewNormal3sv) +#define glNormalPointer GLEW_GET_FUN(__glewNormalPointer) +#define glOrtho GLEW_GET_FUN(__glewOrtho) +#define glPassThrough GLEW_GET_FUN(__glewPassThrough) +#define glPixelMapfv GLEW_GET_FUN(__glewPixelMapfv) +#define glPixelMapuiv GLEW_GET_FUN(__glewPixelMapuiv) +#define glPixelMapusv GLEW_GET_FUN(__glewPixelMapusv) +#define glPixelStoref GLEW_GET_FUN(__glewPixelStoref) +#define glPixelStorei GLEW_GET_FUN(__glewPixelStorei) +#define glPixelTransferf GLEW_GET_FUN(__glewPixelTransferf) +#define glPixelTransferi GLEW_GET_FUN(__glewPixelTransferi) +#define glPixelZoom GLEW_GET_FUN(__glewPixelZoom) +#define glPointSize GLEW_GET_FUN(__glewPointSize) +#define glPolygonMode GLEW_GET_FUN(__glewPolygonMode) +#define glPolygonOffset GLEW_GET_FUN(__glewPolygonOffset) +#define glPolygonStipple GLEW_GET_FUN(__glewPolygonStipple) +#define glPopAttrib GLEW_GET_FUN(__glewPopAttrib) +#define glPopClientAttrib GLEW_GET_FUN(__glewPopClientAttrib) +#define glPopMatrix GLEW_GET_FUN(__glewPopMatrix) +#define glPopName GLEW_GET_FUN(__glewPopName) +#define glPrioritizeTextures GLEW_GET_FUN(__glewPrioritizeTextures) +#define glPushAttrib GLEW_GET_FUN(__glewPushAttrib) +#define glPushClientAttrib GLEW_GET_FUN(__glewPushClientAttrib) +#define glPushMatrix GLEW_GET_FUN(__glewPushMatrix) +#define glPushName GLEW_GET_FUN(__glewPushName) +#define glRasterPos2d GLEW_GET_FUN(__glewRasterPos2d) +#define glRasterPos2dv GLEW_GET_FUN(__glewRasterPos2dv) +#define glRasterPos2f GLEW_GET_FUN(__glewRasterPos2f) +#define glRasterPos2fv GLEW_GET_FUN(__glewRasterPos2fv) +#define glRasterPos2i GLEW_GET_FUN(__glewRasterPos2i) +#define glRasterPos2iv GLEW_GET_FUN(__glewRasterPos2iv) +#define glRasterPos2s GLEW_GET_FUN(__glewRasterPos2s) +#define glRasterPos2sv GLEW_GET_FUN(__glewRasterPos2sv) +#define glRasterPos3d GLEW_GET_FUN(__glewRasterPos3d) +#define glRasterPos3dv GLEW_GET_FUN(__glewRasterPos3dv) +#define glRasterPos3f GLEW_GET_FUN(__glewRasterPos3f) +#define glRasterPos3fv GLEW_GET_FUN(__glewRasterPos3fv) +#define glRasterPos3i GLEW_GET_FUN(__glewRasterPos3i) +#define glRasterPos3iv GLEW_GET_FUN(__glewRasterPos3iv) +#define glRasterPos3s GLEW_GET_FUN(__glewRasterPos3s) +#define glRasterPos3sv GLEW_GET_FUN(__glewRasterPos3sv) +#define glRasterPos4d GLEW_GET_FUN(__glewRasterPos4d) +#define glRasterPos4dv GLEW_GET_FUN(__glewRasterPos4dv) +#define glRasterPos4f GLEW_GET_FUN(__glewRasterPos4f) +#define glRasterPos4fv GLEW_GET_FUN(__glewRasterPos4fv) +#define glRasterPos4i GLEW_GET_FUN(__glewRasterPos4i) +#define glRasterPos4iv GLEW_GET_FUN(__glewRasterPos4iv) +#define glRasterPos4s GLEW_GET_FUN(__glewRasterPos4s) +#define glRasterPos4sv GLEW_GET_FUN(__glewRasterPos4sv) +#define glReadBuffer GLEW_GET_FUN(__glewReadBuffer) +#define glReadPixels GLEW_GET_FUN(__glewReadPixels) +#define glRectd GLEW_GET_FUN(__glewRectd) +#define glRectdv GLEW_GET_FUN(__glewRectdv) +#define glRectf GLEW_GET_FUN(__glewRectf) +#define glRectfv GLEW_GET_FUN(__glewRectfv) +#define glRecti GLEW_GET_FUN(__glewRecti) +#define glRectiv GLEW_GET_FUN(__glewRectiv) +#define glRects GLEW_GET_FUN(__glewRects) +#define glRectsv GLEW_GET_FUN(__glewRectsv) +#define glRenderMode GLEW_GET_FUN(__glewRenderMode) +#define glRotated GLEW_GET_FUN(__glewRotated) +#define glRotatef GLEW_GET_FUN(__glewRotatef) +#define glScaled GLEW_GET_FUN(__glewScaled) +#define glScalef GLEW_GET_FUN(__glewScalef) +#define glScissor GLEW_GET_FUN(__glewScissor) +#define glSelectBuffer GLEW_GET_FUN(__glewSelectBuffer) +#define glShadeModel GLEW_GET_FUN(__glewShadeModel) +#define glStencilFunc GLEW_GET_FUN(__glewStencilFunc) +#define glStencilMask GLEW_GET_FUN(__glewStencilMask) +#define glStencilOp GLEW_GET_FUN(__glewStencilOp) +#define glTexCoord1d GLEW_GET_FUN(__glewTexCoord1d) +#define glTexCoord1dv GLEW_GET_FUN(__glewTexCoord1dv) +#define glTexCoord1f GLEW_GET_FUN(__glewTexCoord1f) +#define glTexCoord1fv GLEW_GET_FUN(__glewTexCoord1fv) +#define glTexCoord1i GLEW_GET_FUN(__glewTexCoord1i) +#define glTexCoord1iv GLEW_GET_FUN(__glewTexCoord1iv) +#define glTexCoord1s GLEW_GET_FUN(__glewTexCoord1s) +#define glTexCoord1sv GLEW_GET_FUN(__glewTexCoord1sv) +#define glTexCoord2d GLEW_GET_FUN(__glewTexCoord2d) +#define glTexCoord2dv GLEW_GET_FUN(__glewTexCoord2dv) +#define glTexCoord2f GLEW_GET_FUN(__glewTexCoord2f) +#define glTexCoord2fv GLEW_GET_FUN(__glewTexCoord2fv) +#define glTexCoord2i GLEW_GET_FUN(__glewTexCoord2i) +#define glTexCoord2iv GLEW_GET_FUN(__glewTexCoord2iv) +#define glTexCoord2s GLEW_GET_FUN(__glewTexCoord2s) +#define glTexCoord2sv GLEW_GET_FUN(__glewTexCoord2sv) +#define glTexCoord3d GLEW_GET_FUN(__glewTexCoord3d) +#define glTexCoord3dv GLEW_GET_FUN(__glewTexCoord3dv) +#define glTexCoord3f GLEW_GET_FUN(__glewTexCoord3f) +#define glTexCoord3fv GLEW_GET_FUN(__glewTexCoord3fv) +#define glTexCoord3i GLEW_GET_FUN(__glewTexCoord3i) +#define glTexCoord3iv GLEW_GET_FUN(__glewTexCoord3iv) +#define glTexCoord3s GLEW_GET_FUN(__glewTexCoord3s) +#define glTexCoord3sv GLEW_GET_FUN(__glewTexCoord3sv) +#define glTexCoord4d GLEW_GET_FUN(__glewTexCoord4d) +#define glTexCoord4dv GLEW_GET_FUN(__glewTexCoord4dv) +#define glTexCoord4f GLEW_GET_FUN(__glewTexCoord4f) +#define glTexCoord4fv GLEW_GET_FUN(__glewTexCoord4fv) +#define glTexCoord4i GLEW_GET_FUN(__glewTexCoord4i) +#define glTexCoord4iv GLEW_GET_FUN(__glewTexCoord4iv) +#define glTexCoord4s GLEW_GET_FUN(__glewTexCoord4s) +#define glTexCoord4sv GLEW_GET_FUN(__glewTexCoord4sv) +#define glTexCoordPointer GLEW_GET_FUN(__glewTexCoordPointer) +#define glTexEnvf GLEW_GET_FUN(__glewTexEnvf) +#define glTexEnvfv GLEW_GET_FUN(__glewTexEnvfv) +#define glTexEnvi GLEW_GET_FUN(__glewTexEnvi) +#define glTexEnviv GLEW_GET_FUN(__glewTexEnviv) +#define glTexGend GLEW_GET_FUN(__glewTexGend) +#define glTexGendv GLEW_GET_FUN(__glewTexGendv) +#define glTexGenf GLEW_GET_FUN(__glewTexGenf) +#define glTexGenfv GLEW_GET_FUN(__glewTexGenfv) +#define glTexGeni GLEW_GET_FUN(__glewTexGeni) +#define glTexGeniv GLEW_GET_FUN(__glewTexGeniv) +#define glTexImage1D GLEW_GET_FUN(__glewTexImage1D) +#define glTexImage2D GLEW_GET_FUN(__glewTexImage2D) +#define glTexParameterf GLEW_GET_FUN(__glewTexParameterf) +#define glTexParameterfv GLEW_GET_FUN(__glewTexParameterfv) +#define glTexParameteri GLEW_GET_FUN(__glewTexParameteri) +#define glTexParameteriv GLEW_GET_FUN(__glewTexParameteriv) +#define glTexSubImage1D GLEW_GET_FUN(__glewTexSubImage1D) +#define glTexSubImage2D GLEW_GET_FUN(__glewTexSubImage2D) +#define glTranslated GLEW_GET_FUN(__glewTranslated) +#define glTranslatef GLEW_GET_FUN(__glewTranslatef) +#define glVertex2d GLEW_GET_FUN(__glewVertex2d) +#define glVertex2dv GLEW_GET_FUN(__glewVertex2dv) +#define glVertex2f GLEW_GET_FUN(__glewVertex2f) +#define glVertex2fv GLEW_GET_FUN(__glewVertex2fv) +#define glVertex2i GLEW_GET_FUN(__glewVertex2i) +#define glVertex2iv GLEW_GET_FUN(__glewVertex2iv) +#define glVertex2s GLEW_GET_FUN(__glewVertex2s) +#define glVertex2sv GLEW_GET_FUN(__glewVertex2sv) +#define glVertex3d GLEW_GET_FUN(__glewVertex3d) +#define glVertex3dv GLEW_GET_FUN(__glewVertex3dv) +#define glVertex3f GLEW_GET_FUN(__glewVertex3f) +#define glVertex3fv GLEW_GET_FUN(__glewVertex3fv) +#define glVertex3i GLEW_GET_FUN(__glewVertex3i) +#define glVertex3iv GLEW_GET_FUN(__glewVertex3iv) +#define glVertex3s GLEW_GET_FUN(__glewVertex3s) +#define glVertex3sv GLEW_GET_FUN(__glewVertex3sv) +#define glVertex4d GLEW_GET_FUN(__glewVertex4d) +#define glVertex4dv GLEW_GET_FUN(__glewVertex4dv) +#define glVertex4f GLEW_GET_FUN(__glewVertex4f) +#define glVertex4fv GLEW_GET_FUN(__glewVertex4fv) +#define glVertex4i GLEW_GET_FUN(__glewVertex4i) +#define glVertex4iv GLEW_GET_FUN(__glewVertex4iv) +#define glVertex4s GLEW_GET_FUN(__glewVertex4s) +#define glVertex4sv GLEW_GET_FUN(__glewVertex4sv) +#define glVertexPointer GLEW_GET_FUN(__glewVertexPointer) +#define glViewport GLEW_GET_FUN(__glewViewport) + + +#else //GLEW_INIT_OPENGL11_FUNCTIONS + 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); @@ -1167,13 +1856,12 @@ 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); - +#endif //GLEW_INIT_OPENGL11_FUNCTIONS #define GLEW_VERSION_1_1 GLEW_GET_VAR(__GLEW_VERSION_1_1) #endif /* GL_VERSION_1_1 */ /* ---------------------------------- GLU ---------------------------------- */ -#define GLEW_NO_GLU #ifndef GLEW_NO_GLU /* this is where we can safely include GLU */ @@ -1227,7 +1915,6 @@ GLAPI void GLAPIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei heigh #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 @@ -2052,8 +2739,6 @@ typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei #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_RGBA32F 0x8814 #define GL_RGB32F 0x8815 #define GL_RGBA16F 0x881A @@ -2360,11 +3045,6 @@ typedef void (GLAPIENTRY * PFNGLGETINTEGER64I_VPROC) (GLenum, GLuint, GLint64 *) #define GL_VERSION_3_3 1 #define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE -#define GL_TEXTURE_SWIZZLE_R 0x8E42 -#define GL_TEXTURE_SWIZZLE_G 0x8E43 -#define GL_TEXTURE_SWIZZLE_B 0x8E44 -#define GL_TEXTURE_SWIZZLE_A 0x8E45 -#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 #define GL_RGB10_A2UI 0x906F typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor); @@ -2380,13 +3060,8 @@ typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint d #ifndef GL_VERSION_4_0 #define GL_VERSION_4_0 1 -#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F #define GL_SAMPLE_SHADING 0x8C36 #define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37 -#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A -#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B -#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C -#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D #define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E #define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F #define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS 0x8F9F @@ -2449,6 +3124,17 @@ typedef void (GLAPIENTRY * PFNGLMINSAMPLESHADINGPROC) (GLclampf value); #endif /* GL_VERSION_4_3 */ +/* ----------------------------- GL_VERSION_4_4 ---------------------------- */ + +#ifndef GL_VERSION_4_4 +#define GL_VERSION_4_4 1 + +#define GL_MAX_VERTEX_ATTRIB_STRIDE 0x82E5 + +#define GLEW_VERSION_4_4 GLEW_GET_VAR(__GLEW_VERSION_4_4) + +#endif /* GL_VERSION_4_4 */ + /* -------------------------- GL_3DFX_multisample -------------------------- */ #ifndef GL_3DFX_multisample @@ -2531,7 +3217,7 @@ typedef void (GLAPIENTRY * PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); typedef void (APIENTRY *GLDEBUGPROCAMD)(GLuint id, GLenum category, GLenum severity, GLsizei length, const GLchar* message, GLvoid* userParam); -typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKAMDPROC) (GLDEBUGPROCAMD callback, void* userParam); +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKAMDPROC) (GLDEBUGPROCAMD callback, GLvoid *userParam); typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEENABLEAMDPROC) (GLenum category, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled); typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTAMDPROC) (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar* buf); typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGAMDPROC) (GLuint count, GLsizei bufsize, GLenum* categories, GLuint* severities, GLuint* ids, GLsizei* lengths, GLchar* message); @@ -2576,13 +3262,36 @@ typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC) (GLuint buf, GL #endif /* GL_AMD_draw_buffers_blend */ +/* ---------------------- GL_AMD_interleaved_elements ---------------------- */ + +#ifndef GL_AMD_interleaved_elements +#define GL_AMD_interleaved_elements 1 + +#define GL_RED 0x1903 +#define GL_GREEN 0x1904 +#define GL_BLUE 0x1905 +#define GL_ALPHA 0x1906 +#define GL_RG8UI 0x8238 +#define GL_RG16UI 0x823A +#define GL_RGBA8UI 0x8D7C +#define GL_VERTEX_ELEMENT_SWIZZLE_AMD 0x91A4 +#define GL_VERTEX_ID_SWIZZLE_AMD 0x91A5 + +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPARAMETERIAMDPROC) (GLuint index, GLenum pname, GLint param); + +#define glVertexAttribParameteriAMD GLEW_GET_FUN(__glewVertexAttribParameteriAMD) + +#define GLEW_AMD_interleaved_elements GLEW_GET_VAR(__GLEW_AMD_interleaved_elements) + +#endif /* GL_AMD_interleaved_elements */ + /* ----------------------- GL_AMD_multi_draw_indirect ---------------------- */ #ifndef GL_AMD_multi_draw_indirect #define GL_AMD_multi_draw_indirect 1 -typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC) (GLenum mode, const void* indirect, GLsizei primcount, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC) (GLenum mode, GLenum type, const void* indirect, GLsizei primcount, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC) (GLenum mode, const GLvoid *indirect, GLsizei primcount, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC) (GLenum mode, GLenum type, const GLvoid *indirect, GLsizei primcount, GLsizei stride); #define glMultiDrawArraysIndirectAMD GLEW_GET_FUN(__glewMultiDrawArraysIndirectAMD) #define glMultiDrawElementsIndirectAMD GLEW_GET_FUN(__glewMultiDrawElementsIndirectAMD) @@ -2632,7 +3341,7 @@ typedef void (GLAPIENTRY * PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint* m typedef void (GLAPIENTRY * PFNGLENDPERFMONITORAMDPROC) (GLuint monitor); typedef void (GLAPIENTRY * PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint* monitors); typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint *bytesWritten); -typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, void* data); +typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, GLvoid *data); typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, GLchar *counterString); typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint* numCounters, GLint *maxActiveCounters, GLsizei countersSize, GLuint *counters); typedef void (GLAPIENTRY * PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei* length, GLchar *groupString); @@ -2714,6 +3423,40 @@ typedef void (GLAPIENTRY * PFNGLSETMULTISAMPLEFVAMDPROC) (GLenum pname, GLuint i #endif /* GL_AMD_shader_stencil_export */ +/* ---------------------- GL_AMD_shader_trinary_minmax --------------------- */ + +#ifndef GL_AMD_shader_trinary_minmax +#define GL_AMD_shader_trinary_minmax 1 + +#define GLEW_AMD_shader_trinary_minmax GLEW_GET_VAR(__GLEW_AMD_shader_trinary_minmax) + +#endif /* GL_AMD_shader_trinary_minmax */ + +/* ------------------------- GL_AMD_sparse_texture ------------------------- */ + +#ifndef GL_AMD_sparse_texture +#define GL_AMD_sparse_texture 1 + +#define GL_TEXTURE_STORAGE_SPARSE_BIT_AMD 0x00000001 +#define GL_VIRTUAL_PAGE_SIZE_X_AMD 0x9195 +#define GL_VIRTUAL_PAGE_SIZE_Y_AMD 0x9196 +#define GL_VIRTUAL_PAGE_SIZE_Z_AMD 0x9197 +#define GL_MAX_SPARSE_TEXTURE_SIZE_AMD 0x9198 +#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_AMD 0x9199 +#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS 0x919A +#define GL_MIN_SPARSE_LEVEL_AMD 0x919B +#define GL_MIN_LOD_WARNING_AMD 0x919C + +typedef void (GLAPIENTRY * PFNGLTEXSTORAGESPARSEAMDPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGESPARSEAMDPROC) (GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); + +#define glTexStorageSparseAMD GLEW_GET_FUN(__glewTexStorageSparseAMD) +#define glTextureStorageSparseAMD GLEW_GET_FUN(__glewTextureStorageSparseAMD) + +#define GLEW_AMD_sparse_texture GLEW_GET_VAR(__GLEW_AMD_sparse_texture) + +#endif /* GL_AMD_sparse_texture */ + /* ------------------- GL_AMD_stencil_operation_extended ------------------- */ #ifndef GL_AMD_stencil_operation_extended @@ -2791,6 +3534,200 @@ typedef void (GLAPIENTRY * PFNGLTESSELLATIONMODEAMDPROC) (GLenum mode); #endif /* GL_AMD_vertex_shader_viewport_index */ +/* ------------------------- GL_ANGLE_depth_texture ------------------------ */ + +#ifndef GL_ANGLE_depth_texture +#define GL_ANGLE_depth_texture 1 + +#define GLEW_ANGLE_depth_texture GLEW_GET_VAR(__GLEW_ANGLE_depth_texture) + +#endif /* GL_ANGLE_depth_texture */ + +/* ----------------------- GL_ANGLE_framebuffer_blit ----------------------- */ + +#ifndef GL_ANGLE_framebuffer_blit +#define GL_ANGLE_framebuffer_blit 1 + +#define GL_DRAW_FRAMEBUFFER_BINDING_ANGLE 0x8CA6 +#define GL_READ_FRAMEBUFFER_ANGLE 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_ANGLE 0x8CA9 +#define GL_READ_FRAMEBUFFER_BINDING_ANGLE 0x8CAA + +typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFERANGLEPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); + +#define glBlitFramebufferANGLE GLEW_GET_FUN(__glewBlitFramebufferANGLE) + +#define GLEW_ANGLE_framebuffer_blit GLEW_GET_VAR(__GLEW_ANGLE_framebuffer_blit) + +#endif /* GL_ANGLE_framebuffer_blit */ + +/* -------------------- GL_ANGLE_framebuffer_multisample ------------------- */ + +#ifndef GL_ANGLE_framebuffer_multisample +#define GL_ANGLE_framebuffer_multisample 1 + +#define GL_RENDERBUFFER_SAMPLES_ANGLE 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE 0x8D56 +#define GL_MAX_SAMPLES_ANGLE 0x8D57 + +typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); + +#define glRenderbufferStorageMultisampleANGLE GLEW_GET_FUN(__glewRenderbufferStorageMultisampleANGLE) + +#define GLEW_ANGLE_framebuffer_multisample GLEW_GET_VAR(__GLEW_ANGLE_framebuffer_multisample) + +#endif /* GL_ANGLE_framebuffer_multisample */ + +/* ----------------------- GL_ANGLE_instanced_arrays ----------------------- */ + +#ifndef GL_ANGLE_instanced_arrays +#define GL_ANGLE_instanced_arrays 1 + +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE 0x88FE + +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDANGLEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDANGLEPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORANGLEPROC) (GLuint index, GLuint divisor); + +#define glDrawArraysInstancedANGLE GLEW_GET_FUN(__glewDrawArraysInstancedANGLE) +#define glDrawElementsInstancedANGLE GLEW_GET_FUN(__glewDrawElementsInstancedANGLE) +#define glVertexAttribDivisorANGLE GLEW_GET_FUN(__glewVertexAttribDivisorANGLE) + +#define GLEW_ANGLE_instanced_arrays GLEW_GET_VAR(__GLEW_ANGLE_instanced_arrays) + +#endif /* GL_ANGLE_instanced_arrays */ + +/* -------------------- GL_ANGLE_pack_reverse_row_order -------------------- */ + +#ifndef GL_ANGLE_pack_reverse_row_order +#define GL_ANGLE_pack_reverse_row_order 1 + +#define GL_PACK_REVERSE_ROW_ORDER_ANGLE 0x93A4 + +#define GLEW_ANGLE_pack_reverse_row_order GLEW_GET_VAR(__GLEW_ANGLE_pack_reverse_row_order) + +#endif /* GL_ANGLE_pack_reverse_row_order */ + +/* ------------------------ GL_ANGLE_program_binary ------------------------ */ + +#ifndef GL_ANGLE_program_binary +#define GL_ANGLE_program_binary 1 + +#define GL_PROGRAM_BINARY_ANGLE 0x93A6 + +#define GLEW_ANGLE_program_binary GLEW_GET_VAR(__GLEW_ANGLE_program_binary) + +#endif /* GL_ANGLE_program_binary */ + +/* ------------------- GL_ANGLE_texture_compression_dxt1 ------------------- */ + +#ifndef GL_ANGLE_texture_compression_dxt1 +#define GL_ANGLE_texture_compression_dxt1 1 + +#define GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 + +#define GLEW_ANGLE_texture_compression_dxt1 GLEW_GET_VAR(__GLEW_ANGLE_texture_compression_dxt1) + +#endif /* GL_ANGLE_texture_compression_dxt1 */ + +/* ------------------- GL_ANGLE_texture_compression_dxt3 ------------------- */ + +#ifndef GL_ANGLE_texture_compression_dxt3 +#define GL_ANGLE_texture_compression_dxt3 1 + +#define GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 + +#define GLEW_ANGLE_texture_compression_dxt3 GLEW_GET_VAR(__GLEW_ANGLE_texture_compression_dxt3) + +#endif /* GL_ANGLE_texture_compression_dxt3 */ + +/* ------------------- GL_ANGLE_texture_compression_dxt5 ------------------- */ + +#ifndef GL_ANGLE_texture_compression_dxt5 +#define GL_ANGLE_texture_compression_dxt5 1 + +#define GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 + +#define GLEW_ANGLE_texture_compression_dxt5 GLEW_GET_VAR(__GLEW_ANGLE_texture_compression_dxt5) + +#endif /* GL_ANGLE_texture_compression_dxt5 */ + +/* ------------------------- GL_ANGLE_texture_usage ------------------------ */ + +#ifndef GL_ANGLE_texture_usage +#define GL_ANGLE_texture_usage 1 + +#define GL_TEXTURE_USAGE_ANGLE 0x93A2 +#define GL_FRAMEBUFFER_ATTACHMENT_ANGLE 0x93A3 + +#define GLEW_ANGLE_texture_usage GLEW_GET_VAR(__GLEW_ANGLE_texture_usage) + +#endif /* GL_ANGLE_texture_usage */ + +/* -------------------------- GL_ANGLE_timer_query ------------------------- */ + +#ifndef GL_ANGLE_timer_query +#define GL_ANGLE_timer_query 1 + +#define GL_QUERY_COUNTER_BITS_ANGLE 0x8864 +#define GL_CURRENT_QUERY_ANGLE 0x8865 +#define GL_QUERY_RESULT_ANGLE 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_ANGLE 0x8867 +#define GL_TIME_ELAPSED_ANGLE 0x88BF +#define GL_TIMESTAMP_ANGLE 0x8E28 + +typedef void (GLAPIENTRY * PFNGLBEGINQUERYANGLEPROC) (GLenum target, GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETEQUERIESANGLEPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLENDQUERYANGLEPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLGENQUERIESANGLEPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VANGLEPROC) (GLuint id, GLenum pname, GLint64* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVANGLEPROC) (GLuint id, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VANGLEPROC) (GLuint id, GLenum pname, GLuint64* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVANGLEPROC) (GLuint id, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYIVANGLEPROC) (GLenum target, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISQUERYANGLEPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLQUERYCOUNTERANGLEPROC) (GLuint id, GLenum target); + +#define glBeginQueryANGLE GLEW_GET_FUN(__glewBeginQueryANGLE) +#define glDeleteQueriesANGLE GLEW_GET_FUN(__glewDeleteQueriesANGLE) +#define glEndQueryANGLE GLEW_GET_FUN(__glewEndQueryANGLE) +#define glGenQueriesANGLE GLEW_GET_FUN(__glewGenQueriesANGLE) +#define glGetQueryObjecti64vANGLE GLEW_GET_FUN(__glewGetQueryObjecti64vANGLE) +#define glGetQueryObjectivANGLE GLEW_GET_FUN(__glewGetQueryObjectivANGLE) +#define glGetQueryObjectui64vANGLE GLEW_GET_FUN(__glewGetQueryObjectui64vANGLE) +#define glGetQueryObjectuivANGLE GLEW_GET_FUN(__glewGetQueryObjectuivANGLE) +#define glGetQueryivANGLE GLEW_GET_FUN(__glewGetQueryivANGLE) +#define glIsQueryANGLE GLEW_GET_FUN(__glewIsQueryANGLE) +#define glQueryCounterANGLE GLEW_GET_FUN(__glewQueryCounterANGLE) + +#define GLEW_ANGLE_timer_query GLEW_GET_VAR(__GLEW_ANGLE_timer_query) + +#endif /* GL_ANGLE_timer_query */ + +/* ------------------- GL_ANGLE_translated_shader_source ------------------- */ + +#ifndef GL_ANGLE_translated_shader_source +#define GL_ANGLE_translated_shader_source 1 + +#define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x93A0 + +typedef void (GLAPIENTRY * PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC) (GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source); + +#define glGetTranslatedShaderSourceANGLE GLEW_GET_FUN(__glewGetTranslatedShaderSourceANGLE) + +#define GLEW_ANGLE_translated_shader_source GLEW_GET_VAR(__GLEW_ANGLE_translated_shader_source) + +#endif /* GL_ANGLE_translated_shader_source */ + /* ----------------------- GL_APPLE_aux_depth_stencil ---------------------- */ #ifndef GL_APPLE_aux_depth_stencil @@ -2824,7 +3761,7 @@ typedef void (GLAPIENTRY * PFNGLTESSELLATIONMODEAMDPROC) (GLenum mode); 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 * PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const GLvoid *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); @@ -3049,9 +3986,9 @@ typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); #define GL_STORAGE_CACHED_APPLE 0x85BE #define GL_STORAGE_SHARED_APPLE 0x85BF -typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void* pointer); +typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid *pointer); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void* pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid *pointer); #define glFlushVertexArrayRangeAPPLE GLEW_GET_FUN(__glewFlushVertexArrayRangeAPPLE) #define glVertexArrayParameteriAPPLE GLEW_GET_FUN(__glewVertexArrayParameteriAPPLE) @@ -3130,6 +4067,8 @@ typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB2FAPPLEPROC) (GLuint index, GLuin #define GL_MAX_VARYING_VECTORS 0x8DFC #define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD +typedef int GLfixed; + typedef void (GLAPIENTRY * PFNGLCLEARDEPTHFPROC) (GLclampf d); typedef void (GLAPIENTRY * PFNGLDEPTHRANGEFPROC) (GLclampf n, GLclampf f); typedef void (GLAPIENTRY * PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint* range, GLint *precision); @@ -3151,6 +4090,7 @@ typedef void (GLAPIENTRY * PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint* #ifndef GL_ARB_ES3_compatibility #define GL_ARB_ES3_compatibility 1 +#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF #define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69 #define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A #define GL_MAX_ELEMENT_INDEX 0x8D6B @@ -3184,8 +4124,8 @@ typedef void (GLAPIENTRY * PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint* #define GL_ARB_base_instance 1 typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount, GLuint baseinstance); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount, GLuint baseinstance); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount, GLint basevertex, GLuint baseinstance); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount, GLuint baseinstance); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount, GLint basevertex, GLuint baseinstance); #define glDrawArraysInstancedBaseInstance GLEW_GET_FUN(__glewDrawArraysInstancedBaseInstance) #define glDrawElementsInstancedBaseInstance GLEW_GET_FUN(__glewDrawElementsInstancedBaseInstance) @@ -3195,6 +4135,51 @@ typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) #endif /* GL_ARB_base_instance */ +/* ------------------------ GL_ARB_bindless_texture ------------------------ */ + +#ifndef GL_ARB_bindless_texture +#define GL_ARB_bindless_texture 1 + +#define GL_UNSIGNED_INT64_ARB 0x140F + +typedef GLuint64 (GLAPIENTRY * PFNGLGETIMAGEHANDLEARBPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTUREHANDLEARBPROC) (GLuint texture); +typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTURESAMPLERHANDLEARBPROC) (GLuint texture, GLuint sampler); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLUI64VARBPROC) (GLuint index, GLenum pname, GLuint64EXT* params); +typedef GLboolean (GLAPIENTRY * PFNGLISIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle); +typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle, GLenum access); +typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC) (GLuint program, GLint location, GLuint64 value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* values); +typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64ARBPROC) (GLint location, GLuint64 value); +typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64ARBPROC) (GLuint index, GLuint64EXT x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64VARBPROC) (GLuint index, const GLuint64EXT* v); + +#define glGetImageHandleARB GLEW_GET_FUN(__glewGetImageHandleARB) +#define glGetTextureHandleARB GLEW_GET_FUN(__glewGetTextureHandleARB) +#define glGetTextureSamplerHandleARB GLEW_GET_FUN(__glewGetTextureSamplerHandleARB) +#define glGetVertexAttribLui64vARB GLEW_GET_FUN(__glewGetVertexAttribLui64vARB) +#define glIsImageHandleResidentARB GLEW_GET_FUN(__glewIsImageHandleResidentARB) +#define glIsTextureHandleResidentARB GLEW_GET_FUN(__glewIsTextureHandleResidentARB) +#define glMakeImageHandleNonResidentARB GLEW_GET_FUN(__glewMakeImageHandleNonResidentARB) +#define glMakeImageHandleResidentARB GLEW_GET_FUN(__glewMakeImageHandleResidentARB) +#define glMakeTextureHandleNonResidentARB GLEW_GET_FUN(__glewMakeTextureHandleNonResidentARB) +#define glMakeTextureHandleResidentARB GLEW_GET_FUN(__glewMakeTextureHandleResidentARB) +#define glProgramUniformHandleui64ARB GLEW_GET_FUN(__glewProgramUniformHandleui64ARB) +#define glProgramUniformHandleui64vARB GLEW_GET_FUN(__glewProgramUniformHandleui64vARB) +#define glUniformHandleui64ARB GLEW_GET_FUN(__glewUniformHandleui64ARB) +#define glUniformHandleui64vARB GLEW_GET_FUN(__glewUniformHandleui64vARB) +#define glVertexAttribL1ui64ARB GLEW_GET_FUN(__glewVertexAttribL1ui64ARB) +#define glVertexAttribL1ui64vARB GLEW_GET_FUN(__glewVertexAttribL1ui64vARB) + +#define GLEW_ARB_bindless_texture GLEW_GET_VAR(__GLEW_ARB_bindless_texture) + +#endif /* GL_ARB_bindless_texture */ + /* ----------------------- GL_ARB_blend_func_extended ---------------------- */ #ifndef GL_ARB_blend_func_extended @@ -3215,6 +4200,31 @@ typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATAINDEXPROC) (GLuint program, const GL #endif /* GL_ARB_blend_func_extended */ +/* ------------------------- GL_ARB_buffer_storage ------------------------- */ + +#ifndef GL_ARB_buffer_storage +#define GL_ARB_buffer_storage 1 + +#define GL_MAP_READ_BIT 0x0001 +#define GL_MAP_WRITE_BIT 0x0002 +#define GL_MAP_PERSISTENT_BIT 0x00000040 +#define GL_MAP_COHERENT_BIT 0x00000080 +#define GL_DYNAMIC_STORAGE_BIT 0x0100 +#define GL_CLIENT_STORAGE_BIT 0x0200 +#define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT 0x00004000 +#define GL_BUFFER_IMMUTABLE_STORAGE 0x821F +#define GL_BUFFER_STORAGE_FLAGS 0x8220 + +typedef void (GLAPIENTRY * PFNGLBUFFERSTORAGEPROC) (GLenum target, GLsizeiptr size, const GLvoid* data, GLbitfield flags); +typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSTORAGEEXTPROC) (GLuint buffer, GLsizeiptr size, const GLvoid* data, GLbitfield flags); + +#define glBufferStorage GLEW_GET_FUN(__glewBufferStorage) +#define glNamedBufferStorageEXT GLEW_GET_FUN(__glewNamedBufferStorageEXT) + +#define GLEW_ARB_buffer_storage GLEW_GET_VAR(__GLEW_ARB_buffer_storage) + +#endif /* GL_ARB_buffer_storage */ + /* ---------------------------- GL_ARB_cl_event ---------------------------- */ #ifndef GL_ARB_cl_event @@ -3253,6 +4263,23 @@ typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, #endif /* GL_ARB_clear_buffer_object */ +/* -------------------------- GL_ARB_clear_texture ------------------------- */ + +#ifndef GL_ARB_clear_texture +#define GL_ARB_clear_texture 1 + +#define GL_CLEAR_TEXTURE 0x9365 + +typedef void (GLAPIENTRY * PFNGLCLEARTEXIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, const GLvoid* data); +typedef void (GLAPIENTRY * PFNGLCLEARTEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* data); + +#define glClearTexImage GLEW_GET_FUN(__glewClearTexImage) +#define glClearTexSubImage GLEW_GET_FUN(__glewClearTexSubImage) + +#define GLEW_ARB_clear_texture GLEW_GET_VAR(__GLEW_ARB_clear_texture) + +#endif /* GL_ARB_clear_texture */ + /* ----------------------- GL_ARB_color_buffer_float ----------------------- */ #ifndef GL_ARB_color_buffer_float @@ -3333,6 +4360,24 @@ typedef void (GLAPIENTRY * PFNGLDISPATCHCOMPUTEINDIRECTPROC) (GLintptr indirect) #endif /* GL_ARB_compute_shader */ +/* ------------------- GL_ARB_compute_variable_group_size ------------------ */ + +#ifndef GL_ARB_compute_variable_group_size +#define GL_ARB_compute_variable_group_size 1 + +#define GL_MAX_COMPUTE_FIXED_GROUP_INVOCATIONS_ARB 0x90EB +#define GL_MAX_COMPUTE_FIXED_GROUP_SIZE_ARB 0x91BF +#define GL_MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB 0x9344 +#define GL_MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB 0x9345 + +typedef void (GLAPIENTRY * PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z); + +#define glDispatchComputeGroupSizeARB GLEW_GET_FUN(__glewDispatchComputeGroupSizeARB) + +#define GLEW_ARB_compute_variable_group_size GLEW_GET_VAR(__GLEW_ARB_compute_variable_group_size) + +#endif /* GL_ARB_compute_variable_group_size */ + /* ----------------------- GL_ARB_conservative_depth ----------------------- */ #ifndef GL_ARB_conservative_depth @@ -3401,7 +4446,7 @@ typedef void (GLAPIENTRY * PFNGLCOPYIMAGESUBDATAPROC) (GLuint srcName, GLenum sr typedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, GLvoid* userParam); -typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKARBPROC) (GLDEBUGPROCARB callback, void* userParam); +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKARBPROC) (GLDEBUGPROCARB callback, const GLvoid *userParam); typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECONTROLARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled); typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTARBPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf); typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGARBPROC) (GLuint count, GLsizei bufsize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog); @@ -3509,10 +4554,10 @@ typedef void (GLAPIENTRY * PFNGLBLENDFUNCIARBPROC) (GLuint buf, GLenum src, GLen #ifndef GL_ARB_draw_elements_base_vertex #define GL_ARB_draw_elements_base_vertex 1 -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, void* indices, GLint basevertex); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount, GLint basevertex); -typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, void* indices, GLint basevertex); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei* count, GLenum type, GLvoid**indices, GLsizei primcount, GLint *basevertex); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount, GLint basevertex); +typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, const GLsizei* count, GLenum type, const GLvoid* const *indices, GLsizei primcount, const GLint *basevertex); #define glDrawElementsBaseVertex GLEW_GET_FUN(__glewDrawElementsBaseVertex) #define glDrawElementsInstancedBaseVertex GLEW_GET_FUN(__glewDrawElementsInstancedBaseVertex) @@ -3531,8 +4576,8 @@ typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, G #define GL_DRAW_INDIRECT_BUFFER 0x8F3F #define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43 -typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const void* indirect); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void* indirect); +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const GLvoid *indirect); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const GLvoid *indirect); #define glDrawArraysIndirect GLEW_GET_FUN(__glewDrawArraysIndirect) #define glDrawElementsIndirect GLEW_GET_FUN(__glewDrawElementsIndirect) @@ -3550,6 +4595,19 @@ typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum t #endif /* GL_ARB_draw_instanced */ +/* ------------------------ GL_ARB_enhanced_layouts ------------------------ */ + +#ifndef GL_ARB_enhanced_layouts +#define GL_ARB_enhanced_layouts 1 + +#define GL_LOCATION_COMPONENT 0x934A +#define GL_TRANSFORM_FEEDBACK_BUFFER_INDEX 0x934B +#define GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE 0x934C + +#define GLEW_ARB_enhanced_layouts GLEW_GET_VAR(__GLEW_ARB_enhanced_layouts) + +#endif /* GL_ARB_enhanced_layouts */ + /* -------------------- GL_ARB_explicit_attrib_location -------------------- */ #ifndef GL_ARB_explicit_attrib_location @@ -3851,7 +4909,7 @@ typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIARBPROC) (GLuint program, GLenu #define GL_PROGRAM_BINARY_FORMATS 0x87FF typedef void (GLAPIENTRY * PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei* length, GLenum *binaryFormat, GLvoid*binary); -typedef void (GLAPIENTRY * PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void* binary, GLsizei length); +typedef void (GLAPIENTRY * PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length); typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value); #define glGetProgramBinary GLEW_GET_FUN(__glewGetProgramBinary) @@ -4113,6 +5171,24 @@ typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum in #endif /* GL_ARB_imaging */ +/* ----------------------- GL_ARB_indirect_parameters ---------------------- */ + +#ifndef GL_ARB_indirect_parameters +#define GL_ARB_indirect_parameters 1 + +#define GL_PARAMETER_BUFFER_ARB 0x80EE +#define GL_PARAMETER_BUFFER_BINDING_ARB 0x80EF + +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC) (GLenum mode, const GLvoid *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC) (GLenum mode, GLenum type, const GLvoid *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); + +#define glMultiDrawArraysIndirectCountARB GLEW_GET_FUN(__glewMultiDrawArraysIndirectCountARB) +#define glMultiDrawElementsIndirectCountARB GLEW_GET_FUN(__glewMultiDrawElementsIndirectCountARB) + +#define GLEW_ARB_indirect_parameters GLEW_GET_VAR(__GLEW_ARB_indirect_parameters) + +#endif /* GL_ARB_indirect_parameters */ + /* ------------------------ GL_ARB_instanced_arrays ------------------------ */ #ifndef GL_ARB_instanced_arrays @@ -4152,10 +5228,6 @@ typedef void (GLAPIENTRY * PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum #ifndef GL_ARB_internalformat_query2 #define GL_ARB_internalformat_query2 1 -#define GL_TEXTURE_1D 0x0DE0 -#define GL_TEXTURE_2D 0x0DE1 -#define GL_TEXTURE_3D 0x806F -#define GL_SAMPLES 0x80A9 #define GL_INTERNALFORMAT_SUPPORTED 0x826F #define GL_INTERNALFORMAT_PREFERRED 0x8270 #define GL_INTERNALFORMAT_RED_SIZE 0x8271 @@ -4255,15 +5327,6 @@ typedef void (GLAPIENTRY * PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum #define GL_VIEW_CLASS_RGTC2_RG 0x82D1 #define GL_VIEW_CLASS_BPTC_UNORM 0x82D2 #define GL_VIEW_CLASS_BPTC_FLOAT 0x82D3 -#define GL_TEXTURE_RECTANGLE 0x84F5 -#define GL_TEXTURE_1D_ARRAY 0x8C18 -#define GL_TEXTURE_2D_ARRAY 0x8C1A -#define GL_TEXTURE_BUFFER 0x8C2A -#define GL_RENDERBUFFER 0x8D41 -#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 -#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 -#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 -#define GL_NUM_SAMPLE_COUNTS 0x9380 typedef void (GLAPIENTRY * PFNGLGETINTERNALFORMATI64VPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64* params); @@ -4361,13 +5424,36 @@ typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUSVARBPROC) (GLint size, GLushort *in #endif /* GL_ARB_matrix_palette */ +/* --------------------------- GL_ARB_multi_bind --------------------------- */ + +#ifndef GL_ARB_multi_bind +#define GL_ARB_multi_bind 1 + +typedef void (GLAPIENTRY * PFNGLBINDBUFFERSBASEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint* buffers); +typedef void (GLAPIENTRY * PFNGLBINDBUFFERSRANGEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint* buffers, const GLintptr *offsets, const GLsizeiptr *sizes); +typedef void (GLAPIENTRY * PFNGLBINDIMAGETEXTURESPROC) (GLuint first, GLsizei count, const GLuint* textures); +typedef void (GLAPIENTRY * PFNGLBINDSAMPLERSPROC) (GLuint first, GLsizei count, const GLuint* samplers); +typedef void (GLAPIENTRY * PFNGLBINDTEXTURESPROC) (GLuint first, GLsizei count, const GLuint* textures); +typedef void (GLAPIENTRY * PFNGLBINDVERTEXBUFFERSPROC) (GLuint first, GLsizei count, const GLuint* buffers, const GLintptr *offsets, const GLsizei *strides); + +#define glBindBuffersBase GLEW_GET_FUN(__glewBindBuffersBase) +#define glBindBuffersRange GLEW_GET_FUN(__glewBindBuffersRange) +#define glBindImageTextures GLEW_GET_FUN(__glewBindImageTextures) +#define glBindSamplers GLEW_GET_FUN(__glewBindSamplers) +#define glBindTextures GLEW_GET_FUN(__glewBindTextures) +#define glBindVertexBuffers GLEW_GET_FUN(__glewBindVertexBuffers) + +#define GLEW_ARB_multi_bind GLEW_GET_VAR(__GLEW_ARB_multi_bind) + +#endif /* GL_ARB_multi_bind */ + /* ----------------------- GL_ARB_multi_draw_indirect ---------------------- */ #ifndef GL_ARB_multi_draw_indirect #define GL_ARB_multi_draw_indirect 1 -typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTPROC) (GLenum mode, const void* indirect, GLsizei primcount, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void* indirect, GLsizei primcount, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTPROC) (GLenum mode, const GLvoid *indirect, GLsizei primcount, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const GLvoid *indirect, GLsizei primcount, GLsizei stride); #define glMultiDrawArraysIndirect GLEW_GET_FUN(__glewMultiDrawArraysIndirect) #define glMultiDrawElementsIndirect GLEW_GET_FUN(__glewMultiDrawElementsIndirect) @@ -4693,6 +5779,20 @@ typedef void (GLAPIENTRY * PFNGLPROVOKINGVERTEXPROC) (GLenum mode); #endif /* GL_ARB_provoking_vertex */ +/* ----------------------- GL_ARB_query_buffer_object ---------------------- */ + +#ifndef GL_ARB_query_buffer_object +#define GL_ARB_query_buffer_object 1 + +#define GL_QUERY_BUFFER_BARRIER_BIT 0x00008000 +#define GL_QUERY_BUFFER 0x9192 +#define GL_QUERY_BUFFER_BINDING 0x9193 +#define GL_QUERY_RESULT_NO_WAIT 0x9194 + +#define GLEW_ARB_query_buffer_object GLEW_GET_VAR(__GLEW_ARB_query_buffer_object) + +#endif /* GL_ARB_query_buffer_object */ + /* ------------------ GL_ARB_robust_buffer_access_behavior ----------------- */ #ifndef GL_ARB_robust_buffer_access_behavior @@ -4847,6 +5947,17 @@ typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum #endif /* GL_ARB_seamless_cube_map */ +/* ------------------ GL_ARB_seamless_cubemap_per_texture ------------------ */ + +#ifndef GL_ARB_seamless_cubemap_per_texture +#define GL_ARB_seamless_cubemap_per_texture 1 + +#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F + +#define GLEW_ARB_seamless_cubemap_per_texture GLEW_GET_VAR(__GLEW_ARB_seamless_cubemap_per_texture) + +#endif /* GL_ARB_seamless_cubemap_per_texture */ + /* --------------------- GL_ARB_separate_shader_objects -------------------- */ #ifndef GL_ARB_separate_shader_objects @@ -5040,6 +6151,24 @@ typedef void (GLAPIENTRY * PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) (GLuint prog #endif /* GL_ARB_shader_bit_encoding */ +/* --------------------- GL_ARB_shader_draw_parameters --------------------- */ + +#ifndef GL_ARB_shader_draw_parameters +#define GL_ARB_shader_draw_parameters 1 + +#define GLEW_ARB_shader_draw_parameters GLEW_GET_VAR(__GLEW_ARB_shader_draw_parameters) + +#endif /* GL_ARB_shader_draw_parameters */ + +/* ------------------------ GL_ARB_shader_group_vote ----------------------- */ + +#ifndef GL_ARB_shader_group_vote +#define GL_ARB_shader_group_vote 1 + +#define GLEW_ARB_shader_group_vote GLEW_GET_VAR(__GLEW_ARB_shader_group_vote) + +#endif /* GL_ARB_shader_group_vote */ + /* --------------------- GL_ARB_shader_image_load_store -------------------- */ #ifndef GL_ARB_shader_image_load_store @@ -5379,7 +6508,7 @@ typedef void (GLAPIENTRY * PFNGLUNIFORMSUBROUTINESUIVPROC) (GLenum shadertype, G #define GL_NAMED_STRING_LENGTH_ARB 0x8DE9 #define GL_NAMED_STRING_TYPE_ARB 0x8DEA -typedef void (GLAPIENTRY * PFNGLCOMPILESHADERINCLUDEARBPROC) (GLuint shader, GLsizei count, const GLchar ** path, const GLint *length); +typedef void (GLAPIENTRY * PFNGLCOMPILESHADERINCLUDEARBPROC) (GLuint shader, GLsizei count, const GLchar* const *path, const GLint *length); typedef void (GLAPIENTRY * PFNGLDELETENAMEDSTRINGARBPROC) (GLint namelen, const GLchar* name); typedef void (GLAPIENTRY * PFNGLGETNAMEDSTRINGARBPROC) (GLint namelen, const GLchar* name, GLsizei bufSize, GLint *stringlen, GLchar *string); typedef void (GLAPIENTRY * PFNGLGETNAMEDSTRINGIVARBPROC) (GLint namelen, const GLchar* name, GLenum pname, GLint *params); @@ -5430,6 +6559,33 @@ typedef void (GLAPIENTRY * PFNGLNAMEDSTRINGARBPROC) (GLenum type, GLint namelen, #endif /* GL_ARB_shadow_ambient */ +/* ------------------------- GL_ARB_sparse_texture ------------------------- */ + +#ifndef GL_ARB_sparse_texture +#define GL_ARB_sparse_texture 1 + +#define GL_VIRTUAL_PAGE_SIZE_X_ARB 0x9195 +#define GL_VIRTUAL_PAGE_SIZE_Y_ARB 0x9196 +#define GL_VIRTUAL_PAGE_SIZE_Z_ARB 0x9197 +#define GL_MAX_SPARSE_TEXTURE_SIZE_ARB 0x9198 +#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_ARB 0x9199 +#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_ARB 0x919A +#define GL_TEXTURE_SPARSE_ARB 0x91A6 +#define GL_VIRTUAL_PAGE_SIZE_INDEX_ARB 0x91A7 +#define GL_NUM_VIRTUAL_PAGE_SIZES_ARB 0x91A8 +#define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_ARB 0x91A9 +#define GL_NUM_SPARSE_LEVELS_ARB 0x91AA + +typedef void (GLAPIENTRY * PFNGLTEXPAGECOMMITMENTARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); +typedef void (GLAPIENTRY * PFNGLTEXTUREPAGECOMMITMENTEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); + +#define glTexPageCommitmentARB GLEW_GET_FUN(__glewTexPageCommitmentARB) +#define glTexturePageCommitmentEXT GLEW_GET_FUN(__glewTexturePageCommitmentEXT) + +#define GLEW_ARB_sparse_texture GLEW_GET_VAR(__GLEW_ARB_sparse_texture) + +#endif /* GL_ARB_sparse_texture */ + /* ------------------------ GL_ARB_stencil_texturing ----------------------- */ #ifndef GL_ARB_stencil_texturing @@ -5605,13 +6761,13 @@ typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFERRANGEEXTPROC) (GLuint texture, GLen #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); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *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 GLvoid *data); +typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, GLvoid *img); #define glCompressedTexImage1DARB GLEW_GET_FUN(__glewCompressedTexImage1DARB) #define glCompressedTexImage2DARB GLEW_GET_FUN(__glewCompressedTexImage2DARB) @@ -5797,6 +6953,17 @@ typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GL #endif /* GL_ARB_texture_gather */ +/* ------------------ GL_ARB_texture_mirror_clamp_to_edge ------------------ */ + +#ifndef GL_ARB_texture_mirror_clamp_to_edge +#define GL_ARB_texture_mirror_clamp_to_edge 1 + +#define GL_MIRROR_CLAMP_TO_EDGE 0x8743 + +#define GLEW_ARB_texture_mirror_clamp_to_edge GLEW_GET_VAR(__GLEW_ARB_texture_mirror_clamp_to_edge) + +#endif /* GL_ARB_texture_mirror_clamp_to_edge */ + /* --------------------- GL_ARB_texture_mirrored_repeat -------------------- */ #ifndef GL_ARB_texture_mirrored_repeat @@ -5937,6 +7104,18 @@ typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsiz #endif /* GL_ARB_texture_rgb10_a2ui */ +/* ------------------------ GL_ARB_texture_stencil8 ------------------------ */ + +#ifndef GL_ARB_texture_stencil8 +#define GL_ARB_texture_stencil8 1 + +#define GL_STENCIL_INDEX 0x1901 +#define GL_STENCIL_INDEX8 0x8D48 + +#define GLEW_ARB_texture_stencil8 GLEW_GET_VAR(__GLEW_ARB_texture_stencil8) + +#endif /* GL_ARB_texture_stencil8 */ + /* ------------------------- GL_ARB_texture_storage ------------------------ */ #ifndef GL_ARB_texture_storage @@ -6228,13 +7407,6 @@ typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYPROC) (GLuint array); #ifndef GL_ARB_vertex_attrib_64bit #define GL_ARB_vertex_attrib_64bit 1 -#define GL_DOUBLE_MAT2 0x8F46 -#define GL_DOUBLE_MAT3 0x8F47 -#define GL_DOUBLE_MAT4 0x8F48 -#define GL_DOUBLE_VEC2 0x8FFC -#define GL_DOUBLE_VEC3 0x8FFD -#define GL_DOUBLE_VEC4 0x8FFE - typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLDVPROC) (GLuint index, GLenum pname, GLdouble* params); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DPROC) (GLuint index, GLdouble x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DVPROC) (GLuint index, const GLdouble* v); @@ -6407,13 +7579,13 @@ typedef ptrdiff_t GLintptrARB; typedef ptrdiff_t GLsizeiptrARB; 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 * 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 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); @@ -6528,7 +7700,7 @@ typedef void (GLAPIENTRY * PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, 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 * PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, GLvoid *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); @@ -6543,7 +7715,7 @@ typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, 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 * PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const GLvoid *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); @@ -6580,7 +7752,7 @@ typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLs 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); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); #define glBindProgramARB GLEW_GET_FUN(__glewBindProgramARB) #define glDeleteProgramsARB GLEW_GET_FUN(__glewDeleteProgramsARB) @@ -6674,6 +7846,17 @@ typedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programO #endif /* GL_ARB_vertex_shader */ +/* ------------------- GL_ARB_vertex_type_10f_11f_11f_rev ------------------ */ + +#ifndef GL_ARB_vertex_type_10f_11f_11f_rev +#define GL_ARB_vertex_type_10f_11f_11f_rev 1 + +#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B + +#define GLEW_ARB_vertex_type_10f_11f_11f_rev GLEW_GET_VAR(__GLEW_ARB_vertex_type_10f_11f_11f_rev) + +#endif /* GL_ARB_vertex_type_10f_11f_11f_rev */ + /* ------------------- GL_ARB_vertex_type_2_10_10_10_rev ------------------- */ #ifndef GL_ARB_vertex_type_2_10_10_10_rev @@ -6947,7 +8130,7 @@ typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum* bu 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); +typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERATIPROC) (GLenum type, const GLvoid *pointer); #define glDrawElementArrayATI GLEW_GET_FUN(__glewDrawElementArrayATI) #define glDrawRangeElementArrayATI GLEW_GET_FUN(__glewDrawRangeElementArrayATI) @@ -7253,8 +8436,8 @@ typedef void (GLAPIENTRY * PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum 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 GLuint (GLAPIENTRY * PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const GLvoid *pointer, GLenum usage); +typedef void (GLAPIENTRY * PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const GLvoid *pointer, GLenum preserve); typedef void (GLAPIENTRY * PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); #define glArrayObjectATI GLEW_GET_FUN(__glewArrayObjectATI) @@ -7598,7 +8781,7 @@ typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); #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 * PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); typedef void (GLAPIENTRY * PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); #define glColorSubTableEXT GLEW_GET_FUN(__glewColorSubTableEXT) @@ -7652,19 +8835,19 @@ typedef void (GLAPIENTRY * PFNGLUNLOCKARRAYSEXTPROC) (void); #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 * PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *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 * PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *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); +typedef void (GLAPIENTRY * PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); +typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); #define glConvolutionFilter1DEXT GLEW_GET_FUN(__glewConvolutionFilter1DEXT) #define glConvolutionFilter2DEXT GLEW_GET_FUN(__glewConvolutionFilter2DEXT) @@ -7704,8 +8887,8 @@ typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum #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); +typedef void (GLAPIENTRY * PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLvoid *pointer); +typedef void (GLAPIENTRY * PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, GLvoid *pointer); #define glBinormalPointerEXT GLEW_GET_FUN(__glewBinormalPointerEXT) #define glTangentPointerEXT GLEW_GET_FUN(__glewTangentPointerEXT) @@ -7799,18 +8982,18 @@ typedef void (GLAPIENTRY * PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zma typedef void (GLAPIENTRY * PFNGLBINDMULTITEXTUREEXTPROC) (GLenum texunit, GLenum target, GLuint texture); typedef GLenum (GLAPIENTRY * PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC) (GLuint framebuffer, GLenum target); typedef void (GLAPIENTRY * PFNGLCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void* data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void* data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, 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 * PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void* data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void* data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, 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 * PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, 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 * PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, 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 * PFNGLCOPYMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); @@ -7835,8 +9018,8 @@ typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC) (GLuint framebuff typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERREADBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); typedef void (GLAPIENTRY * PFNGLGENERATEMULTITEXMIPMAPEXTPROC) (GLenum texunit, GLenum target); typedef void (GLAPIENTRY * PFNGLGENERATETEXTUREMIPMAPEXTPROC) (GLuint texture, GLenum target); -typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, void* img); -typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, void* img); +typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, GLvoid *img); +typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, GLvoid *img); typedef void (GLAPIENTRY * PFNGLGETDOUBLEINDEXEDVEXTPROC) (GLenum target, GLuint index, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETDOUBLEI_VEXTPROC) (GLenum pname, GLuint index, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETFLOATINDEXEDVEXTPROC) (GLenum target, GLuint index, GLfloat* params); @@ -7847,7 +9030,7 @@ typedef void (GLAPIENTRY * PFNGLGETMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void* pixels); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); typedef void (GLAPIENTRY * PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params); @@ -7856,18 +9039,18 @@ typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC) (GLuint buffer, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPOINTERVEXTPROC) (GLuint buffer, GLenum pname, void** params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void* data); +typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLvoid *data); typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLint* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum pname, void* string); +typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum pname, GLvoid *string); typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMIVEXTPROC) (GLuint program, GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC) (GLuint renderbuffer, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETPOINTERINDEXEDVEXTPROC) (GLenum target, GLuint index, GLvoid** params); typedef void (GLAPIENTRY * PFNGLGETPOINTERI_VEXTPROC) (GLenum pname, GLuint index, GLvoid** params); -typedef void (GLAPIENTRY * PFNGLGETTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void* pixels); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint* params); @@ -7900,7 +9083,7 @@ typedef void (GLAPIENTRY * PFNGLMATRIXSCALEFEXTPROC) (GLenum matrixMode, GLfloat typedef void (GLAPIENTRY * PFNGLMATRIXTRANSLATEDEXTPROC) (GLenum matrixMode, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLMATRIXTRANSLATEFEXTPROC) (GLenum matrixMode, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLMULTITEXBUFFEREXTPROC) (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDPOINTEREXTPROC) (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void* pointer); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDPOINTEREXTPROC) (GLenum texunit, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); typedef void (GLAPIENTRY * PFNGLMULTITEXENVFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLMULTITEXENVIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); @@ -7911,9 +9094,9 @@ typedef void (GLAPIENTRY * PFNGLMULTITEXGENFEXTPROC) (GLenum texunit, GLenum coo typedef void (GLAPIENTRY * PFNGLMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLMULTITEXGENIEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void* pixels); -typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels); -typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels); +typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLuint* params); typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); @@ -7921,11 +9104,11 @@ typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLe typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* param); typedef void (GLAPIENTRY * PFNGLMULTITEXRENDERBUFFEREXTPROC) (GLenum texunit, GLenum target, GLuint renderbuffer); -typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* pixels); -typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels); -typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels); -typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLsizeiptr size, const void* data, GLenum usage); -typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data); +typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE3DEXTPROC) (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); +typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLsizeiptr size, const GLvoid *data, GLenum usage); +typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const GLvoid *data); typedef void (GLAPIENTRY * PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); @@ -7945,65 +9128,48 @@ typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC) (GLuint typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint* params); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint* params); -typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum format, GLsizei len, const void* string); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum format, GLsizei len, const GLvoid *string); typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC) (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DEXTPROC) (GLuint program, GLint location, GLdouble x); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFEREXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); -typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void* pixels); -typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels); -typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels); +typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLuint* params); typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat param); @@ -8011,9 +9177,9 @@ typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLen typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint* param); typedef void (GLAPIENTRY * PFNGLTEXTURERENDERBUFFEREXTPROC) (GLuint texture, GLenum target, GLuint renderbuffer); -typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* pixels); -typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels); -typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels); +typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE3DEXTPROC) (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); typedef GLboolean (GLAPIENTRY * PFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset); @@ -8180,55 +9346,38 @@ typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC) (GLuint vaobj, G #define glNamedRenderbufferStorageEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageEXT) #define glNamedRenderbufferStorageMultisampleCoverageEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisampleCoverageEXT) #define glNamedRenderbufferStorageMultisampleEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisampleEXT) -#define glProgramUniform1dEXT GLEW_GET_FUN(__glewProgramUniform1dEXT) -#define glProgramUniform1dvEXT GLEW_GET_FUN(__glewProgramUniform1dvEXT) #define glProgramUniform1fEXT GLEW_GET_FUN(__glewProgramUniform1fEXT) #define glProgramUniform1fvEXT GLEW_GET_FUN(__glewProgramUniform1fvEXT) #define glProgramUniform1iEXT GLEW_GET_FUN(__glewProgramUniform1iEXT) #define glProgramUniform1ivEXT GLEW_GET_FUN(__glewProgramUniform1ivEXT) #define glProgramUniform1uiEXT GLEW_GET_FUN(__glewProgramUniform1uiEXT) #define glProgramUniform1uivEXT GLEW_GET_FUN(__glewProgramUniform1uivEXT) -#define glProgramUniform2dEXT GLEW_GET_FUN(__glewProgramUniform2dEXT) -#define glProgramUniform2dvEXT GLEW_GET_FUN(__glewProgramUniform2dvEXT) #define glProgramUniform2fEXT GLEW_GET_FUN(__glewProgramUniform2fEXT) #define glProgramUniform2fvEXT GLEW_GET_FUN(__glewProgramUniform2fvEXT) #define glProgramUniform2iEXT GLEW_GET_FUN(__glewProgramUniform2iEXT) #define glProgramUniform2ivEXT GLEW_GET_FUN(__glewProgramUniform2ivEXT) #define glProgramUniform2uiEXT GLEW_GET_FUN(__glewProgramUniform2uiEXT) #define glProgramUniform2uivEXT GLEW_GET_FUN(__glewProgramUniform2uivEXT) -#define glProgramUniform3dEXT GLEW_GET_FUN(__glewProgramUniform3dEXT) -#define glProgramUniform3dvEXT GLEW_GET_FUN(__glewProgramUniform3dvEXT) #define glProgramUniform3fEXT GLEW_GET_FUN(__glewProgramUniform3fEXT) #define glProgramUniform3fvEXT GLEW_GET_FUN(__glewProgramUniform3fvEXT) #define glProgramUniform3iEXT GLEW_GET_FUN(__glewProgramUniform3iEXT) #define glProgramUniform3ivEXT GLEW_GET_FUN(__glewProgramUniform3ivEXT) #define glProgramUniform3uiEXT GLEW_GET_FUN(__glewProgramUniform3uiEXT) #define glProgramUniform3uivEXT GLEW_GET_FUN(__glewProgramUniform3uivEXT) -#define glProgramUniform4dEXT GLEW_GET_FUN(__glewProgramUniform4dEXT) -#define glProgramUniform4dvEXT GLEW_GET_FUN(__glewProgramUniform4dvEXT) #define glProgramUniform4fEXT GLEW_GET_FUN(__glewProgramUniform4fEXT) #define glProgramUniform4fvEXT GLEW_GET_FUN(__glewProgramUniform4fvEXT) #define glProgramUniform4iEXT GLEW_GET_FUN(__glewProgramUniform4iEXT) #define glProgramUniform4ivEXT GLEW_GET_FUN(__glewProgramUniform4ivEXT) #define glProgramUniform4uiEXT GLEW_GET_FUN(__glewProgramUniform4uiEXT) #define glProgramUniform4uivEXT GLEW_GET_FUN(__glewProgramUniform4uivEXT) -#define glProgramUniformMatrix2dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2dvEXT) #define glProgramUniformMatrix2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2fvEXT) -#define glProgramUniformMatrix2x3dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x3dvEXT) #define glProgramUniformMatrix2x3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x3fvEXT) -#define glProgramUniformMatrix2x4dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x4dvEXT) #define glProgramUniformMatrix2x4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x4fvEXT) -#define glProgramUniformMatrix3dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3dvEXT) #define glProgramUniformMatrix3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3fvEXT) -#define glProgramUniformMatrix3x2dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x2dvEXT) #define glProgramUniformMatrix3x2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x2fvEXT) -#define glProgramUniformMatrix3x4dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x4dvEXT) #define glProgramUniformMatrix3x4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x4fvEXT) -#define glProgramUniformMatrix4dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4dvEXT) #define glProgramUniformMatrix4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4fvEXT) -#define glProgramUniformMatrix4x2dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x2dvEXT) #define glProgramUniformMatrix4x2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x2fvEXT) -#define glProgramUniformMatrix4x3dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x3dvEXT) #define glProgramUniformMatrix4x3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x3fvEXT) #define glPushClientAttribDefaultEXT GLEW_GET_FUN(__glewPushClientAttribDefaultEXT) #define glTextureBufferEXT GLEW_GET_FUN(__glewTextureBufferEXT) @@ -8742,10 +9891,10 @@ typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIPOINTEREXTPROC) (GLuint index, GLin #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 * PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *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 * PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *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); @@ -8854,7 +10003,7 @@ typedef void (GLAPIENTRY * PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mod #define GL_EXT_multi_draw_arrays 1 typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint* first, const GLsizei *count, GLsizei primcount); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, GLsizei* count, GLenum type, const GLvoid **indices, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, GLsizei* count, GLenum type, const GLvoid * const *indices, GLsizei primcount); #define glMultiDrawArraysEXT GLEW_GET_FUN(__glewMultiDrawArraysEXT) #define glMultiDrawElementsEXT GLEW_GET_FUN(__glewMultiDrawElementsEXT) @@ -8965,8 +10114,8 @@ typedef void (GLAPIENTRY * PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); #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 * PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *data); typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); @@ -9337,9 +10486,9 @@ typedef void (GLAPIENTRY * PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); #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); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *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 GLvoid *pixels); #define glTexSubImage1DEXT GLEW_GET_FUN(__glewTexSubImage1DEXT) #define glTexSubImage2DEXT GLEW_GET_FUN(__glewTexSubImage2DEXT) @@ -9416,7 +10565,7 @@ typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint leve #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); +typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); #define glTexImage3DEXT GLEW_GET_FUN(__glewTexImage3DEXT) @@ -9554,18 +10703,6 @@ typedef void (GLAPIENTRY * PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum interna #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 */ @@ -9936,7 +11073,7 @@ typedef void (GLAPIENTRY * PFNGLBINDBUFFEROFFSETEXTPROC) (GLenum target, GLuint typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGEEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKEXTPROC) (void); typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei *size, GLenum *type, GLchar *name); -typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) (GLuint program, GLsizei count, const GLchar ** varyings, GLenum bufferMode); +typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) (GLuint program, GLsizei count, const GLchar * const* varyings, GLenum bufferMode); #define glBeginTransformFeedbackEXT GLEW_GET_FUN(__glewBeginTransformFeedbackEXT) #define glBindBufferBaseEXT GLEW_GET_FUN(__glewBindBufferBaseEXT) @@ -9990,13 +11127,13 @@ typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) (GLuint progra #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 * PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *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 * 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); +typedef void (GLAPIENTRY * PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (GLAPIENTRY * PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); #define glArrayElementEXT GLEW_GET_FUN(__glewArrayElementEXT) #define glColorPointerEXT GLEW_GET_FUN(__glewColorPointerEXT) @@ -10050,7 +11187,7 @@ typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DEXTPROC) (GLuint index, GLdouble typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DVEXTPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DVEXTPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); #define glGetVertexAttribLdvEXT GLEW_GET_FUN(__glewGetVertexAttribLdvEXT) #define glVertexArrayVertexAttribLOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribLOffsetEXT) @@ -10293,7 +11430,7 @@ typedef void (GLAPIENTRY * PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum #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 * PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer); typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFVEXTPROC) (GLfloat* weight); @@ -10338,7 +11475,7 @@ typedef void (GLAPIENTRY * PFNGLFRAMETERMINATORGREMEDYPROC) (void); #ifndef GL_GREMEDY_string_marker #define GL_GREMEDY_string_marker 1 -typedef void (GLAPIENTRY * PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const void* string); +typedef void (GLAPIENTRY * PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const GLvoid *string); #define glStringMarkerGREMEDY GLEW_GET_FUN(__glewStringMarkerGREMEDY) @@ -10383,9 +11520,6 @@ typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, #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 */ @@ -10532,6 +11666,28 @@ typedef void (GLAPIENTRY * PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum ty #endif /* GL_INGR_interlace_read */ +/* -------------------------- GL_INTEL_map_texture ------------------------- */ + +#ifndef GL_INTEL_map_texture +#define GL_INTEL_map_texture 1 + +#define GL_LAYOUT_DEFAULT_INTEL 0 +#define GL_LAYOUT_LINEAR_INTEL 1 +#define GL_LAYOUT_LINEAR_CPU_CACHED_INTEL 2 +#define GL_TEXTURE_MEMORY_LAYOUT_INTEL 0x83FF + +typedef GLvoid * (GLAPIENTRY * PFNGLMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level, GLbitfield access, GLint* stride, GLenum *layout); +typedef void (GLAPIENTRY * PFNGLSYNCTEXTUREINTELPROC) (GLuint texture); +typedef void (GLAPIENTRY * PFNGLUNMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level); + +#define glMapTexture2DINTEL GLEW_GET_FUN(__glewMapTexture2DINTEL) +#define glSyncTextureINTEL GLEW_GET_FUN(__glewSyncTextureINTEL) +#define glUnmapTexture2DINTEL GLEW_GET_FUN(__glewUnmapTexture2DINTEL) + +#define GLEW_INTEL_map_texture GLEW_GET_VAR(__GLEW_INTEL_map_texture) + +#endif /* GL_INTEL_map_texture */ + /* ------------------------ GL_INTEL_parallel_arrays ----------------------- */ #ifndef GL_INTEL_parallel_arrays @@ -10620,15 +11776,15 @@ typedef void (GLAPIENTRY * PFNGLTEXSCISSORINTELPROC) (GLenum target, GLclampf tl typedef void (APIENTRY *GLDEBUGPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, GLvoid* userParam); -typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, void* userParam); +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, const GLvoid *userParam); typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled); typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf); typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufsize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog); typedef void (GLAPIENTRY * PFNGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei* length, GLchar *label); typedef void (GLAPIENTRY * PFNGLGETOBJECTPTRLABELPROC) (void* ptr, GLsizei bufSize, GLsizei* length, GLchar *label); -typedef void (GLAPIENTRY * PFNGLGETPOINTERVPROC) (GLenum pname, void** params); typedef void (GLAPIENTRY * PFNGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar* label); typedef void (GLAPIENTRY * PFNGLOBJECTPTRLABELPROC) (void* ptr, GLsizei length, const GLchar* label); +typedef void (GLAPIENTRY * PFNGLPOPDEBUGGROUPPROC) (void); typedef void (GLAPIENTRY * PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar * message); #define glDebugMessageCallback GLEW_GET_FUN(__glewDebugMessageCallback) @@ -10637,9 +11793,9 @@ typedef void (GLAPIENTRY * PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, G #define glGetDebugMessageLog GLEW_GET_FUN(__glewGetDebugMessageLog) #define glGetObjectLabel GLEW_GET_FUN(__glewGetObjectLabel) #define glGetObjectPtrLabel GLEW_GET_FUN(__glewGetObjectPtrLabel) -#define glGetPointerv GLEW_GET_FUN(__glewGetPointerv) #define glObjectLabel GLEW_GET_FUN(__glewObjectLabel) #define glObjectPtrLabel GLEW_GET_FUN(__glewObjectPtrLabel) +#define glPopDebugGroup GLEW_GET_FUN(__glewPopDebugGroup) #define glPushDebugGroup GLEW_GET_FUN(__glewPushDebugGroup) #define GLEW_KHR_debug GLEW_GET_VAR(__GLEW_KHR_debug) @@ -10822,6 +11978,21 @@ typedef void (GLAPIENTRY * PFNGLWINDOWPOS4SVMESAPROC) (const GLshort* p); #endif /* GL_MESA_ycbcr_texture */ +/* ----------------------- GL_NVX_conditional_render ----------------------- */ + +#ifndef GL_NVX_conditional_render +#define GL_NVX_conditional_render 1 + +typedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERNVXPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERNVXPROC) (void); + +#define glBeginConditionalRenderNVX GLEW_GET_FUN(__glewBeginConditionalRenderNVX) +#define glEndConditionalRenderNVX GLEW_GET_FUN(__glewEndConditionalRenderNVX) + +#define GLEW_NVX_conditional_render GLEW_GET_VAR(__GLEW_NVX_conditional_render) + +#endif /* GL_NVX_conditional_render */ + /* ------------------------- GL_NVX_gpu_memory_info ------------------------ */ #ifndef GL_NVX_gpu_memory_info @@ -10837,6 +12008,21 @@ typedef void (GLAPIENTRY * PFNGLWINDOWPOS4SVMESAPROC) (const GLshort* p); #endif /* GL_NVX_gpu_memory_info */ +/* ------------------- GL_NV_bindless_multi_draw_indirect ------------------ */ + +#ifndef GL_NV_bindless_multi_draw_indirect +#define GL_NV_bindless_multi_draw_indirect 1 + +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC) (GLenum mode, const GLvoid *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC) (GLenum mode, GLenum type, const GLvoid *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); + +#define glMultiDrawArraysIndirectBindlessNV GLEW_GET_FUN(__glewMultiDrawArraysIndirectBindlessNV) +#define glMultiDrawElementsIndirectBindlessNV GLEW_GET_FUN(__glewMultiDrawElementsIndirectBindlessNV) + +#define GLEW_NV_bindless_multi_draw_indirect GLEW_GET_VAR(__GLEW_NV_bindless_multi_draw_indirect) + +#endif /* GL_NV_bindless_multi_draw_indirect */ + /* ------------------------- GL_NV_bindless_texture ------------------------ */ #ifndef GL_NV_bindless_texture @@ -10874,6 +12060,77 @@ typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64VNVPROC) (GLint location, GLsiz #endif /* GL_NV_bindless_texture */ +/* --------------------- GL_NV_blend_equation_advanced --------------------- */ + +#ifndef GL_NV_blend_equation_advanced +#define GL_NV_blend_equation_advanced 1 + +#define GL_BLEND_PREMULTIPLIED_SRC_NV 0x9280 +#define GL_BLEND_OVERLAP_NV 0x9281 +#define GL_UNCORRELATED_NV 0x9282 +#define GL_DISJOINT_NV 0x9283 +#define GL_CONJOINT_NV 0x9284 +#define GL_BLEND_ADVANCED_COHERENT_NV 0x9285 +#define GL_SRC_NV 0x9286 +#define GL_DST_NV 0x9287 +#define GL_SRC_OVER_NV 0x9288 +#define GL_DST_OVER_NV 0x9289 +#define GL_SRC_IN_NV 0x928A +#define GL_DST_IN_NV 0x928B +#define GL_SRC_OUT_NV 0x928C +#define GL_DST_OUT_NV 0x928D +#define GL_SRC_ATOP_NV 0x928E +#define GL_DST_ATOP_NV 0x928F +#define GL_PLUS_NV 0x9291 +#define GL_PLUS_DARKER_NV 0x9292 +#define GL_MULTIPLY_NV 0x9294 +#define GL_SCREEN_NV 0x9295 +#define GL_OVERLAY_NV 0x9296 +#define GL_DARKEN_NV 0x9297 +#define GL_LIGHTEN_NV 0x9298 +#define GL_COLORDODGE_NV 0x9299 +#define GL_COLORBURN_NV 0x929A +#define GL_HARDLIGHT_NV 0x929B +#define GL_SOFTLIGHT_NV 0x929C +#define GL_DIFFERENCE_NV 0x929E +#define GL_MINUS_NV 0x929F +#define GL_EXCLUSION_NV 0x92A0 +#define GL_CONTRAST_NV 0x92A1 +#define GL_INVERT_RGB_NV 0x92A3 +#define GL_LINEARDODGE_NV 0x92A4 +#define GL_LINEARBURN_NV 0x92A5 +#define GL_VIVIDLIGHT_NV 0x92A6 +#define GL_LINEARLIGHT_NV 0x92A7 +#define GL_PINLIGHT_NV 0x92A8 +#define GL_HARDMIX_NV 0x92A9 +#define GL_HSL_HUE_NV 0x92AD +#define GL_HSL_SATURATION_NV 0x92AE +#define GL_HSL_COLOR_NV 0x92AF +#define GL_HSL_LUMINOSITY_NV 0x92B0 +#define GL_PLUS_CLAMPED_NV 0x92B1 +#define GL_PLUS_CLAMPED_ALPHA_NV 0x92B2 +#define GL_MINUS_CLAMPED_NV 0x92B3 +#define GL_INVERT_OVG_NV 0x92B4 + +typedef void (GLAPIENTRY * PFNGLBLENDBARRIERNVPROC) (void); +typedef void (GLAPIENTRY * PFNGLBLENDPARAMETERINVPROC) (GLenum pname, GLint value); + +#define glBlendBarrierNV GLEW_GET_FUN(__glewBlendBarrierNV) +#define glBlendParameteriNV GLEW_GET_FUN(__glewBlendParameteriNV) + +#define GLEW_NV_blend_equation_advanced GLEW_GET_VAR(__GLEW_NV_blend_equation_advanced) + +#endif /* GL_NV_blend_equation_advanced */ + +/* ----------------- GL_NV_blend_equation_advanced_coherent ---------------- */ + +#ifndef GL_NV_blend_equation_advanced_coherent +#define GL_NV_blend_equation_advanced_coherent 1 + +#define GLEW_NV_blend_equation_advanced_coherent GLEW_GET_VAR(__GLEW_NV_blend_equation_advanced_coherent) + +#endif /* GL_NV_blend_equation_advanced_coherent */ + /* --------------------------- GL_NV_blend_square -------------------------- */ #ifndef GL_NV_blend_square @@ -10883,6 +12140,18 @@ typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64VNVPROC) (GLint location, GLsiz #endif /* GL_NV_blend_square */ +/* ------------------------- GL_NV_compute_program5 ------------------------ */ + +#ifndef GL_NV_compute_program5 +#define GL_NV_compute_program5 1 + +#define GL_COMPUTE_PROGRAM_NV 0x90FB +#define GL_COMPUTE_PROGRAM_PARAMETER_BUFFER_NV 0x90FC + +#define GLEW_NV_compute_program5 GLEW_GET_VAR(__GLEW_NV_compute_program5) + +#endif /* GL_NV_compute_program5 */ + /* ------------------------ GL_NV_conditional_render ----------------------- */ #ifndef GL_NV_conditional_render @@ -10928,6 +12197,18 @@ typedef void (GLAPIENTRY * PFNGLCOPYIMAGESUBDATANVPROC) (GLuint srcName, GLenum #endif /* GL_NV_copy_image */ +/* -------------------------- GL_NV_deep_texture3D ------------------------- */ + +#ifndef GL_NV_deep_texture3D +#define GL_NV_deep_texture3D 1 + +#define GL_MAX_DEEP_3D_TEXTURE_WIDTH_HEIGHT_NV 0x90D0 +#define GL_MAX_DEEP_3D_TEXTURE_DEPTH_NV 0x90D1 + +#define GLEW_NV_deep_texture3D GLEW_GET_VAR(__GLEW_NV_deep_texture3D) + +#endif /* GL_NV_deep_texture3D */ + /* ------------------------ GL_NV_depth_buffer_float ----------------------- */ #ifndef GL_NV_depth_buffer_float @@ -10976,6 +12257,19 @@ typedef void (GLAPIENTRY * PFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFa #endif /* GL_NV_depth_range_unclamped */ +/* --------------------------- GL_NV_draw_texture -------------------------- */ + +#ifndef GL_NV_draw_texture +#define GL_NV_draw_texture 1 + +typedef void (GLAPIENTRY * PFNGLDRAWTEXTURENVPROC) (GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); + +#define glDrawTextureNV GLEW_GET_FUN(__glewDrawTextureNV) + +#define GLEW_NV_draw_texture GLEW_GET_VAR(__GLEW_NV_draw_texture) + +#endif /* GL_NV_draw_texture */ + /* ---------------------------- GL_NV_evaluators --------------------------- */ #ifndef GL_NV_evaluators @@ -11009,10 +12303,10 @@ typedef void (GLAPIENTRY * PFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFa 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 * PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, GLvoid *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 * PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const GLvoid *points); typedef void (GLAPIENTRY * PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint* params); @@ -11292,6 +12586,15 @@ typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) (GLenum targe #endif /* GL_NV_gpu_program5 */ +/* -------------------- GL_NV_gpu_program5_mem_extended -------------------- */ + +#ifndef GL_NV_gpu_program5_mem_extended +#define GL_NV_gpu_program5_mem_extended 1 + +#define GLEW_NV_gpu_program5_mem_extended GLEW_GET_VAR(__GLEW_NV_gpu_program5_mem_extended) + +#endif /* GL_NV_gpu_program5_mem_extended */ + /* ------------------------- GL_NV_gpu_program_fp64 ------------------------ */ #ifndef GL_NV_gpu_program_fp64 @@ -11533,7 +12836,6 @@ typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalf* weight); #ifndef GL_NV_multisample_coverage #define GL_NV_multisample_coverage 1 -#define GL_COVERAGE_SAMPLES_NV 0x80A9 #define GL_COLOR_SAMPLES_NV 0x8E20 #define GLEW_NV_multisample_coverage GLEW_GET_VAR(__GLEW_NV_multisample_coverage) @@ -11675,8 +12977,6 @@ typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, #define GL_ARC_TO_NV 0xFE #define GL_RELATIVE_ARC_TO_NV 0xFF #define GL_GLYPH_HAS_KERNING_BIT_NV 0x100 -#define GL_PRIMARY_COLOR_NV 0x852C -#define GL_SECONDARY_COLOR_NV 0x852D #define GL_PRIMARY_COLOR 0x8577 #define GL_PATH_FORMAT_SVG_NV 0x9070 #define GL_PATH_FORMAT_PS_NV 0x9071 @@ -11878,7 +13178,7 @@ typedef void (GLAPIENTRY * PFNGLWEIGHTPATHSNVPROC) (GLuint resultPath, GLsizei n #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); +typedef void (GLAPIENTRY * PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, GLvoid *pointer); #define glFlushPixelDataRangeNV GLEW_GET_FUN(__glewFlushPixelDataRangeNV) #define glPixelDataRangeNV GLEW_GET_FUN(__glewPixelDataRangeNV) @@ -12060,6 +13360,15 @@ typedef void (GLAPIENTRY * PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage #endif /* GL_NV_register_combiners2 */ +/* ---------------------- GL_NV_shader_atomic_counters --------------------- */ + +#ifndef GL_NV_shader_atomic_counters +#define GL_NV_shader_atomic_counters 1 + +#define GLEW_NV_shader_atomic_counters GLEW_GET_VAR(__GLEW_NV_shader_atomic_counters) + +#endif /* GL_NV_shader_atomic_counters */ + /* ----------------------- GL_NV_shader_atomic_float ----------------------- */ #ifndef GL_NV_shader_atomic_float @@ -12110,6 +13419,15 @@ typedef void (GLAPIENTRY * PFNGLUNIFORMUI64VNVPROC) (GLint location, GLsizei cou #endif /* GL_NV_shader_buffer_load */ +/* ------------------- GL_NV_shader_storage_buffer_object ------------------ */ + +#ifndef GL_NV_shader_storage_buffer_object +#define GL_NV_shader_storage_buffer_object 1 + +#define GLEW_NV_shader_storage_buffer_object GLEW_GET_VAR(__GLEW_NV_shader_storage_buffer_object) + +#endif /* GL_NV_shader_storage_buffer_object */ + /* ---------------------- GL_NV_tessellation_program5 ---------------------- */ #ifndef GL_NV_tessellation_program5 @@ -12525,7 +13843,7 @@ typedef void (GLAPIENTRY * PFNGLVDPAUUNREGISTERSURFACENVPROC) (GLvdpauSurfaceNV #define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, void* pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, GLvoid *pointer); #define glFlushVertexArrayRangeNV GLEW_GET_FUN(__glewFlushVertexArrayRangeNV) #define glVertexArrayRangeNV GLEW_GET_FUN(__glewVertexArrayRangeNV) @@ -12797,7 +14115,7 @@ typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, 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 * PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *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); @@ -13003,8 +14321,6 @@ typedef void (GLAPIENTRY * PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC) (GLuint vid #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 */ @@ -13166,6 +14482,138 @@ typedef void (GLAPIENTRY * PFNGLORTHOFOESPROC) (GLfloat l, GLfloat r, GLfloat b, #endif /* GL_PGI_vertex_hints */ +/* ---------------------- GL_REGAL_ES1_0_compatibility --------------------- */ + +#ifndef GL_REGAL_ES1_0_compatibility +#define GL_REGAL_ES1_0_compatibility 1 + +typedef int GLclampx; + +typedef void (GLAPIENTRY * PFNGLALPHAFUNCXPROC) (GLenum func, GLclampx ref); +typedef void (GLAPIENTRY * PFNGLCLEARCOLORXPROC) (GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha); +typedef void (GLAPIENTRY * PFNGLCLEARDEPTHXPROC) (GLclampx depth); +typedef void (GLAPIENTRY * PFNGLCOLOR4XPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +typedef void (GLAPIENTRY * PFNGLDEPTHRANGEXPROC) (GLclampx zNear, GLclampx zFar); +typedef void (GLAPIENTRY * PFNGLFOGXPROC) (GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLFOGXVPROC) (GLenum pname, const GLfixed* params); +typedef void (GLAPIENTRY * PFNGLFRUSTUMFPROC) (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar); +typedef void (GLAPIENTRY * PFNGLFRUSTUMXPROC) (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar); +typedef void (GLAPIENTRY * PFNGLLIGHTMODELXPROC) (GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLLIGHTMODELXVPROC) (GLenum pname, const GLfixed* params); +typedef void (GLAPIENTRY * PFNGLLIGHTXPROC) (GLenum light, GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLLIGHTXVPROC) (GLenum light, GLenum pname, const GLfixed* params); +typedef void (GLAPIENTRY * PFNGLLINEWIDTHXPROC) (GLfixed width); +typedef void (GLAPIENTRY * PFNGLLOADMATRIXXPROC) (const GLfixed* m); +typedef void (GLAPIENTRY * PFNGLMATERIALXPROC) (GLenum face, GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLMATERIALXVPROC) (GLenum face, GLenum pname, const GLfixed* params); +typedef void (GLAPIENTRY * PFNGLMULTMATRIXXPROC) (const GLfixed* m); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4XPROC) (GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q); +typedef void (GLAPIENTRY * PFNGLNORMAL3XPROC) (GLfixed nx, GLfixed ny, GLfixed nz); +typedef void (GLAPIENTRY * PFNGLORTHOFPROC) (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar); +typedef void (GLAPIENTRY * PFNGLORTHOXPROC) (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar); +typedef void (GLAPIENTRY * PFNGLPOINTSIZEXPROC) (GLfixed size); +typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETXPROC) (GLfixed factor, GLfixed units); +typedef void (GLAPIENTRY * PFNGLROTATEXPROC) (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); +typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEXPROC) (GLclampx value, GLboolean invert); +typedef void (GLAPIENTRY * PFNGLSCALEXPROC) (GLfixed x, GLfixed y, GLfixed z); +typedef void (GLAPIENTRY * PFNGLTEXENVXPROC) (GLenum target, GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLTEXENVXVPROC) (GLenum target, GLenum pname, const GLfixed* params); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERXPROC) (GLenum target, GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLTRANSLATEXPROC) (GLfixed x, GLfixed y, GLfixed z); + +#define glAlphaFuncx GLEW_GET_FUN(__glewAlphaFuncx) +#define glClearColorx GLEW_GET_FUN(__glewClearColorx) +#define glClearDepthx GLEW_GET_FUN(__glewClearDepthx) +#define glColor4x GLEW_GET_FUN(__glewColor4x) +#define glDepthRangex GLEW_GET_FUN(__glewDepthRangex) +#define glFogx GLEW_GET_FUN(__glewFogx) +#define glFogxv GLEW_GET_FUN(__glewFogxv) +#define glFrustumf GLEW_GET_FUN(__glewFrustumf) +#define glFrustumx GLEW_GET_FUN(__glewFrustumx) +#define glLightModelx GLEW_GET_FUN(__glewLightModelx) +#define glLightModelxv GLEW_GET_FUN(__glewLightModelxv) +#define glLightx GLEW_GET_FUN(__glewLightx) +#define glLightxv GLEW_GET_FUN(__glewLightxv) +#define glLineWidthx GLEW_GET_FUN(__glewLineWidthx) +#define glLoadMatrixx GLEW_GET_FUN(__glewLoadMatrixx) +#define glMaterialx GLEW_GET_FUN(__glewMaterialx) +#define glMaterialxv GLEW_GET_FUN(__glewMaterialxv) +#define glMultMatrixx GLEW_GET_FUN(__glewMultMatrixx) +#define glMultiTexCoord4x GLEW_GET_FUN(__glewMultiTexCoord4x) +#define glNormal3x GLEW_GET_FUN(__glewNormal3x) +#define glOrthof GLEW_GET_FUN(__glewOrthof) +#define glOrthox GLEW_GET_FUN(__glewOrthox) +#define glPointSizex GLEW_GET_FUN(__glewPointSizex) +#define glPolygonOffsetx GLEW_GET_FUN(__glewPolygonOffsetx) +#define glRotatex GLEW_GET_FUN(__glewRotatex) +#define glSampleCoveragex GLEW_GET_FUN(__glewSampleCoveragex) +#define glScalex GLEW_GET_FUN(__glewScalex) +#define glTexEnvx GLEW_GET_FUN(__glewTexEnvx) +#define glTexEnvxv GLEW_GET_FUN(__glewTexEnvxv) +#define glTexParameterx GLEW_GET_FUN(__glewTexParameterx) +#define glTranslatex GLEW_GET_FUN(__glewTranslatex) + +#define GLEW_REGAL_ES1_0_compatibility GLEW_GET_VAR(__GLEW_REGAL_ES1_0_compatibility) + +#endif /* GL_REGAL_ES1_0_compatibility */ + +/* ---------------------- GL_REGAL_ES1_1_compatibility --------------------- */ + +#ifndef GL_REGAL_ES1_1_compatibility +#define GL_REGAL_ES1_1_compatibility 1 + +typedef void (GLAPIENTRY * PFNGLCLIPPLANEFPROC) (GLenum plane, const GLfloat* equation); +typedef void (GLAPIENTRY * PFNGLCLIPPLANEXPROC) (GLenum plane, const GLfixed* equation); +typedef void (GLAPIENTRY * PFNGLGETCLIPPLANEFPROC) (GLenum pname, GLfloat eqn[4]); +typedef void (GLAPIENTRY * PFNGLGETCLIPPLANEXPROC) (GLenum pname, GLfixed eqn[4]); +typedef void (GLAPIENTRY * PFNGLGETFIXEDVPROC) (GLenum pname, GLfixed* params); +typedef void (GLAPIENTRY * PFNGLGETLIGHTXVPROC) (GLenum light, GLenum pname, GLfixed* params); +typedef void (GLAPIENTRY * PFNGLGETMATERIALXVPROC) (GLenum face, GLenum pname, GLfixed* params); +typedef void (GLAPIENTRY * PFNGLGETTEXENVXVPROC) (GLenum env, GLenum pname, GLfixed* params); +typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERXVPROC) (GLenum target, GLenum pname, GLfixed* params); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERXPROC) (GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERXVPROC) (GLenum pname, const GLfixed* params); +typedef void (GLAPIENTRY * PFNGLPOINTSIZEPOINTEROESPROC) (GLenum type, GLsizei stride, const GLvoid* pointer); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERXVPROC) (GLenum target, GLenum pname, const GLfixed* params); + +#define glClipPlanef GLEW_GET_FUN(__glewClipPlanef) +#define glClipPlanex GLEW_GET_FUN(__glewClipPlanex) +#define glGetClipPlanef GLEW_GET_FUN(__glewGetClipPlanef) +#define glGetClipPlanex GLEW_GET_FUN(__glewGetClipPlanex) +#define glGetFixedv GLEW_GET_FUN(__glewGetFixedv) +#define glGetLightxv GLEW_GET_FUN(__glewGetLightxv) +#define glGetMaterialxv GLEW_GET_FUN(__glewGetMaterialxv) +#define glGetTexEnvxv GLEW_GET_FUN(__glewGetTexEnvxv) +#define glGetTexParameterxv GLEW_GET_FUN(__glewGetTexParameterxv) +#define glPointParameterx GLEW_GET_FUN(__glewPointParameterx) +#define glPointParameterxv GLEW_GET_FUN(__glewPointParameterxv) +#define glPointSizePointerOES GLEW_GET_FUN(__glewPointSizePointerOES) +#define glTexParameterxv GLEW_GET_FUN(__glewTexParameterxv) + +#define GLEW_REGAL_ES1_1_compatibility GLEW_GET_VAR(__GLEW_REGAL_ES1_1_compatibility) + +#endif /* GL_REGAL_ES1_1_compatibility */ + +/* ---------------------------- GL_REGAL_enable ---------------------------- */ + +#ifndef GL_REGAL_enable +#define GL_REGAL_enable 1 + +#define GL_ERROR_REGAL 0x9322 +#define GL_DEBUG_REGAL 0x9323 +#define GL_LOG_REGAL 0x9324 +#define GL_EMULATION_REGAL 0x9325 +#define GL_DRIVER_REGAL 0x9326 +#define GL_MISSING_REGAL 0x9360 +#define GL_TRACE_REGAL 0x9361 +#define GL_CACHE_REGAL 0x9362 +#define GL_CODE_REGAL 0x9363 +#define GL_STATISTICS_REGAL 0x9364 + +#define GLEW_REGAL_enable GLEW_GET_VAR(__GLEW_REGAL_enable) + +#endif /* GL_REGAL_enable */ + /* ------------------------- GL_REGAL_error_string ------------------------- */ #ifndef GL_REGAL_error_string @@ -13209,6 +14657,12 @@ typedef GLboolean (GLAPIENTRY * PFNGLISSUPPORTEDREGALPROC) (const GLchar* ext); #define GL_LOG_STATUS_REGAL 0x9320 #define GL_LOG_HTTP_REGAL 0x9321 +typedef void (APIENTRY *GLLOGPROCREGAL)(GLenum stream, GLsizei length, const GLchar *message, GLvoid *context); + +typedef void (GLAPIENTRY * PFNGLLOGMESSAGECALLBACKREGALPROC) (GLLOGPROCREGAL callback); + +#define glLogMessageCallbackREGAL GLEW_GET_FUN(__glewLogMessageCallbackREGAL) + #define GLEW_REGAL_log GLEW_GET_VAR(__GLEW_REGAL_log) #endif /* GL_REGAL_log */ @@ -13381,8 +14835,8 @@ typedef void (GLAPIENTRY * PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei #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); +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 GLvoid *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 GLvoid *pixels); #define glTexImage4DSGIS GLEW_GET_FUN(__glewTexImage4DSGIS) #define glTexSubImage4DSGIS GLEW_GET_FUN(__glewTexSubImage4DSGIS) @@ -13957,11 +15411,11 @@ typedef void (GLAPIENTRY * PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); 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 * PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *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); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); #define glColorTableParameterfvSGI GLEW_GET_FUN(__glewColorTableParameterfvSGI) #define glColorTableParameterivSGI GLEW_GET_FUN(__glewColorTableParameterivSGI) @@ -14103,7 +15557,7 @@ typedef void (GLAPIENTRY * PFNGLREADVIDEOPIXELSSUNPROC) (GLint x, GLint y, GLsiz #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 * PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte* code); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); @@ -14269,6 +15723,346 @@ struct GLEWContextStruct { #endif /* GLEW_MX */ +#ifdef GLEW_INIT_OPENGL11_FUNCTIONS + +GLEW_FUN_EXPORT PFNGLACCUMPROC __glewAccum; +GLEW_FUN_EXPORT PFNGLALPHAFUNCPROC __glewAlphaFunc; +GLEW_FUN_EXPORT PFNGLARETEXTURESRESIDENTPROC __glewAreTexturesResident; +GLEW_FUN_EXPORT PFNGLARRAYELEMENTPROC __glewArrayElement; +GLEW_FUN_EXPORT PFNGLBEGINPROC __glewBegin; +GLEW_FUN_EXPORT PFNGLBINDTEXTUREPROC __glewBindTexture; +GLEW_FUN_EXPORT PFNGLBITMAPPROC __glewBitmap; +GLEW_FUN_EXPORT PFNGLBLENDFUNCPROC __glewBlendFunc; +GLEW_FUN_EXPORT PFNGLCALLLISTPROC __glewCallList; +GLEW_FUN_EXPORT PFNGLCALLLISTSPROC __glewCallLists; +GLEW_FUN_EXPORT PFNGLCLEARPROC __glewClear; +GLEW_FUN_EXPORT PFNGLCLEARACCUMPROC __glewClearAccum; +GLEW_FUN_EXPORT PFNGLCLEARCOLORPROC __glewClearColor; +GLEW_FUN_EXPORT PFNGLCLEARDEPTHPROC __glewClearDepth; +GLEW_FUN_EXPORT PFNGLCLEARINDEXPROC __glewClearIndex; +GLEW_FUN_EXPORT PFNGLCLEARSTENCILPROC __glewClearStencil; +GLEW_FUN_EXPORT PFNGLCLIPPLANEPROC __glewClipPlane; +GLEW_FUN_EXPORT PFNGLCOLOR3BPROC __glewColor3b; +GLEW_FUN_EXPORT PFNGLCOLOR3BVPROC __glewColor3bv; +GLEW_FUN_EXPORT PFNGLCOLOR3DPROC __glewColor3d; +GLEW_FUN_EXPORT PFNGLCOLOR3DVPROC __glewColor3dv; +GLEW_FUN_EXPORT PFNGLCOLOR3FPROC __glewColor3f; +GLEW_FUN_EXPORT PFNGLCOLOR3FVPROC __glewColor3fv; +GLEW_FUN_EXPORT PFNGLCOLOR3IPROC __glewColor3i; +GLEW_FUN_EXPORT PFNGLCOLOR3IVPROC __glewColor3iv; +GLEW_FUN_EXPORT PFNGLCOLOR3SPROC __glewColor3s; +GLEW_FUN_EXPORT PFNGLCOLOR3SVPROC __glewColor3sv; +GLEW_FUN_EXPORT PFNGLCOLOR3UBPROC __glewColor3ub; +GLEW_FUN_EXPORT PFNGLCOLOR3UBVPROC __glewColor3ubv; +GLEW_FUN_EXPORT PFNGLCOLOR3UIPROC __glewColor3ui; +GLEW_FUN_EXPORT PFNGLCOLOR3UIVPROC __glewColor3uiv; +GLEW_FUN_EXPORT PFNGLCOLOR3USPROC __glewColor3us; +GLEW_FUN_EXPORT PFNGLCOLOR3USVPROC __glewColor3usv; +GLEW_FUN_EXPORT PFNGLCOLOR4BPROC __glewColor4b; +GLEW_FUN_EXPORT PFNGLCOLOR4BVPROC __glewColor4bv; +GLEW_FUN_EXPORT PFNGLCOLOR4DPROC __glewColor4d; +GLEW_FUN_EXPORT PFNGLCOLOR4DVPROC __glewColor4dv; +GLEW_FUN_EXPORT PFNGLCOLOR4FPROC __glewColor4f; +GLEW_FUN_EXPORT PFNGLCOLOR4FVPROC __glewColor4fv; +GLEW_FUN_EXPORT PFNGLCOLOR4IPROC __glewColor4i; +GLEW_FUN_EXPORT PFNGLCOLOR4IVPROC __glewColor4iv; +GLEW_FUN_EXPORT PFNGLCOLOR4SPROC __glewColor4s; +GLEW_FUN_EXPORT PFNGLCOLOR4SVPROC __glewColor4sv; +GLEW_FUN_EXPORT PFNGLCOLOR4UBPROC __glewColor4ub; +GLEW_FUN_EXPORT PFNGLCOLOR4UBVPROC __glewColor4ubv; +GLEW_FUN_EXPORT PFNGLCOLOR4UIPROC __glewColor4ui; +GLEW_FUN_EXPORT PFNGLCOLOR4UIVPROC __glewColor4uiv; +GLEW_FUN_EXPORT PFNGLCOLOR4USPROC __glewColor4us; +GLEW_FUN_EXPORT PFNGLCOLOR4USVPROC __glewColor4usv; +GLEW_FUN_EXPORT PFNGLCOLORMASKPROC __glewColorMask; +GLEW_FUN_EXPORT PFNGLCOLORMATERIALPROC __glewColorMaterial; +GLEW_FUN_EXPORT PFNGLCOLORPOINTERPROC __glewColorPointer; +GLEW_FUN_EXPORT PFNGLCOPYPIXELSPROC __glewCopyPixels; +GLEW_FUN_EXPORT PFNGLCOPYTEXIMAGE1DPROC __glewCopyTexImage1D; +GLEW_FUN_EXPORT PFNGLCOPYTEXIMAGE2DPROC __glewCopyTexImage2D; +GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE1DPROC __glewCopyTexSubImage1D; +GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE2DPROC __glewCopyTexSubImage2D; +GLEW_FUN_EXPORT PFNGLCULLFACEPROC __glewCullFace; +GLEW_FUN_EXPORT PFNGLDELETELISTSPROC __glewDeleteLists; +GLEW_FUN_EXPORT PFNGLDELETETEXTURESPROC __glewDeleteTextures; +GLEW_FUN_EXPORT PFNGLDEPTHFUNCPROC __glewDepthFunc; +GLEW_FUN_EXPORT PFNGLDEPTHMASKPROC __glewDepthMask; +GLEW_FUN_EXPORT PFNGLDEPTHRANGEPROC __glewDepthRange; +GLEW_FUN_EXPORT PFNGLDISABLEPROC __glewDisable; +GLEW_FUN_EXPORT PFNGLDISABLECLIENTSTATEPROC __glewDisableClientState; +GLEW_FUN_EXPORT PFNGLDRAWARRAYSPROC __glewDrawArrays; +GLEW_FUN_EXPORT PFNGLDRAWBUFFERPROC __glewDrawBuffer; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSPROC __glewDrawElements; +GLEW_FUN_EXPORT PFNGLDRAWPIXELSPROC __glewDrawPixels; +GLEW_FUN_EXPORT PFNGLEDGEFLAGPROC __glewEdgeFlag; +GLEW_FUN_EXPORT PFNGLEDGEFLAGPOINTERPROC __glewEdgeFlagPointer; +GLEW_FUN_EXPORT PFNGLEDGEFLAGVPROC __glewEdgeFlagv; +GLEW_FUN_EXPORT PFNGLENABLEPROC __glewEnable; +GLEW_FUN_EXPORT PFNGLENABLECLIENTSTATEPROC __glewEnableClientState; +GLEW_FUN_EXPORT PFNGLENDPROC __glewEnd; +GLEW_FUN_EXPORT PFNGLENDLISTPROC __glewEndList; +GLEW_FUN_EXPORT PFNGLEVALCOORD1DPROC __glewEvalCoord1d; +GLEW_FUN_EXPORT PFNGLEVALCOORD1DVPROC __glewEvalCoord1dv; +GLEW_FUN_EXPORT PFNGLEVALCOORD1FPROC __glewEvalCoord1f; +GLEW_FUN_EXPORT PFNGLEVALCOORD1FVPROC __glewEvalCoord1fv; +GLEW_FUN_EXPORT PFNGLEVALCOORD2DPROC __glewEvalCoord2d; +GLEW_FUN_EXPORT PFNGLEVALCOORD2DVPROC __glewEvalCoord2dv; +GLEW_FUN_EXPORT PFNGLEVALCOORD2FPROC __glewEvalCoord2f; +GLEW_FUN_EXPORT PFNGLEVALCOORD2FVPROC __glewEvalCoord2fv; +GLEW_FUN_EXPORT PFNGLEVALMESH1PROC __glewEvalMesh1; +GLEW_FUN_EXPORT PFNGLEVALMESH2PROC __glewEvalMesh2; +GLEW_FUN_EXPORT PFNGLEVALPOINT1PROC __glewEvalPoint1; +GLEW_FUN_EXPORT PFNGLEVALPOINT2PROC __glewEvalPoint2; +GLEW_FUN_EXPORT PFNGLFEEDBACKBUFFERPROC __glewFeedbackBuffer; +GLEW_FUN_EXPORT PFNGLFINISHPROC __glewFinish; +GLEW_FUN_EXPORT PFNGLFLUSHPROC __glewFlush; +GLEW_FUN_EXPORT PFNGLFOGFPROC __glewFogf; +GLEW_FUN_EXPORT PFNGLFOGFVPROC __glewFogfv; +GLEW_FUN_EXPORT PFNGLFOGIPROC __glewFogi; +GLEW_FUN_EXPORT PFNGLFOGIVPROC __glewFogiv; +GLEW_FUN_EXPORT PFNGLFRONTFACEPROC __glewFrontFace; +GLEW_FUN_EXPORT PFNGLFRUSTUMPROC __glewFrustum; +GLEW_FUN_EXPORT PFNGLGENLISTSPROC __glewGenLists; +GLEW_FUN_EXPORT PFNGLGENTEXTURESPROC __glewGenTextures; +GLEW_FUN_EXPORT PFNGLGETBOOLEANVPROC __glewGetBooleanv; +GLEW_FUN_EXPORT PFNGLGETCLIPPLANEPROC __glewGetClipPlane; +GLEW_FUN_EXPORT PFNGLGETDOUBLEVPROC __glewGetDoublev; +GLEW_FUN_EXPORT PFNGLGETERRORPROC __glewGetError; +GLEW_FUN_EXPORT PFNGLGETFLOATVPROC __glewGetFloatv; +GLEW_FUN_EXPORT PFNGLGETINTEGERVPROC __glewGetIntegerv; +GLEW_FUN_EXPORT PFNGLGETLIGHTFVPROC __glewGetLightfv; +GLEW_FUN_EXPORT PFNGLGETLIGHTIVPROC __glewGetLightiv; +GLEW_FUN_EXPORT PFNGLGETMAPDVPROC __glewGetMapdv; +GLEW_FUN_EXPORT PFNGLGETMAPFVPROC __glewGetMapfv; +GLEW_FUN_EXPORT PFNGLGETMAPIVPROC __glewGetMapiv; +GLEW_FUN_EXPORT PFNGLGETMATERIALFVPROC __glewGetMaterialfv; +GLEW_FUN_EXPORT PFNGLGETMATERIALIVPROC __glewGetMaterialiv; +GLEW_FUN_EXPORT PFNGLGETPIXELMAPFVPROC __glewGetPixelMapfv; +GLEW_FUN_EXPORT PFNGLGETPIXELMAPUIVPROC __glewGetPixelMapuiv; +GLEW_FUN_EXPORT PFNGLGETPIXELMAPUSVPROC __glewGetPixelMapusv; +GLEW_FUN_EXPORT PFNGLGETPOINTERVPROC __glewGetPointerv; +GLEW_FUN_EXPORT PFNGLGETPOLYGONSTIPPLEPROC __glewGetPolygonStipple; +GLEW_FUN_EXPORT PFNGLGETSTRINGPROC __glewGetString; +GLEW_FUN_EXPORT PFNGLGETTEXENVFVPROC __glewGetTexEnvfv; +GLEW_FUN_EXPORT PFNGLGETTEXENVIVPROC __glewGetTexEnviv; +GLEW_FUN_EXPORT PFNGLGETTEXGENDVPROC __glewGetTexGendv; +GLEW_FUN_EXPORT PFNGLGETTEXGENFVPROC __glewGetTexGenfv; +GLEW_FUN_EXPORT PFNGLGETTEXGENIVPROC __glewGetTexGeniv; +GLEW_FUN_EXPORT PFNGLGETTEXIMAGEPROC __glewGetTexImage; +GLEW_FUN_EXPORT PFNGLGETTEXLEVELPARAMETERFVPROC __glewGetTexLevelParameterfv; +GLEW_FUN_EXPORT PFNGLGETTEXLEVELPARAMETERIVPROC __glewGetTexLevelParameteriv; +GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERFVPROC __glewGetTexParameterfv; +GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIVPROC __glewGetTexParameteriv; +GLEW_FUN_EXPORT PFNGLHINTPROC __glewHint; +GLEW_FUN_EXPORT PFNGLINDEXMASKPROC __glewIndexMask; +GLEW_FUN_EXPORT PFNGLINDEXPOINTERPROC __glewIndexPointer; +GLEW_FUN_EXPORT PFNGLINDEXDPROC __glewIndexd; +GLEW_FUN_EXPORT PFNGLINDEXDVPROC __glewIndexdv; +GLEW_FUN_EXPORT PFNGLINDEXFPROC __glewIndexf; +GLEW_FUN_EXPORT PFNGLINDEXFVPROC __glewIndexfv; +GLEW_FUN_EXPORT PFNGLINDEXIPROC __glewIndexi; +GLEW_FUN_EXPORT PFNGLINDEXIVPROC __glewIndexiv; +GLEW_FUN_EXPORT PFNGLINDEXSPROC __glewIndexs; +GLEW_FUN_EXPORT PFNGLINDEXSVPROC __glewIndexsv; +GLEW_FUN_EXPORT PFNGLINDEXUBPROC __glewIndexub; +GLEW_FUN_EXPORT PFNGLINDEXUBVPROC __glewIndexubv; +GLEW_FUN_EXPORT PFNGLINITNAMESPROC __glewInitNames; +GLEW_FUN_EXPORT PFNGLINTERLEAVEDARRAYSPROC __glewInterleavedArrays; +GLEW_FUN_EXPORT PFNGLISENABLEDPROC __glewIsEnabled; +GLEW_FUN_EXPORT PFNGLISLISTPROC __glewIsList; +GLEW_FUN_EXPORT PFNGLISTEXTUREPROC __glewIsTexture; +GLEW_FUN_EXPORT PFNGLLIGHTMODELFPROC __glewLightModelf; +GLEW_FUN_EXPORT PFNGLLIGHTMODELFVPROC __glewLightModelfv; +GLEW_FUN_EXPORT PFNGLLIGHTMODELIPROC __glewLightModeli; +GLEW_FUN_EXPORT PFNGLLIGHTMODELIVPROC __glewLightModeliv; +GLEW_FUN_EXPORT PFNGLLIGHTFPROC __glewLightf; +GLEW_FUN_EXPORT PFNGLLIGHTFVPROC __glewLightfv; +GLEW_FUN_EXPORT PFNGLLIGHTIPROC __glewLighti; +GLEW_FUN_EXPORT PFNGLLIGHTIVPROC __glewLightiv; +GLEW_FUN_EXPORT PFNGLLINESTIPPLEPROC __glewLineStipple; +GLEW_FUN_EXPORT PFNGLLINEWIDTHPROC __glewLineWidth; +GLEW_FUN_EXPORT PFNGLLISTBASEPROC __glewListBase; +GLEW_FUN_EXPORT PFNGLLOADIDENTITYPROC __glewLoadIdentity; +GLEW_FUN_EXPORT PFNGLLOADMATRIXDPROC __glewLoadMatrixd; +GLEW_FUN_EXPORT PFNGLLOADMATRIXFPROC __glewLoadMatrixf; +GLEW_FUN_EXPORT PFNGLLOADNAMEPROC __glewLoadName; +GLEW_FUN_EXPORT PFNGLLOGICOPPROC __glewLogicOp; +GLEW_FUN_EXPORT PFNGLMAP1DPROC __glewMap1d; +GLEW_FUN_EXPORT PFNGLMAP1FPROC __glewMap1f; +GLEW_FUN_EXPORT PFNGLMAP2DPROC __glewMap2d; +GLEW_FUN_EXPORT PFNGLMAP2FPROC __glewMap2f; +GLEW_FUN_EXPORT PFNGLMAPGRID1DPROC __glewMapGrid1d; +GLEW_FUN_EXPORT PFNGLMAPGRID1FPROC __glewMapGrid1f; +GLEW_FUN_EXPORT PFNGLMAPGRID2DPROC __glewMapGrid2d; +GLEW_FUN_EXPORT PFNGLMAPGRID2FPROC __glewMapGrid2f; +GLEW_FUN_EXPORT PFNGLMATERIALFPROC __glewMaterialf; +GLEW_FUN_EXPORT PFNGLMATERIALFVPROC __glewMaterialfv; +GLEW_FUN_EXPORT PFNGLMATERIALIPROC __glewMateriali; +GLEW_FUN_EXPORT PFNGLMATERIALIVPROC __glewMaterialiv; +GLEW_FUN_EXPORT PFNGLMATRIXMODEPROC __glewMatrixMode; +GLEW_FUN_EXPORT PFNGLMULTMATRIXDPROC __glewMultMatrixd; +GLEW_FUN_EXPORT PFNGLMULTMATRIXFPROC __glewMultMatrixf; +GLEW_FUN_EXPORT PFNGLNEWLISTPROC __glewNewList; +GLEW_FUN_EXPORT PFNGLNORMAL3BPROC __glewNormal3b; +GLEW_FUN_EXPORT PFNGLNORMAL3BVPROC __glewNormal3bv; +GLEW_FUN_EXPORT PFNGLNORMAL3DPROC __glewNormal3d; +GLEW_FUN_EXPORT PFNGLNORMAL3DVPROC __glewNormal3dv; +GLEW_FUN_EXPORT PFNGLNORMAL3FPROC __glewNormal3f; +GLEW_FUN_EXPORT PFNGLNORMAL3FVPROC __glewNormal3fv; +GLEW_FUN_EXPORT PFNGLNORMAL3IPROC __glewNormal3i; +GLEW_FUN_EXPORT PFNGLNORMAL3IVPROC __glewNormal3iv; +GLEW_FUN_EXPORT PFNGLNORMAL3SPROC __glewNormal3s; +GLEW_FUN_EXPORT PFNGLNORMAL3SVPROC __glewNormal3sv; +GLEW_FUN_EXPORT PFNGLNORMALPOINTERPROC __glewNormalPointer; +GLEW_FUN_EXPORT PFNGLORTHOPROC __glewOrtho; +GLEW_FUN_EXPORT PFNGLPASSTHROUGHPROC __glewPassThrough; +GLEW_FUN_EXPORT PFNGLPIXELMAPFVPROC __glewPixelMapfv; +GLEW_FUN_EXPORT PFNGLPIXELMAPUIVPROC __glewPixelMapuiv; +GLEW_FUN_EXPORT PFNGLPIXELMAPUSVPROC __glewPixelMapusv; +GLEW_FUN_EXPORT PFNGLPIXELSTOREFPROC __glewPixelStoref; +GLEW_FUN_EXPORT PFNGLPIXELSTOREIPROC __glewPixelStorei; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFERFPROC __glewPixelTransferf; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFERIPROC __glewPixelTransferi; +GLEW_FUN_EXPORT PFNGLPIXELZOOMPROC __glewPixelZoom; +GLEW_FUN_EXPORT PFNGLPOINTSIZEPROC __glewPointSize; +GLEW_FUN_EXPORT PFNGLPOLYGONMODEPROC __glewPolygonMode; +GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETPROC __glewPolygonOffset; +GLEW_FUN_EXPORT PFNGLPOLYGONSTIPPLEPROC __glewPolygonStipple; +GLEW_FUN_EXPORT PFNGLPOPATTRIBPROC __glewPopAttrib; +GLEW_FUN_EXPORT PFNGLPOPCLIENTATTRIBPROC __glewPopClientAttrib; +GLEW_FUN_EXPORT PFNGLPOPMATRIXPROC __glewPopMatrix; +GLEW_FUN_EXPORT PFNGLPOPNAMEPROC __glewPopName; +GLEW_FUN_EXPORT PFNGLPRIORITIZETEXTURESPROC __glewPrioritizeTextures; +GLEW_FUN_EXPORT PFNGLPUSHATTRIBPROC __glewPushAttrib; +GLEW_FUN_EXPORT PFNGLPUSHCLIENTATTRIBPROC __glewPushClientAttrib; +GLEW_FUN_EXPORT PFNGLPUSHMATRIXPROC __glewPushMatrix; +GLEW_FUN_EXPORT PFNGLPUSHNAMEPROC __glewPushName; +GLEW_FUN_EXPORT PFNGLRASTERPOS2DPROC __glewRasterPos2d; +GLEW_FUN_EXPORT PFNGLRASTERPOS2DVPROC __glewRasterPos2dv; +GLEW_FUN_EXPORT PFNGLRASTERPOS2FPROC __glewRasterPos2f; +GLEW_FUN_EXPORT PFNGLRASTERPOS2FVPROC __glewRasterPos2fv; +GLEW_FUN_EXPORT PFNGLRASTERPOS2IPROC __glewRasterPos2i; +GLEW_FUN_EXPORT PFNGLRASTERPOS2IVPROC __glewRasterPos2iv; +GLEW_FUN_EXPORT PFNGLRASTERPOS2SPROC __glewRasterPos2s; +GLEW_FUN_EXPORT PFNGLRASTERPOS2SVPROC __glewRasterPos2sv; +GLEW_FUN_EXPORT PFNGLRASTERPOS3DPROC __glewRasterPos3d; +GLEW_FUN_EXPORT PFNGLRASTERPOS3DVPROC __glewRasterPos3dv; +GLEW_FUN_EXPORT PFNGLRASTERPOS3FPROC __glewRasterPos3f; +GLEW_FUN_EXPORT PFNGLRASTERPOS3FVPROC __glewRasterPos3fv; +GLEW_FUN_EXPORT PFNGLRASTERPOS3IPROC __glewRasterPos3i; +GLEW_FUN_EXPORT PFNGLRASTERPOS3IVPROC __glewRasterPos3iv; +GLEW_FUN_EXPORT PFNGLRASTERPOS3SPROC __glewRasterPos3s; +GLEW_FUN_EXPORT PFNGLRASTERPOS3SVPROC __glewRasterPos3sv; +GLEW_FUN_EXPORT PFNGLRASTERPOS4DPROC __glewRasterPos4d; +GLEW_FUN_EXPORT PFNGLRASTERPOS4DVPROC __glewRasterPos4dv; +GLEW_FUN_EXPORT PFNGLRASTERPOS4FPROC __glewRasterPos4f; +GLEW_FUN_EXPORT PFNGLRASTERPOS4FVPROC __glewRasterPos4fv; +GLEW_FUN_EXPORT PFNGLRASTERPOS4IPROC __glewRasterPos4i; +GLEW_FUN_EXPORT PFNGLRASTERPOS4IVPROC __glewRasterPos4iv; +GLEW_FUN_EXPORT PFNGLRASTERPOS4SPROC __glewRasterPos4s; +GLEW_FUN_EXPORT PFNGLRASTERPOS4SVPROC __glewRasterPos4sv; +GLEW_FUN_EXPORT PFNGLREADBUFFERPROC __glewReadBuffer; +GLEW_FUN_EXPORT PFNGLREADPIXELSPROC __glewReadPixels; +GLEW_FUN_EXPORT PFNGLRECTDPROC __glewRectd; +GLEW_FUN_EXPORT PFNGLRECTDVPROC __glewRectdv; +GLEW_FUN_EXPORT PFNGLRECTFPROC __glewRectf; +GLEW_FUN_EXPORT PFNGLRECTFVPROC __glewRectfv; +GLEW_FUN_EXPORT PFNGLRECTIPROC __glewRecti; +GLEW_FUN_EXPORT PFNGLRECTIVPROC __glewRectiv; +GLEW_FUN_EXPORT PFNGLRECTSPROC __glewRects; +GLEW_FUN_EXPORT PFNGLRECTSVPROC __glewRectsv; +GLEW_FUN_EXPORT PFNGLRENDERMODEPROC __glewRenderMode; +GLEW_FUN_EXPORT PFNGLROTATEDPROC __glewRotated; +GLEW_FUN_EXPORT PFNGLROTATEFPROC __glewRotatef; +GLEW_FUN_EXPORT PFNGLSCALEDPROC __glewScaled; +GLEW_FUN_EXPORT PFNGLSCALEFPROC __glewScalef; +GLEW_FUN_EXPORT PFNGLSCISSORPROC __glewScissor; +GLEW_FUN_EXPORT PFNGLSELECTBUFFERPROC __glewSelectBuffer; +GLEW_FUN_EXPORT PFNGLSHADEMODELPROC __glewShadeModel; +GLEW_FUN_EXPORT PFNGLSTENCILFUNCPROC __glewStencilFunc; +GLEW_FUN_EXPORT PFNGLSTENCILMASKPROC __glewStencilMask; +GLEW_FUN_EXPORT PFNGLSTENCILOPPROC __glewStencilOp; +GLEW_FUN_EXPORT PFNGLTEXCOORD1DPROC __glewTexCoord1d; +GLEW_FUN_EXPORT PFNGLTEXCOORD1DVPROC __glewTexCoord1dv; +GLEW_FUN_EXPORT PFNGLTEXCOORD1FPROC __glewTexCoord1f; +GLEW_FUN_EXPORT PFNGLTEXCOORD1FVPROC __glewTexCoord1fv; +GLEW_FUN_EXPORT PFNGLTEXCOORD1IPROC __glewTexCoord1i; +GLEW_FUN_EXPORT PFNGLTEXCOORD1IVPROC __glewTexCoord1iv; +GLEW_FUN_EXPORT PFNGLTEXCOORD1SPROC __glewTexCoord1s; +GLEW_FUN_EXPORT PFNGLTEXCOORD1SVPROC __glewTexCoord1sv; +GLEW_FUN_EXPORT PFNGLTEXCOORD2DPROC __glewTexCoord2d; +GLEW_FUN_EXPORT PFNGLTEXCOORD2DVPROC __glewTexCoord2dv; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FPROC __glewTexCoord2f; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FVPROC __glewTexCoord2fv; +GLEW_FUN_EXPORT PFNGLTEXCOORD2IPROC __glewTexCoord2i; +GLEW_FUN_EXPORT PFNGLTEXCOORD2IVPROC __glewTexCoord2iv; +GLEW_FUN_EXPORT PFNGLTEXCOORD2SPROC __glewTexCoord2s; +GLEW_FUN_EXPORT PFNGLTEXCOORD2SVPROC __glewTexCoord2sv; +GLEW_FUN_EXPORT PFNGLTEXCOORD3DPROC __glewTexCoord3d; +GLEW_FUN_EXPORT PFNGLTEXCOORD3DVPROC __glewTexCoord3dv; +GLEW_FUN_EXPORT PFNGLTEXCOORD3FPROC __glewTexCoord3f; +GLEW_FUN_EXPORT PFNGLTEXCOORD3FVPROC __glewTexCoord3fv; +GLEW_FUN_EXPORT PFNGLTEXCOORD3IPROC __glewTexCoord3i; +GLEW_FUN_EXPORT PFNGLTEXCOORD3IVPROC __glewTexCoord3iv; +GLEW_FUN_EXPORT PFNGLTEXCOORD3SPROC __glewTexCoord3s; +GLEW_FUN_EXPORT PFNGLTEXCOORD3SVPROC __glewTexCoord3sv; +GLEW_FUN_EXPORT PFNGLTEXCOORD4DPROC __glewTexCoord4d; +GLEW_FUN_EXPORT PFNGLTEXCOORD4DVPROC __glewTexCoord4dv; +GLEW_FUN_EXPORT PFNGLTEXCOORD4FPROC __glewTexCoord4f; +GLEW_FUN_EXPORT PFNGLTEXCOORD4FVPROC __glewTexCoord4fv; +GLEW_FUN_EXPORT PFNGLTEXCOORD4IPROC __glewTexCoord4i; +GLEW_FUN_EXPORT PFNGLTEXCOORD4IVPROC __glewTexCoord4iv; +GLEW_FUN_EXPORT PFNGLTEXCOORD4SPROC __glewTexCoord4s; +GLEW_FUN_EXPORT PFNGLTEXCOORD4SVPROC __glewTexCoord4sv; +GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERPROC __glewTexCoordPointer; +GLEW_FUN_EXPORT PFNGLTEXENVFPROC __glewTexEnvf; +GLEW_FUN_EXPORT PFNGLTEXENVFVPROC __glewTexEnvfv; +GLEW_FUN_EXPORT PFNGLTEXENVIPROC __glewTexEnvi; +GLEW_FUN_EXPORT PFNGLTEXENVIVPROC __glewTexEnviv; +GLEW_FUN_EXPORT PFNGLTEXGENDPROC __glewTexGend; +GLEW_FUN_EXPORT PFNGLTEXGENDVPROC __glewTexGendv; +GLEW_FUN_EXPORT PFNGLTEXGENFPROC __glewTexGenf; +GLEW_FUN_EXPORT PFNGLTEXGENFVPROC __glewTexGenfv; +GLEW_FUN_EXPORT PFNGLTEXGENIPROC __glewTexGeni; +GLEW_FUN_EXPORT PFNGLTEXGENIVPROC __glewTexGeniv; +GLEW_FUN_EXPORT PFNGLTEXIMAGE1DPROC __glewTexImage1D; +GLEW_FUN_EXPORT PFNGLTEXIMAGE2DPROC __glewTexImage2D; +GLEW_FUN_EXPORT PFNGLTEXPARAMETERFPROC __glewTexParameterf; +GLEW_FUN_EXPORT PFNGLTEXPARAMETERFVPROC __glewTexParameterfv; +GLEW_FUN_EXPORT PFNGLTEXPARAMETERIPROC __glewTexParameteri; +GLEW_FUN_EXPORT PFNGLTEXPARAMETERIVPROC __glewTexParameteriv; +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE1DPROC __glewTexSubImage1D; +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE2DPROC __glewTexSubImage2D; +GLEW_FUN_EXPORT PFNGLTRANSLATEDPROC __glewTranslated; +GLEW_FUN_EXPORT PFNGLTRANSLATEFPROC __glewTranslatef; +GLEW_FUN_EXPORT PFNGLVERTEX2DPROC __glewVertex2d; +GLEW_FUN_EXPORT PFNGLVERTEX2DVPROC __glewVertex2dv; +GLEW_FUN_EXPORT PFNGLVERTEX2FPROC __glewVertex2f; +GLEW_FUN_EXPORT PFNGLVERTEX2FVPROC __glewVertex2fv; +GLEW_FUN_EXPORT PFNGLVERTEX2IPROC __glewVertex2i; +GLEW_FUN_EXPORT PFNGLVERTEX2IVPROC __glewVertex2iv; +GLEW_FUN_EXPORT PFNGLVERTEX2SPROC __glewVertex2s; +GLEW_FUN_EXPORT PFNGLVERTEX2SVPROC __glewVertex2sv; +GLEW_FUN_EXPORT PFNGLVERTEX3DPROC __glewVertex3d; +GLEW_FUN_EXPORT PFNGLVERTEX3DVPROC __glewVertex3dv; +GLEW_FUN_EXPORT PFNGLVERTEX3FPROC __glewVertex3f; +GLEW_FUN_EXPORT PFNGLVERTEX3FVPROC __glewVertex3fv; +GLEW_FUN_EXPORT PFNGLVERTEX3IPROC __glewVertex3i; +GLEW_FUN_EXPORT PFNGLVERTEX3IVPROC __glewVertex3iv; +GLEW_FUN_EXPORT PFNGLVERTEX3SPROC __glewVertex3s; +GLEW_FUN_EXPORT PFNGLVERTEX3SVPROC __glewVertex3sv; +GLEW_FUN_EXPORT PFNGLVERTEX4DPROC __glewVertex4d; +GLEW_FUN_EXPORT PFNGLVERTEX4DVPROC __glewVertex4dv; +GLEW_FUN_EXPORT PFNGLVERTEX4FPROC __glewVertex4f; +GLEW_FUN_EXPORT PFNGLVERTEX4FVPROC __glewVertex4fv; +GLEW_FUN_EXPORT PFNGLVERTEX4IPROC __glewVertex4i; +GLEW_FUN_EXPORT PFNGLVERTEX4IVPROC __glewVertex4iv; +GLEW_FUN_EXPORT PFNGLVERTEX4SPROC __glewVertex4s; +GLEW_FUN_EXPORT PFNGLVERTEX4SVPROC __glewVertex4sv; +GLEW_FUN_EXPORT PFNGLVERTEXPOINTERPROC __glewVertexPointer; +GLEW_FUN_EXPORT PFNGLVIEWPORTPROC __glewViewport; +#endif //#ifdef GLEW_INIT_OPENGL11_FUNCTIONS + GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DPROC __glewCopyTexSubImage3D; GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSPROC __glewDrawRangeElements; GLEW_FUN_EXPORT PFNGLTEXIMAGE3DPROC __glewTexImage3D; @@ -14575,6 +16369,8 @@ GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC __glewBlendEquationSepa GLEW_FUN_EXPORT PFNGLBLENDFUNCINDEXEDAMDPROC __glewBlendFuncIndexedAMD; GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC __glewBlendFuncSeparateIndexedAMD; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPARAMETERIAMDPROC __glewVertexAttribParameteriAMD; + GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC __glewMultiDrawArraysIndirectAMD; GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC __glewMultiDrawElementsIndirectAMD; @@ -14596,11 +16392,36 @@ GLEW_FUN_EXPORT PFNGLSELECTPERFMONITORCOUNTERSAMDPROC __glewSelectPerfMonitorCou GLEW_FUN_EXPORT PFNGLSETMULTISAMPLEFVAMDPROC __glewSetMultisamplefvAMD; +GLEW_FUN_EXPORT PFNGLTEXSTORAGESPARSEAMDPROC __glewTexStorageSparseAMD; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGESPARSEAMDPROC __glewTextureStorageSparseAMD; + GLEW_FUN_EXPORT PFNGLSTENCILOPVALUEAMDPROC __glewStencilOpValueAMD; GLEW_FUN_EXPORT PFNGLTESSELLATIONFACTORAMDPROC __glewTessellationFactorAMD; GLEW_FUN_EXPORT PFNGLTESSELLATIONMODEAMDPROC __glewTessellationModeAMD; +GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFERANGLEPROC __glewBlitFramebufferANGLE; + +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC __glewRenderbufferStorageMultisampleANGLE; + +GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDANGLEPROC __glewDrawArraysInstancedANGLE; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDANGLEPROC __glewDrawElementsInstancedANGLE; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORANGLEPROC __glewVertexAttribDivisorANGLE; + +GLEW_FUN_EXPORT PFNGLBEGINQUERYANGLEPROC __glewBeginQueryANGLE; +GLEW_FUN_EXPORT PFNGLDELETEQUERIESANGLEPROC __glewDeleteQueriesANGLE; +GLEW_FUN_EXPORT PFNGLENDQUERYANGLEPROC __glewEndQueryANGLE; +GLEW_FUN_EXPORT PFNGLGENQUERIESANGLEPROC __glewGenQueriesANGLE; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VANGLEPROC __glewGetQueryObjecti64vANGLE; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVANGLEPROC __glewGetQueryObjectivANGLE; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VANGLEPROC __glewGetQueryObjectui64vANGLE; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVANGLEPROC __glewGetQueryObjectuivANGLE; +GLEW_FUN_EXPORT PFNGLGETQUERYIVANGLEPROC __glewGetQueryivANGLE; +GLEW_FUN_EXPORT PFNGLISQUERYANGLEPROC __glewIsQueryANGLE; +GLEW_FUN_EXPORT PFNGLQUERYCOUNTERANGLEPROC __glewQueryCounterANGLE; + +GLEW_FUN_EXPORT PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC __glewGetTranslatedShaderSourceANGLE; + GLEW_FUN_EXPORT PFNGLDRAWELEMENTARRAYAPPLEPROC __glewDrawElementArrayAPPLE; GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC __glewDrawRangeElementArrayAPPLE; GLEW_FUN_EXPORT PFNGLELEMENTPOINTERAPPLEPROC __glewElementPointerAPPLE; @@ -14653,9 +16474,29 @@ GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC __glewDrawArraysInstanc GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC __glewDrawElementsInstancedBaseInstance; GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC __glewDrawElementsInstancedBaseVertexBaseInstance; +GLEW_FUN_EXPORT PFNGLGETIMAGEHANDLEARBPROC __glewGetImageHandleARB; +GLEW_FUN_EXPORT PFNGLGETTEXTUREHANDLEARBPROC __glewGetTextureHandleARB; +GLEW_FUN_EXPORT PFNGLGETTEXTURESAMPLERHANDLEARBPROC __glewGetTextureSamplerHandleARB; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLUI64VARBPROC __glewGetVertexAttribLui64vARB; +GLEW_FUN_EXPORT PFNGLISIMAGEHANDLERESIDENTARBPROC __glewIsImageHandleResidentARB; +GLEW_FUN_EXPORT PFNGLISTEXTUREHANDLERESIDENTARBPROC __glewIsTextureHandleResidentARB; +GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC __glewMakeImageHandleNonResidentARB; +GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLERESIDENTARBPROC __glewMakeImageHandleResidentARB; +GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC __glewMakeTextureHandleNonResidentARB; +GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLERESIDENTARBPROC __glewMakeTextureHandleResidentARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC __glewProgramUniformHandleui64ARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC __glewProgramUniformHandleui64vARB; +GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64ARBPROC __glewUniformHandleui64ARB; +GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64VARBPROC __glewUniformHandleui64vARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64ARBPROC __glewVertexAttribL1ui64ARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64VARBPROC __glewVertexAttribL1ui64vARB; + GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONINDEXEDPROC __glewBindFragDataLocationIndexed; GLEW_FUN_EXPORT PFNGLGETFRAGDATAINDEXPROC __glewGetFragDataIndex; +GLEW_FUN_EXPORT PFNGLBUFFERSTORAGEPROC __glewBufferStorage; +GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSTORAGEEXTPROC __glewNamedBufferStorageEXT; + GLEW_FUN_EXPORT PFNGLCREATESYNCFROMCLEVENTARBPROC __glewCreateSyncFromCLeventARB; GLEW_FUN_EXPORT PFNGLCLEARBUFFERDATAPROC __glewClearBufferData; @@ -14663,11 +16504,16 @@ GLEW_FUN_EXPORT PFNGLCLEARBUFFERSUBDATAPROC __glewClearBufferSubData; GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERDATAEXTPROC __glewClearNamedBufferDataEXT; GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC __glewClearNamedBufferSubDataEXT; +GLEW_FUN_EXPORT PFNGLCLEARTEXIMAGEPROC __glewClearTexImage; +GLEW_FUN_EXPORT PFNGLCLEARTEXSUBIMAGEPROC __glewClearTexSubImage; + GLEW_FUN_EXPORT PFNGLCLAMPCOLORARBPROC __glewClampColorARB; GLEW_FUN_EXPORT PFNGLDISPATCHCOMPUTEPROC __glewDispatchCompute; GLEW_FUN_EXPORT PFNGLDISPATCHCOMPUTEINDIRECTPROC __glewDispatchComputeIndirect; +GLEW_FUN_EXPORT PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC __glewDispatchComputeGroupSizeARB; + GLEW_FUN_EXPORT PFNGLCOPYBUFFERSUBDATAPROC __glewCopyBufferSubData; GLEW_FUN_EXPORT PFNGLCOPYIMAGESUBDATAPROC __glewCopyImageSubData; @@ -14779,6 +16625,9 @@ GLEW_FUN_EXPORT PFNGLRESETHISTOGRAMPROC __glewResetHistogram; GLEW_FUN_EXPORT PFNGLRESETMINMAXPROC __glewResetMinmax; GLEW_FUN_EXPORT PFNGLSEPARABLEFILTER2DPROC __glewSeparableFilter2D; +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC __glewMultiDrawArraysIndirectCountARB; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC __glewMultiDrawElementsIndirectCountARB; + GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDARBPROC __glewDrawArraysInstancedARB; GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDARBPROC __glewDrawElementsInstancedARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORARBPROC __glewVertexAttribDivisorARB; @@ -14803,6 +16652,13 @@ GLEW_FUN_EXPORT PFNGLMATRIXINDEXUBVARBPROC __glewMatrixIndexubvARB; GLEW_FUN_EXPORT PFNGLMATRIXINDEXUIVARBPROC __glewMatrixIndexuivARB; GLEW_FUN_EXPORT PFNGLMATRIXINDEXUSVARBPROC __glewMatrixIndexusvARB; +GLEW_FUN_EXPORT PFNGLBINDBUFFERSBASEPROC __glewBindBuffersBase; +GLEW_FUN_EXPORT PFNGLBINDBUFFERSRANGEPROC __glewBindBuffersRange; +GLEW_FUN_EXPORT PFNGLBINDIMAGETEXTURESPROC __glewBindImageTextures; +GLEW_FUN_EXPORT PFNGLBINDSAMPLERSPROC __glewBindSamplers; +GLEW_FUN_EXPORT PFNGLBINDTEXTURESPROC __glewBindTextures; +GLEW_FUN_EXPORT PFNGLBINDVERTEXBUFFERSPROC __glewBindVertexBuffers; + GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTPROC __glewMultiDrawArraysIndirect; GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTPROC __glewMultiDrawElementsIndirect; @@ -15026,6 +16882,9 @@ GLEW_FUN_EXPORT PFNGLGETNAMEDSTRINGIVARBPROC __glewGetNamedStringivARB; GLEW_FUN_EXPORT PFNGLISNAMEDSTRINGARBPROC __glewIsNamedStringARB; GLEW_FUN_EXPORT PFNGLNAMEDSTRINGARBPROC __glewNamedStringARB; +GLEW_FUN_EXPORT PFNGLTEXPAGECOMMITMENTARBPROC __glewTexPageCommitmentARB; +GLEW_FUN_EXPORT PFNGLTEXTUREPAGECOMMITMENTEXTPROC __glewTexturePageCommitmentEXT; + GLEW_FUN_EXPORT PFNGLCLIENTWAITSYNCPROC __glewClientWaitSync; GLEW_FUN_EXPORT PFNGLDELETESYNCPROC __glewDeleteSync; GLEW_FUN_EXPORT PFNGLFENCESYNCPROC __glewFenceSync; @@ -15586,55 +17445,38 @@ GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMSTRINGEXTPROC __glewNamedProgramStringEXT; GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC __glewNamedRenderbufferStorageEXT; GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC __glewNamedRenderbufferStorageMultisampleCoverageEXT; GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewNamedRenderbufferStorageMultisampleEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1DEXTPROC __glewProgramUniform1dEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1DVEXTPROC __glewProgramUniform1dvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FEXTPROC __glewProgramUniform1fEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FVEXTPROC __glewProgramUniform1fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IEXTPROC __glewProgramUniform1iEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IVEXTPROC __glewProgramUniform1ivEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIEXTPROC __glewProgramUniform1uiEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIVEXTPROC __glewProgramUniform1uivEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2DEXTPROC __glewProgramUniform2dEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2DVEXTPROC __glewProgramUniform2dvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FEXTPROC __glewProgramUniform2fEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FVEXTPROC __glewProgramUniform2fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IEXTPROC __glewProgramUniform2iEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IVEXTPROC __glewProgramUniform2ivEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIEXTPROC __glewProgramUniform2uiEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIVEXTPROC __glewProgramUniform2uivEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3DEXTPROC __glewProgramUniform3dEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3DVEXTPROC __glewProgramUniform3dvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FEXTPROC __glewProgramUniform3fEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FVEXTPROC __glewProgramUniform3fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IEXTPROC __glewProgramUniform3iEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IVEXTPROC __glewProgramUniform3ivEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIEXTPROC __glewProgramUniform3uiEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIVEXTPROC __glewProgramUniform3uivEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4DEXTPROC __glewProgramUniform4dEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4DVEXTPROC __glewProgramUniform4dvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FEXTPROC __glewProgramUniform4fEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FVEXTPROC __glewProgramUniform4fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IEXTPROC __glewProgramUniform4iEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IVEXTPROC __glewProgramUniform4ivEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIEXTPROC __glewProgramUniform4uiEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIVEXTPROC __glewProgramUniform4uivEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC __glewProgramUniformMatrix2dvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC __glewProgramUniformMatrix2fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC __glewProgramUniformMatrix2x3dvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC __glewProgramUniformMatrix2x3fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC __glewProgramUniformMatrix2x4dvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC __glewProgramUniformMatrix2x4fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC __glewProgramUniformMatrix3dvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC __glewProgramUniformMatrix3fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC __glewProgramUniformMatrix3x2dvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC __glewProgramUniformMatrix3x2fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC __glewProgramUniformMatrix3x4dvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC __glewProgramUniformMatrix3x4fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC __glewProgramUniformMatrix4dvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC __glewProgramUniformMatrix4fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC __glewProgramUniformMatrix4x2dvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC __glewProgramUniformMatrix4x2fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC __glewProgramUniformMatrix4x3dvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC __glewProgramUniformMatrix4x3fvEXT; GLEW_FUN_EXPORT PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC __glewPushClientAttribDefaultEXT; GLEW_FUN_EXPORT PFNGLTEXTUREBUFFEREXTPROC __glewTextureBufferEXT; @@ -15969,6 +17811,10 @@ GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTERLISTIBMPROC __glewSecondaryColorPointe GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERLISTIBMPROC __glewTexCoordPointerListIBM; GLEW_FUN_EXPORT PFNGLVERTEXPOINTERLISTIBMPROC __glewVertexPointerListIBM; +GLEW_FUN_EXPORT PFNGLMAPTEXTURE2DINTELPROC __glewMapTexture2DINTEL; +GLEW_FUN_EXPORT PFNGLSYNCTEXTUREINTELPROC __glewSyncTextureINTEL; +GLEW_FUN_EXPORT PFNGLUNMAPTEXTURE2DINTELPROC __glewUnmapTexture2DINTEL; + GLEW_FUN_EXPORT PFNGLCOLORPOINTERVINTELPROC __glewColorPointervINTEL; GLEW_FUN_EXPORT PFNGLNORMALPOINTERVINTELPROC __glewNormalPointervINTEL; GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERVINTELPROC __glewTexCoordPointervINTEL; @@ -15983,9 +17829,9 @@ GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTPROC __glewDebugMessageInsert; GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGPROC __glewGetDebugMessageLog; GLEW_FUN_EXPORT PFNGLGETOBJECTLABELPROC __glewGetObjectLabel; GLEW_FUN_EXPORT PFNGLGETOBJECTPTRLABELPROC __glewGetObjectPtrLabel; -GLEW_FUN_EXPORT PFNGLGETPOINTERVPROC __glewGetPointerv; GLEW_FUN_EXPORT PFNGLOBJECTLABELPROC __glewObjectLabel; GLEW_FUN_EXPORT PFNGLOBJECTPTRLABELPROC __glewObjectPtrLabel; +GLEW_FUN_EXPORT PFNGLPOPDEBUGGROUPPROC __glewPopDebugGroup; GLEW_FUN_EXPORT PFNGLPUSHDEBUGGROUPPROC __glewPushDebugGroup; GLEW_FUN_EXPORT PFNGLBUFFERREGIONENABLEDPROC __glewBufferRegionEnabled; @@ -16021,6 +17867,12 @@ GLEW_FUN_EXPORT PFNGLWINDOWPOS4IVMESAPROC __glewWindowPos4ivMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS4SMESAPROC __glewWindowPos4sMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS4SVMESAPROC __glewWindowPos4svMESA; +GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERNVXPROC __glewBeginConditionalRenderNVX; +GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERNVXPROC __glewEndConditionalRenderNVX; + +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC __glewMultiDrawArraysIndirectBindlessNV; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC __glewMultiDrawElementsIndirectBindlessNV; + GLEW_FUN_EXPORT PFNGLGETIMAGEHANDLENVPROC __glewGetImageHandleNV; GLEW_FUN_EXPORT PFNGLGETTEXTUREHANDLENVPROC __glewGetTextureHandleNV; GLEW_FUN_EXPORT PFNGLGETTEXTURESAMPLERHANDLENVPROC __glewGetTextureSamplerHandleNV; @@ -16035,6 +17887,9 @@ GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC __glewProgramUniformHandleu GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64NVPROC __glewUniformHandleui64NV; GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64VNVPROC __glewUniformHandleui64vNV; +GLEW_FUN_EXPORT PFNGLBLENDBARRIERNVPROC __glewBlendBarrierNV; +GLEW_FUN_EXPORT PFNGLBLENDPARAMETERINVPROC __glewBlendParameteriNV; + GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERNVPROC __glewBeginConditionalRenderNV; GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERNVPROC __glewEndConditionalRenderNV; @@ -16044,6 +17899,8 @@ GLEW_FUN_EXPORT PFNGLCLEARDEPTHDNVPROC __glewClearDepthdNV; GLEW_FUN_EXPORT PFNGLDEPTHBOUNDSDNVPROC __glewDepthBoundsdNV; GLEW_FUN_EXPORT PFNGLDEPTHRANGEDNVPROC __glewDepthRangedNV; +GLEW_FUN_EXPORT PFNGLDRAWTEXTURENVPROC __glewDrawTextureNV; + GLEW_FUN_EXPORT PFNGLEVALMAPSNVPROC __glewEvalMapsNV; GLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERFVNVPROC __glewGetMapAttribParameterfvNV; GLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERIVNVPROC __glewGetMapAttribParameterivNV; @@ -16442,11 +18299,59 @@ GLEW_FUN_EXPORT PFNGLFRUSTUMFOESPROC __glewFrustumfOES; GLEW_FUN_EXPORT PFNGLGETCLIPPLANEFOESPROC __glewGetClipPlanefOES; GLEW_FUN_EXPORT PFNGLORTHOFOESPROC __glewOrthofOES; +GLEW_FUN_EXPORT PFNGLALPHAFUNCXPROC __glewAlphaFuncx; +GLEW_FUN_EXPORT PFNGLCLEARCOLORXPROC __glewClearColorx; +GLEW_FUN_EXPORT PFNGLCLEARDEPTHXPROC __glewClearDepthx; +GLEW_FUN_EXPORT PFNGLCOLOR4XPROC __glewColor4x; +GLEW_FUN_EXPORT PFNGLDEPTHRANGEXPROC __glewDepthRangex; +GLEW_FUN_EXPORT PFNGLFOGXPROC __glewFogx; +GLEW_FUN_EXPORT PFNGLFOGXVPROC __glewFogxv; +GLEW_FUN_EXPORT PFNGLFRUSTUMFPROC __glewFrustumf; +GLEW_FUN_EXPORT PFNGLFRUSTUMXPROC __glewFrustumx; +GLEW_FUN_EXPORT PFNGLLIGHTMODELXPROC __glewLightModelx; +GLEW_FUN_EXPORT PFNGLLIGHTMODELXVPROC __glewLightModelxv; +GLEW_FUN_EXPORT PFNGLLIGHTXPROC __glewLightx; +GLEW_FUN_EXPORT PFNGLLIGHTXVPROC __glewLightxv; +GLEW_FUN_EXPORT PFNGLLINEWIDTHXPROC __glewLineWidthx; +GLEW_FUN_EXPORT PFNGLLOADMATRIXXPROC __glewLoadMatrixx; +GLEW_FUN_EXPORT PFNGLMATERIALXPROC __glewMaterialx; +GLEW_FUN_EXPORT PFNGLMATERIALXVPROC __glewMaterialxv; +GLEW_FUN_EXPORT PFNGLMULTMATRIXXPROC __glewMultMatrixx; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4XPROC __glewMultiTexCoord4x; +GLEW_FUN_EXPORT PFNGLNORMAL3XPROC __glewNormal3x; +GLEW_FUN_EXPORT PFNGLORTHOFPROC __glewOrthof; +GLEW_FUN_EXPORT PFNGLORTHOXPROC __glewOrthox; +GLEW_FUN_EXPORT PFNGLPOINTSIZEXPROC __glewPointSizex; +GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETXPROC __glewPolygonOffsetx; +GLEW_FUN_EXPORT PFNGLROTATEXPROC __glewRotatex; +GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEXPROC __glewSampleCoveragex; +GLEW_FUN_EXPORT PFNGLSCALEXPROC __glewScalex; +GLEW_FUN_EXPORT PFNGLTEXENVXPROC __glewTexEnvx; +GLEW_FUN_EXPORT PFNGLTEXENVXVPROC __glewTexEnvxv; +GLEW_FUN_EXPORT PFNGLTEXPARAMETERXPROC __glewTexParameterx; +GLEW_FUN_EXPORT PFNGLTRANSLATEXPROC __glewTranslatex; + +GLEW_FUN_EXPORT PFNGLCLIPPLANEFPROC __glewClipPlanef; +GLEW_FUN_EXPORT PFNGLCLIPPLANEXPROC __glewClipPlanex; +GLEW_FUN_EXPORT PFNGLGETCLIPPLANEFPROC __glewGetClipPlanef; +GLEW_FUN_EXPORT PFNGLGETCLIPPLANEXPROC __glewGetClipPlanex; +GLEW_FUN_EXPORT PFNGLGETFIXEDVPROC __glewGetFixedv; +GLEW_FUN_EXPORT PFNGLGETLIGHTXVPROC __glewGetLightxv; +GLEW_FUN_EXPORT PFNGLGETMATERIALXVPROC __glewGetMaterialxv; +GLEW_FUN_EXPORT PFNGLGETTEXENVXVPROC __glewGetTexEnvxv; +GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERXVPROC __glewGetTexParameterxv; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERXPROC __glewPointParameterx; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERXVPROC __glewPointParameterxv; +GLEW_FUN_EXPORT PFNGLPOINTSIZEPOINTEROESPROC __glewPointSizePointerOES; +GLEW_FUN_EXPORT PFNGLTEXPARAMETERXVPROC __glewTexParameterxv; + GLEW_FUN_EXPORT PFNGLERRORSTRINGREGALPROC __glewErrorStringREGAL; GLEW_FUN_EXPORT PFNGLGETEXTENSIONREGALPROC __glewGetExtensionREGAL; GLEW_FUN_EXPORT PFNGLISSUPPORTEDREGALPROC __glewIsSupportedREGAL; +GLEW_FUN_EXPORT PFNGLLOGMESSAGECALLBACKREGALPROC __glewLogMessageCallbackREGAL; + GLEW_FUN_EXPORT PFNGLDETAILTEXFUNCSGISPROC __glewDetailTexFuncSGIS; GLEW_FUN_EXPORT PFNGLGETDETAILTEXFUNCSGISPROC __glewGetDetailTexFuncSGIS; @@ -16600,6 +18505,7 @@ GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_0; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_1; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_2; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_3; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_4; GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_tbuffer; GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_texture_compression_FXT1; @@ -16608,6 +18514,7 @@ GLEW_VAR_EXPORT GLboolean __GLEW_AMD_conservative_depth; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_debug_output; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_depth_clamp_separate; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_draw_buffers_blend; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_interleaved_elements; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_multi_draw_indirect; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_name_gen_delete; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_performance_monitor; @@ -16616,12 +18523,26 @@ GLEW_VAR_EXPORT GLboolean __GLEW_AMD_query_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_sample_positions; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_seamless_cubemap_per_texture; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_stencil_export; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_trinary_minmax; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_sparse_texture; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_stencil_operation_extended; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_texture_texture4; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_transform_feedback3_lines_triangles; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_layer; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_tessellator; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_viewport_index; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_depth_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_framebuffer_blit; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_framebuffer_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_instanced_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_pack_reverse_row_order; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_program_binary; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_compression_dxt1; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_compression_dxt3; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_compression_dxt5; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_usage; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_timer_query; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_translated_shader_source; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_aux_depth_stencil; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_client_storage; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_element_array; @@ -16643,13 +18564,17 @@ GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES2_compatibility; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES3_compatibility; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_arrays_of_arrays; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_base_instance; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_bindless_texture; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_blend_func_extended; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_buffer_storage; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_cl_event; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_clear_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_clear_texture; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_color_buffer_float; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compatibility; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compressed_texture_pixel_storage; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compute_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compute_variable_group_size; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_conservative_depth; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_copy_buffer; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_copy_image; @@ -16662,6 +18587,7 @@ GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_buffers_blend; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_elements_base_vertex; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_indirect; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_instanced; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_enhanced_layouts; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_explicit_attrib_location; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_explicit_uniform_location; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_coord_conventions; @@ -16679,6 +18605,7 @@ GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader_fp64; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_half_float_pixel; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_half_float_vertex; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_imaging; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_indirect_parameters; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_instanced_arrays; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_internalformat_query; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_internalformat_query2; @@ -16686,6 +18613,7 @@ GLEW_VAR_EXPORT GLboolean __GLEW_ARB_invalidate_subdata; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_map_buffer_alignment; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_map_buffer_range; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_matrix_palette; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multi_bind; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multi_draw_indirect; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multitexture; @@ -16696,6 +18624,7 @@ GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_parameters; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_sprite; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_program_interface_query; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_provoking_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_query_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robust_buffer_access_behavior; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness_application_isolation; @@ -16703,9 +18632,12 @@ GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness_share_group_isolation; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sample_shading; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sampler_objects; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_seamless_cube_map; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_seamless_cubemap_per_texture; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_separate_shader_objects; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_atomic_counters; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_bit_encoding; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_draw_parameters; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_group_vote; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_image_load_store; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_image_size; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_objects; @@ -16720,6 +18652,7 @@ GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_include; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_packing; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow_ambient; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_texture; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_stencil_texturing; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sync; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_tessellation_shader; @@ -16738,6 +18671,7 @@ 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_gather; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_mirror_clamp_to_edge; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_mirrored_repeat; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_non_power_of_two; @@ -16746,6 +18680,7 @@ GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_query_lod; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rectangle; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rg; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rgb10_a2ui; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_stencil8; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_storage; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_storage_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_swizzle; @@ -16764,6 +18699,7 @@ 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_vertex_type_10f_11f_11f_rev; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_type_2_10_10_10_rev; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_viewport_array; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_window_pos; @@ -16902,6 +18838,7 @@ 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_map_texture; GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_parallel_arrays; GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_texture_scissor; GLEW_VAR_EXPORT GLboolean __GLEW_KHR_debug; @@ -16912,15 +18849,22 @@ 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_NVX_conditional_render; GLEW_VAR_EXPORT GLboolean __GLEW_NVX_gpu_memory_info; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_bindless_multi_draw_indirect; GLEW_VAR_EXPORT GLboolean __GLEW_NV_bindless_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_equation_advanced; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_equation_advanced_coherent; GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_square; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_compute_program5; GLEW_VAR_EXPORT GLboolean __GLEW_NV_conditional_render; GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_depth_to_color; GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_image; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_deep_texture3D; 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_draw_texture; GLEW_VAR_EXPORT GLboolean __GLEW_NV_evaluators; GLEW_VAR_EXPORT GLboolean __GLEW_NV_explicit_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_NV_fence; @@ -16935,6 +18879,7 @@ 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_gpu_program5; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program5_mem_extended; GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program_fp64; GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_shader5; GLEW_VAR_EXPORT GLboolean __GLEW_NV_half_float; @@ -16952,8 +18897,10 @@ GLEW_VAR_EXPORT GLboolean __GLEW_NV_present_video; 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_shader_atomic_counters; GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_float; GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_buffer_load; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_storage_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_NV_tessellation_program5; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_emboss; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_reflection; @@ -16989,6 +18936,9 @@ 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_REGAL_ES1_0_compatibility; +GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_ES1_1_compatibility; +GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_enable; GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_error_string; GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_extension_query; GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_log; @@ -17108,6 +19058,14 @@ GLEWAPI GLboolean GLEWAPIENTRY glewGetExtension (const char *name); GLEWAPI const GLubyte * GLEWAPIENTRY glewGetErrorString (GLenum error); GLEWAPI const GLubyte * GLEWAPIENTRY glewGetString (GLenum name); +#ifdef GLEW_INIT_OPENGL11_FUNCTIONS +GLEWAPI GLboolean GLEWAPIENTRY glewOpenGL11Init(void); +#endif //GLEW_INIT_OPENGL11_FUNCTIONS + +#ifdef GLEW_DYNAMIC_LOAD_ALL_GLX_FUNCTIONS +GLEWAPI GLboolean GLEWAPIENTRY glewXInit(void); +#endif //GLEW_DYNAMIC_LOAD_ALL_GLX_FUNCTIONS + #ifdef __cplusplus } #endif diff --git a/btgui/OpenGLWindow/GlewWindows/GL/glxew.h b/btgui/OpenGLWindow/GlewWindows/GL/glxew.h index 9335b27bc..6115d611e 100644 --- a/btgui/OpenGLWindow/GlewWindows/GL/glxew.h +++ b/btgui/OpenGLWindow/GlewWindows/GL/glxew.h @@ -4,24 +4,24 @@ ** Copyright (C) 2002-2008, Marcelo E. Magallon ** Copyright (C) 2002, Lev Povalahev ** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without +** +** 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, +** +** * 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 +** * 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 +** * 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 +** 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 +** 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) @@ -55,7 +55,7 @@ /* ** Copyright (c) 2007 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 @@ -63,10 +63,10 @@ ** 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. @@ -97,7 +97,7 @@ #include #include #include -#include +#include "glew.h" #ifdef __cplusplus extern "C" { @@ -141,8 +141,50 @@ typedef struct __glXContextRec *GLXContext; typedef struct __GLXcontextRec *GLXContext; #endif -typedef unsigned int GLXVideoDeviceNV; +typedef unsigned int GLXVideoDeviceNV; +#ifdef GLEW_DYNAMIC_LOAD_ALL_GLX_FUNCTIONS + +typedef Bool (* PFNGLXQUERYEXTENSION) (Display *dpy, int *errorBase, int *eventBase); +#define glXQueryExtension GLXEW_GET_FUN(__glewXQueryExtension) + +typedef Bool (* PFNGLXQUERYVERSION) (Display *dpy, int *major, int *minor); +#define glXQueryVersion GLXEW_GET_FUN(__glewXQueryVersion) + +typedef int (* PFNGLXGETCONFIG) (Display *dpy, XVisualInfo *vis, int attrib, int *value); +#define glXGetConfig GLXEW_GET_FUN(__glewXGetConfig) + +typedef XVisualInfo* (* PFNGLXCHOOSEVISUAL) (Display *dpy, int screen, int *attribList); +#define glXChooseVisual GLXEW_GET_FUN(__glewXChooseVisual) + +//extern GLXPixmap glXCreateGLXPixmap (Display *dpy, XVisualInfo *vis, Pixmap pixmap); +//extern void glXDestroyGLXPixmap (Display *dpy, GLXPixmap pix); +typedef GLXContext (* PFNGLXCREATECONTEXT) (Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct); +#define glXCreateContext GLXEW_GET_FUN(__glewXCreateContext) + + +typedef void (*PFNGLXDESTROYCONTEXT) (Display *dpy, GLXContext ctx); +#define glXDestroyContext GLXEW_GET_FUN(__glewXDestroyContext) + +typedef Bool (* PFNGLXISDIRECT) (Display *dpy, GLXContext ctx); +#define glXIsDirect GLXEW_GET_FUN(__glewXIsDirect) + + +//extern void glXCopyContext (Display *dpy, GLXContext src, GLXContext dst, GLulong mask); +typedef Bool (*PFNGLXMAKECURRENT) (Display *dpy, GLXDrawable drawable, GLXContext ctx); +#define glXMakeCurrent GLXEW_GET_FUN(__glewXMakeCurrent) + +//extern GLXContext glXGetCurrentContext (void); +//extern GLXDrawable glXGetCurrentDrawable (void); +//extern void glXWaitGL (void); +//extern void glXWaitX (void); +typedef void (*PFNGLXSWAPBUFFERS) (Display *dpy, GLXDrawable drawable); +#define glXSwapBuffers GLXEW_GET_FUN(__glewXSwapBuffers) + +//extern void glXUseXFont (Font font, int first, int count, int listBase); + + +#else//GLEW_DYNAMIC_LOAD_ALL_GLX_FUNCTIONS 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); @@ -160,6 +202,7 @@ 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); +#endif //GLEW_DYNAMIC_LOAD_ALL_GLX_FUNCTIONS #define GLXEW_VERSION_1_0 GLXEW_GET_VAR(__GLXEW_VERSION_1_0) @@ -174,9 +217,22 @@ extern void glXUseXFont (Font font, int first, int count, int listBase); #define GLX_VERSION 0x2 #define GLX_EXTENSIONS 0x3 +#ifdef GLEW_DYNAMIC_LOAD_ALL_GLX_FUNCTIONS + +typedef const char* (*PFNGLXQUERYEXTENSIONSSTRING) (Display *dpy, int screen); +#define glXQueryExtensionsString GLXEW_GET_FUN(__glewXQueryExtensionsString) + +typedef const char* (*PFNGLXGETCLIENTSTRING) (Display *dpy, int name); +#define glXGetClientString GLXEW_GET_FUN(__glewXGetClientString) + +typedef const char* (*PFNGLXQUERYSERVERSTRING) (Display *dpy, int screen, int name); +#define glXQueryServerString GLXEW_GET_FUN(__glewXQueryServerString) + +#else//GLEW_DYNAMIC_LOAD_ALL_GLX_FUNCTIONS 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); +#endif//GLEW_DYNAMIC_LOAD_ALL_GLX_FUNCTIONS #define GLXEW_VERSION_1_1 GLXEW_GET_VAR(__GLXEW_VERSION_1_1) @@ -263,21 +319,21 @@ typedef XID GLXWindow; 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; + 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]; + GLXPbufferClobberEvent glxpbufferclobber; + long pad[24]; } GLXEvent; typedef GLXFBConfig* ( * PFNGLXCHOOSEFBCONFIGPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements); @@ -362,6 +418,26 @@ extern void ( * glXGetProcAddress (const GLubyte *procName)) (void); #define GLX_GPU_NUM_RB_AMD 0x21A7 #define GLX_GPU_NUM_SPI_AMD 0x21A8 +typedef void ( * PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC) (GLXContext dstCtx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef GLXContext ( * PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC) (unsigned int id, GLXContext share_list); +typedef GLXContext ( * PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC) (unsigned int id, GLXContext share_context, const int* attribList); +typedef Bool ( * PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC) (GLXContext ctx); +typedef unsigned int ( * PFNGLXGETCONTEXTGPUIDAMDPROC) (GLXContext ctx); +typedef GLXContext ( * PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC) (void); +typedef unsigned int ( * PFNGLXGETGPUIDSAMDPROC) (unsigned int maxCount, unsigned int* ids); +typedef int ( * PFNGLXGETGPUINFOAMDPROC) (unsigned int id, int property, GLenum dataType, unsigned int size, void* data); +typedef Bool ( * PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC) (GLXContext ctx); + +#define glXBlitContextFramebufferAMD GLXEW_GET_FUN(__glewXBlitContextFramebufferAMD) +#define glXCreateAssociatedContextAMD GLXEW_GET_FUN(__glewXCreateAssociatedContextAMD) +#define glXCreateAssociatedContextAttribsAMD GLXEW_GET_FUN(__glewXCreateAssociatedContextAttribsAMD) +#define glXDeleteAssociatedContextAMD GLXEW_GET_FUN(__glewXDeleteAssociatedContextAMD) +#define glXGetContextGPUIDAMD GLXEW_GET_FUN(__glewXGetContextGPUIDAMD) +#define glXGetCurrentAssociatedContextAMD GLXEW_GET_FUN(__glewXGetCurrentAssociatedContextAMD) +#define glXGetGPUIDsAMD GLXEW_GET_FUN(__glewXGetGPUIDsAMD) +#define glXGetGPUInfoAMD GLXEW_GET_FUN(__glewXGetGPUInfoAMD) +#define glXMakeAssociatedContextCurrentAMD GLXEW_GET_FUN(__glewXMakeAssociatedContextCurrentAMD) + #define GLXEW_AMD_gpu_association GLXEW_GET_VAR(__GLXEW_AMD_gpu_association) #endif /* GLX_AMD_gpu_association */ @@ -440,7 +516,13 @@ typedef GLXContext ( * PFNGLXCREATECONTEXTATTRIBSARBPROC) (Display* dpy, GLXFBCo #ifndef GLX_ARB_get_proc_address #define GLX_ARB_get_proc_address 1 +#ifdef GLEW_DYNAMIC_LOAD_ALL_GLX_FUNCTIONS +typedef void* ( * PFNGLXGETPROCADDRESSARBPROC) (const GLubyte *procName); +#define glXGetProcAddressARB GLXEW_GET_FUN(__glewXGetProcAddressARB) + +#else//GLEW_DYNAMIC_LOAD_ALL_GLX_FUNCTIONS extern void ( * glXGetProcAddressARB (const GLubyte *procName)) (void); +#endif //GLEW_DYNAMIC_LOAD_ALL_GLX_FUNCTIONS #define GLXEW_ARB_get_proc_address GLXEW_GET_VAR(__GLXEW_ARB_get_proc_address) @@ -555,6 +637,17 @@ typedef void ( * PFNGLXRELEASETEXIMAGEATIPROC) (Display *dpy, GLXPbuffer pbuf, i #endif /* GLX_ATI_render_texture */ +/* --------------------------- GLX_EXT_buffer_age -------------------------- */ + +#ifndef GLX_EXT_buffer_age +#define GLX_EXT_buffer_age 1 + +#define GLX_BACK_BUFFER_AGE_EXT 0x20F4 + +#define GLXEW_EXT_buffer_age GLXEW_GET_VAR(__GLXEW_EXT_buffer_age) + +#endif /* GLX_EXT_buffer_age */ + /* ------------------- GLX_EXT_create_context_es2_profile ------------------ */ #ifndef GLX_EXT_create_context_es2_profile @@ -962,10 +1055,10 @@ typedef void ( * PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC) (Display* dpy, GLXVideoC #endif /* GLX_NV_video_capture */ -/* ---------------------------- GLX_NV_video_out --------------------------- */ +/* -------------------------- GLX_NV_video_output -------------------------- */ -#ifndef GLX_NV_video_out -#define GLX_NV_video_out 1 +#ifndef GLX_NV_video_output +#define GLX_NV_video_output 1 #define GLX_VIDEO_OUT_COLOR_NV 0x20C3 #define GLX_VIDEO_OUT_ALPHA_NV 0x20C4 @@ -992,9 +1085,9 @@ typedef int ( * PFNGLXSENDPBUFFERTOVIDEONVPROC) (Display* dpy, GLXPbuffer pbuf, #define glXReleaseVideoImageNV GLXEW_GET_FUN(__glewXReleaseVideoImageNV) #define glXSendPbufferToVideoNV GLXEW_GET_FUN(__glewXSendPbufferToVideoNV) -#define GLXEW_NV_video_out GLXEW_GET_VAR(__GLXEW_NV_video_out) +#define GLXEW_NV_video_output GLXEW_GET_VAR(__GLXEW_NV_video_output) -#endif /* GLX_NV_video_out */ +#endif /* GLX_NV_video_output */ /* -------------------------- GLX_OML_swap_method -------------------------- */ @@ -1047,16 +1140,6 @@ typedef Bool ( * PFNGLXWAITFORSBCOMLPROC) (Display* dpy, GLXDrawable drawable, i #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 */ @@ -1140,32 +1223,32 @@ typedef XVisualInfo* ( * PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) (Display *dpy, GLX #define GLX_HYPERPIPE_ID_SGIX 0x8030 typedef struct { - char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; - int networkId; + char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; + int networkId; } GLXHyperpipeNetworkSGIX; typedef struct { - char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; - int XOrigin; - int YOrigin; - int maxHeight; - int maxWidth; + char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; + int XOrigin; + int YOrigin; + int maxHeight; + int maxWidth; } GLXPipeRectLimits; typedef struct { - char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; - int channel; - unsigned int participationType; - int timeSlice; + 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; + 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 int ( * PFNGLXBINDHYPERPIPESGIXPROC) (Display *dpy, int hpId); @@ -1393,13 +1476,31 @@ typedef int ( * PFNGLXVIDEORESIZESUNPROC) (Display* display, GLXDrawable window, /* ------------------------------------------------------------------------- */ #ifdef GLEW_MX -#define GLXEW_FUN_EXPORT +#define GLXEW_FUN_EXPORT GLEW_FUN_EXPORT #define GLXEW_VAR_EXPORT #else #define GLXEW_FUN_EXPORT GLEW_FUN_EXPORT #define GLXEW_VAR_EXPORT GLEW_VAR_EXPORT #endif /* GLEW_MX */ +#ifdef GLEW_DYNAMIC_LOAD_ALL_GLX_FUNCTIONS +GLXEW_FUN_EXPORT PFNGLXGETPROCADDRESSARBPROC __glewXGetProcAddressARB; +GLXEW_FUN_EXPORT PFNGLXQUERYEXTENSION __glewXQueryExtension; +GLXEW_FUN_EXPORT PFNGLXQUERYVERSION __glewXQueryVersion; +GLXEW_FUN_EXPORT PFNGLXGETCONFIG __glewXGetConfig; +GLXEW_FUN_EXPORT PFNGLXCHOOSEVISUAL __glewXChooseVisual; +GLXEW_FUN_EXPORT PFNGLXCREATECONTEXT __glewXCreateContext; +GLXEW_FUN_EXPORT PFNGLXDESTROYCONTEXT __glewXDestroyContext; +GLXEW_FUN_EXPORT PFNGLXISDIRECT __glewXIsDirect; +GLXEW_FUN_EXPORT PFNGLXMAKECURRENT __glewXMakeCurrent; +GLXEW_FUN_EXPORT PFNGLXQUERYEXTENSIONSSTRING __glewXQueryExtensionsString; +GLXEW_FUN_EXPORT PFNGLXGETCLIENTSTRING __glewXGetClientString; +GLXEW_FUN_EXPORT PFNGLXQUERYSERVERSTRING __glewXQueryServerString; +GLXEW_FUN_EXPORT PFNGLXSWAPBUFFERS __glewXSwapBuffers; + + +#endif //GLEW_DYNAMIC_LOAD_ALL_GLX_FUNCTIONS + GLXEW_FUN_EXPORT PFNGLXGETCURRENTDISPLAYPROC __glewXGetCurrentDisplay; GLXEW_FUN_EXPORT PFNGLXCHOOSEFBCONFIGPROC __glewXChooseFBConfig; @@ -1420,8 +1521,19 @@ GLXEW_FUN_EXPORT PFNGLXQUERYCONTEXTPROC __glewXQueryContext; GLXEW_FUN_EXPORT PFNGLXQUERYDRAWABLEPROC __glewXQueryDrawable; GLXEW_FUN_EXPORT PFNGLXSELECTEVENTPROC __glewXSelectEvent; +GLXEW_FUN_EXPORT PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC __glewXBlitContextFramebufferAMD; +GLXEW_FUN_EXPORT PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC __glewXCreateAssociatedContextAMD; +GLXEW_FUN_EXPORT PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __glewXCreateAssociatedContextAttribsAMD; +GLXEW_FUN_EXPORT PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC __glewXDeleteAssociatedContextAMD; +GLXEW_FUN_EXPORT PFNGLXGETCONTEXTGPUIDAMDPROC __glewXGetContextGPUIDAMD; +GLXEW_FUN_EXPORT PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC __glewXGetCurrentAssociatedContextAMD; +GLXEW_FUN_EXPORT PFNGLXGETGPUIDSAMDPROC __glewXGetGPUIDsAMD; +GLXEW_FUN_EXPORT PFNGLXGETGPUINFOAMDPROC __glewXGetGPUInfoAMD; +GLXEW_FUN_EXPORT PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __glewXMakeAssociatedContextCurrentAMD; + GLXEW_FUN_EXPORT PFNGLXCREATECONTEXTATTRIBSARBPROC __glewXCreateContextAttribsARB; + GLXEW_FUN_EXPORT PFNGLXBINDTEXIMAGEATIPROC __glewXBindTexImageATI; GLXEW_FUN_EXPORT PFNGLXDRAWABLEATTRIBATIPROC __glewXDrawableAttribATI; GLXEW_FUN_EXPORT PFNGLXRELEASETEXIMAGEATIPROC __glewXReleaseTexImageATI; @@ -1555,6 +1667,7 @@ GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_robustness_share_group_isolation; GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_vertex_buffer_object; GLXEW_VAR_EXPORT GLboolean __GLXEW_ATI_pixel_format_float; GLXEW_VAR_EXPORT GLboolean __GLXEW_ATI_render_texture; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_buffer_age; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_create_context_es2_profile; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_create_context_es_profile; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_fbconfig_packed_float; @@ -1580,7 +1693,7 @@ GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_present_video; GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_swap_group; GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_vertex_array_range; GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_video_capture; -GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_video_out; +GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_video_output; GLXEW_VAR_EXPORT GLboolean __GLXEW_OML_swap_method; GLXEW_VAR_EXPORT GLboolean __GLXEW_OML_sync_control; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_blended_overlay; diff --git a/btgui/OpenGLWindow/GlewWindows/GL/glxext.h b/btgui/OpenGLWindow/GlewWindows/GL/glxext.h deleted file mode 100644 index b3de958da..000000000 --- a/btgui/OpenGLWindow/GlewWindows/GL/glxext.h +++ /dev/null @@ -1,546 +0,0 @@ -#ifndef __glxext_h_ -#define __glxext_h_ - -#ifdef __cplusplus -extern "C" { -#endif - -/* -** 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. -*/ - -#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) -#define WIN32_LEAN_AND_MEAN 1 -#include -#else -#include -#endif - -#ifndef APIENTRY -#define APIENTRY -#endif - - -/*************************************************************/ - -/* Header file version number, required by OpenGL ABI for Linux */ -#define GLX_GLXEXT_VERSION 2 - -#ifndef GLX_VERSION_1_3 -#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 -#endif - -#ifndef GLX_EXT_visual_info -#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 - -#ifndef GLX_SGI_swap_control -#endif - -#ifndef GLX_SGI_video_sync -#endif - -#ifndef GLX_SGI_make_current_read -#endif - -#ifndef GLX_SGIX_video_source -#endif - -#ifndef GLX_EXT_visual_rating -#define GLX_VISUAL_CAVEAT_EXT 0x20 -#define GLX_SLOW_VISUAL_EXT 0x8001 -#define GLX_NON_CONFORMANT_VISUAL_EXT 0x800D -/* reuse GLX_NONE_EXT */ -#endif - -#ifndef GLX_EXT_import_context -#define GLX_SHARE_CONTEXT_EXT 0x800A -#define GLX_VISUAL_ID_EXT 0x800B -#define GLX_SCREEN_EXT 0x800C -#endif - -#ifndef GLX_SGIX_fbconfig -#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 -/* reuse GLX_SCREEN_EXT */ -#endif - -#ifndef GLX_SGIX_pbuffer -#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 -#endif - -#ifndef GLX_SGI_cushion -#endif - -#ifndef GLX_SGIX_video_resize -#define GLX_SYNC_FRAME_SGIX 0x00000000 -#define GLX_SYNC_SWAP_SGIX 0x00000001 -#endif - -#ifndef GLX_SGIX_dmbuffer -#define GLX_DIGITAL_MEDIA_PBUFFER_SGIX 0x8024 -#endif - -#ifndef GLX_SGIX_swap_group -#endif - -#ifndef GLX_SGIX_swap_barrier -#endif - -#ifndef GLX_SGIS_blended_overlay -#define GLX_BLENDED_RGBA_SGIS 0x8025 -#endif - -#ifndef GLX_SGIS_shared_multisample -#define GLX_MULTISAMPLE_SUB_RECT_WIDTH_SGIS 0x8026 -#define GLX_MULTISAMPLE_SUB_RECT_HEIGHT_SGIS 0x8027 -#endif - -#ifndef GLX_SUN_get_transparent_index -#endif - -#ifndef GLX_3DFX_multisample -#define GLX_SAMPLE_BUFFERS_3DFX 0x8050 -#define GLX_SAMPLES_3DFX 0x8051 -#endif - -#ifndef GLX_MESA_copy_sub_buffer -#endif - -#ifndef GLX_MESA_pixmap_colormap -#endif - -#ifndef GLX_MESA_release_buffers -#endif - -#ifndef GLX_MESA_set_3dfx_mode -#define GLX_3DFX_WINDOW_MODE_MESA 0x1 -#define GLX_3DFX_FULLSCREEN_MODE_MESA 0x2 -#endif - - -/*************************************************************/ - -#ifndef GLX_ARB_get_proc_address -typedef void (*__GLXextFuncPtr)(); -#endif - -#ifndef GLX_SGIX_video_source -typedef XID GLXVideoSourceSGIX; -#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; /* # of last request processed by server */ - Bool send_event; /* true if this came for SendEvent request */ - Display *display; /* display the event was read from */ - GLXDrawable drawable; /* i.d. of Drawable */ - int event_type; /* GLX_DAMAGED_SGIX or GLX_SAVED_SGIX */ - int draw_type; /* GLX_WINDOW_SGIX or GLX_PBUFFER_SGIX */ - unsigned int mask; /* mask indicating which buffers are affected*/ - int x, y; - int width, height; - int count; /* if nonzero, at least this many more */ -} GLXBufferClobberEventSGIX; -#endif - -#ifdef GL_NV_vertex_array_range -#ifndef PFNGLXALLOCATEMEMORYNVPROC -#ifdef GLX_GLXEXT_PROTOTYPES -extern void *glXAllocateMemoryNV (GLsizei, GLfloat, GLfloat, GLfloat); -#endif -typedef void * ( * PFNGLXALLOCATEMEMORYNVPROC) (GLsizei, GLfloat, GLfloat, GLfloat); -#endif -#ifndef PFNGLXFREEMEMORYNVPROC -#ifdef GLX_GLXEXT_PROTOTYPES -extern void glXFreeMemoryNV (void *); -#endif -typedef void ( * PFNGLXFREEMEMORYNVPROC) (void *); -#endif -#endif - -#ifndef GLX_VERSION_1_3 -#define GLX_VERSION_1_3 1 -#ifdef GLX_GLXEXT_PROTOTYPES -extern GLXFBConfig * glXGetFBConfigs (Display *, int, int *); -extern GLXFBConfig * glXChooseFBConfig (Display *, int, const int *, int *); -extern int glXGetFBConfigAttrib (Display *, GLXFBConfig, int, int *); -extern XVisualInfo * glXGetVisualFromFBConfig (Display *, GLXFBConfig); -extern GLXWindow glXCreateWindow (Display *, GLXFBConfig, Window, const int *); -extern void glXDestroyWindow (Display *, GLXWindow); -extern GLXPixmap glXCreatePixmap (Display *, GLXFBConfig, Pixmap, const int *); -extern void glXDestroyPixmap (Display *, GLXPixmap); -extern GLXPbuffer glXCreatePbuffer (Display *, GLXFBConfig, const int *); -extern void glXDestroyPbuffer (Display *, GLXPbuffer); -extern void glXQueryDrawable (Display *, GLXDrawable, int, unsigned int *); -extern GLXContext glXCreateNewContext (Display *, GLXFBConfig, int, GLXContext, Bool); -extern Bool glXMakeContextCurrent (Display *, GLXDrawable, GLXDrawable, GLXContext); -extern GLXDrawable glXGetCurrentReadDrawable (void); -extern Display * glXGetCurrentDisplay (void); -extern int glXQueryContext (Display *, GLXContext, int, int *); -extern void glXSelectEvent (Display *, GLXDrawable, unsigned long); -extern void glXGetSelectedEvent (Display *, GLXDrawable, unsigned long *); -#endif /* GLX_GLXEXT_PROTOTYPES */ -typedef GLXFBConfig * ( * PFNGLXGETFBCONFIGSPROC) (Display *dpy, int screen, int *nelements); -typedef GLXFBConfig * ( * PFNGLXCHOOSEFBCONFIGPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements); -typedef int ( * PFNGLXGETFBCONFIGATTRIBPROC) (Display *dpy, GLXFBConfig config, int attribute, int *value); -typedef XVisualInfo * ( * PFNGLXGETVISUALFROMFBCONFIGPROC) (Display *dpy, GLXFBConfig config); -typedef GLXWindow ( * PFNGLXCREATEWINDOWPROC) (Display *dpy, GLXFBConfig config, Window win, const int *attrib_list); -typedef void ( * PFNGLXDESTROYWINDOWPROC) (Display *dpy, GLXWindow win); -typedef GLXPixmap ( * PFNGLXCREATEPIXMAPPROC) (Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attrib_list); -typedef void ( * PFNGLXDESTROYPIXMAPPROC) (Display *dpy, GLXPixmap pixmap); -typedef GLXPbuffer ( * PFNGLXCREATEPBUFFERPROC) (Display *dpy, GLXFBConfig config, const int *attrib_list); -typedef void ( * PFNGLXDESTROYPBUFFERPROC) (Display *dpy, GLXPbuffer pbuf); -typedef void ( * PFNGLXQUERYDRAWABLEPROC) (Display *dpy, GLXDrawable draw, int attribute, unsigned int *value); -typedef GLXContext ( * PFNGLXCREATENEWCONTEXTPROC) (Display *dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct); -typedef Bool ( * PFNGLXMAKECONTEXTCURRENTPROC) (Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx); -typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLEPROC) (void); -typedef Display * ( * PFNGLXGETCURRENTDISPLAYPROC) (void); -typedef int ( * PFNGLXQUERYCONTEXTPROC) (Display *dpy, GLXContext ctx, int attribute, int *value); -typedef void ( * PFNGLXSELECTEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long event_mask); -typedef void ( * PFNGLXGETSELECTEDEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long *event_mask); -#endif - -#ifndef GLX_ARB_get_proc_address -#define GLX_ARB_get_proc_address 1 -#ifdef GLX_GLXEXT_PROTOTYPES -extern __GLXextFuncPtr glXGetProcAddressARB (const GLubyte *); -#endif /* GLX_GLXEXT_PROTOTYPES */ -typedef __GLXextFuncPtr ( * PFNGLXGETPROCADDRESSARBPROC) (const GLubyte *procName); -#endif - -#ifndef GLX_SGIS_multisample -#define GLX_SGIS_multisample 1 -#endif - -#ifndef GLX_EXT_visual_info -#define GLX_EXT_visual_info 1 -#endif - -#ifndef GLX_SGI_swap_control -#define GLX_SGI_swap_control 1 -#ifdef GLX_GLXEXT_PROTOTYPES -extern int glXSwapIntervalSGI (int); -#endif /* GLX_GLXEXT_PROTOTYPES */ -typedef int ( * PFNGLXSWAPINTERVALSGIPROC) (int interval); -#endif - -#ifndef GLX_SGI_video_sync -#define GLX_SGI_video_sync 1 -#ifdef GLX_GLXEXT_PROTOTYPES -extern int glXGetVideoSyncSGI (unsigned int *); -extern int glXWaitVideoSyncSGI (int, int, unsigned int *); -#endif /* GLX_GLXEXT_PROTOTYPES */ -typedef int ( * PFNGLXGETVIDEOSYNCSGIPROC) (unsigned int *count); -typedef int ( * PFNGLXWAITVIDEOSYNCSGIPROC) (int divisor, int remainder, unsigned int *count); -#endif - -#ifndef GLX_SGI_make_current_read -#define GLX_SGI_make_current_read 1 -#ifdef GLX_GLXEXT_PROTOTYPES -extern Bool glXMakeCurrentReadSGI (Display *, GLXDrawable, GLXDrawable, GLXContext); -extern GLXDrawable glXGetCurrentReadDrawableSGI (void); -#endif /* GLX_GLXEXT_PROTOTYPES */ -typedef Bool ( * PFNGLXMAKECURRENTREADSGIPROC) (Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx); -typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLESGIPROC) (void); -#endif - -#ifdef _VL_H -#ifndef GLX_SGIX_video_source -#define GLX_SGIX_video_source 1 -#ifdef GLX_GLXEXT_PROTOTYPES -extern GLXVideoSourceSGIX glXCreateGLXVideoSourceSGIX (Display *, int, VLServer, VLPath, int, VLNode); -extern void glXDestroyGLXVideoSourceSGIX (Display *, GLXVideoSourceSGIX); -#endif /* GLX_GLXEXT_PROTOTYPES */ -typedef GLXVideoSourceSGIX ( * PFNGLXCREATEGLXVIDEOSOURCESGIXPROC) (Display *display, int screen, VLServer server, VLPath path, int nodeClass, VLNode drainNode); -typedef void ( * PFNGLXDESTROYGLXVIDEOSOURCESGIXPROC) (Display *dpy, GLXVideoSourceSGIX glxvideosource); -#endif - -#endif /* _VL_H */ -#ifndef GLX_EXT_visual_rating -#define GLX_EXT_visual_rating 1 -#endif - -#ifndef GLX_EXT_import_context -#define GLX_EXT_import_context 1 -#ifdef GLX_GLXEXT_PROTOTYPES -extern Display * glXGetCurrentDisplayEXT (void); -extern int glXQueryContextInfoEXT (Display *, GLXContext, int, int *); -extern GLXContextID glXGetContextIDEXT (GLXContext); -extern GLXContext glXImportContextEXT (Display *, GLXContextID); -extern void glXFreeContextEXT (Display *, GLXContext); -#endif /* GLX_GLXEXT_PROTOTYPES */ -typedef Display * ( * PFNGLXGETCURRENTDISPLAYEXTPROC) (void); -typedef int ( * PFNGLXQUERYCONTEXTINFOEXTPROC) (Display *dpy, GLXContext context, int attribute, int *value); -typedef GLXContextID ( * PFNGLXGETCONTEXTIDEXTPROC) (GLXContext context); -typedef GLXContext ( * PFNGLXIMPORTCONTEXTEXTPROC) (Display *dpy, GLXContextID contextID); -typedef void ( * PFNGLXFREECONTEXTEXTPROC) (Display *dpy, GLXContext context); -#endif - -#ifndef GLX_SGIX_fbconfig -#define GLX_SGIX_fbconfig 1 -#ifdef GLX_GLXEXT_PROTOTYPES -extern int glXGetFBConfigAttribSGIX (Display *, GLXFBConfigSGIX, int, int *); -extern GLXFBConfigSGIX * glXChooseFBConfigSGIX (Display *, int, int *, int *); -extern GLXPixmap glXCreateGLXPixmapWithConfigSGIX (Display *, GLXFBConfigSGIX, Pixmap); -extern GLXContext glXCreateContextWithConfigSGIX (Display *, GLXFBConfigSGIX, int, GLXContext, Bool); -extern XVisualInfo * glXGetVisualFromFBConfigSGIX (Display *, GLXFBConfigSGIX); -extern GLXFBConfigSGIX glXGetFBConfigFromVisualSGIX (Display *, XVisualInfo *); -#endif /* GLX_GLXEXT_PROTOTYPES */ -typedef int ( * PFNGLXGETFBCONFIGATTRIBSGIXPROC) (Display *dpy, GLXFBConfigSGIX config, int attribute, int *value); -typedef GLXFBConfigSGIX * ( * PFNGLXCHOOSEFBCONFIGSGIXPROC) (Display *dpy, int screen, int *attrib_list, int *nelements); -typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC) (Display *dpy, GLXFBConfigSGIX config, Pixmap pixmap); -typedef GLXContext ( * PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) (Display *dpy, GLXFBConfigSGIX config, int render_type, GLXContext share_list, Bool direct); -typedef XVisualInfo * ( * PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) (Display *dpy, GLXFBConfigSGIX config); -typedef GLXFBConfigSGIX ( * PFNGLXGETFBCONFIGFROMVISUALSGIXPROC) (Display *dpy, XVisualInfo *vis); -#endif - -#ifndef GLX_SGIX_pbuffer -#define GLX_SGIX_pbuffer 1 -#ifdef GLX_GLXEXT_PROTOTYPES -extern GLXPbufferSGIX glXCreateGLXPbufferSGIX (Display *, GLXFBConfigSGIX, unsigned int, unsigned int, int *); -extern void glXDestroyGLXPbufferSGIX (Display *, GLXPbufferSGIX); -extern int glXQueryGLXPbufferSGIX (Display *, GLXPbufferSGIX, int, unsigned int *); -extern void glXSelectEventSGIX (Display *, GLXDrawable, unsigned long); -extern void glXGetSelectedEventSGIX (Display *, GLXDrawable, unsigned long *); -#endif /* GLX_GLXEXT_PROTOTYPES */ -typedef GLXPbufferSGIX ( * PFNGLXCREATEGLXPBUFFERSGIXPROC) (Display *dpy, GLXFBConfigSGIX config, unsigned int width, unsigned int height, int *attrib_list); -typedef void ( * PFNGLXDESTROYGLXPBUFFERSGIXPROC) (Display *dpy, GLXPbufferSGIX pbuf); -typedef int ( * PFNGLXQUERYGLXPBUFFERSGIXPROC) (Display *dpy, GLXPbufferSGIX pbuf, int attribute, unsigned int *value); -typedef void ( * PFNGLXSELECTEVENTSGIXPROC) (Display *dpy, GLXDrawable drawable, unsigned long mask); -typedef void ( * PFNGLXGETSELECTEDEVENTSGIXPROC) (Display *dpy, GLXDrawable drawable, unsigned long *mask); -#endif - -#ifndef GLX_SGI_cushion -#define GLX_SGI_cushion 1 -#ifdef GLX_GLXEXT_PROTOTYPES -extern void glXCushionSGI (Display *, Window, float); -#endif /* GLX_GLXEXT_PROTOTYPES */ -typedef void ( * PFNGLXCUSHIONSGIPROC) (Display *dpy, Window window, float cushion); -#endif - -#ifndef GLX_SGIX_video_resize -#define GLX_SGIX_video_resize 1 -#ifdef GLX_GLXEXT_PROTOTYPES -extern int glXBindChannelToWindowSGIX (Display *, int, int, Window); -extern int glXChannelRectSGIX (Display *, int, int, int, int, int, int); -extern int glXQueryChannelRectSGIX (Display *, int, int, int *, int *, int *, int *); -extern int glXQueryChannelDeltasSGIX (Display *, int, int, int *, int *, int *, int *); -extern int glXChannelRectSyncSGIX (Display *, int, int, GLenum); -#endif /* GLX_GLXEXT_PROTOTYPES */ -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 ( * PFNGLXQUERYCHANNELRECTSGIXPROC) (Display *display, int screen, int channel, int *dx, int *dy, int *dw, int *dh); -typedef int ( * PFNGLXQUERYCHANNELDELTASSGIXPROC) (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); -#endif - -#ifdef _DM_BUFFER_H_ -#ifndef GLX_SGIX_dmbuffer -#define GLX_SGIX_dmbuffer 1 -#ifdef GLX_GLXEXT_PROTOTYPES -extern Bool glXAssociateDMPbufferSGIX (Display *, GLXPbufferSGIX, DMparams *, DMbuffer); -#endif /* GLX_GLXEXT_PROTOTYPES */ -typedef Bool ( * PFNGLXASSOCIATEDMPBUFFERSGIXPROC) (Display *dpy, GLXPbufferSGIX pbuffer, DMparams *params, DMbuffer dmbuffer); -#endif - -#endif /* _DM_BUFFER_H_ */ -#ifndef GLX_SGIX_swap_group -#define GLX_SGIX_swap_group 1 -#ifdef GLX_GLXEXT_PROTOTYPES -extern void glXJoinSwapGroupSGIX (Display *, GLXDrawable, GLXDrawable); -#endif /* GLX_GLXEXT_PROTOTYPES */ -typedef void ( * PFNGLXJOINSWAPGROUPSGIXPROC) (Display *dpy, GLXDrawable drawable, GLXDrawable member); -#endif - -#ifndef GLX_SGIX_swap_barrier -#define GLX_SGIX_swap_barrier 1 -#ifdef GLX_GLXEXT_PROTOTYPES -extern void glXBindSwapBarrierSGIX (Display *, GLXDrawable, int); -extern Bool glXQueryMaxSwapBarriersSGIX (Display *, int, int *); -#endif /* GLX_GLXEXT_PROTOTYPES */ -typedef void ( * PFNGLXBINDSWAPBARRIERSGIXPROC) (Display *dpy, GLXDrawable drawable, int barrier); -typedef Bool ( * PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC) (Display *dpy, int screen, int *max); -#endif - -#ifndef GLX_SUN_get_transparent_index -#define GLX_SUN_get_transparent_index 1 -#ifdef GLX_GLXEXT_PROTOTYPES -extern Status glXGetTransparentIndexSUN (Display *, Window, Window, long *); -#endif /* GLX_GLXEXT_PROTOTYPES */ -typedef Status ( * PFNGLXGETTRANSPARENTINDEXSUNPROC) (Display *dpy, Window overlay, Window underlay, long *pTransparentIndex); -#endif - -#ifndef GLX_MESA_copy_sub_buffer -#define GLX_MESA_copy_sub_buffer 1 -#ifdef GLX_GLXEXT_PROTOTYPES -extern void glXCopySubBufferMESA (Display *, GLXDrawable, int, int, int, int); -#endif /* GLX_GLXEXT_PROTOTYPES */ -typedef void ( * PFNGLXCOPYSUBBUFFERMESAPROC) (Display *dpy, GLXDrawable drawable, int x, int y, int width, int height); -#endif - -#ifndef GLX_MESA_pixmap_colormap -#define GLX_MESA_pixmap_colormap 1 -#ifdef GLX_GLXEXT_PROTOTYPES -extern GLXPixmap glXCreateGLXPixmapMESA (Display *, XVisualInfo *, Pixmap, Colormap); -#endif /* GLX_GLXEXT_PROTOTYPES */ -typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPMESAPROC) (Display *dpy, XVisualInfo *visual, Pixmap pixmap, Colormap cmap); -#endif - -#ifndef GLX_MESA_release_buffers -#define GLX_MESA_release_buffers 1 -#ifdef GLX_GLXEXT_PROTOTYPES -extern Bool glXReleaseBuffersMESA (Display *, GLXDrawable); -#endif /* GLX_GLXEXT_PROTOTYPES */ -typedef Bool ( * PFNGLXRELEASEBUFFERSMESAPROC) (Display *dpy, GLXDrawable drawable); -#endif - -#ifndef GLX_MESA_set_3dfx_mode -#define GLX_MESA_set_3dfx_mode 1 -#ifdef GLX_GLXEXT_PROTOTYPES -extern Bool glXSet3DfxModeMESA (int); -#endif /* GLX_GLXEXT_PROTOTYPES */ -typedef Bool ( * PFNGLXSET3DFXMODEMESAPROC) (int mode); -#endif - - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/btgui/OpenGLWindow/GlewWindows/GL/wglew.h b/btgui/OpenGLWindow/GlewWindows/GL/wglew.h index c0f59f56d..8659841d3 100644 --- a/btgui/OpenGLWindow/GlewWindows/GL/wglew.h +++ b/btgui/OpenGLWindow/GlewWindows/GL/wglew.h @@ -446,6 +446,28 @@ typedef BOOL (WINAPI * PFNWGLSETPBUFFERATTRIBARBPROC) (HPBUFFERARB hPbuffer, con #endif /* WGL_ARB_render_texture */ +/* ---------------- WGL_ARB_robustness_application_isolation --------------- */ + +#ifndef WGL_ARB_robustness_application_isolation +#define WGL_ARB_robustness_application_isolation 1 + +#define WGL_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 + +#define WGLEW_ARB_robustness_application_isolation WGLEW_GET_VAR(__WGLEW_ARB_robustness_application_isolation) + +#endif /* WGL_ARB_robustness_application_isolation */ + +/* ---------------- WGL_ARB_robustness_share_group_isolation --------------- */ + +#ifndef WGL_ARB_robustness_share_group_isolation +#define WGL_ARB_robustness_share_group_isolation 1 + +#define WGL_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 + +#define WGLEW_ARB_robustness_share_group_isolation WGLEW_GET_VAR(__WGLEW_ARB_robustness_share_group_isolation) + +#endif /* WGL_ARB_robustness_share_group_isolation */ + /* ----------------------- WGL_ATI_pixel_format_float ---------------------- */ #ifndef WGL_ATI_pixel_format_float @@ -1323,6 +1345,8 @@ WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_pbuffer; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_pixel_format; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_pixel_format_float; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_render_texture; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_robustness_application_isolation; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_robustness_share_group_isolation; WGLEW_VAR_EXPORT GLboolean __WGLEW_ATI_pixel_format_float; WGLEW_VAR_EXPORT GLboolean __WGLEW_ATI_render_texture_rectangle; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_create_context_es2_profile; diff --git a/btgui/OpenGLWindow/GlewWindows/GL/wglext.h b/btgui/OpenGLWindow/GlewWindows/GL/wglext.h deleted file mode 100644 index 8c6192c27..000000000 --- a/btgui/OpenGLWindow/GlewWindows/GL/wglext.h +++ /dev/null @@ -1,466 +0,0 @@ -#ifndef __wglext_h_ -#define __wglext_h_ - -#ifdef __cplusplus -extern "C" { -#endif - -/* -** 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. -*/ - -#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) -#define WIN32_LEAN_AND_MEAN 1 -#include -#endif - -#ifndef APIENTRY -#define APIENTRY -#endif - -/*************************************************************/ - -/* Header file version number */ -#define WGL_WGLEXT_VERSION 1 - -#ifndef WGL_ARB_buffer_region -#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 -#endif - -#ifndef WGL_ARB_extensions_string -#endif - -#ifndef WGL_ARB_pixel_format -#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 -#endif - -#ifndef WGL_ARB_make_current_read -#define ERROR_INVALID_PIXEL_TYPE_ARB 0x2043 -#define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054 -#endif - -#ifndef WGL_ARB_pbuffer -#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 -#endif - -#ifndef WGL_ARB_render_texture -#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 -#endif - -#ifndef WGL_EXT_make_current_read -#define ERROR_INVALID_PIXEL_TYPE_EXT 0x2043 -#endif - -#ifndef WGL_EXT_pixel_format -#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 -#endif - -#ifndef WGL_EXT_pbuffer -#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 -#endif - -#ifndef WGL_EXT_depth_float -#define WGL_DEPTH_FLOAT_EXT 0x2040 -#endif - -#ifndef WGL_NV_render_texture_rectangle -#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 - -#ifndef WGL_NV_render_depth_texture -#define WGL_TEXTURE_DEPTH_COMPONENT_NV 0x20A6 -#define WGL_DEPTH_TEXTURE_FORMAT_NV 0x20A5 -#define WGL_BIND_TO_TEXTURE_DEPTH_NV 0x20A3 -#define WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV 0x20A4 -#define WGL_DEPTH_COMPONENT_NV 0x20A7 -#endif - -#ifndef WGL_3DFX_multisample -#define WGL_SAMPLE_BUFFERS_3DFX 0x2060 -#define WGL_SAMPLES_3DFX 0x2061 -#endif - -#ifndef WGL_EXT_multisample -#define WGL_SAMPLE_BUFFERS_EXT 0x2041 -#define WGL_SAMPLES_EXT 0x2042 -#endif - -#ifndef WGL_I3D_unknown_genlock_extension_name -#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 -#endif - -#ifndef WGL_I3D_unknown_gamma_extension_name -#define WGL_GAMMA_TABLE_SIZE_I3D 0x204E -#define WGL_GAMMA_EXCLUDE_DESKTOP_I3D 0x204F -#endif - -#ifndef WGL_I3D_unknown_digital_video_cursor_extension_name -#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 -#endif - - -/*************************************************************/ - -#ifndef WGL_ARB_pbuffer -DECLARE_HANDLE(HPBUFFERARB); -#endif -#ifndef WGL_EXT_pbuffer -DECLARE_HANDLE(HPBUFFEREXT); -#endif - -#ifndef WGL_ARB_buffer_region -#define WGL_ARB_buffer_region 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern HANDLE WINAPI wglCreateBufferRegionARB (HDC, int, UINT); -extern VOID WINAPI wglDeleteBufferRegionARB (HANDLE); -extern BOOL WINAPI wglSaveBufferRegionARB (HANDLE, int, int, int, int); -extern BOOL WINAPI wglRestoreBufferRegionARB (HANDLE, int, int, int, int, int, int); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef HANDLE (WINAPI * PFNWGLCREATEBUFFERREGIONARBPROC) (HDC hDC, int iLayerPlane, UINT uType); -typedef VOID (WINAPI * PFNWGLDELETEBUFFERREGIONARBPROC) (HANDLE hRegion); -typedef BOOL (WINAPI * PFNWGLSAVEBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height); -typedef BOOL (WINAPI * PFNWGLRESTOREBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc); -#endif - -#ifndef WGL_ARB_extensions_string -#define WGL_ARB_extensions_string 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern const char * WINAPI wglGetExtensionsStringARB (HDC); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef const char * (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc); -#endif - -#ifndef WGL_ARB_pixel_format -#define WGL_ARB_pixel_format 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern BOOL WINAPI wglGetPixelFormatAttribivARB (HDC, int, int, UINT, const int *, int *); -extern BOOL WINAPI wglGetPixelFormatAttribfvARB (HDC, int, int, UINT, const int *, FLOAT *); -extern BOOL WINAPI wglChoosePixelFormatARB (HDC, const int *, const FLOAT *, UINT, int *, UINT *); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues); -typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues); -typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); -#endif - -#ifndef WGL_ARB_make_current_read -#define WGL_ARB_make_current_read 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern BOOL WINAPI wglMakeContextCurrentARB (HDC, HDC, HGLRC); -extern HDC WINAPI wglGetCurrentReadDCARB (void); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); -typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCARBPROC) (void); -#endif - -#ifndef WGL_ARB_pbuffer -#define WGL_ARB_pbuffer 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern HPBUFFERARB WINAPI wglCreatePbufferARB (HDC, int, int, int, const int *); -extern HDC WINAPI wglGetPbufferDCARB (HPBUFFERARB); -extern int WINAPI wglReleasePbufferDCARB (HPBUFFERARB, HDC); -extern BOOL WINAPI wglDestroyPbufferARB (HPBUFFERARB); -extern BOOL WINAPI wglQueryPbufferARB (HPBUFFERARB, int, int *); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef HPBUFFERARB (WINAPI * PFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList); -typedef HDC (WINAPI * PFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer); -typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC); -typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer); -typedef BOOL (WINAPI * PFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int *piValue); -#endif - -#ifndef WGL_EXT_display_color_table -#define WGL_EXT_display_color_table 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern GLboolean WINAPI wglCreateDisplayColorTableEXT (GLushort); -extern GLboolean WINAPI wglLoadDisplayColorTableEXT (const GLushort *, GLuint); -extern GLboolean WINAPI wglBindDisplayColorTableEXT (GLushort); -extern VOID WINAPI wglDestroyDisplayColorTableEXT (GLushort); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef GLboolean (WINAPI * PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC) (GLushort id); -typedef GLboolean (WINAPI * PFNWGLLOADDISPLAYCOLORTABLEEXTPROC) (const GLushort *table, GLuint length); -typedef GLboolean (WINAPI * PFNWGLBINDDISPLAYCOLORTABLEEXTPROC) (GLushort id); -typedef VOID (WINAPI * PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC) (GLushort id); -#endif - -#ifndef WGL_EXT_extensions_string -#define WGL_EXT_extensions_string 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern const char * WINAPI wglGetExtensionsStringEXT (void); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef const char * (WINAPI * PFNWGLGETEXTENSIONSSTRINGEXTPROC) (void); -#endif - -#ifndef WGL_EXT_make_current_read -#define WGL_EXT_make_current_read 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern BOOL WINAPI wglMakeContextCurrentEXT (HDC, HDC, HGLRC); -extern HDC WINAPI wglGetCurrentReadDCEXT (void); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTEXTPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); -typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCEXTPROC) (void); -#endif - -#ifndef WGL_EXT_pbuffer -#define WGL_EXT_pbuffer 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern HPBUFFEREXT WINAPI wglCreatePbufferEXT (HDC, int, int, int, const int *); -extern HDC WINAPI wglGetPbufferDCEXT (HPBUFFEREXT); -extern int WINAPI wglReleasePbufferDCEXT (HPBUFFEREXT, HDC); -extern BOOL WINAPI wglDestroyPbufferEXT (HPBUFFEREXT); -extern BOOL WINAPI wglQueryPbufferEXT (HPBUFFEREXT, int, int *); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef HPBUFFEREXT (WINAPI * PFNWGLCREATEPBUFFEREXTPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList); -typedef HDC (WINAPI * PFNWGLGETPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer); -typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer, HDC hDC); -typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer); -typedef BOOL (WINAPI * PFNWGLQUERYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer, int iAttribute, int *piValue); -#endif - -#ifndef WGL_EXT_pixel_format -#define WGL_EXT_pixel_format 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern BOOL WINAPI wglGetPixelFormatAttribivEXT (HDC, int, int, UINT, int *, int *); -extern BOOL WINAPI wglGetPixelFormatAttribfvEXT (HDC, int, int, UINT, int *, FLOAT *); -extern BOOL WINAPI wglChoosePixelFormatEXT (HDC, const int *, const FLOAT *, UINT, int *, UINT *); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int *piAttributes, int *piValues); -typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int *piAttributes, FLOAT *pfValues); -typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATEXTPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); -#endif - -#ifndef WGL_EXT_swap_control -#define WGL_EXT_swap_control 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern BOOL WINAPI wglSwapIntervalEXT (int); -extern int WINAPI wglGetSwapIntervalEXT (void); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval); -typedef int (WINAPI * PFNWGLGETSWAPINTERVALEXTPROC) (void); -#endif - -#ifndef WGL_WGL_EXT_depth_float -#define WGL_WGL_EXT_depth_float 1 -#endif - -#ifndef WGL_WGL_3DFX_multisample -#define WGL_WGL_3DFX_multisample 1 -#endif - -#ifndef WGL_WGL_EXT_multisample -#define WGL_WGL_EXT_multisample 1 -#endif - -/* added by Cass -- but this should already be in here! */ -#ifndef WGL_NV_allocate_memory -#define WGL_NV_allocate_memory 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern void * wglAllocateMemoryNV(int size, float readfreq, float writefreq, float priority); -extern void wglFreeMemoryNV(void * pointer); -#endif -typedef void * (APIENTRY * PFNWGLALLOCATEMEMORYNVPROC) (int size, float readfreq, float writefreq, float priority); -typedef void (APIENTRY * PFNWGLFREEMEMORYNVPROC) (void *pointer); -#endif - -/* WGL_ARB_render_texture */ -#ifndef WGL_ARB_render_texture -#define WGL_ARB_render_texture 1 -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); -#endif - -#ifndef WGL_NV_render_texture_rectangle -#define WGL_NV_render_texture_rectangle 1 -#endif - -#ifndef WGL_NV_render_depth_texture -#define WGL_NV_render_depth_texture 1 -#endif - -#ifdef __cplusplus -} -#endif - -#endif - - diff --git a/btgui/OpenGLWindow/GlewWindows/glew.c b/btgui/OpenGLWindow/GlewWindows/glew.c index 1aaee11c3..c90af794a 100644 --- a/btgui/OpenGLWindow/GlewWindows/glew.c +++ b/btgui/OpenGLWindow/GlewWindows/glew.c @@ -4,24 +4,24 @@ ** Copyright (C) 2002-2008, Marcelo E. Magallon ** Copyright (C) 2002, Lev Povalahev ** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without +** +** 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, +** +** * 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 +** * 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 +** * 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 +** 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 +** 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) @@ -29,12 +29,43 @@ ** THE POSSIBILITY OF SUCH DAMAGE. */ -#include +#include "GL/glew.h" #if defined(_WIN32) # include -#elif !defined(__ANDROID__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) +#elif !defined(__ANDROID__) && !defined(__native_client__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) # include "GL/glxew.h" + +#ifdef GLEW_DYNAMIC_LOAD_ALL_GLX_FUNCTIONS + +#include +#include +#include + +void* dlglXGetProcAddressARB(const GLubyte* name) +{ + static void* h = NULL; + static void* gpa; + + if (h == NULL) + { + if ((h = dlopen("libGL.so.1", RTLD_LAZY | RTLD_LOCAL)) == NULL) + { + return NULL; + } + gpa = dlsym(h, "glXGetProcAddressARB"); + } + + if (gpa != NULL) + return ((void*(*)(const GLubyte*))gpa)(name); + else + return dlsym(h, (const char*)name); +} + + + +#endif //GLEW_DYNAMIC_LOAD_ALL_GLX_FUNCTIONS + #endif /* @@ -102,7 +133,7 @@ void* NSGLGetProcAddress (const GLubyte *name) { static void* image = NULL; void* addr; - if (NULL == image) + if (NULL == image) { #ifdef GLEW_REGAL image = dlopen("libRegal.dylib", RTLD_LAZY); @@ -166,8 +197,14 @@ void* NSGLGetProcAddress (const GLubyte *name) # define glewGetProcAddress(name) dlGetProcAddress(name) #elif defined(__ANDROID__) # define glewGetProcAddress(name) NULL /* TODO */ +#elif defined(__native_client__) +# define glewGetProcAddress(name) NULL /* TODO */ #else /* __linux */ +#ifdef GLEW_DYNAMIC_LOAD_ALL_GLX_FUNCTIONS +# define glewGetProcAddress(name) dlglXGetProcAddressARB(name) +#else//GLEW_DYNAMIC_LOAD_ALL_GLX_FUNCTIONS # define glewGetProcAddress(name) (*glXGetProcAddressARB)(name) +#endif//GLEW_DYNAMIC_LOAD_ALL_GLX_FUNCTIONS #endif /* @@ -585,6 +622,8 @@ PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC __glewBlendEquationSeparateIndexedAMD = PFNGLBLENDFUNCINDEXEDAMDPROC __glewBlendFuncIndexedAMD = NULL; PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC __glewBlendFuncSeparateIndexedAMD = NULL; +PFNGLVERTEXATTRIBPARAMETERIAMDPROC __glewVertexAttribParameteriAMD = NULL; + PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC __glewMultiDrawArraysIndirectAMD = NULL; PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC __glewMultiDrawElementsIndirectAMD = NULL; @@ -606,11 +645,36 @@ PFNGLSELECTPERFMONITORCOUNTERSAMDPROC __glewSelectPerfMonitorCountersAMD = NULL; PFNGLSETMULTISAMPLEFVAMDPROC __glewSetMultisamplefvAMD = NULL; +PFNGLTEXSTORAGESPARSEAMDPROC __glewTexStorageSparseAMD = NULL; +PFNGLTEXTURESTORAGESPARSEAMDPROC __glewTextureStorageSparseAMD = NULL; + PFNGLSTENCILOPVALUEAMDPROC __glewStencilOpValueAMD = NULL; PFNGLTESSELLATIONFACTORAMDPROC __glewTessellationFactorAMD = NULL; PFNGLTESSELLATIONMODEAMDPROC __glewTessellationModeAMD = NULL; +PFNGLBLITFRAMEBUFFERANGLEPROC __glewBlitFramebufferANGLE = NULL; + +PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC __glewRenderbufferStorageMultisampleANGLE = NULL; + +PFNGLDRAWARRAYSINSTANCEDANGLEPROC __glewDrawArraysInstancedANGLE = NULL; +PFNGLDRAWELEMENTSINSTANCEDANGLEPROC __glewDrawElementsInstancedANGLE = NULL; +PFNGLVERTEXATTRIBDIVISORANGLEPROC __glewVertexAttribDivisorANGLE = NULL; + +PFNGLBEGINQUERYANGLEPROC __glewBeginQueryANGLE = NULL; +PFNGLDELETEQUERIESANGLEPROC __glewDeleteQueriesANGLE = NULL; +PFNGLENDQUERYANGLEPROC __glewEndQueryANGLE = NULL; +PFNGLGENQUERIESANGLEPROC __glewGenQueriesANGLE = NULL; +PFNGLGETQUERYOBJECTI64VANGLEPROC __glewGetQueryObjecti64vANGLE = NULL; +PFNGLGETQUERYOBJECTIVANGLEPROC __glewGetQueryObjectivANGLE = NULL; +PFNGLGETQUERYOBJECTUI64VANGLEPROC __glewGetQueryObjectui64vANGLE = NULL; +PFNGLGETQUERYOBJECTUIVANGLEPROC __glewGetQueryObjectuivANGLE = NULL; +PFNGLGETQUERYIVANGLEPROC __glewGetQueryivANGLE = NULL; +PFNGLISQUERYANGLEPROC __glewIsQueryANGLE = NULL; +PFNGLQUERYCOUNTERANGLEPROC __glewQueryCounterANGLE = NULL; + +PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC __glewGetTranslatedShaderSourceANGLE = NULL; + PFNGLDRAWELEMENTARRAYAPPLEPROC __glewDrawElementArrayAPPLE = NULL; PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC __glewDrawRangeElementArrayAPPLE = NULL; PFNGLELEMENTPOINTERAPPLEPROC __glewElementPointerAPPLE = NULL; @@ -663,9 +727,29 @@ PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC __glewDrawArraysInstancedBaseInstance = PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC __glewDrawElementsInstancedBaseInstance = NULL; PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC __glewDrawElementsInstancedBaseVertexBaseInstance = NULL; +PFNGLGETIMAGEHANDLEARBPROC __glewGetImageHandleARB = NULL; +PFNGLGETTEXTUREHANDLEARBPROC __glewGetTextureHandleARB = NULL; +PFNGLGETTEXTURESAMPLERHANDLEARBPROC __glewGetTextureSamplerHandleARB = NULL; +PFNGLGETVERTEXATTRIBLUI64VARBPROC __glewGetVertexAttribLui64vARB = NULL; +PFNGLISIMAGEHANDLERESIDENTARBPROC __glewIsImageHandleResidentARB = NULL; +PFNGLISTEXTUREHANDLERESIDENTARBPROC __glewIsTextureHandleResidentARB = NULL; +PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC __glewMakeImageHandleNonResidentARB = NULL; +PFNGLMAKEIMAGEHANDLERESIDENTARBPROC __glewMakeImageHandleResidentARB = NULL; +PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC __glewMakeTextureHandleNonResidentARB = NULL; +PFNGLMAKETEXTUREHANDLERESIDENTARBPROC __glewMakeTextureHandleResidentARB = NULL; +PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC __glewProgramUniformHandleui64ARB = NULL; +PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC __glewProgramUniformHandleui64vARB = NULL; +PFNGLUNIFORMHANDLEUI64ARBPROC __glewUniformHandleui64ARB = NULL; +PFNGLUNIFORMHANDLEUI64VARBPROC __glewUniformHandleui64vARB = NULL; +PFNGLVERTEXATTRIBL1UI64ARBPROC __glewVertexAttribL1ui64ARB = NULL; +PFNGLVERTEXATTRIBL1UI64VARBPROC __glewVertexAttribL1ui64vARB = NULL; + PFNGLBINDFRAGDATALOCATIONINDEXEDPROC __glewBindFragDataLocationIndexed = NULL; PFNGLGETFRAGDATAINDEXPROC __glewGetFragDataIndex = NULL; +PFNGLBUFFERSTORAGEPROC __glewBufferStorage = NULL; +PFNGLNAMEDBUFFERSTORAGEEXTPROC __glewNamedBufferStorageEXT = NULL; + PFNGLCREATESYNCFROMCLEVENTARBPROC __glewCreateSyncFromCLeventARB = NULL; PFNGLCLEARBUFFERDATAPROC __glewClearBufferData = NULL; @@ -673,11 +757,16 @@ PFNGLCLEARBUFFERSUBDATAPROC __glewClearBufferSubData = NULL; PFNGLCLEARNAMEDBUFFERDATAEXTPROC __glewClearNamedBufferDataEXT = NULL; PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC __glewClearNamedBufferSubDataEXT = NULL; +PFNGLCLEARTEXIMAGEPROC __glewClearTexImage = NULL; +PFNGLCLEARTEXSUBIMAGEPROC __glewClearTexSubImage = NULL; + PFNGLCLAMPCOLORARBPROC __glewClampColorARB = NULL; PFNGLDISPATCHCOMPUTEPROC __glewDispatchCompute = NULL; PFNGLDISPATCHCOMPUTEINDIRECTPROC __glewDispatchComputeIndirect = NULL; +PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC __glewDispatchComputeGroupSizeARB = NULL; + PFNGLCOPYBUFFERSUBDATAPROC __glewCopyBufferSubData = NULL; PFNGLCOPYIMAGESUBDATAPROC __glewCopyImageSubData = NULL; @@ -789,6 +878,9 @@ PFNGLRESETHISTOGRAMPROC __glewResetHistogram = NULL; PFNGLRESETMINMAXPROC __glewResetMinmax = NULL; PFNGLSEPARABLEFILTER2DPROC __glewSeparableFilter2D = NULL; +PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC __glewMultiDrawArraysIndirectCountARB = NULL; +PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC __glewMultiDrawElementsIndirectCountARB = NULL; + PFNGLDRAWARRAYSINSTANCEDARBPROC __glewDrawArraysInstancedARB = NULL; PFNGLDRAWELEMENTSINSTANCEDARBPROC __glewDrawElementsInstancedARB = NULL; PFNGLVERTEXATTRIBDIVISORARBPROC __glewVertexAttribDivisorARB = NULL; @@ -813,6 +905,13 @@ PFNGLMATRIXINDEXUBVARBPROC __glewMatrixIndexubvARB = NULL; PFNGLMATRIXINDEXUIVARBPROC __glewMatrixIndexuivARB = NULL; PFNGLMATRIXINDEXUSVARBPROC __glewMatrixIndexusvARB = NULL; +PFNGLBINDBUFFERSBASEPROC __glewBindBuffersBase = NULL; +PFNGLBINDBUFFERSRANGEPROC __glewBindBuffersRange = NULL; +PFNGLBINDIMAGETEXTURESPROC __glewBindImageTextures = NULL; +PFNGLBINDSAMPLERSPROC __glewBindSamplers = NULL; +PFNGLBINDTEXTURESPROC __glewBindTextures = NULL; +PFNGLBINDVERTEXBUFFERSPROC __glewBindVertexBuffers = NULL; + PFNGLMULTIDRAWARRAYSINDIRECTPROC __glewMultiDrawArraysIndirect = NULL; PFNGLMULTIDRAWELEMENTSINDIRECTPROC __glewMultiDrawElementsIndirect = NULL; @@ -1036,6 +1135,9 @@ PFNGLGETNAMEDSTRINGIVARBPROC __glewGetNamedStringivARB = NULL; PFNGLISNAMEDSTRINGARBPROC __glewIsNamedStringARB = NULL; PFNGLNAMEDSTRINGARBPROC __glewNamedStringARB = NULL; +PFNGLTEXPAGECOMMITMENTARBPROC __glewTexPageCommitmentARB = NULL; +PFNGLTEXTUREPAGECOMMITMENTEXTPROC __glewTexturePageCommitmentEXT = NULL; + PFNGLCLIENTWAITSYNCPROC __glewClientWaitSync = NULL; PFNGLDELETESYNCPROC __glewDeleteSync = NULL; PFNGLFENCESYNCPROC __glewFenceSync = NULL; @@ -1596,55 +1698,38 @@ PFNGLNAMEDPROGRAMSTRINGEXTPROC __glewNamedProgramStringEXT = NULL; PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC __glewNamedRenderbufferStorageEXT = NULL; PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC __glewNamedRenderbufferStorageMultisampleCoverageEXT = NULL; PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewNamedRenderbufferStorageMultisampleEXT = NULL; -PFNGLPROGRAMUNIFORM1DEXTPROC __glewProgramUniform1dEXT = NULL; -PFNGLPROGRAMUNIFORM1DVEXTPROC __glewProgramUniform1dvEXT = NULL; PFNGLPROGRAMUNIFORM1FEXTPROC __glewProgramUniform1fEXT = NULL; PFNGLPROGRAMUNIFORM1FVEXTPROC __glewProgramUniform1fvEXT = NULL; PFNGLPROGRAMUNIFORM1IEXTPROC __glewProgramUniform1iEXT = NULL; PFNGLPROGRAMUNIFORM1IVEXTPROC __glewProgramUniform1ivEXT = NULL; PFNGLPROGRAMUNIFORM1UIEXTPROC __glewProgramUniform1uiEXT = NULL; PFNGLPROGRAMUNIFORM1UIVEXTPROC __glewProgramUniform1uivEXT = NULL; -PFNGLPROGRAMUNIFORM2DEXTPROC __glewProgramUniform2dEXT = NULL; -PFNGLPROGRAMUNIFORM2DVEXTPROC __glewProgramUniform2dvEXT = NULL; PFNGLPROGRAMUNIFORM2FEXTPROC __glewProgramUniform2fEXT = NULL; PFNGLPROGRAMUNIFORM2FVEXTPROC __glewProgramUniform2fvEXT = NULL; PFNGLPROGRAMUNIFORM2IEXTPROC __glewProgramUniform2iEXT = NULL; PFNGLPROGRAMUNIFORM2IVEXTPROC __glewProgramUniform2ivEXT = NULL; PFNGLPROGRAMUNIFORM2UIEXTPROC __glewProgramUniform2uiEXT = NULL; PFNGLPROGRAMUNIFORM2UIVEXTPROC __glewProgramUniform2uivEXT = NULL; -PFNGLPROGRAMUNIFORM3DEXTPROC __glewProgramUniform3dEXT = NULL; -PFNGLPROGRAMUNIFORM3DVEXTPROC __glewProgramUniform3dvEXT = NULL; PFNGLPROGRAMUNIFORM3FEXTPROC __glewProgramUniform3fEXT = NULL; PFNGLPROGRAMUNIFORM3FVEXTPROC __glewProgramUniform3fvEXT = NULL; PFNGLPROGRAMUNIFORM3IEXTPROC __glewProgramUniform3iEXT = NULL; PFNGLPROGRAMUNIFORM3IVEXTPROC __glewProgramUniform3ivEXT = NULL; PFNGLPROGRAMUNIFORM3UIEXTPROC __glewProgramUniform3uiEXT = NULL; PFNGLPROGRAMUNIFORM3UIVEXTPROC __glewProgramUniform3uivEXT = NULL; -PFNGLPROGRAMUNIFORM4DEXTPROC __glewProgramUniform4dEXT = NULL; -PFNGLPROGRAMUNIFORM4DVEXTPROC __glewProgramUniform4dvEXT = NULL; PFNGLPROGRAMUNIFORM4FEXTPROC __glewProgramUniform4fEXT = NULL; PFNGLPROGRAMUNIFORM4FVEXTPROC __glewProgramUniform4fvEXT = NULL; PFNGLPROGRAMUNIFORM4IEXTPROC __glewProgramUniform4iEXT = NULL; PFNGLPROGRAMUNIFORM4IVEXTPROC __glewProgramUniform4ivEXT = NULL; PFNGLPROGRAMUNIFORM4UIEXTPROC __glewProgramUniform4uiEXT = NULL; PFNGLPROGRAMUNIFORM4UIVEXTPROC __glewProgramUniform4uivEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC __glewProgramUniformMatrix2dvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC __glewProgramUniformMatrix2fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC __glewProgramUniformMatrix2x3dvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC __glewProgramUniformMatrix2x3fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC __glewProgramUniformMatrix2x4dvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC __glewProgramUniformMatrix2x4fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC __glewProgramUniformMatrix3dvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC __glewProgramUniformMatrix3fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC __glewProgramUniformMatrix3x2dvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC __glewProgramUniformMatrix3x2fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC __glewProgramUniformMatrix3x4dvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC __glewProgramUniformMatrix3x4fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC __glewProgramUniformMatrix4dvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC __glewProgramUniformMatrix4fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC __glewProgramUniformMatrix4x2dvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC __glewProgramUniformMatrix4x2fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC __glewProgramUniformMatrix4x3dvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC __glewProgramUniformMatrix4x3fvEXT = NULL; PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC __glewPushClientAttribDefaultEXT = NULL; PFNGLTEXTUREBUFFEREXTPROC __glewTextureBufferEXT = NULL; @@ -1979,6 +2064,10 @@ PFNGLSECONDARYCOLORPOINTERLISTIBMPROC __glewSecondaryColorPointerListIBM = NULL; PFNGLTEXCOORDPOINTERLISTIBMPROC __glewTexCoordPointerListIBM = NULL; PFNGLVERTEXPOINTERLISTIBMPROC __glewVertexPointerListIBM = NULL; +PFNGLMAPTEXTURE2DINTELPROC __glewMapTexture2DINTEL = NULL; +PFNGLSYNCTEXTUREINTELPROC __glewSyncTextureINTEL = NULL; +PFNGLUNMAPTEXTURE2DINTELPROC __glewUnmapTexture2DINTEL = NULL; + PFNGLCOLORPOINTERVINTELPROC __glewColorPointervINTEL = NULL; PFNGLNORMALPOINTERVINTELPROC __glewNormalPointervINTEL = NULL; PFNGLTEXCOORDPOINTERVINTELPROC __glewTexCoordPointervINTEL = NULL; @@ -1993,9 +2082,9 @@ PFNGLDEBUGMESSAGEINSERTPROC __glewDebugMessageInsert = NULL; PFNGLGETDEBUGMESSAGELOGPROC __glewGetDebugMessageLog = NULL; PFNGLGETOBJECTLABELPROC __glewGetObjectLabel = NULL; PFNGLGETOBJECTPTRLABELPROC __glewGetObjectPtrLabel = NULL; -PFNGLGETPOINTERVPROC __glewGetPointerv = NULL; PFNGLOBJECTLABELPROC __glewObjectLabel = NULL; PFNGLOBJECTPTRLABELPROC __glewObjectPtrLabel = NULL; +PFNGLPOPDEBUGGROUPPROC __glewPopDebugGroup = NULL; PFNGLPUSHDEBUGGROUPPROC __glewPushDebugGroup = NULL; PFNGLBUFFERREGIONENABLEDPROC __glewBufferRegionEnabled = NULL; @@ -2031,6 +2120,12 @@ PFNGLWINDOWPOS4IVMESAPROC __glewWindowPos4ivMESA = NULL; PFNGLWINDOWPOS4SMESAPROC __glewWindowPos4sMESA = NULL; PFNGLWINDOWPOS4SVMESAPROC __glewWindowPos4svMESA = NULL; +PFNGLBEGINCONDITIONALRENDERNVXPROC __glewBeginConditionalRenderNVX = NULL; +PFNGLENDCONDITIONALRENDERNVXPROC __glewEndConditionalRenderNVX = NULL; + +PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC __glewMultiDrawArraysIndirectBindlessNV = NULL; +PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC __glewMultiDrawElementsIndirectBindlessNV = NULL; + PFNGLGETIMAGEHANDLENVPROC __glewGetImageHandleNV = NULL; PFNGLGETTEXTUREHANDLENVPROC __glewGetTextureHandleNV = NULL; PFNGLGETTEXTURESAMPLERHANDLENVPROC __glewGetTextureSamplerHandleNV = NULL; @@ -2045,6 +2140,9 @@ PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC __glewProgramUniformHandleui64vNV = NULL; PFNGLUNIFORMHANDLEUI64NVPROC __glewUniformHandleui64NV = NULL; PFNGLUNIFORMHANDLEUI64VNVPROC __glewUniformHandleui64vNV = NULL; +PFNGLBLENDBARRIERNVPROC __glewBlendBarrierNV = NULL; +PFNGLBLENDPARAMETERINVPROC __glewBlendParameteriNV = NULL; + PFNGLBEGINCONDITIONALRENDERNVPROC __glewBeginConditionalRenderNV = NULL; PFNGLENDCONDITIONALRENDERNVPROC __glewEndConditionalRenderNV = NULL; @@ -2054,6 +2152,8 @@ PFNGLCLEARDEPTHDNVPROC __glewClearDepthdNV = NULL; PFNGLDEPTHBOUNDSDNVPROC __glewDepthBoundsdNV = NULL; PFNGLDEPTHRANGEDNVPROC __glewDepthRangedNV = NULL; +PFNGLDRAWTEXTURENVPROC __glewDrawTextureNV = NULL; + PFNGLEVALMAPSNVPROC __glewEvalMapsNV = NULL; PFNGLGETMAPATTRIBPARAMETERFVNVPROC __glewGetMapAttribParameterfvNV = NULL; PFNGLGETMAPATTRIBPARAMETERIVNVPROC __glewGetMapAttribParameterivNV = NULL; @@ -2452,11 +2552,59 @@ PFNGLFRUSTUMFOESPROC __glewFrustumfOES = NULL; PFNGLGETCLIPPLANEFOESPROC __glewGetClipPlanefOES = NULL; PFNGLORTHOFOESPROC __glewOrthofOES = NULL; +PFNGLALPHAFUNCXPROC __glewAlphaFuncx = NULL; +PFNGLCLEARCOLORXPROC __glewClearColorx = NULL; +PFNGLCLEARDEPTHXPROC __glewClearDepthx = NULL; +PFNGLCOLOR4XPROC __glewColor4x = NULL; +PFNGLDEPTHRANGEXPROC __glewDepthRangex = NULL; +PFNGLFOGXPROC __glewFogx = NULL; +PFNGLFOGXVPROC __glewFogxv = NULL; +PFNGLFRUSTUMFPROC __glewFrustumf = NULL; +PFNGLFRUSTUMXPROC __glewFrustumx = NULL; +PFNGLLIGHTMODELXPROC __glewLightModelx = NULL; +PFNGLLIGHTMODELXVPROC __glewLightModelxv = NULL; +PFNGLLIGHTXPROC __glewLightx = NULL; +PFNGLLIGHTXVPROC __glewLightxv = NULL; +PFNGLLINEWIDTHXPROC __glewLineWidthx = NULL; +PFNGLLOADMATRIXXPROC __glewLoadMatrixx = NULL; +PFNGLMATERIALXPROC __glewMaterialx = NULL; +PFNGLMATERIALXVPROC __glewMaterialxv = NULL; +PFNGLMULTMATRIXXPROC __glewMultMatrixx = NULL; +PFNGLMULTITEXCOORD4XPROC __glewMultiTexCoord4x = NULL; +PFNGLNORMAL3XPROC __glewNormal3x = NULL; +PFNGLORTHOFPROC __glewOrthof = NULL; +PFNGLORTHOXPROC __glewOrthox = NULL; +PFNGLPOINTSIZEXPROC __glewPointSizex = NULL; +PFNGLPOLYGONOFFSETXPROC __glewPolygonOffsetx = NULL; +PFNGLROTATEXPROC __glewRotatex = NULL; +PFNGLSAMPLECOVERAGEXPROC __glewSampleCoveragex = NULL; +PFNGLSCALEXPROC __glewScalex = NULL; +PFNGLTEXENVXPROC __glewTexEnvx = NULL; +PFNGLTEXENVXVPROC __glewTexEnvxv = NULL; +PFNGLTEXPARAMETERXPROC __glewTexParameterx = NULL; +PFNGLTRANSLATEXPROC __glewTranslatex = NULL; + +PFNGLCLIPPLANEFPROC __glewClipPlanef = NULL; +PFNGLCLIPPLANEXPROC __glewClipPlanex = NULL; +PFNGLGETCLIPPLANEFPROC __glewGetClipPlanef = NULL; +PFNGLGETCLIPPLANEXPROC __glewGetClipPlanex = NULL; +PFNGLGETFIXEDVPROC __glewGetFixedv = NULL; +PFNGLGETLIGHTXVPROC __glewGetLightxv = NULL; +PFNGLGETMATERIALXVPROC __glewGetMaterialxv = NULL; +PFNGLGETTEXENVXVPROC __glewGetTexEnvxv = NULL; +PFNGLGETTEXPARAMETERXVPROC __glewGetTexParameterxv = NULL; +PFNGLPOINTPARAMETERXPROC __glewPointParameterx = NULL; +PFNGLPOINTPARAMETERXVPROC __glewPointParameterxv = NULL; +PFNGLPOINTSIZEPOINTEROESPROC __glewPointSizePointerOES = NULL; +PFNGLTEXPARAMETERXVPROC __glewTexParameterxv = NULL; + PFNGLERRORSTRINGREGALPROC __glewErrorStringREGAL = NULL; PFNGLGETEXTENSIONREGALPROC __glewGetExtensionREGAL = NULL; PFNGLISSUPPORTEDREGALPROC __glewIsSupportedREGAL = NULL; +PFNGLLOGMESSAGECALLBACKREGALPROC __glewLogMessageCallbackREGAL = NULL; + PFNGLDETAILTEXFUNCSGISPROC __glewDetailTexFuncSGIS = NULL; PFNGLGETDETAILTEXFUNCSGISPROC __glewGetDetailTexFuncSGIS = NULL; @@ -2609,6 +2757,7 @@ GLboolean __GLEW_VERSION_4_0 = GL_FALSE; GLboolean __GLEW_VERSION_4_1 = GL_FALSE; GLboolean __GLEW_VERSION_4_2 = GL_FALSE; GLboolean __GLEW_VERSION_4_3 = GL_FALSE; +GLboolean __GLEW_VERSION_4_4 = GL_FALSE; GLboolean __GLEW_3DFX_multisample = GL_FALSE; GLboolean __GLEW_3DFX_tbuffer = GL_FALSE; GLboolean __GLEW_3DFX_texture_compression_FXT1 = GL_FALSE; @@ -2617,6 +2766,7 @@ GLboolean __GLEW_AMD_conservative_depth = GL_FALSE; GLboolean __GLEW_AMD_debug_output = GL_FALSE; GLboolean __GLEW_AMD_depth_clamp_separate = GL_FALSE; GLboolean __GLEW_AMD_draw_buffers_blend = GL_FALSE; +GLboolean __GLEW_AMD_interleaved_elements = GL_FALSE; GLboolean __GLEW_AMD_multi_draw_indirect = GL_FALSE; GLboolean __GLEW_AMD_name_gen_delete = GL_FALSE; GLboolean __GLEW_AMD_performance_monitor = GL_FALSE; @@ -2625,12 +2775,26 @@ GLboolean __GLEW_AMD_query_buffer_object = GL_FALSE; GLboolean __GLEW_AMD_sample_positions = GL_FALSE; GLboolean __GLEW_AMD_seamless_cubemap_per_texture = GL_FALSE; GLboolean __GLEW_AMD_shader_stencil_export = GL_FALSE; +GLboolean __GLEW_AMD_shader_trinary_minmax = GL_FALSE; +GLboolean __GLEW_AMD_sparse_texture = GL_FALSE; GLboolean __GLEW_AMD_stencil_operation_extended = GL_FALSE; GLboolean __GLEW_AMD_texture_texture4 = GL_FALSE; GLboolean __GLEW_AMD_transform_feedback3_lines_triangles = GL_FALSE; GLboolean __GLEW_AMD_vertex_shader_layer = GL_FALSE; GLboolean __GLEW_AMD_vertex_shader_tessellator = GL_FALSE; GLboolean __GLEW_AMD_vertex_shader_viewport_index = GL_FALSE; +GLboolean __GLEW_ANGLE_depth_texture = GL_FALSE; +GLboolean __GLEW_ANGLE_framebuffer_blit = GL_FALSE; +GLboolean __GLEW_ANGLE_framebuffer_multisample = GL_FALSE; +GLboolean __GLEW_ANGLE_instanced_arrays = GL_FALSE; +GLboolean __GLEW_ANGLE_pack_reverse_row_order = GL_FALSE; +GLboolean __GLEW_ANGLE_program_binary = GL_FALSE; +GLboolean __GLEW_ANGLE_texture_compression_dxt1 = GL_FALSE; +GLboolean __GLEW_ANGLE_texture_compression_dxt3 = GL_FALSE; +GLboolean __GLEW_ANGLE_texture_compression_dxt5 = GL_FALSE; +GLboolean __GLEW_ANGLE_texture_usage = GL_FALSE; +GLboolean __GLEW_ANGLE_timer_query = GL_FALSE; +GLboolean __GLEW_ANGLE_translated_shader_source = GL_FALSE; GLboolean __GLEW_APPLE_aux_depth_stencil = GL_FALSE; GLboolean __GLEW_APPLE_client_storage = GL_FALSE; GLboolean __GLEW_APPLE_element_array = GL_FALSE; @@ -2652,13 +2816,17 @@ GLboolean __GLEW_ARB_ES2_compatibility = GL_FALSE; GLboolean __GLEW_ARB_ES3_compatibility = GL_FALSE; GLboolean __GLEW_ARB_arrays_of_arrays = GL_FALSE; GLboolean __GLEW_ARB_base_instance = GL_FALSE; +GLboolean __GLEW_ARB_bindless_texture = GL_FALSE; GLboolean __GLEW_ARB_blend_func_extended = GL_FALSE; +GLboolean __GLEW_ARB_buffer_storage = GL_FALSE; GLboolean __GLEW_ARB_cl_event = GL_FALSE; GLboolean __GLEW_ARB_clear_buffer_object = GL_FALSE; +GLboolean __GLEW_ARB_clear_texture = GL_FALSE; GLboolean __GLEW_ARB_color_buffer_float = GL_FALSE; GLboolean __GLEW_ARB_compatibility = GL_FALSE; GLboolean __GLEW_ARB_compressed_texture_pixel_storage = GL_FALSE; GLboolean __GLEW_ARB_compute_shader = GL_FALSE; +GLboolean __GLEW_ARB_compute_variable_group_size = GL_FALSE; GLboolean __GLEW_ARB_conservative_depth = GL_FALSE; GLboolean __GLEW_ARB_copy_buffer = GL_FALSE; GLboolean __GLEW_ARB_copy_image = GL_FALSE; @@ -2671,6 +2839,7 @@ GLboolean __GLEW_ARB_draw_buffers_blend = GL_FALSE; GLboolean __GLEW_ARB_draw_elements_base_vertex = GL_FALSE; GLboolean __GLEW_ARB_draw_indirect = GL_FALSE; GLboolean __GLEW_ARB_draw_instanced = GL_FALSE; +GLboolean __GLEW_ARB_enhanced_layouts = GL_FALSE; GLboolean __GLEW_ARB_explicit_attrib_location = GL_FALSE; GLboolean __GLEW_ARB_explicit_uniform_location = GL_FALSE; GLboolean __GLEW_ARB_fragment_coord_conventions = GL_FALSE; @@ -2688,6 +2857,7 @@ GLboolean __GLEW_ARB_gpu_shader_fp64 = GL_FALSE; GLboolean __GLEW_ARB_half_float_pixel = GL_FALSE; GLboolean __GLEW_ARB_half_float_vertex = GL_FALSE; GLboolean __GLEW_ARB_imaging = GL_FALSE; +GLboolean __GLEW_ARB_indirect_parameters = GL_FALSE; GLboolean __GLEW_ARB_instanced_arrays = GL_FALSE; GLboolean __GLEW_ARB_internalformat_query = GL_FALSE; GLboolean __GLEW_ARB_internalformat_query2 = GL_FALSE; @@ -2695,6 +2865,7 @@ GLboolean __GLEW_ARB_invalidate_subdata = GL_FALSE; GLboolean __GLEW_ARB_map_buffer_alignment = GL_FALSE; GLboolean __GLEW_ARB_map_buffer_range = GL_FALSE; GLboolean __GLEW_ARB_matrix_palette = GL_FALSE; +GLboolean __GLEW_ARB_multi_bind = GL_FALSE; GLboolean __GLEW_ARB_multi_draw_indirect = GL_FALSE; GLboolean __GLEW_ARB_multisample = GL_FALSE; GLboolean __GLEW_ARB_multitexture = GL_FALSE; @@ -2705,6 +2876,7 @@ GLboolean __GLEW_ARB_point_parameters = GL_FALSE; GLboolean __GLEW_ARB_point_sprite = GL_FALSE; GLboolean __GLEW_ARB_program_interface_query = GL_FALSE; GLboolean __GLEW_ARB_provoking_vertex = GL_FALSE; +GLboolean __GLEW_ARB_query_buffer_object = GL_FALSE; GLboolean __GLEW_ARB_robust_buffer_access_behavior = GL_FALSE; GLboolean __GLEW_ARB_robustness = GL_FALSE; GLboolean __GLEW_ARB_robustness_application_isolation = GL_FALSE; @@ -2712,9 +2884,12 @@ GLboolean __GLEW_ARB_robustness_share_group_isolation = GL_FALSE; GLboolean __GLEW_ARB_sample_shading = GL_FALSE; GLboolean __GLEW_ARB_sampler_objects = GL_FALSE; GLboolean __GLEW_ARB_seamless_cube_map = GL_FALSE; +GLboolean __GLEW_ARB_seamless_cubemap_per_texture = GL_FALSE; GLboolean __GLEW_ARB_separate_shader_objects = GL_FALSE; GLboolean __GLEW_ARB_shader_atomic_counters = GL_FALSE; GLboolean __GLEW_ARB_shader_bit_encoding = GL_FALSE; +GLboolean __GLEW_ARB_shader_draw_parameters = GL_FALSE; +GLboolean __GLEW_ARB_shader_group_vote = GL_FALSE; GLboolean __GLEW_ARB_shader_image_load_store = GL_FALSE; GLboolean __GLEW_ARB_shader_image_size = GL_FALSE; GLboolean __GLEW_ARB_shader_objects = GL_FALSE; @@ -2729,6 +2904,7 @@ GLboolean __GLEW_ARB_shading_language_include = GL_FALSE; GLboolean __GLEW_ARB_shading_language_packing = GL_FALSE; GLboolean __GLEW_ARB_shadow = GL_FALSE; GLboolean __GLEW_ARB_shadow_ambient = GL_FALSE; +GLboolean __GLEW_ARB_sparse_texture = GL_FALSE; GLboolean __GLEW_ARB_stencil_texturing = GL_FALSE; GLboolean __GLEW_ARB_sync = GL_FALSE; GLboolean __GLEW_ARB_tessellation_shader = GL_FALSE; @@ -2747,6 +2923,7 @@ GLboolean __GLEW_ARB_texture_env_crossbar = GL_FALSE; GLboolean __GLEW_ARB_texture_env_dot3 = GL_FALSE; GLboolean __GLEW_ARB_texture_float = GL_FALSE; GLboolean __GLEW_ARB_texture_gather = GL_FALSE; +GLboolean __GLEW_ARB_texture_mirror_clamp_to_edge = GL_FALSE; GLboolean __GLEW_ARB_texture_mirrored_repeat = GL_FALSE; GLboolean __GLEW_ARB_texture_multisample = GL_FALSE; GLboolean __GLEW_ARB_texture_non_power_of_two = GL_FALSE; @@ -2755,6 +2932,7 @@ GLboolean __GLEW_ARB_texture_query_lod = GL_FALSE; GLboolean __GLEW_ARB_texture_rectangle = GL_FALSE; GLboolean __GLEW_ARB_texture_rg = GL_FALSE; GLboolean __GLEW_ARB_texture_rgb10_a2ui = GL_FALSE; +GLboolean __GLEW_ARB_texture_stencil8 = GL_FALSE; GLboolean __GLEW_ARB_texture_storage = GL_FALSE; GLboolean __GLEW_ARB_texture_storage_multisample = GL_FALSE; GLboolean __GLEW_ARB_texture_swizzle = GL_FALSE; @@ -2773,6 +2951,7 @@ GLboolean __GLEW_ARB_vertex_blend = GL_FALSE; GLboolean __GLEW_ARB_vertex_buffer_object = GL_FALSE; GLboolean __GLEW_ARB_vertex_program = GL_FALSE; GLboolean __GLEW_ARB_vertex_shader = GL_FALSE; +GLboolean __GLEW_ARB_vertex_type_10f_11f_11f_rev = GL_FALSE; GLboolean __GLEW_ARB_vertex_type_2_10_10_10_rev = GL_FALSE; GLboolean __GLEW_ARB_viewport_array = GL_FALSE; GLboolean __GLEW_ARB_window_pos = GL_FALSE; @@ -2911,6 +3090,7 @@ GLboolean __GLEW_IBM_texture_mirrored_repeat = GL_FALSE; GLboolean __GLEW_IBM_vertex_array_lists = GL_FALSE; GLboolean __GLEW_INGR_color_clamp = GL_FALSE; GLboolean __GLEW_INGR_interlace_read = GL_FALSE; +GLboolean __GLEW_INTEL_map_texture = GL_FALSE; GLboolean __GLEW_INTEL_parallel_arrays = GL_FALSE; GLboolean __GLEW_INTEL_texture_scissor = GL_FALSE; GLboolean __GLEW_KHR_debug = GL_FALSE; @@ -2921,15 +3101,22 @@ GLboolean __GLEW_MESA_pack_invert = GL_FALSE; GLboolean __GLEW_MESA_resize_buffers = GL_FALSE; GLboolean __GLEW_MESA_window_pos = GL_FALSE; GLboolean __GLEW_MESA_ycbcr_texture = GL_FALSE; +GLboolean __GLEW_NVX_conditional_render = GL_FALSE; GLboolean __GLEW_NVX_gpu_memory_info = GL_FALSE; +GLboolean __GLEW_NV_bindless_multi_draw_indirect = GL_FALSE; GLboolean __GLEW_NV_bindless_texture = GL_FALSE; +GLboolean __GLEW_NV_blend_equation_advanced = GL_FALSE; +GLboolean __GLEW_NV_blend_equation_advanced_coherent = GL_FALSE; GLboolean __GLEW_NV_blend_square = GL_FALSE; +GLboolean __GLEW_NV_compute_program5 = GL_FALSE; GLboolean __GLEW_NV_conditional_render = GL_FALSE; GLboolean __GLEW_NV_copy_depth_to_color = GL_FALSE; GLboolean __GLEW_NV_copy_image = GL_FALSE; +GLboolean __GLEW_NV_deep_texture3D = GL_FALSE; GLboolean __GLEW_NV_depth_buffer_float = GL_FALSE; GLboolean __GLEW_NV_depth_clamp = GL_FALSE; GLboolean __GLEW_NV_depth_range_unclamped = GL_FALSE; +GLboolean __GLEW_NV_draw_texture = GL_FALSE; GLboolean __GLEW_NV_evaluators = GL_FALSE; GLboolean __GLEW_NV_explicit_multisample = GL_FALSE; GLboolean __GLEW_NV_fence = GL_FALSE; @@ -2944,6 +3131,7 @@ GLboolean __GLEW_NV_geometry_program4 = GL_FALSE; GLboolean __GLEW_NV_geometry_shader4 = GL_FALSE; GLboolean __GLEW_NV_gpu_program4 = GL_FALSE; GLboolean __GLEW_NV_gpu_program5 = GL_FALSE; +GLboolean __GLEW_NV_gpu_program5_mem_extended = GL_FALSE; GLboolean __GLEW_NV_gpu_program_fp64 = GL_FALSE; GLboolean __GLEW_NV_gpu_shader5 = GL_FALSE; GLboolean __GLEW_NV_half_float = GL_FALSE; @@ -2961,8 +3149,10 @@ GLboolean __GLEW_NV_present_video = GL_FALSE; GLboolean __GLEW_NV_primitive_restart = GL_FALSE; GLboolean __GLEW_NV_register_combiners = GL_FALSE; GLboolean __GLEW_NV_register_combiners2 = GL_FALSE; +GLboolean __GLEW_NV_shader_atomic_counters = GL_FALSE; GLboolean __GLEW_NV_shader_atomic_float = GL_FALSE; GLboolean __GLEW_NV_shader_buffer_load = GL_FALSE; +GLboolean __GLEW_NV_shader_storage_buffer_object = GL_FALSE; GLboolean __GLEW_NV_tessellation_program5 = GL_FALSE; GLboolean __GLEW_NV_texgen_emboss = GL_FALSE; GLboolean __GLEW_NV_texgen_reflection = GL_FALSE; @@ -2998,6 +3188,9 @@ GLboolean __GLEW_OML_resample = GL_FALSE; GLboolean __GLEW_OML_subsample = GL_FALSE; GLboolean __GLEW_PGI_misc_hints = GL_FALSE; GLboolean __GLEW_PGI_vertex_hints = GL_FALSE; +GLboolean __GLEW_REGAL_ES1_0_compatibility = GL_FALSE; +GLboolean __GLEW_REGAL_ES1_1_compatibility = GL_FALSE; +GLboolean __GLEW_REGAL_enable = GL_FALSE; GLboolean __GLEW_REGAL_error_string = GL_FALSE; GLboolean __GLEW_REGAL_extension_query = GL_FALSE; GLboolean __GLEW_REGAL_log = GL_FALSE; @@ -3497,6 +3690,10 @@ static GLboolean _glewInit_GL_VERSION_4_0 (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_VERSION_4_3 */ +#ifdef GL_VERSION_4_4 + +#endif /* GL_VERSION_4_4 */ + #ifdef GL_3DFX_multisample #endif /* GL_3DFX_multisample */ @@ -3562,6 +3759,19 @@ static GLboolean _glewInit_GL_AMD_draw_buffers_blend (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_AMD_draw_buffers_blend */ +#ifdef GL_AMD_interleaved_elements + +static GLboolean _glewInit_GL_AMD_interleaved_elements (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glVertexAttribParameteriAMD = (PFNGLVERTEXATTRIBPARAMETERIAMDPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribParameteriAMD")) == NULL) || r; + + return r; +} + +#endif /* GL_AMD_interleaved_elements */ + #ifdef GL_AMD_multi_draw_indirect static GLboolean _glewInit_GL_AMD_multi_draw_indirect (GLEW_CONTEXT_ARG_DEF_INIT) @@ -3643,6 +3853,24 @@ static GLboolean _glewInit_GL_AMD_sample_positions (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_AMD_shader_stencil_export */ +#ifdef GL_AMD_shader_trinary_minmax + +#endif /* GL_AMD_shader_trinary_minmax */ + +#ifdef GL_AMD_sparse_texture + +static GLboolean _glewInit_GL_AMD_sparse_texture (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glTexStorageSparseAMD = (PFNGLTEXSTORAGESPARSEAMDPROC)glewGetProcAddress((const GLubyte*)"glTexStorageSparseAMD")) == NULL) || r; + r = ((glTextureStorageSparseAMD = (PFNGLTEXTURESTORAGESPARSEAMDPROC)glewGetProcAddress((const GLubyte*)"glTextureStorageSparseAMD")) == NULL) || r; + + return r; +} + +#endif /* GL_AMD_sparse_texture */ + #ifdef GL_AMD_stencil_operation_extended static GLboolean _glewInit_GL_AMD_stencil_operation_extended (GLEW_CONTEXT_ARG_DEF_INIT) @@ -3686,6 +3914,111 @@ static GLboolean _glewInit_GL_AMD_vertex_shader_tessellator (GLEW_CONTEXT_ARG_DE #endif /* GL_AMD_vertex_shader_viewport_index */ +#ifdef GL_ANGLE_depth_texture + +#endif /* GL_ANGLE_depth_texture */ + +#ifdef GL_ANGLE_framebuffer_blit + +static GLboolean _glewInit_GL_ANGLE_framebuffer_blit (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBlitFramebufferANGLE = (PFNGLBLITFRAMEBUFFERANGLEPROC)glewGetProcAddress((const GLubyte*)"glBlitFramebufferANGLE")) == NULL) || r; + + return r; +} + +#endif /* GL_ANGLE_framebuffer_blit */ + +#ifdef GL_ANGLE_framebuffer_multisample + +static GLboolean _glewInit_GL_ANGLE_framebuffer_multisample (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glRenderbufferStorageMultisampleANGLE = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleANGLE")) == NULL) || r; + + return r; +} + +#endif /* GL_ANGLE_framebuffer_multisample */ + +#ifdef GL_ANGLE_instanced_arrays + +static GLboolean _glewInit_GL_ANGLE_instanced_arrays (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDrawArraysInstancedANGLE = (PFNGLDRAWARRAYSINSTANCEDANGLEPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedANGLE")) == NULL) || r; + r = ((glDrawElementsInstancedANGLE = (PFNGLDRAWELEMENTSINSTANCEDANGLEPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedANGLE")) == NULL) || r; + r = ((glVertexAttribDivisorANGLE = (PFNGLVERTEXATTRIBDIVISORANGLEPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribDivisorANGLE")) == NULL) || r; + + return r; +} + +#endif /* GL_ANGLE_instanced_arrays */ + +#ifdef GL_ANGLE_pack_reverse_row_order + +#endif /* GL_ANGLE_pack_reverse_row_order */ + +#ifdef GL_ANGLE_program_binary + +#endif /* GL_ANGLE_program_binary */ + +#ifdef GL_ANGLE_texture_compression_dxt1 + +#endif /* GL_ANGLE_texture_compression_dxt1 */ + +#ifdef GL_ANGLE_texture_compression_dxt3 + +#endif /* GL_ANGLE_texture_compression_dxt3 */ + +#ifdef GL_ANGLE_texture_compression_dxt5 + +#endif /* GL_ANGLE_texture_compression_dxt5 */ + +#ifdef GL_ANGLE_texture_usage + +#endif /* GL_ANGLE_texture_usage */ + +#ifdef GL_ANGLE_timer_query + +static GLboolean _glewInit_GL_ANGLE_timer_query (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBeginQueryANGLE = (PFNGLBEGINQUERYANGLEPROC)glewGetProcAddress((const GLubyte*)"glBeginQueryANGLE")) == NULL) || r; + r = ((glDeleteQueriesANGLE = (PFNGLDELETEQUERIESANGLEPROC)glewGetProcAddress((const GLubyte*)"glDeleteQueriesANGLE")) == NULL) || r; + r = ((glEndQueryANGLE = (PFNGLENDQUERYANGLEPROC)glewGetProcAddress((const GLubyte*)"glEndQueryANGLE")) == NULL) || r; + r = ((glGenQueriesANGLE = (PFNGLGENQUERIESANGLEPROC)glewGetProcAddress((const GLubyte*)"glGenQueriesANGLE")) == NULL) || r; + r = ((glGetQueryObjecti64vANGLE = (PFNGLGETQUERYOBJECTI64VANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjecti64vANGLE")) == NULL) || r; + r = ((glGetQueryObjectivANGLE = (PFNGLGETQUERYOBJECTIVANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectivANGLE")) == NULL) || r; + r = ((glGetQueryObjectui64vANGLE = (PFNGLGETQUERYOBJECTUI64VANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectui64vANGLE")) == NULL) || r; + r = ((glGetQueryObjectuivANGLE = (PFNGLGETQUERYOBJECTUIVANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectuivANGLE")) == NULL) || r; + r = ((glGetQueryivANGLE = (PFNGLGETQUERYIVANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryivANGLE")) == NULL) || r; + r = ((glIsQueryANGLE = (PFNGLISQUERYANGLEPROC)glewGetProcAddress((const GLubyte*)"glIsQueryANGLE")) == NULL) || r; + r = ((glQueryCounterANGLE = (PFNGLQUERYCOUNTERANGLEPROC)glewGetProcAddress((const GLubyte*)"glQueryCounterANGLE")) == NULL) || r; + + return r; +} + +#endif /* GL_ANGLE_timer_query */ + +#ifdef GL_ANGLE_translated_shader_source + +static GLboolean _glewInit_GL_ANGLE_translated_shader_source (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetTranslatedShaderSourceANGLE = (PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetTranslatedShaderSourceANGLE")) == NULL) || r; + + return r; +} + +#endif /* GL_ANGLE_translated_shader_source */ + #ifdef GL_APPLE_aux_depth_stencil #endif /* GL_APPLE_aux_depth_stencil */ @@ -3892,6 +4225,34 @@ static GLboolean _glewInit_GL_ARB_base_instance (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_ARB_base_instance */ +#ifdef GL_ARB_bindless_texture + +static GLboolean _glewInit_GL_ARB_bindless_texture (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetImageHandleARB = (PFNGLGETIMAGEHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetImageHandleARB")) == NULL) || r; + r = ((glGetTextureHandleARB = (PFNGLGETTEXTUREHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetTextureHandleARB")) == NULL) || r; + r = ((glGetTextureSamplerHandleARB = (PFNGLGETTEXTURESAMPLERHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetTextureSamplerHandleARB")) == NULL) || r; + r = ((glGetVertexAttribLui64vARB = (PFNGLGETVERTEXATTRIBLUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLui64vARB")) == NULL) || r; + r = ((glIsImageHandleResidentARB = (PFNGLISIMAGEHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glIsImageHandleResidentARB")) == NULL) || r; + r = ((glIsTextureHandleResidentARB = (PFNGLISTEXTUREHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glIsTextureHandleResidentARB")) == NULL) || r; + r = ((glMakeImageHandleNonResidentARB = (PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeImageHandleNonResidentARB")) == NULL) || r; + r = ((glMakeImageHandleResidentARB = (PFNGLMAKEIMAGEHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeImageHandleResidentARB")) == NULL) || r; + r = ((glMakeTextureHandleNonResidentARB = (PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeTextureHandleNonResidentARB")) == NULL) || r; + r = ((glMakeTextureHandleResidentARB = (PFNGLMAKETEXTUREHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeTextureHandleResidentARB")) == NULL) || r; + r = ((glProgramUniformHandleui64ARB = (PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64ARB")) == NULL) || r; + r = ((glProgramUniformHandleui64vARB = (PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64vARB")) == NULL) || r; + r = ((glUniformHandleui64ARB = (PFNGLUNIFORMHANDLEUI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64ARB")) == NULL) || r; + r = ((glUniformHandleui64vARB = (PFNGLUNIFORMHANDLEUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64vARB")) == NULL) || r; + r = ((glVertexAttribL1ui64ARB = (PFNGLVERTEXATTRIBL1UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64ARB")) == NULL) || r; + r = ((glVertexAttribL1ui64vARB = (PFNGLVERTEXATTRIBL1UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64vARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_bindless_texture */ + #ifdef GL_ARB_blend_func_extended static GLboolean _glewInit_GL_ARB_blend_func_extended (GLEW_CONTEXT_ARG_DEF_INIT) @@ -3906,6 +4267,20 @@ static GLboolean _glewInit_GL_ARB_blend_func_extended (GLEW_CONTEXT_ARG_DEF_INIT #endif /* GL_ARB_blend_func_extended */ +#ifdef GL_ARB_buffer_storage + +static GLboolean _glewInit_GL_ARB_buffer_storage (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBufferStorage = (PFNGLBUFFERSTORAGEPROC)glewGetProcAddress((const GLubyte*)"glBufferStorage")) == NULL) || r; + r = ((glNamedBufferStorageEXT = (PFNGLNAMEDBUFFERSTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferStorageEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_buffer_storage */ + #ifdef GL_ARB_cl_event static GLboolean _glewInit_GL_ARB_cl_event (GLEW_CONTEXT_ARG_DEF_INIT) @@ -3935,6 +4310,20 @@ static GLboolean _glewInit_GL_ARB_clear_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT #endif /* GL_ARB_clear_buffer_object */ +#ifdef GL_ARB_clear_texture + +static GLboolean _glewInit_GL_ARB_clear_texture (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glClearTexImage = (PFNGLCLEARTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glClearTexImage")) == NULL) || r; + r = ((glClearTexSubImage = (PFNGLCLEARTEXSUBIMAGEPROC)glewGetProcAddress((const GLubyte*)"glClearTexSubImage")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_clear_texture */ + #ifdef GL_ARB_color_buffer_float static GLboolean _glewInit_GL_ARB_color_buffer_float (GLEW_CONTEXT_ARG_DEF_INIT) @@ -3970,6 +4359,19 @@ static GLboolean _glewInit_GL_ARB_compute_shader (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_ARB_compute_shader */ +#ifdef GL_ARB_compute_variable_group_size + +static GLboolean _glewInit_GL_ARB_compute_variable_group_size (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDispatchComputeGroupSizeARB = (PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC)glewGetProcAddress((const GLubyte*)"glDispatchComputeGroupSizeARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_compute_variable_group_size */ + #ifdef GL_ARB_conservative_depth #endif /* GL_ARB_conservative_depth */ @@ -4091,6 +4493,10 @@ static GLboolean _glewInit_GL_ARB_draw_indirect (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_ARB_draw_instanced */ +#ifdef GL_ARB_enhanced_layouts + +#endif /* GL_ARB_enhanced_layouts */ + #ifdef GL_ARB_explicit_attrib_location #endif /* GL_ARB_explicit_attrib_location */ @@ -4289,6 +4695,20 @@ static GLboolean _glewInit_GL_ARB_imaging (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_ARB_imaging */ +#ifdef GL_ARB_indirect_parameters + +static GLboolean _glewInit_GL_ARB_indirect_parameters (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glMultiDrawArraysIndirectCountARB = (PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectCountARB")) == NULL) || r; + r = ((glMultiDrawElementsIndirectCountARB = (PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectCountARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_indirect_parameters */ + #ifdef GL_ARB_instanced_arrays static GLboolean _glewInit_GL_ARB_instanced_arrays (GLEW_CONTEXT_ARG_DEF_INIT) @@ -4383,6 +4803,24 @@ static GLboolean _glewInit_GL_ARB_matrix_palette (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_ARB_matrix_palette */ +#ifdef GL_ARB_multi_bind + +static GLboolean _glewInit_GL_ARB_multi_bind (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBindBuffersBase = (PFNGLBINDBUFFERSBASEPROC)glewGetProcAddress((const GLubyte*)"glBindBuffersBase")) == NULL) || r; + r = ((glBindBuffersRange = (PFNGLBINDBUFFERSRANGEPROC)glewGetProcAddress((const GLubyte*)"glBindBuffersRange")) == NULL) || r; + r = ((glBindImageTextures = (PFNGLBINDIMAGETEXTURESPROC)glewGetProcAddress((const GLubyte*)"glBindImageTextures")) == NULL) || r; + r = ((glBindSamplers = (PFNGLBINDSAMPLERSPROC)glewGetProcAddress((const GLubyte*)"glBindSamplers")) == NULL) || r; + r = ((glBindTextures = (PFNGLBINDTEXTURESPROC)glewGetProcAddress((const GLubyte*)"glBindTextures")) == NULL) || r; + r = ((glBindVertexBuffers = (PFNGLBINDVERTEXBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glBindVertexBuffers")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_multi_bind */ + #ifdef GL_ARB_multi_draw_indirect static GLboolean _glewInit_GL_ARB_multi_draw_indirect (GLEW_CONTEXT_ARG_DEF_INIT) @@ -4533,6 +4971,10 @@ static GLboolean _glewInit_GL_ARB_provoking_vertex (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_ARB_provoking_vertex */ +#ifdef GL_ARB_query_buffer_object + +#endif /* GL_ARB_query_buffer_object */ + #ifdef GL_ARB_robust_buffer_access_behavior #endif /* GL_ARB_robust_buffer_access_behavior */ @@ -4620,6 +5062,10 @@ static GLboolean _glewInit_GL_ARB_sampler_objects (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_ARB_seamless_cube_map */ +#ifdef GL_ARB_seamless_cubemap_per_texture + +#endif /* GL_ARB_seamless_cubemap_per_texture */ + #ifdef GL_ARB_separate_shader_objects static GLboolean _glewInit_GL_ARB_separate_shader_objects (GLEW_CONTEXT_ARG_DEF_INIT) @@ -4709,6 +5155,14 @@ static GLboolean _glewInit_GL_ARB_shader_atomic_counters (GLEW_CONTEXT_ARG_DEF_I #endif /* GL_ARB_shader_bit_encoding */ +#ifdef GL_ARB_shader_draw_parameters + +#endif /* GL_ARB_shader_draw_parameters */ + +#ifdef GL_ARB_shader_group_vote + +#endif /* GL_ARB_shader_group_vote */ + #ifdef GL_ARB_shader_image_load_store static GLboolean _glewInit_GL_ARB_shader_image_load_store (GLEW_CONTEXT_ARG_DEF_INIT) @@ -4861,6 +5315,20 @@ static GLboolean _glewInit_GL_ARB_shading_language_include (GLEW_CONTEXT_ARG_DEF #endif /* GL_ARB_shadow_ambient */ +#ifdef GL_ARB_sparse_texture + +static GLboolean _glewInit_GL_ARB_sparse_texture (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glTexPageCommitmentARB = (PFNGLTEXPAGECOMMITMENTARBPROC)glewGetProcAddress((const GLubyte*)"glTexPageCommitmentARB")) == NULL) || r; + r = ((glTexturePageCommitmentEXT = (PFNGLTEXTUREPAGECOMMITMENTEXTPROC)glewGetProcAddress((const GLubyte*)"glTexturePageCommitmentEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_sparse_texture */ + #ifdef GL_ARB_stencil_texturing #endif /* GL_ARB_stencil_texturing */ @@ -4992,6 +5460,10 @@ static GLboolean _glewInit_GL_ARB_texture_compression (GLEW_CONTEXT_ARG_DEF_INIT #endif /* GL_ARB_texture_gather */ +#ifdef GL_ARB_texture_mirror_clamp_to_edge + +#endif /* GL_ARB_texture_mirror_clamp_to_edge */ + #ifdef GL_ARB_texture_mirrored_repeat #endif /* GL_ARB_texture_mirrored_repeat */ @@ -5036,6 +5508,10 @@ static GLboolean _glewInit_GL_ARB_texture_multisample (GLEW_CONTEXT_ARG_DEF_INIT #endif /* GL_ARB_texture_rgb10_a2ui */ +#ifdef GL_ARB_texture_stencil8 + +#endif /* GL_ARB_texture_stencil8 */ + #ifdef GL_ARB_texture_storage static GLboolean _glewInit_GL_ARB_texture_storage (GLEW_CONTEXT_ARG_DEF_INIT) @@ -5383,6 +5859,10 @@ static GLboolean _glewInit_GL_ARB_vertex_shader (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_ARB_vertex_shader */ +#ifdef GL_ARB_vertex_type_10f_11f_11f_rev + +#endif /* GL_ARB_vertex_type_10f_11f_11f_rev */ + #ifdef GL_ARB_vertex_type_2_10_10_10_rev static GLboolean _glewInit_GL_ARB_vertex_type_2_10_10_10_rev (GLEW_CONTEXT_ARG_DEF_INIT) @@ -6119,55 +6599,38 @@ static GLboolean _glewInit_GL_EXT_direct_state_access (GLEW_CONTEXT_ARG_DEF_INIT r = ((glNamedRenderbufferStorageEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageEXT")) == NULL) || r; r = ((glNamedRenderbufferStorageMultisampleCoverageEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageMultisampleCoverageEXT")) == NULL) || r; r = ((glNamedRenderbufferStorageMultisampleEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageMultisampleEXT")) == NULL) || r; - r = ((glProgramUniform1dEXT = (PFNGLPROGRAMUNIFORM1DEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1dEXT")) == NULL) || r; - r = ((glProgramUniform1dvEXT = (PFNGLPROGRAMUNIFORM1DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1dvEXT")) == NULL) || r; r = ((glProgramUniform1fEXT = (PFNGLPROGRAMUNIFORM1FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1fEXT")) == NULL) || r; r = ((glProgramUniform1fvEXT = (PFNGLPROGRAMUNIFORM1FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1fvEXT")) == NULL) || r; r = ((glProgramUniform1iEXT = (PFNGLPROGRAMUNIFORM1IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1iEXT")) == NULL) || r; r = ((glProgramUniform1ivEXT = (PFNGLPROGRAMUNIFORM1IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ivEXT")) == NULL) || r; r = ((glProgramUniform1uiEXT = (PFNGLPROGRAMUNIFORM1UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1uiEXT")) == NULL) || r; r = ((glProgramUniform1uivEXT = (PFNGLPROGRAMUNIFORM1UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1uivEXT")) == NULL) || r; - r = ((glProgramUniform2dEXT = (PFNGLPROGRAMUNIFORM2DEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2dEXT")) == NULL) || r; - r = ((glProgramUniform2dvEXT = (PFNGLPROGRAMUNIFORM2DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2dvEXT")) == NULL) || r; r = ((glProgramUniform2fEXT = (PFNGLPROGRAMUNIFORM2FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2fEXT")) == NULL) || r; r = ((glProgramUniform2fvEXT = (PFNGLPROGRAMUNIFORM2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2fvEXT")) == NULL) || r; r = ((glProgramUniform2iEXT = (PFNGLPROGRAMUNIFORM2IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2iEXT")) == NULL) || r; r = ((glProgramUniform2ivEXT = (PFNGLPROGRAMUNIFORM2IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ivEXT")) == NULL) || r; r = ((glProgramUniform2uiEXT = (PFNGLPROGRAMUNIFORM2UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2uiEXT")) == NULL) || r; r = ((glProgramUniform2uivEXT = (PFNGLPROGRAMUNIFORM2UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2uivEXT")) == NULL) || r; - r = ((glProgramUniform3dEXT = (PFNGLPROGRAMUNIFORM3DEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3dEXT")) == NULL) || r; - r = ((glProgramUniform3dvEXT = (PFNGLPROGRAMUNIFORM3DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3dvEXT")) == NULL) || r; r = ((glProgramUniform3fEXT = (PFNGLPROGRAMUNIFORM3FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3fEXT")) == NULL) || r; r = ((glProgramUniform3fvEXT = (PFNGLPROGRAMUNIFORM3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3fvEXT")) == NULL) || r; r = ((glProgramUniform3iEXT = (PFNGLPROGRAMUNIFORM3IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3iEXT")) == NULL) || r; r = ((glProgramUniform3ivEXT = (PFNGLPROGRAMUNIFORM3IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ivEXT")) == NULL) || r; r = ((glProgramUniform3uiEXT = (PFNGLPROGRAMUNIFORM3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3uiEXT")) == NULL) || r; r = ((glProgramUniform3uivEXT = (PFNGLPROGRAMUNIFORM3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3uivEXT")) == NULL) || r; - r = ((glProgramUniform4dEXT = (PFNGLPROGRAMUNIFORM4DEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4dEXT")) == NULL) || r; - r = ((glProgramUniform4dvEXT = (PFNGLPROGRAMUNIFORM4DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4dvEXT")) == NULL) || r; r = ((glProgramUniform4fEXT = (PFNGLPROGRAMUNIFORM4FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4fEXT")) == NULL) || r; r = ((glProgramUniform4fvEXT = (PFNGLPROGRAMUNIFORM4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4fvEXT")) == NULL) || r; r = ((glProgramUniform4iEXT = (PFNGLPROGRAMUNIFORM4IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4iEXT")) == NULL) || r; r = ((glProgramUniform4ivEXT = (PFNGLPROGRAMUNIFORM4IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ivEXT")) == NULL) || r; r = ((glProgramUniform4uiEXT = (PFNGLPROGRAMUNIFORM4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4uiEXT")) == NULL) || r; r = ((glProgramUniform4uivEXT = (PFNGLPROGRAMUNIFORM4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4uivEXT")) == NULL) || r; - r = ((glProgramUniformMatrix2dvEXT = (PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2dvEXT")) == NULL) || r; r = ((glProgramUniformMatrix2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix2x3dvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x3dvEXT")) == NULL) || r; r = ((glProgramUniformMatrix2x3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x3fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix2x4dvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x4dvEXT")) == NULL) || r; r = ((glProgramUniformMatrix2x4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x4fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix3dvEXT = (PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3dvEXT")) == NULL) || r; r = ((glProgramUniformMatrix3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix3x2dvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x2dvEXT")) == NULL) || r; r = ((glProgramUniformMatrix3x2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x2fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix3x4dvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x4dvEXT")) == NULL) || r; r = ((glProgramUniformMatrix3x4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x4fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix4dvEXT = (PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4dvEXT")) == NULL) || r; r = ((glProgramUniformMatrix4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix4x2dvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x2dvEXT")) == NULL) || r; r = ((glProgramUniformMatrix4x2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x2fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix4x3dvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x3dvEXT")) == NULL) || r; r = ((glProgramUniformMatrix4x3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x3fvEXT")) == NULL) || r; r = ((glPushClientAttribDefaultEXT = (PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC)glewGetProcAddress((const GLubyte*)"glPushClientAttribDefaultEXT")) == NULL) || r; r = ((glTextureBufferEXT = (PFNGLTEXTUREBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glTextureBufferEXT")) == NULL) || r; @@ -7197,6 +7660,21 @@ static GLboolean _glewInit_GL_IBM_vertex_array_lists (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_INGR_interlace_read */ +#ifdef GL_INTEL_map_texture + +static GLboolean _glewInit_GL_INTEL_map_texture (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glMapTexture2DINTEL = (PFNGLMAPTEXTURE2DINTELPROC)glewGetProcAddress((const GLubyte*)"glMapTexture2DINTEL")) == NULL) || r; + r = ((glSyncTextureINTEL = (PFNGLSYNCTEXTUREINTELPROC)glewGetProcAddress((const GLubyte*)"glSyncTextureINTEL")) == NULL) || r; + r = ((glUnmapTexture2DINTEL = (PFNGLUNMAPTEXTURE2DINTELPROC)glewGetProcAddress((const GLubyte*)"glUnmapTexture2DINTEL")) == NULL) || r; + + return r; +} + +#endif /* GL_INTEL_map_texture */ + #ifdef GL_INTEL_parallel_arrays static GLboolean _glewInit_GL_INTEL_parallel_arrays (GLEW_CONTEXT_ARG_DEF_INIT) @@ -7239,9 +7717,9 @@ static GLboolean _glewInit_GL_KHR_debug (GLEW_CONTEXT_ARG_DEF_INIT) r = ((glGetDebugMessageLog = (PFNGLGETDEBUGMESSAGELOGPROC)glewGetProcAddress((const GLubyte*)"glGetDebugMessageLog")) == NULL) || r; r = ((glGetObjectLabel = (PFNGLGETOBJECTLABELPROC)glewGetProcAddress((const GLubyte*)"glGetObjectLabel")) == NULL) || r; r = ((glGetObjectPtrLabel = (PFNGLGETOBJECTPTRLABELPROC)glewGetProcAddress((const GLubyte*)"glGetObjectPtrLabel")) == NULL) || r; - r = ((glGetPointerv = (PFNGLGETPOINTERVPROC)glewGetProcAddress((const GLubyte*)"glGetPointerv")) == NULL) || r; r = ((glObjectLabel = (PFNGLOBJECTLABELPROC)glewGetProcAddress((const GLubyte*)"glObjectLabel")) == NULL) || r; r = ((glObjectPtrLabel = (PFNGLOBJECTPTRLABELPROC)glewGetProcAddress((const GLubyte*)"glObjectPtrLabel")) == NULL) || r; + r = ((glPopDebugGroup = (PFNGLPOPDEBUGGROUPPROC)glewGetProcAddress((const GLubyte*)"glPopDebugGroup")) == NULL) || r; r = ((glPushDebugGroup = (PFNGLPUSHDEBUGGROUPPROC)glewGetProcAddress((const GLubyte*)"glPushDebugGroup")) == NULL) || r; return r; @@ -7331,10 +7809,38 @@ static GLboolean _glewInit_GL_MESA_window_pos (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_MESA_ycbcr_texture */ +#ifdef GL_NVX_conditional_render + +static GLboolean _glewInit_GL_NVX_conditional_render (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBeginConditionalRenderNVX = (PFNGLBEGINCONDITIONALRENDERNVXPROC)glewGetProcAddress((const GLubyte*)"glBeginConditionalRenderNVX")) == NULL) || r; + r = ((glEndConditionalRenderNVX = (PFNGLENDCONDITIONALRENDERNVXPROC)glewGetProcAddress((const GLubyte*)"glEndConditionalRenderNVX")) == NULL) || r; + + return r; +} + +#endif /* GL_NVX_conditional_render */ + #ifdef GL_NVX_gpu_memory_info #endif /* GL_NVX_gpu_memory_info */ +#ifdef GL_NV_bindless_multi_draw_indirect + +static GLboolean _glewInit_GL_NV_bindless_multi_draw_indirect (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glMultiDrawArraysIndirectBindlessNV = (PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectBindlessNV")) == NULL) || r; + r = ((glMultiDrawElementsIndirectBindlessNV = (PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectBindlessNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_bindless_multi_draw_indirect */ + #ifdef GL_NV_bindless_texture static GLboolean _glewInit_GL_NV_bindless_texture (GLEW_CONTEXT_ARG_DEF_INIT) @@ -7360,10 +7866,32 @@ static GLboolean _glewInit_GL_NV_bindless_texture (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_NV_bindless_texture */ +#ifdef GL_NV_blend_equation_advanced + +static GLboolean _glewInit_GL_NV_blend_equation_advanced (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBlendBarrierNV = (PFNGLBLENDBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"glBlendBarrierNV")) == NULL) || r; + r = ((glBlendParameteriNV = (PFNGLBLENDPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glBlendParameteriNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_blend_equation_advanced */ + +#ifdef GL_NV_blend_equation_advanced_coherent + +#endif /* GL_NV_blend_equation_advanced_coherent */ + #ifdef GL_NV_blend_square #endif /* GL_NV_blend_square */ +#ifdef GL_NV_compute_program5 + +#endif /* GL_NV_compute_program5 */ + #ifdef GL_NV_conditional_render static GLboolean _glewInit_GL_NV_conditional_render (GLEW_CONTEXT_ARG_DEF_INIT) @@ -7395,6 +7923,10 @@ static GLboolean _glewInit_GL_NV_copy_image (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_NV_copy_image */ +#ifdef GL_NV_deep_texture3D + +#endif /* GL_NV_deep_texture3D */ + #ifdef GL_NV_depth_buffer_float static GLboolean _glewInit_GL_NV_depth_buffer_float (GLEW_CONTEXT_ARG_DEF_INIT) @@ -7418,6 +7950,19 @@ static GLboolean _glewInit_GL_NV_depth_buffer_float (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_NV_depth_range_unclamped */ +#ifdef GL_NV_draw_texture + +static GLboolean _glewInit_GL_NV_draw_texture (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDrawTextureNV = (PFNGLDRAWTEXTURENVPROC)glewGetProcAddress((const GLubyte*)"glDrawTextureNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_draw_texture */ + #ifdef GL_NV_evaluators static GLboolean _glewInit_GL_NV_evaluators (GLEW_CONTEXT_ARG_DEF_INIT) @@ -7569,6 +8114,10 @@ static GLboolean _glewInit_GL_NV_gpu_program4 (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_NV_gpu_program5 */ +#ifdef GL_NV_gpu_program5_mem_extended + +#endif /* GL_NV_gpu_program5_mem_extended */ + #ifdef GL_NV_gpu_program_fp64 #endif /* GL_NV_gpu_program_fp64 */ @@ -7891,6 +8440,10 @@ static GLboolean _glewInit_GL_NV_register_combiners2 (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_NV_register_combiners2 */ +#ifdef GL_NV_shader_atomic_counters + +#endif /* GL_NV_shader_atomic_counters */ + #ifdef GL_NV_shader_atomic_float #endif /* GL_NV_shader_atomic_float */ @@ -7920,6 +8473,10 @@ static GLboolean _glewInit_GL_NV_shader_buffer_load (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_NV_shader_buffer_load */ +#ifdef GL_NV_shader_storage_buffer_object + +#endif /* GL_NV_shader_storage_buffer_object */ + #ifdef GL_NV_tessellation_program5 #endif /* GL_NV_tessellation_program5 */ @@ -8298,6 +8855,78 @@ static GLboolean _glewInit_GL_OES_single_precision (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_PGI_vertex_hints */ +#ifdef GL_REGAL_ES1_0_compatibility + +static GLboolean _glewInit_GL_REGAL_ES1_0_compatibility (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glAlphaFuncx = (PFNGLALPHAFUNCXPROC)glewGetProcAddress((const GLubyte*)"glAlphaFuncx")) == NULL) || r; + r = ((glClearColorx = (PFNGLCLEARCOLORXPROC)glewGetProcAddress((const GLubyte*)"glClearColorx")) == NULL) || r; + r = ((glClearDepthx = (PFNGLCLEARDEPTHXPROC)glewGetProcAddress((const GLubyte*)"glClearDepthx")) == NULL) || r; + r = ((glColor4x = (PFNGLCOLOR4XPROC)glewGetProcAddress((const GLubyte*)"glColor4x")) == NULL) || r; + r = ((glDepthRangex = (PFNGLDEPTHRANGEXPROC)glewGetProcAddress((const GLubyte*)"glDepthRangex")) == NULL) || r; + r = ((glFogx = (PFNGLFOGXPROC)glewGetProcAddress((const GLubyte*)"glFogx")) == NULL) || r; + r = ((glFogxv = (PFNGLFOGXVPROC)glewGetProcAddress((const GLubyte*)"glFogxv")) == NULL) || r; + r = ((glFrustumf = (PFNGLFRUSTUMFPROC)glewGetProcAddress((const GLubyte*)"glFrustumf")) == NULL) || r; + r = ((glFrustumx = (PFNGLFRUSTUMXPROC)glewGetProcAddress((const GLubyte*)"glFrustumx")) == NULL) || r; + r = ((glLightModelx = (PFNGLLIGHTMODELXPROC)glewGetProcAddress((const GLubyte*)"glLightModelx")) == NULL) || r; + r = ((glLightModelxv = (PFNGLLIGHTMODELXVPROC)glewGetProcAddress((const GLubyte*)"glLightModelxv")) == NULL) || r; + r = ((glLightx = (PFNGLLIGHTXPROC)glewGetProcAddress((const GLubyte*)"glLightx")) == NULL) || r; + r = ((glLightxv = (PFNGLLIGHTXVPROC)glewGetProcAddress((const GLubyte*)"glLightxv")) == NULL) || r; + r = ((glLineWidthx = (PFNGLLINEWIDTHXPROC)glewGetProcAddress((const GLubyte*)"glLineWidthx")) == NULL) || r; + r = ((glLoadMatrixx = (PFNGLLOADMATRIXXPROC)glewGetProcAddress((const GLubyte*)"glLoadMatrixx")) == NULL) || r; + r = ((glMaterialx = (PFNGLMATERIALXPROC)glewGetProcAddress((const GLubyte*)"glMaterialx")) == NULL) || r; + r = ((glMaterialxv = (PFNGLMATERIALXVPROC)glewGetProcAddress((const GLubyte*)"glMaterialxv")) == NULL) || r; + r = ((glMultMatrixx = (PFNGLMULTMATRIXXPROC)glewGetProcAddress((const GLubyte*)"glMultMatrixx")) == NULL) || r; + r = ((glMultiTexCoord4x = (PFNGLMULTITEXCOORD4XPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4x")) == NULL) || r; + r = ((glNormal3x = (PFNGLNORMAL3XPROC)glewGetProcAddress((const GLubyte*)"glNormal3x")) == NULL) || r; + r = ((glOrthof = (PFNGLORTHOFPROC)glewGetProcAddress((const GLubyte*)"glOrthof")) == NULL) || r; + r = ((glOrthox = (PFNGLORTHOXPROC)glewGetProcAddress((const GLubyte*)"glOrthox")) == NULL) || r; + r = ((glPointSizex = (PFNGLPOINTSIZEXPROC)glewGetProcAddress((const GLubyte*)"glPointSizex")) == NULL) || r; + r = ((glPolygonOffsetx = (PFNGLPOLYGONOFFSETXPROC)glewGetProcAddress((const GLubyte*)"glPolygonOffsetx")) == NULL) || r; + r = ((glRotatex = (PFNGLROTATEXPROC)glewGetProcAddress((const GLubyte*)"glRotatex")) == NULL) || r; + r = ((glSampleCoveragex = (PFNGLSAMPLECOVERAGEXPROC)glewGetProcAddress((const GLubyte*)"glSampleCoveragex")) == NULL) || r; + r = ((glScalex = (PFNGLSCALEXPROC)glewGetProcAddress((const GLubyte*)"glScalex")) == NULL) || r; + r = ((glTexEnvx = (PFNGLTEXENVXPROC)glewGetProcAddress((const GLubyte*)"glTexEnvx")) == NULL) || r; + r = ((glTexEnvxv = (PFNGLTEXENVXVPROC)glewGetProcAddress((const GLubyte*)"glTexEnvxv")) == NULL) || r; + r = ((glTexParameterx = (PFNGLTEXPARAMETERXPROC)glewGetProcAddress((const GLubyte*)"glTexParameterx")) == NULL) || r; + r = ((glTranslatex = (PFNGLTRANSLATEXPROC)glewGetProcAddress((const GLubyte*)"glTranslatex")) == NULL) || r; + + return r; +} + +#endif /* GL_REGAL_ES1_0_compatibility */ + +#ifdef GL_REGAL_ES1_1_compatibility + +static GLboolean _glewInit_GL_REGAL_ES1_1_compatibility (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glClipPlanef = (PFNGLCLIPPLANEFPROC)glewGetProcAddress((const GLubyte*)"glClipPlanef")) == NULL) || r; + r = ((glClipPlanex = (PFNGLCLIPPLANEXPROC)glewGetProcAddress((const GLubyte*)"glClipPlanex")) == NULL) || r; + r = ((glGetClipPlanef = (PFNGLGETCLIPPLANEFPROC)glewGetProcAddress((const GLubyte*)"glGetClipPlanef")) == NULL) || r; + r = ((glGetClipPlanex = (PFNGLGETCLIPPLANEXPROC)glewGetProcAddress((const GLubyte*)"glGetClipPlanex")) == NULL) || r; + r = ((glGetFixedv = (PFNGLGETFIXEDVPROC)glewGetProcAddress((const GLubyte*)"glGetFixedv")) == NULL) || r; + r = ((glGetLightxv = (PFNGLGETLIGHTXVPROC)glewGetProcAddress((const GLubyte*)"glGetLightxv")) == NULL) || r; + r = ((glGetMaterialxv = (PFNGLGETMATERIALXVPROC)glewGetProcAddress((const GLubyte*)"glGetMaterialxv")) == NULL) || r; + r = ((glGetTexEnvxv = (PFNGLGETTEXENVXVPROC)glewGetProcAddress((const GLubyte*)"glGetTexEnvxv")) == NULL) || r; + r = ((glGetTexParameterxv = (PFNGLGETTEXPARAMETERXVPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterxv")) == NULL) || r; + r = ((glPointParameterx = (PFNGLPOINTPARAMETERXPROC)glewGetProcAddress((const GLubyte*)"glPointParameterx")) == NULL) || r; + r = ((glPointParameterxv = (PFNGLPOINTPARAMETERXVPROC)glewGetProcAddress((const GLubyte*)"glPointParameterxv")) == NULL) || r; + r = ((glPointSizePointerOES = (PFNGLPOINTSIZEPOINTEROESPROC)glewGetProcAddress((const GLubyte*)"glPointSizePointerOES")) == NULL) || r; + r = ((glTexParameterxv = (PFNGLTEXPARAMETERXVPROC)glewGetProcAddress((const GLubyte*)"glTexParameterxv")) == NULL) || r; + + return r; +} + +#endif /* GL_REGAL_ES1_1_compatibility */ + +#ifdef GL_REGAL_enable + +#endif /* GL_REGAL_enable */ + #ifdef GL_REGAL_error_string static GLboolean _glewInit_GL_REGAL_error_string (GLEW_CONTEXT_ARG_DEF_INIT) @@ -8327,6 +8956,15 @@ static GLboolean _glewInit_GL_REGAL_extension_query (GLEW_CONTEXT_ARG_DEF_INIT) #ifdef GL_REGAL_log +static GLboolean _glewInit_GL_REGAL_log (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glLogMessageCallbackREGAL = (PFNGLLOGMESSAGECALLBACKREGALPROC)glewGetProcAddress((const GLubyte*)"glLogMessageCallbackREGAL")) == NULL) || r; + + return r; +} + #endif /* GL_REGAL_log */ #ifdef GL_REND_screen_coordinates @@ -8866,7 +9504,7 @@ static GLboolean _glewInit_GL_WIN_swap_hint (GLEW_CONTEXT_ARG_DEF_INIT) /* ------------------------------------------------------------------------- */ GLboolean GLEWAPIENTRY glewGetExtension (const char* name) -{ +{ const GLubyte* start; const GLubyte* end; start = (const GLubyte*)glGetString(GL_EXTENSIONS); @@ -8893,7 +9531,7 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) dot = _glewStrCLen(s, '.'); if (dot == 0) return GLEW_ERROR_NO_GL_VERSION; - + major = s[dot-1]-'0'; minor = s[dot+1]-'0'; @@ -8901,7 +9539,7 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) minor = 0; if (major<0 || major>9) return GLEW_ERROR_NO_GL_VERSION; - + if (major == 1 && minor == 0) { @@ -8909,7 +9547,8 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) } else { - CONST_CAST(GLEW_VERSION_4_3) = ( major > 4 ) || ( major == 4 && minor >= 3 ) ? GL_TRUE : GL_FALSE; + CONST_CAST(GLEW_VERSION_4_4) = ( major > 4 ) || ( major == 4 && minor >= 4 ) ? GL_TRUE : GL_FALSE; + CONST_CAST(GLEW_VERSION_4_3) = GLEW_VERSION_4_4 == GL_TRUE || ( major == 4 && minor >= 3 ) ? GL_TRUE : GL_FALSE; CONST_CAST(GLEW_VERSION_4_2) = GLEW_VERSION_4_3 == GL_TRUE || ( major == 4 && minor >= 2 ) ? GL_TRUE : GL_FALSE; CONST_CAST(GLEW_VERSION_4_1) = GLEW_VERSION_4_2 == GL_TRUE || ( major == 4 && minor >= 1 ) ? GL_TRUE : GL_FALSE; CONST_CAST(GLEW_VERSION_4_0) = GLEW_VERSION_4_1 == GL_TRUE || ( major == 4 ) ? GL_TRUE : GL_FALSE; @@ -8917,12 +9556,12 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) CONST_CAST(GLEW_VERSION_3_2) = GLEW_VERSION_3_3 == GL_TRUE || ( major == 3 && minor >= 2 ) ? GL_TRUE : GL_FALSE; CONST_CAST(GLEW_VERSION_3_1) = GLEW_VERSION_3_2 == GL_TRUE || ( major == 3 && minor >= 1 ) ? GL_TRUE : GL_FALSE; CONST_CAST(GLEW_VERSION_3_0) = GLEW_VERSION_3_1 == GL_TRUE || ( major == 3 ) ? GL_TRUE : GL_FALSE; - CONST_CAST(GLEW_VERSION_2_1) = GLEW_VERSION_3_0 == GL_TRUE || ( major == 2 && minor >= 1 ) ? GL_TRUE : GL_FALSE; + CONST_CAST(GLEW_VERSION_2_1) = GLEW_VERSION_3_0 == GL_TRUE || ( major == 2 && minor >= 1 ) ? GL_TRUE : GL_FALSE; CONST_CAST(GLEW_VERSION_2_0) = GLEW_VERSION_2_1 == GL_TRUE || ( major == 2 ) ? GL_TRUE : GL_FALSE; CONST_CAST(GLEW_VERSION_1_5) = GLEW_VERSION_2_0 == GL_TRUE || ( major == 1 && minor >= 5 ) ? GL_TRUE : GL_FALSE; CONST_CAST(GLEW_VERSION_1_4) = GLEW_VERSION_1_5 == GL_TRUE || ( major == 1 && minor >= 4 ) ? GL_TRUE : GL_FALSE; CONST_CAST(GLEW_VERSION_1_3) = GLEW_VERSION_1_4 == GL_TRUE || ( major == 1 && minor >= 3 ) ? GL_TRUE : GL_FALSE; - CONST_CAST(GLEW_VERSION_1_2_1) = GLEW_VERSION_1_3 == GL_TRUE ? GL_TRUE : GL_FALSE; + CONST_CAST(GLEW_VERSION_1_2_1) = GLEW_VERSION_1_3 == GL_TRUE ? GL_TRUE : GL_FALSE; CONST_CAST(GLEW_VERSION_1_2) = GLEW_VERSION_1_2_1 == GL_TRUE || ( major == 1 && minor >= 2 ) ? GL_TRUE : GL_FALSE; CONST_CAST(GLEW_VERSION_1_1) = GLEW_VERSION_1_2 == GL_TRUE || ( major == 1 && minor >= 1 ) ? GL_TRUE : GL_FALSE; } @@ -8975,6 +9614,8 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) #endif /* GL_VERSION_4_2 */ #ifdef GL_VERSION_4_3 #endif /* GL_VERSION_4_3 */ +#ifdef GL_VERSION_4_4 +#endif /* GL_VERSION_4_4 */ #ifdef GL_3DFX_multisample CONST_CAST(GLEW_3DFX_multisample) = _glewSearchExtension("GL_3DFX_multisample", extStart, extEnd); #endif /* GL_3DFX_multisample */ @@ -9002,6 +9643,10 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) CONST_CAST(GLEW_AMD_draw_buffers_blend) = _glewSearchExtension("GL_AMD_draw_buffers_blend", extStart, extEnd); if (glewExperimental || GLEW_AMD_draw_buffers_blend) CONST_CAST(GLEW_AMD_draw_buffers_blend) = !_glewInit_GL_AMD_draw_buffers_blend(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_AMD_draw_buffers_blend */ +#ifdef GL_AMD_interleaved_elements + CONST_CAST(GLEW_AMD_interleaved_elements) = _glewSearchExtension("GL_AMD_interleaved_elements", extStart, extEnd); + if (glewExperimental || GLEW_AMD_interleaved_elements) CONST_CAST(GLEW_AMD_interleaved_elements) = !_glewInit_GL_AMD_interleaved_elements(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_AMD_interleaved_elements */ #ifdef GL_AMD_multi_draw_indirect CONST_CAST(GLEW_AMD_multi_draw_indirect) = _glewSearchExtension("GL_AMD_multi_draw_indirect", extStart, extEnd); if (glewExperimental || GLEW_AMD_multi_draw_indirect) CONST_CAST(GLEW_AMD_multi_draw_indirect) = !_glewInit_GL_AMD_multi_draw_indirect(GLEW_CONTEXT_ARG_VAR_INIT); @@ -9030,6 +9675,13 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) #ifdef GL_AMD_shader_stencil_export CONST_CAST(GLEW_AMD_shader_stencil_export) = _glewSearchExtension("GL_AMD_shader_stencil_export", extStart, extEnd); #endif /* GL_AMD_shader_stencil_export */ +#ifdef GL_AMD_shader_trinary_minmax + CONST_CAST(GLEW_AMD_shader_trinary_minmax) = _glewSearchExtension("GL_AMD_shader_trinary_minmax", extStart, extEnd); +#endif /* GL_AMD_shader_trinary_minmax */ +#ifdef GL_AMD_sparse_texture + CONST_CAST(GLEW_AMD_sparse_texture) = _glewSearchExtension("GL_AMD_sparse_texture", extStart, extEnd); + if (glewExperimental || GLEW_AMD_sparse_texture) CONST_CAST(GLEW_AMD_sparse_texture) = !_glewInit_GL_AMD_sparse_texture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_AMD_sparse_texture */ #ifdef GL_AMD_stencil_operation_extended CONST_CAST(GLEW_AMD_stencil_operation_extended) = _glewSearchExtension("GL_AMD_stencil_operation_extended", extStart, extEnd); if (glewExperimental || GLEW_AMD_stencil_operation_extended) CONST_CAST(GLEW_AMD_stencil_operation_extended) = !_glewInit_GL_AMD_stencil_operation_extended(GLEW_CONTEXT_ARG_VAR_INIT); @@ -9050,6 +9702,47 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) #ifdef GL_AMD_vertex_shader_viewport_index CONST_CAST(GLEW_AMD_vertex_shader_viewport_index) = _glewSearchExtension("GL_AMD_vertex_shader_viewport_index", extStart, extEnd); #endif /* GL_AMD_vertex_shader_viewport_index */ +#ifdef GL_ANGLE_depth_texture + CONST_CAST(GLEW_ANGLE_depth_texture) = _glewSearchExtension("GL_ANGLE_depth_texture", extStart, extEnd); +#endif /* GL_ANGLE_depth_texture */ +#ifdef GL_ANGLE_framebuffer_blit + CONST_CAST(GLEW_ANGLE_framebuffer_blit) = _glewSearchExtension("GL_ANGLE_framebuffer_blit", extStart, extEnd); + if (glewExperimental || GLEW_ANGLE_framebuffer_blit) CONST_CAST(GLEW_ANGLE_framebuffer_blit) = !_glewInit_GL_ANGLE_framebuffer_blit(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ANGLE_framebuffer_blit */ +#ifdef GL_ANGLE_framebuffer_multisample + CONST_CAST(GLEW_ANGLE_framebuffer_multisample) = _glewSearchExtension("GL_ANGLE_framebuffer_multisample", extStart, extEnd); + if (glewExperimental || GLEW_ANGLE_framebuffer_multisample) CONST_CAST(GLEW_ANGLE_framebuffer_multisample) = !_glewInit_GL_ANGLE_framebuffer_multisample(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ANGLE_framebuffer_multisample */ +#ifdef GL_ANGLE_instanced_arrays + CONST_CAST(GLEW_ANGLE_instanced_arrays) = _glewSearchExtension("GL_ANGLE_instanced_arrays", extStart, extEnd); + if (glewExperimental || GLEW_ANGLE_instanced_arrays) CONST_CAST(GLEW_ANGLE_instanced_arrays) = !_glewInit_GL_ANGLE_instanced_arrays(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ANGLE_instanced_arrays */ +#ifdef GL_ANGLE_pack_reverse_row_order + CONST_CAST(GLEW_ANGLE_pack_reverse_row_order) = _glewSearchExtension("GL_ANGLE_pack_reverse_row_order", extStart, extEnd); +#endif /* GL_ANGLE_pack_reverse_row_order */ +#ifdef GL_ANGLE_program_binary + CONST_CAST(GLEW_ANGLE_program_binary) = _glewSearchExtension("GL_ANGLE_program_binary", extStart, extEnd); +#endif /* GL_ANGLE_program_binary */ +#ifdef GL_ANGLE_texture_compression_dxt1 + CONST_CAST(GLEW_ANGLE_texture_compression_dxt1) = _glewSearchExtension("GL_ANGLE_texture_compression_dxt1", extStart, extEnd); +#endif /* GL_ANGLE_texture_compression_dxt1 */ +#ifdef GL_ANGLE_texture_compression_dxt3 + CONST_CAST(GLEW_ANGLE_texture_compression_dxt3) = _glewSearchExtension("GL_ANGLE_texture_compression_dxt3", extStart, extEnd); +#endif /* GL_ANGLE_texture_compression_dxt3 */ +#ifdef GL_ANGLE_texture_compression_dxt5 + CONST_CAST(GLEW_ANGLE_texture_compression_dxt5) = _glewSearchExtension("GL_ANGLE_texture_compression_dxt5", extStart, extEnd); +#endif /* GL_ANGLE_texture_compression_dxt5 */ +#ifdef GL_ANGLE_texture_usage + CONST_CAST(GLEW_ANGLE_texture_usage) = _glewSearchExtension("GL_ANGLE_texture_usage", extStart, extEnd); +#endif /* GL_ANGLE_texture_usage */ +#ifdef GL_ANGLE_timer_query + CONST_CAST(GLEW_ANGLE_timer_query) = _glewSearchExtension("GL_ANGLE_timer_query", extStart, extEnd); + if (glewExperimental || GLEW_ANGLE_timer_query) CONST_CAST(GLEW_ANGLE_timer_query) = !_glewInit_GL_ANGLE_timer_query(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ANGLE_timer_query */ +#ifdef GL_ANGLE_translated_shader_source + CONST_CAST(GLEW_ANGLE_translated_shader_source) = _glewSearchExtension("GL_ANGLE_translated_shader_source", extStart, extEnd); + if (glewExperimental || GLEW_ANGLE_translated_shader_source) CONST_CAST(GLEW_ANGLE_translated_shader_source) = !_glewInit_GL_ANGLE_translated_shader_source(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ANGLE_translated_shader_source */ #ifdef GL_APPLE_aux_depth_stencil CONST_CAST(GLEW_APPLE_aux_depth_stencil) = _glewSearchExtension("GL_APPLE_aux_depth_stencil", extStart, extEnd); #endif /* GL_APPLE_aux_depth_stencil */ @@ -9123,10 +9816,18 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) CONST_CAST(GLEW_ARB_base_instance) = _glewSearchExtension("GL_ARB_base_instance", extStart, extEnd); if (glewExperimental || GLEW_ARB_base_instance) CONST_CAST(GLEW_ARB_base_instance) = !_glewInit_GL_ARB_base_instance(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_base_instance */ +#ifdef GL_ARB_bindless_texture + CONST_CAST(GLEW_ARB_bindless_texture) = _glewSearchExtension("GL_ARB_bindless_texture", extStart, extEnd); + if (glewExperimental || GLEW_ARB_bindless_texture) CONST_CAST(GLEW_ARB_bindless_texture) = !_glewInit_GL_ARB_bindless_texture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_bindless_texture */ #ifdef GL_ARB_blend_func_extended CONST_CAST(GLEW_ARB_blend_func_extended) = _glewSearchExtension("GL_ARB_blend_func_extended", extStart, extEnd); if (glewExperimental || GLEW_ARB_blend_func_extended) CONST_CAST(GLEW_ARB_blend_func_extended) = !_glewInit_GL_ARB_blend_func_extended(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_blend_func_extended */ +#ifdef GL_ARB_buffer_storage + CONST_CAST(GLEW_ARB_buffer_storage) = _glewSearchExtension("GL_ARB_buffer_storage", extStart, extEnd); + if (glewExperimental || GLEW_ARB_buffer_storage) CONST_CAST(GLEW_ARB_buffer_storage) = !_glewInit_GL_ARB_buffer_storage(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_buffer_storage */ #ifdef GL_ARB_cl_event CONST_CAST(GLEW_ARB_cl_event) = _glewSearchExtension("GL_ARB_cl_event", extStart, extEnd); if (glewExperimental || GLEW_ARB_cl_event) CONST_CAST(GLEW_ARB_cl_event) = !_glewInit_GL_ARB_cl_event(GLEW_CONTEXT_ARG_VAR_INIT); @@ -9135,6 +9836,10 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) CONST_CAST(GLEW_ARB_clear_buffer_object) = _glewSearchExtension("GL_ARB_clear_buffer_object", extStart, extEnd); if (glewExperimental || GLEW_ARB_clear_buffer_object) CONST_CAST(GLEW_ARB_clear_buffer_object) = !_glewInit_GL_ARB_clear_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_clear_buffer_object */ +#ifdef GL_ARB_clear_texture + CONST_CAST(GLEW_ARB_clear_texture) = _glewSearchExtension("GL_ARB_clear_texture", extStart, extEnd); + if (glewExperimental || GLEW_ARB_clear_texture) CONST_CAST(GLEW_ARB_clear_texture) = !_glewInit_GL_ARB_clear_texture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_clear_texture */ #ifdef GL_ARB_color_buffer_float CONST_CAST(GLEW_ARB_color_buffer_float) = _glewSearchExtension("GL_ARB_color_buffer_float", extStart, extEnd); if (glewExperimental || GLEW_ARB_color_buffer_float) CONST_CAST(GLEW_ARB_color_buffer_float) = !_glewInit_GL_ARB_color_buffer_float(GLEW_CONTEXT_ARG_VAR_INIT); @@ -9149,6 +9854,10 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) CONST_CAST(GLEW_ARB_compute_shader) = _glewSearchExtension("GL_ARB_compute_shader", extStart, extEnd); if (glewExperimental || GLEW_ARB_compute_shader) CONST_CAST(GLEW_ARB_compute_shader) = !_glewInit_GL_ARB_compute_shader(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_compute_shader */ +#ifdef GL_ARB_compute_variable_group_size + CONST_CAST(GLEW_ARB_compute_variable_group_size) = _glewSearchExtension("GL_ARB_compute_variable_group_size", extStart, extEnd); + if (glewExperimental || GLEW_ARB_compute_variable_group_size) CONST_CAST(GLEW_ARB_compute_variable_group_size) = !_glewInit_GL_ARB_compute_variable_group_size(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_compute_variable_group_size */ #ifdef GL_ARB_conservative_depth CONST_CAST(GLEW_ARB_conservative_depth) = _glewSearchExtension("GL_ARB_conservative_depth", extStart, extEnd); #endif /* GL_ARB_conservative_depth */ @@ -9192,6 +9901,9 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) #ifdef GL_ARB_draw_instanced CONST_CAST(GLEW_ARB_draw_instanced) = _glewSearchExtension("GL_ARB_draw_instanced", extStart, extEnd); #endif /* GL_ARB_draw_instanced */ +#ifdef GL_ARB_enhanced_layouts + CONST_CAST(GLEW_ARB_enhanced_layouts) = _glewSearchExtension("GL_ARB_enhanced_layouts", extStart, extEnd); +#endif /* GL_ARB_enhanced_layouts */ #ifdef GL_ARB_explicit_attrib_location CONST_CAST(GLEW_ARB_explicit_attrib_location) = _glewSearchExtension("GL_ARB_explicit_attrib_location", extStart, extEnd); #endif /* GL_ARB_explicit_attrib_location */ @@ -9249,6 +9961,10 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) CONST_CAST(GLEW_ARB_imaging) = _glewSearchExtension("GL_ARB_imaging", extStart, extEnd); if (glewExperimental || GLEW_ARB_imaging) CONST_CAST(GLEW_ARB_imaging) = !_glewInit_GL_ARB_imaging(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_imaging */ +#ifdef GL_ARB_indirect_parameters + CONST_CAST(GLEW_ARB_indirect_parameters) = _glewSearchExtension("GL_ARB_indirect_parameters", extStart, extEnd); + if (glewExperimental || GLEW_ARB_indirect_parameters) CONST_CAST(GLEW_ARB_indirect_parameters) = !_glewInit_GL_ARB_indirect_parameters(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_indirect_parameters */ #ifdef GL_ARB_instanced_arrays CONST_CAST(GLEW_ARB_instanced_arrays) = _glewSearchExtension("GL_ARB_instanced_arrays", extStart, extEnd); if (glewExperimental || GLEW_ARB_instanced_arrays) CONST_CAST(GLEW_ARB_instanced_arrays) = !_glewInit_GL_ARB_instanced_arrays(GLEW_CONTEXT_ARG_VAR_INIT); @@ -9276,6 +9992,10 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) CONST_CAST(GLEW_ARB_matrix_palette) = _glewSearchExtension("GL_ARB_matrix_palette", extStart, extEnd); if (glewExperimental || GLEW_ARB_matrix_palette) CONST_CAST(GLEW_ARB_matrix_palette) = !_glewInit_GL_ARB_matrix_palette(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_matrix_palette */ +#ifdef GL_ARB_multi_bind + CONST_CAST(GLEW_ARB_multi_bind) = _glewSearchExtension("GL_ARB_multi_bind", extStart, extEnd); + if (glewExperimental || GLEW_ARB_multi_bind) CONST_CAST(GLEW_ARB_multi_bind) = !_glewInit_GL_ARB_multi_bind(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_multi_bind */ #ifdef GL_ARB_multi_draw_indirect CONST_CAST(GLEW_ARB_multi_draw_indirect) = _glewSearchExtension("GL_ARB_multi_draw_indirect", extStart, extEnd); if (glewExperimental || GLEW_ARB_multi_draw_indirect) CONST_CAST(GLEW_ARB_multi_draw_indirect) = !_glewInit_GL_ARB_multi_draw_indirect(GLEW_CONTEXT_ARG_VAR_INIT); @@ -9313,6 +10033,9 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) CONST_CAST(GLEW_ARB_provoking_vertex) = _glewSearchExtension("GL_ARB_provoking_vertex", extStart, extEnd); if (glewExperimental || GLEW_ARB_provoking_vertex) CONST_CAST(GLEW_ARB_provoking_vertex) = !_glewInit_GL_ARB_provoking_vertex(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_provoking_vertex */ +#ifdef GL_ARB_query_buffer_object + CONST_CAST(GLEW_ARB_query_buffer_object) = _glewSearchExtension("GL_ARB_query_buffer_object", extStart, extEnd); +#endif /* GL_ARB_query_buffer_object */ #ifdef GL_ARB_robust_buffer_access_behavior CONST_CAST(GLEW_ARB_robust_buffer_access_behavior) = _glewSearchExtension("GL_ARB_robust_buffer_access_behavior", extStart, extEnd); #endif /* GL_ARB_robust_buffer_access_behavior */ @@ -9337,6 +10060,9 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) #ifdef GL_ARB_seamless_cube_map CONST_CAST(GLEW_ARB_seamless_cube_map) = _glewSearchExtension("GL_ARB_seamless_cube_map", extStart, extEnd); #endif /* GL_ARB_seamless_cube_map */ +#ifdef GL_ARB_seamless_cubemap_per_texture + CONST_CAST(GLEW_ARB_seamless_cubemap_per_texture) = _glewSearchExtension("GL_ARB_seamless_cubemap_per_texture", extStart, extEnd); +#endif /* GL_ARB_seamless_cubemap_per_texture */ #ifdef GL_ARB_separate_shader_objects CONST_CAST(GLEW_ARB_separate_shader_objects) = _glewSearchExtension("GL_ARB_separate_shader_objects", extStart, extEnd); if (glewExperimental || GLEW_ARB_separate_shader_objects) CONST_CAST(GLEW_ARB_separate_shader_objects) = !_glewInit_GL_ARB_separate_shader_objects(GLEW_CONTEXT_ARG_VAR_INIT); @@ -9348,6 +10074,12 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) #ifdef GL_ARB_shader_bit_encoding CONST_CAST(GLEW_ARB_shader_bit_encoding) = _glewSearchExtension("GL_ARB_shader_bit_encoding", extStart, extEnd); #endif /* GL_ARB_shader_bit_encoding */ +#ifdef GL_ARB_shader_draw_parameters + CONST_CAST(GLEW_ARB_shader_draw_parameters) = _glewSearchExtension("GL_ARB_shader_draw_parameters", extStart, extEnd); +#endif /* GL_ARB_shader_draw_parameters */ +#ifdef GL_ARB_shader_group_vote + CONST_CAST(GLEW_ARB_shader_group_vote) = _glewSearchExtension("GL_ARB_shader_group_vote", extStart, extEnd); +#endif /* GL_ARB_shader_group_vote */ #ifdef GL_ARB_shader_image_load_store CONST_CAST(GLEW_ARB_shader_image_load_store) = _glewSearchExtension("GL_ARB_shader_image_load_store", extStart, extEnd); if (glewExperimental || GLEW_ARB_shader_image_load_store) CONST_CAST(GLEW_ARB_shader_image_load_store) = !_glewInit_GL_ARB_shader_image_load_store(GLEW_CONTEXT_ARG_VAR_INIT); @@ -9395,6 +10127,10 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) #ifdef GL_ARB_shadow_ambient CONST_CAST(GLEW_ARB_shadow_ambient) = _glewSearchExtension("GL_ARB_shadow_ambient", extStart, extEnd); #endif /* GL_ARB_shadow_ambient */ +#ifdef GL_ARB_sparse_texture + CONST_CAST(GLEW_ARB_sparse_texture) = _glewSearchExtension("GL_ARB_sparse_texture", extStart, extEnd); + if (glewExperimental || GLEW_ARB_sparse_texture) CONST_CAST(GLEW_ARB_sparse_texture) = !_glewInit_GL_ARB_sparse_texture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_sparse_texture */ #ifdef GL_ARB_stencil_texturing CONST_CAST(GLEW_ARB_stencil_texturing) = _glewSearchExtension("GL_ARB_stencil_texturing", extStart, extEnd); #endif /* GL_ARB_stencil_texturing */ @@ -9454,6 +10190,9 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) #ifdef GL_ARB_texture_gather CONST_CAST(GLEW_ARB_texture_gather) = _glewSearchExtension("GL_ARB_texture_gather", extStart, extEnd); #endif /* GL_ARB_texture_gather */ +#ifdef GL_ARB_texture_mirror_clamp_to_edge + CONST_CAST(GLEW_ARB_texture_mirror_clamp_to_edge) = _glewSearchExtension("GL_ARB_texture_mirror_clamp_to_edge", extStart, extEnd); +#endif /* GL_ARB_texture_mirror_clamp_to_edge */ #ifdef GL_ARB_texture_mirrored_repeat CONST_CAST(GLEW_ARB_texture_mirrored_repeat) = _glewSearchExtension("GL_ARB_texture_mirrored_repeat", extStart, extEnd); #endif /* GL_ARB_texture_mirrored_repeat */ @@ -9479,6 +10218,9 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) #ifdef GL_ARB_texture_rgb10_a2ui CONST_CAST(GLEW_ARB_texture_rgb10_a2ui) = _glewSearchExtension("GL_ARB_texture_rgb10_a2ui", extStart, extEnd); #endif /* GL_ARB_texture_rgb10_a2ui */ +#ifdef GL_ARB_texture_stencil8 + CONST_CAST(GLEW_ARB_texture_stencil8) = _glewSearchExtension("GL_ARB_texture_stencil8", extStart, extEnd); +#endif /* GL_ARB_texture_stencil8 */ #ifdef GL_ARB_texture_storage CONST_CAST(GLEW_ARB_texture_storage) = _glewSearchExtension("GL_ARB_texture_storage", extStart, extEnd); if (glewExperimental || GLEW_ARB_texture_storage) CONST_CAST(GLEW_ARB_texture_storage) = !_glewInit_GL_ARB_texture_storage(GLEW_CONTEXT_ARG_VAR_INIT); @@ -9549,6 +10291,9 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) CONST_CAST(GLEW_ARB_vertex_shader) = _glewSearchExtension("GL_ARB_vertex_shader", extStart, extEnd); if (glewExperimental || GLEW_ARB_vertex_shader) CONST_CAST(GLEW_ARB_vertex_shader) = !_glewInit_GL_ARB_vertex_shader(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_vertex_shader */ +#ifdef GL_ARB_vertex_type_10f_11f_11f_rev + CONST_CAST(GLEW_ARB_vertex_type_10f_11f_11f_rev) = _glewSearchExtension("GL_ARB_vertex_type_10f_11f_11f_rev", extStart, extEnd); +#endif /* GL_ARB_vertex_type_10f_11f_11f_rev */ #ifdef GL_ARB_vertex_type_2_10_10_10_rev CONST_CAST(GLEW_ARB_vertex_type_2_10_10_10_rev) = _glewSearchExtension("GL_ARB_vertex_type_2_10_10_10_rev", extStart, extEnd); if (glewExperimental || GLEW_ARB_vertex_type_2_10_10_10_rev) CONST_CAST(GLEW_ARB_vertex_type_2_10_10_10_rev) = !_glewInit_GL_ARB_vertex_type_2_10_10_10_rev(GLEW_CONTEXT_ARG_VAR_INIT); @@ -10036,6 +10781,10 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) #ifdef GL_INGR_interlace_read CONST_CAST(GLEW_INGR_interlace_read) = _glewSearchExtension("GL_INGR_interlace_read", extStart, extEnd); #endif /* GL_INGR_interlace_read */ +#ifdef GL_INTEL_map_texture + CONST_CAST(GLEW_INTEL_map_texture) = _glewSearchExtension("GL_INTEL_map_texture", extStart, extEnd); + if (glewExperimental || GLEW_INTEL_map_texture) CONST_CAST(GLEW_INTEL_map_texture) = !_glewInit_GL_INTEL_map_texture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_INTEL_map_texture */ #ifdef GL_INTEL_parallel_arrays CONST_CAST(GLEW_INTEL_parallel_arrays) = _glewSearchExtension("GL_INTEL_parallel_arrays", extStart, extEnd); if (glewExperimental || GLEW_INTEL_parallel_arrays) CONST_CAST(GLEW_INTEL_parallel_arrays) = !_glewInit_GL_INTEL_parallel_arrays(GLEW_CONTEXT_ARG_VAR_INIT); @@ -10072,16 +10821,34 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) #ifdef GL_MESA_ycbcr_texture CONST_CAST(GLEW_MESA_ycbcr_texture) = _glewSearchExtension("GL_MESA_ycbcr_texture", extStart, extEnd); #endif /* GL_MESA_ycbcr_texture */ +#ifdef GL_NVX_conditional_render + CONST_CAST(GLEW_NVX_conditional_render) = _glewSearchExtension("GL_NVX_conditional_render", extStart, extEnd); + if (glewExperimental || GLEW_NVX_conditional_render) CONST_CAST(GLEW_NVX_conditional_render) = !_glewInit_GL_NVX_conditional_render(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NVX_conditional_render */ #ifdef GL_NVX_gpu_memory_info CONST_CAST(GLEW_NVX_gpu_memory_info) = _glewSearchExtension("GL_NVX_gpu_memory_info", extStart, extEnd); #endif /* GL_NVX_gpu_memory_info */ +#ifdef GL_NV_bindless_multi_draw_indirect + CONST_CAST(GLEW_NV_bindless_multi_draw_indirect) = _glewSearchExtension("GL_NV_bindless_multi_draw_indirect", extStart, extEnd); + if (glewExperimental || GLEW_NV_bindless_multi_draw_indirect) CONST_CAST(GLEW_NV_bindless_multi_draw_indirect) = !_glewInit_GL_NV_bindless_multi_draw_indirect(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_bindless_multi_draw_indirect */ #ifdef GL_NV_bindless_texture CONST_CAST(GLEW_NV_bindless_texture) = _glewSearchExtension("GL_NV_bindless_texture", extStart, extEnd); if (glewExperimental || GLEW_NV_bindless_texture) CONST_CAST(GLEW_NV_bindless_texture) = !_glewInit_GL_NV_bindless_texture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_bindless_texture */ +#ifdef GL_NV_blend_equation_advanced + CONST_CAST(GLEW_NV_blend_equation_advanced) = _glewSearchExtension("GL_NV_blend_equation_advanced", extStart, extEnd); + if (glewExperimental || GLEW_NV_blend_equation_advanced) CONST_CAST(GLEW_NV_blend_equation_advanced) = !_glewInit_GL_NV_blend_equation_advanced(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_blend_equation_advanced */ +#ifdef GL_NV_blend_equation_advanced_coherent + CONST_CAST(GLEW_NV_blend_equation_advanced_coherent) = _glewSearchExtension("GL_NV_blend_equation_advanced_coherent", extStart, extEnd); +#endif /* GL_NV_blend_equation_advanced_coherent */ #ifdef GL_NV_blend_square CONST_CAST(GLEW_NV_blend_square) = _glewSearchExtension("GL_NV_blend_square", extStart, extEnd); #endif /* GL_NV_blend_square */ +#ifdef GL_NV_compute_program5 + CONST_CAST(GLEW_NV_compute_program5) = _glewSearchExtension("GL_NV_compute_program5", extStart, extEnd); +#endif /* GL_NV_compute_program5 */ #ifdef GL_NV_conditional_render CONST_CAST(GLEW_NV_conditional_render) = _glewSearchExtension("GL_NV_conditional_render", extStart, extEnd); if (glewExperimental || GLEW_NV_conditional_render) CONST_CAST(GLEW_NV_conditional_render) = !_glewInit_GL_NV_conditional_render(GLEW_CONTEXT_ARG_VAR_INIT); @@ -10093,6 +10860,9 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) CONST_CAST(GLEW_NV_copy_image) = _glewSearchExtension("GL_NV_copy_image", extStart, extEnd); if (glewExperimental || GLEW_NV_copy_image) CONST_CAST(GLEW_NV_copy_image) = !_glewInit_GL_NV_copy_image(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_copy_image */ +#ifdef GL_NV_deep_texture3D + CONST_CAST(GLEW_NV_deep_texture3D) = _glewSearchExtension("GL_NV_deep_texture3D", extStart, extEnd); +#endif /* GL_NV_deep_texture3D */ #ifdef GL_NV_depth_buffer_float CONST_CAST(GLEW_NV_depth_buffer_float) = _glewSearchExtension("GL_NV_depth_buffer_float", extStart, extEnd); if (glewExperimental || GLEW_NV_depth_buffer_float) CONST_CAST(GLEW_NV_depth_buffer_float) = !_glewInit_GL_NV_depth_buffer_float(GLEW_CONTEXT_ARG_VAR_INIT); @@ -10103,6 +10873,10 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) #ifdef GL_NV_depth_range_unclamped CONST_CAST(GLEW_NV_depth_range_unclamped) = _glewSearchExtension("GL_NV_depth_range_unclamped", extStart, extEnd); #endif /* GL_NV_depth_range_unclamped */ +#ifdef GL_NV_draw_texture + CONST_CAST(GLEW_NV_draw_texture) = _glewSearchExtension("GL_NV_draw_texture", extStart, extEnd); + if (glewExperimental || GLEW_NV_draw_texture) CONST_CAST(GLEW_NV_draw_texture) = !_glewInit_GL_NV_draw_texture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_draw_texture */ #ifdef GL_NV_evaluators CONST_CAST(GLEW_NV_evaluators) = _glewSearchExtension("GL_NV_evaluators", extStart, extEnd); if (glewExperimental || GLEW_NV_evaluators) CONST_CAST(GLEW_NV_evaluators) = !_glewInit_GL_NV_evaluators(GLEW_CONTEXT_ARG_VAR_INIT); @@ -10152,6 +10926,9 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) #ifdef GL_NV_gpu_program5 CONST_CAST(GLEW_NV_gpu_program5) = _glewSearchExtension("GL_NV_gpu_program5", extStart, extEnd); #endif /* GL_NV_gpu_program5 */ +#ifdef GL_NV_gpu_program5_mem_extended + CONST_CAST(GLEW_NV_gpu_program5_mem_extended) = _glewSearchExtension("GL_NV_gpu_program5_mem_extended", extStart, extEnd); +#endif /* GL_NV_gpu_program5_mem_extended */ #ifdef GL_NV_gpu_program_fp64 CONST_CAST(GLEW_NV_gpu_program_fp64) = _glewSearchExtension("GL_NV_gpu_program_fp64", extStart, extEnd); #endif /* GL_NV_gpu_program_fp64 */ @@ -10214,6 +10991,9 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) CONST_CAST(GLEW_NV_register_combiners2) = _glewSearchExtension("GL_NV_register_combiners2", extStart, extEnd); if (glewExperimental || GLEW_NV_register_combiners2) CONST_CAST(GLEW_NV_register_combiners2) = !_glewInit_GL_NV_register_combiners2(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_register_combiners2 */ +#ifdef GL_NV_shader_atomic_counters + CONST_CAST(GLEW_NV_shader_atomic_counters) = _glewSearchExtension("GL_NV_shader_atomic_counters", extStart, extEnd); +#endif /* GL_NV_shader_atomic_counters */ #ifdef GL_NV_shader_atomic_float CONST_CAST(GLEW_NV_shader_atomic_float) = _glewSearchExtension("GL_NV_shader_atomic_float", extStart, extEnd); #endif /* GL_NV_shader_atomic_float */ @@ -10221,6 +11001,9 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) CONST_CAST(GLEW_NV_shader_buffer_load) = _glewSearchExtension("GL_NV_shader_buffer_load", extStart, extEnd); if (glewExperimental || GLEW_NV_shader_buffer_load) CONST_CAST(GLEW_NV_shader_buffer_load) = !_glewInit_GL_NV_shader_buffer_load(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_shader_buffer_load */ +#ifdef GL_NV_shader_storage_buffer_object + CONST_CAST(GLEW_NV_shader_storage_buffer_object) = _glewSearchExtension("GL_NV_shader_storage_buffer_object", extStart, extEnd); +#endif /* GL_NV_shader_storage_buffer_object */ #ifdef GL_NV_tessellation_program5 CONST_CAST(GLEW_NV_tessellation_program5) = _glewSearchExtension("GL_NV_gpu_program5", extStart, extEnd); #endif /* GL_NV_tessellation_program5 */ @@ -10337,6 +11120,17 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) #ifdef GL_PGI_vertex_hints CONST_CAST(GLEW_PGI_vertex_hints) = _glewSearchExtension("GL_PGI_vertex_hints", extStart, extEnd); #endif /* GL_PGI_vertex_hints */ +#ifdef GL_REGAL_ES1_0_compatibility + CONST_CAST(GLEW_REGAL_ES1_0_compatibility) = _glewSearchExtension("GL_REGAL_ES1_0_compatibility", extStart, extEnd); + if (glewExperimental || GLEW_REGAL_ES1_0_compatibility) CONST_CAST(GLEW_REGAL_ES1_0_compatibility) = !_glewInit_GL_REGAL_ES1_0_compatibility(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_REGAL_ES1_0_compatibility */ +#ifdef GL_REGAL_ES1_1_compatibility + CONST_CAST(GLEW_REGAL_ES1_1_compatibility) = _glewSearchExtension("GL_REGAL_ES1_1_compatibility", extStart, extEnd); + if (glewExperimental || GLEW_REGAL_ES1_1_compatibility) CONST_CAST(GLEW_REGAL_ES1_1_compatibility) = !_glewInit_GL_REGAL_ES1_1_compatibility(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_REGAL_ES1_1_compatibility */ +#ifdef GL_REGAL_enable + CONST_CAST(GLEW_REGAL_enable) = _glewSearchExtension("GL_REGAL_enable", extStart, extEnd); +#endif /* GL_REGAL_enable */ #ifdef GL_REGAL_error_string CONST_CAST(GLEW_REGAL_error_string) = _glewSearchExtension("GL_REGAL_error_string", extStart, extEnd); if (glewExperimental || GLEW_REGAL_error_string) CONST_CAST(GLEW_REGAL_error_string) = !_glewInit_GL_REGAL_error_string(GLEW_CONTEXT_ARG_VAR_INIT); @@ -10347,6 +11141,7 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) #endif /* GL_REGAL_extension_query */ #ifdef GL_REGAL_log CONST_CAST(GLEW_REGAL_log) = _glewSearchExtension("GL_REGAL_log", extStart, extEnd); + if (glewExperimental || GLEW_REGAL_log) CONST_CAST(GLEW_REGAL_log) = !_glewInit_GL_REGAL_log(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_REGAL_log */ #ifdef GL_REND_screen_coordinates CONST_CAST(GLEW_REND_screen_coordinates) = _glewSearchExtension("GL_REND_screen_coordinates", extStart, extEnd); @@ -10727,6 +11522,8 @@ GLboolean __WGLEW_ARB_pbuffer = GL_FALSE; GLboolean __WGLEW_ARB_pixel_format = GL_FALSE; GLboolean __WGLEW_ARB_pixel_format_float = GL_FALSE; GLboolean __WGLEW_ARB_render_texture = GL_FALSE; +GLboolean __WGLEW_ARB_robustness_application_isolation = GL_FALSE; +GLboolean __WGLEW_ARB_robustness_share_group_isolation = GL_FALSE; GLboolean __WGLEW_ATI_pixel_format_float = GL_FALSE; GLboolean __WGLEW_ATI_render_texture_rectangle = GL_FALSE; GLboolean __WGLEW_EXT_create_context_es2_profile = GL_FALSE; @@ -10926,6 +11723,14 @@ static GLboolean _glewInit_WGL_ARB_render_texture (WGLEW_CONTEXT_ARG_DEF_INIT) #endif /* WGL_ARB_render_texture */ +#ifdef WGL_ARB_robustness_application_isolation + +#endif /* WGL_ARB_robustness_application_isolation */ + +#ifdef WGL_ARB_robustness_share_group_isolation + +#endif /* WGL_ARB_robustness_share_group_isolation */ + #ifdef WGL_ATI_pixel_format_float #endif /* WGL_ATI_pixel_format_float */ @@ -11329,7 +12134,7 @@ static PFNWGLGETEXTENSIONSSTRINGARBPROC _wglewGetExtensionsStringARB = NULL; static PFNWGLGETEXTENSIONSSTRINGEXTPROC _wglewGetExtensionsStringEXT = NULL; GLboolean GLEWAPIENTRY wglewGetExtension (const char* name) -{ +{ const GLubyte* start; const GLubyte* end; if (_wglewGetExtensionsStringARB == NULL) @@ -11418,6 +12223,12 @@ GLenum GLEWAPIENTRY wglewContextInit (WGLEW_CONTEXT_ARG_DEF_LIST) CONST_CAST(WGLEW_ARB_render_texture) = _glewSearchExtension("WGL_ARB_render_texture", extStart, extEnd); if (glewExperimental || WGLEW_ARB_render_texture|| crippled) CONST_CAST(WGLEW_ARB_render_texture)= !_glewInit_WGL_ARB_render_texture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_ARB_render_texture */ +#ifdef WGL_ARB_robustness_application_isolation + CONST_CAST(WGLEW_ARB_robustness_application_isolation) = _glewSearchExtension("WGL_ARB_robustness_application_isolation", extStart, extEnd); +#endif /* WGL_ARB_robustness_application_isolation */ +#ifdef WGL_ARB_robustness_share_group_isolation + CONST_CAST(WGLEW_ARB_robustness_share_group_isolation) = _glewSearchExtension("WGL_ARB_robustness_share_group_isolation", extStart, extEnd); +#endif /* WGL_ARB_robustness_share_group_isolation */ #ifdef WGL_ATI_pixel_format_float CONST_CAST(WGLEW_ATI_pixel_format_float) = _glewSearchExtension("WGL_ATI_pixel_format_float", extStart, extEnd); #endif /* WGL_ATI_pixel_format_float */ @@ -11548,7 +12359,25 @@ GLenum GLEWAPIENTRY wglewContextInit (WGLEW_CONTEXT_ARG_DEF_LIST) return GLEW_OK; } -#elif !defined(__ANDROID__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) +#elif !defined(__ANDROID__) && !defined(__native_client__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) + + +#ifdef GLEW_DYNAMIC_LOAD_ALL_GLX_FUNCTIONS +PFNGLXGETPROCADDRESSARBPROC __glewXGetProcAddressARB = NULL; +PFNGLXQUERYEXTENSION __glewXQueryExtension=NULL; +PFNGLXQUERYVERSION __glewXQueryVersion=NULL; +PFNGLXGETCONFIG __glewXGetConfig=NULL; +PFNGLXCHOOSEVISUAL __glewXChooseVisual=NULL; +PFNGLXCREATECONTEXT __glewXCreateContext=NULL; +PFNGLXDESTROYCONTEXT __glewXDestroyContext=NULL; +PFNGLXISDIRECT __glewXIsDirect=NULL; +PFNGLXMAKECURRENT __glewXMakeCurrent=NULL; +PFNGLXQUERYEXTENSIONSSTRING __glewXQueryExtensionsString=NULL; +PFNGLXGETCLIENTSTRING __glewXGetClientString=NULL; +PFNGLXQUERYSERVERSTRING __glewXQueryServerString=NULL; +PFNGLXSWAPBUFFERS __glewXSwapBuffers=NULL; + +#endif//GLEW_DYNAMIC_LOAD_ALL_GLX_FUNCTIONS PFNGLXGETCURRENTDISPLAYPROC __glewXGetCurrentDisplay = NULL; @@ -11570,6 +12399,16 @@ PFNGLXQUERYCONTEXTPROC __glewXQueryContext = NULL; PFNGLXQUERYDRAWABLEPROC __glewXQueryDrawable = NULL; PFNGLXSELECTEVENTPROC __glewXSelectEvent = NULL; +PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC __glewXBlitContextFramebufferAMD = NULL; +PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC __glewXCreateAssociatedContextAMD = NULL; +PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __glewXCreateAssociatedContextAttribsAMD = NULL; +PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC __glewXDeleteAssociatedContextAMD = NULL; +PFNGLXGETCONTEXTGPUIDAMDPROC __glewXGetContextGPUIDAMD = NULL; +PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC __glewXGetCurrentAssociatedContextAMD = NULL; +PFNGLXGETGPUIDSAMDPROC __glewXGetGPUIDsAMD = NULL; +PFNGLXGETGPUINFOAMDPROC __glewXGetGPUInfoAMD = NULL; +PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __glewXMakeAssociatedContextCurrentAMD = NULL; + PFNGLXCREATECONTEXTATTRIBSARBPROC __glewXCreateContextAttribsARB = NULL; PFNGLXBINDTEXIMAGEATIPROC __glewXBindTexImageATI = NULL; @@ -11702,6 +12541,7 @@ GLboolean __GLXEW_ARB_robustness_share_group_isolation = GL_FALSE; GLboolean __GLXEW_ARB_vertex_buffer_object = GL_FALSE; GLboolean __GLXEW_ATI_pixel_format_float = GL_FALSE; GLboolean __GLXEW_ATI_render_texture = GL_FALSE; +GLboolean __GLXEW_EXT_buffer_age = GL_FALSE; GLboolean __GLXEW_EXT_create_context_es2_profile = GL_FALSE; GLboolean __GLXEW_EXT_create_context_es_profile = GL_FALSE; GLboolean __GLXEW_EXT_fbconfig_packed_float = GL_FALSE; @@ -11727,7 +12567,7 @@ GLboolean __GLXEW_NV_present_video = GL_FALSE; GLboolean __GLXEW_NV_swap_group = GL_FALSE; GLboolean __GLXEW_NV_vertex_array_range = GL_FALSE; GLboolean __GLXEW_NV_video_capture = GL_FALSE; -GLboolean __GLXEW_NV_video_out = GL_FALSE; +GLboolean __GLXEW_NV_video_output = GL_FALSE; GLboolean __GLXEW_OML_swap_method = GL_FALSE; GLboolean __GLXEW_OML_sync_control = GL_FALSE; GLboolean __GLXEW_SGIS_blended_overlay = GL_FALSE; @@ -11802,6 +12642,23 @@ static GLboolean _glewInit_GLX_VERSION_1_3 (GLXEW_CONTEXT_ARG_DEF_INIT) #ifdef GLX_AMD_gpu_association +static GLboolean _glewInit_GLX_AMD_gpu_association (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXBlitContextFramebufferAMD = (PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC)glewGetProcAddress((const GLubyte*)"glXBlitContextFramebufferAMD")) == NULL) || r; + r = ((glXCreateAssociatedContextAMD = (PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"glXCreateAssociatedContextAMD")) == NULL) || r; + r = ((glXCreateAssociatedContextAttribsAMD = (PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC)glewGetProcAddress((const GLubyte*)"glXCreateAssociatedContextAttribsAMD")) == NULL) || r; + r = ((glXDeleteAssociatedContextAMD = (PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"glXDeleteAssociatedContextAMD")) == NULL) || r; + r = ((glXGetContextGPUIDAMD = (PFNGLXGETCONTEXTGPUIDAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetContextGPUIDAMD")) == NULL) || r; + r = ((glXGetCurrentAssociatedContextAMD = (PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentAssociatedContextAMD")) == NULL) || r; + r = ((glXGetGPUIDsAMD = (PFNGLXGETGPUIDSAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetGPUIDsAMD")) == NULL) || r; + r = ((glXGetGPUInfoAMD = (PFNGLXGETGPUINFOAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetGPUInfoAMD")) == NULL) || r; + r = ((glXMakeAssociatedContextCurrentAMD = (PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC)glewGetProcAddress((const GLubyte*)"glXMakeAssociatedContextCurrentAMD")) == NULL) || r; + + return r; +} + #endif /* GLX_AMD_gpu_association */ #ifdef GLX_ARB_create_context @@ -11872,6 +12729,10 @@ static GLboolean _glewInit_GLX_ATI_render_texture (GLXEW_CONTEXT_ARG_DEF_INIT) #endif /* GLX_ATI_render_texture */ +#ifdef GLX_EXT_buffer_age + +#endif /* GLX_EXT_buffer_age */ + #ifdef GLX_EXT_create_context_es2_profile #endif /* GLX_EXT_create_context_es2_profile */ @@ -12114,9 +12975,9 @@ static GLboolean _glewInit_GLX_NV_video_capture (GLXEW_CONTEXT_ARG_DEF_INIT) #endif /* GLX_NV_video_capture */ -#ifdef GLX_NV_video_out +#ifdef GLX_NV_video_output -static GLboolean _glewInit_GLX_NV_video_out (GLXEW_CONTEXT_ARG_DEF_INIT) +static GLboolean _glewInit_GLX_NV_video_output (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; @@ -12130,7 +12991,7 @@ static GLboolean _glewInit_GLX_NV_video_out (GLXEW_CONTEXT_ARG_DEF_INIT) return r; } -#endif /* GLX_NV_video_out */ +#endif /* GLX_NV_video_output */ #ifdef GLX_OML_swap_method @@ -12356,7 +13217,7 @@ static GLboolean _glewInit_GLX_SUN_video_resize (GLXEW_CONTEXT_ARG_DEF_INIT) /* ------------------------------------------------------------------------ */ GLboolean glxewGetExtension (const char* name) -{ +{ const GLubyte* start; const GLubyte* end; @@ -12414,6 +13275,7 @@ GLenum glxewContextInit (GLXEW_CONTEXT_ARG_DEF_LIST) #endif /* GLX_3DFX_multisample */ #ifdef GLX_AMD_gpu_association CONST_CAST(GLXEW_AMD_gpu_association) = _glewSearchExtension("GLX_AMD_gpu_association", extStart, extEnd); + if (glewExperimental || GLXEW_AMD_gpu_association) CONST_CAST(GLXEW_AMD_gpu_association) = !_glewInit_GLX_AMD_gpu_association(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_AMD_gpu_association */ #ifdef GLX_ARB_create_context CONST_CAST(GLXEW_ARB_create_context) = _glewSearchExtension("GLX_ARB_create_context", extStart, extEnd); @@ -12453,6 +13315,9 @@ GLenum glxewContextInit (GLXEW_CONTEXT_ARG_DEF_LIST) CONST_CAST(GLXEW_ATI_render_texture) = _glewSearchExtension("GLX_ATI_render_texture", extStart, extEnd); if (glewExperimental || GLXEW_ATI_render_texture) CONST_CAST(GLXEW_ATI_render_texture) = !_glewInit_GLX_ATI_render_texture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_ATI_render_texture */ +#ifdef GLX_EXT_buffer_age + CONST_CAST(GLXEW_EXT_buffer_age) = _glewSearchExtension("GLX_EXT_buffer_age", extStart, extEnd); +#endif /* GLX_EXT_buffer_age */ #ifdef GLX_EXT_create_context_es2_profile CONST_CAST(GLXEW_EXT_create_context_es2_profile) = _glewSearchExtension("GLX_EXT_create_context_es2_profile", extStart, extEnd); #endif /* GLX_EXT_create_context_es2_profile */ @@ -12542,10 +13407,10 @@ GLenum glxewContextInit (GLXEW_CONTEXT_ARG_DEF_LIST) CONST_CAST(GLXEW_NV_video_capture) = _glewSearchExtension("GLX_NV_video_capture", extStart, extEnd); if (glewExperimental || GLXEW_NV_video_capture) CONST_CAST(GLXEW_NV_video_capture) = !_glewInit_GLX_NV_video_capture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_NV_video_capture */ -#ifdef GLX_NV_video_out - CONST_CAST(GLXEW_NV_video_out) = _glewSearchExtension("GLX_NV_video_out", extStart, extEnd); - if (glewExperimental || GLXEW_NV_video_out) CONST_CAST(GLXEW_NV_video_out) = !_glewInit_GLX_NV_video_out(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_NV_video_out */ +#ifdef GLX_NV_video_output + CONST_CAST(GLXEW_NV_video_output) = _glewSearchExtension("GLX_NV_video_output", extStart, extEnd); + if (glewExperimental || GLXEW_NV_video_output) CONST_CAST(GLXEW_NV_video_output) = !_glewInit_GLX_NV_video_output(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_NV_video_output */ #ifdef GLX_OML_swap_method CONST_CAST(GLXEW_OML_swap_method) = _glewSearchExtension("GLX_OML_swap_method", extStart, extEnd); #endif /* GLX_OML_swap_method */ @@ -12620,7 +13485,7 @@ GLenum glxewContextInit (GLXEW_CONTEXT_ARG_DEF_LIST) return GLEW_OK; } -#endif /* !defined(__ANDROID__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) */ +#endif /* !defined(__ANDROID__) && !defined(__native_client__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) */ /* ------------------------------------------------------------------------ */ @@ -12643,9 +13508,9 @@ const GLubyte * GLEWAPIENTRY glewGetString (GLenum name) static const GLubyte* _glewString[] = { (const GLubyte*)NULL, - (const GLubyte*)"1.9.0", + (const GLubyte*)"1.10.0", (const GLubyte*)"1", - (const GLubyte*)"9", + (const GLubyte*)"10", (const GLubyte*)"0" }; const int max_string = sizeof(_glewString)/sizeof(*_glewString) - 1; @@ -12660,10 +13525,730 @@ GLboolean glewExperimental = GL_FALSE; #if defined(_WIN32) extern GLenum GLEWAPIENTRY wglewContextInit (void); -#elif !defined(__ANDROID__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) +#elif !defined(__ANDROID__) && !defined(__native_client__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) extern GLenum GLEWAPIENTRY glxewContextInit (void); #endif /* _WIN32 */ +#ifdef GLEW_DYNAMIC_LOAD_ALL_GLX_FUNCTIONS +GLboolean GLEWAPIENTRY glewXInit(void) +{ + GLboolean r = GL_FALSE; + r = ((glXGetProcAddressARB = (PFNGLXGETPROCADDRESSARBPROC)dlglXGetProcAddressARB((const GLubyte*)"glXGetProcAddressARB")) == NULL) || r; + r = ((glXQueryExtension = (PFNGLXQUERYEXTENSION)dlglXGetProcAddressARB((const GLubyte*)"glXQueryExtension")) == NULL) || r; + r = ((glXQueryVersion = (PFNGLXQUERYVERSION)dlglXGetProcAddressARB((const GLubyte*)"glXQueryVersion")) == NULL) || r; + r = ((glXGetConfig = (PFNGLXGETCONFIG)dlglXGetProcAddressARB((const GLubyte*)"glXGetConfig")) == NULL) || r; + r = ((glXChooseVisual = (PFNGLXCHOOSEVISUAL)dlglXGetProcAddressARB((const GLubyte*)"glXChooseVisual")) == NULL) || r; + r = ((glXCreateContext = (PFNGLXCREATECONTEXT)dlglXGetProcAddressARB((const GLubyte*)"glXCreateContext")) == NULL) || r; + r = ((glXDestroyContext = (PFNGLXDESTROYCONTEXT)dlglXGetProcAddressARB((const GLubyte*)"glXDestroyContext")) == NULL) || r; + r = ((glXDestroyContext = (PFNGLXDESTROYCONTEXT)dlglXGetProcAddressARB((const GLubyte*)"glXDestroyContext")) == NULL) || r; + r = ((glXIsDirect = (PFNGLXISDIRECT)dlglXGetProcAddressARB((const GLubyte*)"glXIsDirect")) == NULL) || r; + r = ((glXMakeCurrent = (PFNGLXMAKECURRENT)dlglXGetProcAddressARB((const GLubyte*)"glXMakeCurrent")) == NULL) || r; + r = ((glXQueryExtensionsString = (PFNGLXQUERYEXTENSIONSSTRING)dlglXGetProcAddressARB((const GLubyte*)"glXQueryExtensionsString")) == NULL) || r; + r = ((glXGetClientString = (PFNGLXGETCLIENTSTRING)dlglXGetProcAddressARB((const GLubyte*)"glXGetClientString")) == NULL) || r; + r = ((glXQueryServerString = (PFNGLXQUERYSERVERSTRING)dlglXGetProcAddressARB((const GLubyte*)"glXQueryServerString")) == NULL) || r; + r = ((glXSwapBuffers = (PFNGLXSWAPBUFFERS)dlglXGetProcAddressARB((const GLubyte*)"glXSwapBuffers")) == NULL) || r; + //glxewContextInit(); + _glewInit_GLX_VERSION_1_3(); + + if (r==0) + { + printf("glewXInit dynamically loaded using dlopen/dlsym OK\n"); + } + return r; +} +#endif //GLEW_DYNAMIC_LOAD_ALL_GLX_FUNCTIONS + +#ifdef GLEW_INIT_OPENGL11_FUNCTIONS + +PFNGLACCUMPROC __glewAccum = NULL; +PFNGLALPHAFUNCPROC __glewAlphaFunc = NULL; +PFNGLARETEXTURESRESIDENTPROC __glewAreTexturesResident = NULL; +PFNGLARRAYELEMENTPROC __glewArrayElement = NULL; +PFNGLBEGINPROC __glewBegin = NULL; +PFNGLBINDTEXTUREPROC __glewBindTexture = NULL; +PFNGLBITMAPPROC __glewBitmap = NULL; +PFNGLBLENDFUNCPROC __glewBlendFunc = NULL; +PFNGLCALLLISTPROC __glewCallList = NULL; +PFNGLCALLLISTSPROC __glewCallLists = NULL; +PFNGLCLEARPROC __glewClear = NULL; +PFNGLCLEARACCUMPROC __glewClearAccum = NULL; +PFNGLCLEARCOLORPROC __glewClearColor = NULL; +PFNGLCLEARDEPTHPROC __glewClearDepth = NULL; +PFNGLCLEARINDEXPROC __glewClearIndex = NULL; +PFNGLCLEARSTENCILPROC __glewClearStencil = NULL; +PFNGLCLIPPLANEPROC __glewClipPlane = NULL; +PFNGLCOLOR3BPROC __glewColor3b = NULL; +PFNGLCOLOR3BVPROC __glewColor3bv = NULL; +PFNGLCOLOR3DPROC __glewColor3d = NULL; +PFNGLCOLOR3DVPROC __glewColor3dv = NULL; +PFNGLCOLOR3FPROC __glewColor3f = NULL; +PFNGLCOLOR3FVPROC __glewColor3fv = NULL; +PFNGLCOLOR3IPROC __glewColor3i = NULL; +PFNGLCOLOR3IVPROC __glewColor3iv = NULL; +PFNGLCOLOR3SPROC __glewColor3s = NULL; +PFNGLCOLOR3SVPROC __glewColor3sv = NULL; +PFNGLCOLOR3UBPROC __glewColor3ub = NULL; +PFNGLCOLOR3UBVPROC __glewColor3ubv = NULL; +PFNGLCOLOR3UIPROC __glewColor3ui = NULL; +PFNGLCOLOR3UIVPROC __glewColor3uiv = NULL; +PFNGLCOLOR3USPROC __glewColor3us = NULL; +PFNGLCOLOR3USVPROC __glewColor3usv = NULL; +PFNGLCOLOR4BPROC __glewColor4b = NULL; +PFNGLCOLOR4BVPROC __glewColor4bv = NULL; +PFNGLCOLOR4DPROC __glewColor4d = NULL; +PFNGLCOLOR4DVPROC __glewColor4dv = NULL; +PFNGLCOLOR4FPROC __glewColor4f = NULL; +PFNGLCOLOR4FVPROC __glewColor4fv = NULL; +PFNGLCOLOR4IPROC __glewColor4i = NULL; +PFNGLCOLOR4IVPROC __glewColor4iv = NULL; +PFNGLCOLOR4SPROC __glewColor4s = NULL; +PFNGLCOLOR4SVPROC __glewColor4sv = NULL; +PFNGLCOLOR4UBPROC __glewColor4ub = NULL; +PFNGLCOLOR4UBVPROC __glewColor4ubv = NULL; +PFNGLCOLOR4UIPROC __glewColor4ui = NULL; +PFNGLCOLOR4UIVPROC __glewColor4uiv = NULL; +PFNGLCOLOR4USPROC __glewColor4us = NULL; +PFNGLCOLOR4USVPROC __glewColor4usv = NULL; +PFNGLCOLORMASKPROC __glewColorMask = NULL; +PFNGLCOLORMATERIALPROC __glewColorMaterial = NULL; +PFNGLCOLORPOINTERPROC __glewColorPointer = NULL; +PFNGLCOPYPIXELSPROC __glewCopyPixels = NULL; +PFNGLCOPYTEXIMAGE1DPROC __glewCopyTexImage1D = NULL; +PFNGLCOPYTEXIMAGE2DPROC __glewCopyTexImage2D = NULL; +PFNGLCOPYTEXSUBIMAGE1DPROC __glewCopyTexSubImage1D = NULL; +PFNGLCOPYTEXSUBIMAGE2DPROC __glewCopyTexSubImage2D = NULL; +PFNGLCULLFACEPROC __glewCullFace = NULL; +PFNGLDELETELISTSPROC __glewDeleteLists = NULL; +PFNGLDELETETEXTURESPROC __glewDeleteTextures = NULL; +PFNGLDEPTHFUNCPROC __glewDepthFunc = NULL; +PFNGLDEPTHMASKPROC __glewDepthMask = NULL; +PFNGLDEPTHRANGEPROC __glewDepthRange = NULL; +PFNGLDISABLEPROC __glewDisable = NULL; +PFNGLDISABLECLIENTSTATEPROC __glewDisableClientState = NULL; +PFNGLDRAWARRAYSPROC __glewDrawArrays = NULL; +PFNGLDRAWBUFFERPROC __glewDrawBuffer = NULL; +PFNGLDRAWELEMENTSPROC __glewDrawElements = NULL; +PFNGLDRAWPIXELSPROC __glewDrawPixels = NULL; +PFNGLEDGEFLAGPROC __glewEdgeFlag = NULL; +PFNGLEDGEFLAGPOINTERPROC __glewEdgeFlagPointer = NULL; +PFNGLEDGEFLAGVPROC __glewEdgeFlagv = NULL; +PFNGLENABLEPROC __glewEnable = NULL; +PFNGLENABLECLIENTSTATEPROC __glewEnableClientState = NULL; +PFNGLENDPROC __glewEnd = NULL; +PFNGLENDLISTPROC __glewEndList = NULL; +PFNGLEVALCOORD1DPROC __glewEvalCoord1d = NULL; +PFNGLEVALCOORD1DVPROC __glewEvalCoord1dv = NULL; +PFNGLEVALCOORD1FPROC __glewEvalCoord1f = NULL; +PFNGLEVALCOORD1FVPROC __glewEvalCoord1fv = NULL; +PFNGLEVALCOORD2DPROC __glewEvalCoord2d = NULL; +PFNGLEVALCOORD2DVPROC __glewEvalCoord2dv = NULL; +PFNGLEVALCOORD2FPROC __glewEvalCoord2f = NULL; +PFNGLEVALCOORD2FVPROC __glewEvalCoord2fv = NULL; +PFNGLEVALMESH1PROC __glewEvalMesh1 = NULL; +PFNGLEVALMESH2PROC __glewEvalMesh2 = NULL; +PFNGLEVALPOINT1PROC __glewEvalPoint1 = NULL; +PFNGLEVALPOINT2PROC __glewEvalPoint2 = NULL; +PFNGLFEEDBACKBUFFERPROC __glewFeedbackBuffer = NULL; +PFNGLFINISHPROC __glewFinish = NULL; +PFNGLFLUSHPROC __glewFlush = NULL; +PFNGLFOGFPROC __glewFogf = NULL; +PFNGLFOGFVPROC __glewFogfv = NULL; +PFNGLFOGIPROC __glewFogi = NULL; +PFNGLFOGIVPROC __glewFogiv = NULL; +PFNGLFRONTFACEPROC __glewFrontFace = NULL; +PFNGLFRUSTUMPROC __glewFrustum = NULL; +PFNGLGENLISTSPROC __glewGenLists = NULL; +PFNGLGENTEXTURESPROC __glewGenTextures = NULL; +PFNGLGETBOOLEANVPROC __glewGetBooleanv = NULL; +PFNGLGETCLIPPLANEPROC __glewGetClipPlane = NULL; +PFNGLGETDOUBLEVPROC __glewGetDoublev = NULL; +PFNGLGETERRORPROC __glewGetError = NULL; +PFNGLGETFLOATVPROC __glewGetFloatv = NULL; +PFNGLGETINTEGERVPROC __glewGetIntegerv = NULL; +PFNGLGETLIGHTFVPROC __glewGetLightfv = NULL; +PFNGLGETLIGHTIVPROC __glewGetLightiv = NULL; +PFNGLGETMAPDVPROC __glewGetMapdv = NULL; +PFNGLGETMAPFVPROC __glewGetMapfv = NULL; +PFNGLGETMAPIVPROC __glewGetMapiv = NULL; +PFNGLGETMATERIALFVPROC __glewGetMaterialfv = NULL; +PFNGLGETMATERIALIVPROC __glewGetMaterialiv = NULL; +PFNGLGETPIXELMAPFVPROC __glewGetPixelMapfv = NULL; +PFNGLGETPIXELMAPUIVPROC __glewGetPixelMapuiv = NULL; +PFNGLGETPIXELMAPUSVPROC __glewGetPixelMapusv = NULL; +PFNGLGETPOINTERVPROC __glewGetPointerv = NULL; +PFNGLGETPOLYGONSTIPPLEPROC __glewGetPolygonStipple = NULL; +PFNGLGETSTRINGPROC __glewGetString = NULL; +PFNGLGETTEXENVFVPROC __glewGetTexEnvfv = NULL; +PFNGLGETTEXENVIVPROC __glewGetTexEnviv = NULL; +PFNGLGETTEXGENDVPROC __glewGetTexGendv = NULL; +PFNGLGETTEXGENFVPROC __glewGetTexGenfv = NULL; +PFNGLGETTEXGENIVPROC __glewGetTexGeniv = NULL; +PFNGLGETTEXIMAGEPROC __glewGetTexImage = NULL; +PFNGLGETTEXLEVELPARAMETERFVPROC __glewGetTexLevelParameterfv = NULL; +PFNGLGETTEXLEVELPARAMETERIVPROC __glewGetTexLevelParameteriv = NULL; +PFNGLGETTEXPARAMETERFVPROC __glewGetTexParameterfv = NULL; +PFNGLGETTEXPARAMETERIVPROC __glewGetTexParameteriv = NULL; +PFNGLHINTPROC __glewHint = NULL; +PFNGLINDEXMASKPROC __glewIndexMask = NULL; +PFNGLINDEXPOINTERPROC __glewIndexPointer = NULL; +PFNGLINDEXDPROC __glewIndexd = NULL; +PFNGLINDEXDVPROC __glewIndexdv = NULL; +PFNGLINDEXFPROC __glewIndexf = NULL; +PFNGLINDEXFVPROC __glewIndexfv = NULL; +PFNGLINDEXIPROC __glewIndexi = NULL; +PFNGLINDEXIVPROC __glewIndexiv = NULL; +PFNGLINDEXSPROC __glewIndexs = NULL; +PFNGLINDEXSVPROC __glewIndexsv = NULL; +PFNGLINDEXUBPROC __glewIndexub = NULL; +PFNGLINDEXUBVPROC __glewIndexubv = NULL; +PFNGLINITNAMESPROC __glewInitNames = NULL; +PFNGLINTERLEAVEDARRAYSPROC __glewInterleavedArrays = NULL; +PFNGLISENABLEDPROC __glewIsEnabled = NULL; +PFNGLISLISTPROC __glewIsList = NULL; +PFNGLISTEXTUREPROC __glewIsTexture = NULL; +PFNGLLIGHTMODELFPROC __glewLightModelf = NULL; +PFNGLLIGHTMODELFVPROC __glewLightModelfv = NULL; +PFNGLLIGHTMODELIPROC __glewLightModeli = NULL; +PFNGLLIGHTMODELIVPROC __glewLightModeliv = NULL; +PFNGLLIGHTFPROC __glewLightf = NULL; +PFNGLLIGHTFVPROC __glewLightfv = NULL; +PFNGLLIGHTIPROC __glewLighti = NULL; +PFNGLLIGHTIVPROC __glewLightiv = NULL; +PFNGLLINESTIPPLEPROC __glewLineStipple = NULL; +PFNGLLINEWIDTHPROC __glewLineWidth = NULL; +PFNGLLISTBASEPROC __glewListBase = NULL; +PFNGLLOADIDENTITYPROC __glewLoadIdentity = NULL; +PFNGLLOADMATRIXDPROC __glewLoadMatrixd = NULL; +PFNGLLOADMATRIXFPROC __glewLoadMatrixf = NULL; +PFNGLLOADNAMEPROC __glewLoadName = NULL; +PFNGLLOGICOPPROC __glewLogicOp = NULL; +PFNGLMAP1DPROC __glewMap1d = NULL; +PFNGLMAP1FPROC __glewMap1f = NULL; +PFNGLMAP2DPROC __glewMap2d = NULL; +PFNGLMAP2FPROC __glewMap2f = NULL; +PFNGLMAPGRID1DPROC __glewMapGrid1d = NULL; +PFNGLMAPGRID1FPROC __glewMapGrid1f = NULL; +PFNGLMAPGRID2DPROC __glewMapGrid2d = NULL; +PFNGLMAPGRID2FPROC __glewMapGrid2f = NULL; +PFNGLMATERIALFPROC __glewMaterialf = NULL; +PFNGLMATERIALFVPROC __glewMaterialfv = NULL; +PFNGLMATERIALIPROC __glewMateriali = NULL; +PFNGLMATERIALIVPROC __glewMaterialiv = NULL; +PFNGLMATRIXMODEPROC __glewMatrixMode = NULL; +PFNGLMULTMATRIXDPROC __glewMultMatrixd = NULL; +PFNGLMULTMATRIXFPROC __glewMultMatrixf = NULL; +PFNGLNEWLISTPROC __glewNewList = NULL; +PFNGLNORMAL3BPROC __glewNormal3b = NULL; +PFNGLNORMAL3BVPROC __glewNormal3bv = NULL; +PFNGLNORMAL3DPROC __glewNormal3d = NULL; +PFNGLNORMAL3DVPROC __glewNormal3dv = NULL; +PFNGLNORMAL3FPROC __glewNormal3f = NULL; +PFNGLNORMAL3FVPROC __glewNormal3fv = NULL; +PFNGLNORMAL3IPROC __glewNormal3i = NULL; +PFNGLNORMAL3IVPROC __glewNormal3iv = NULL; +PFNGLNORMAL3SPROC __glewNormal3s = NULL; +PFNGLNORMAL3SVPROC __glewNormal3sv = NULL; +PFNGLNORMALPOINTERPROC __glewNormalPointer = NULL; +PFNGLORTHOPROC __glewOrtho = NULL; +PFNGLPASSTHROUGHPROC __glewPassThrough = NULL; +PFNGLPIXELMAPFVPROC __glewPixelMapfv = NULL; +PFNGLPIXELMAPUIVPROC __glewPixelMapuiv = NULL; +PFNGLPIXELMAPUSVPROC __glewPixelMapusv = NULL; +PFNGLPIXELSTOREFPROC __glewPixelStoref = NULL; +PFNGLPIXELSTOREIPROC __glewPixelStorei = NULL; +PFNGLPIXELTRANSFERFPROC __glewPixelTransferf = NULL; +PFNGLPIXELTRANSFERIPROC __glewPixelTransferi = NULL; +PFNGLPIXELZOOMPROC __glewPixelZoom = NULL; +PFNGLPOINTSIZEPROC __glewPointSize = NULL; +PFNGLPOLYGONMODEPROC __glewPolygonMode = NULL; +PFNGLPOLYGONOFFSETPROC __glewPolygonOffset = NULL; +PFNGLPOLYGONSTIPPLEPROC __glewPolygonStipple = NULL; +PFNGLPOPATTRIBPROC __glewPopAttrib = NULL; +PFNGLPOPCLIENTATTRIBPROC __glewPopClientAttrib = NULL; +PFNGLPOPMATRIXPROC __glewPopMatrix = NULL; +PFNGLPOPNAMEPROC __glewPopName = NULL; +PFNGLPRIORITIZETEXTURESPROC __glewPrioritizeTextures = NULL; +PFNGLPUSHATTRIBPROC __glewPushAttrib = NULL; +PFNGLPUSHCLIENTATTRIBPROC __glewPushClientAttrib = NULL; +PFNGLPUSHMATRIXPROC __glewPushMatrix = NULL; +PFNGLPUSHNAMEPROC __glewPushName = NULL; +PFNGLRASTERPOS2DPROC __glewRasterPos2d = NULL; +PFNGLRASTERPOS2DVPROC __glewRasterPos2dv = NULL; +PFNGLRASTERPOS2FPROC __glewRasterPos2f = NULL; +PFNGLRASTERPOS2FVPROC __glewRasterPos2fv = NULL; +PFNGLRASTERPOS2IPROC __glewRasterPos2i = NULL; +PFNGLRASTERPOS2IVPROC __glewRasterPos2iv = NULL; +PFNGLRASTERPOS2SPROC __glewRasterPos2s = NULL; +PFNGLRASTERPOS2SVPROC __glewRasterPos2sv = NULL; +PFNGLRASTERPOS3DPROC __glewRasterPos3d = NULL; +PFNGLRASTERPOS3DVPROC __glewRasterPos3dv = NULL; +PFNGLRASTERPOS3FPROC __glewRasterPos3f = NULL; +PFNGLRASTERPOS3FVPROC __glewRasterPos3fv = NULL; +PFNGLRASTERPOS3IPROC __glewRasterPos3i = NULL; +PFNGLRASTERPOS3IVPROC __glewRasterPos3iv = NULL; +PFNGLRASTERPOS3SPROC __glewRasterPos3s = NULL; +PFNGLRASTERPOS3SVPROC __glewRasterPos3sv = NULL; +PFNGLRASTERPOS4DPROC __glewRasterPos4d = NULL; +PFNGLRASTERPOS4DVPROC __glewRasterPos4dv = NULL; +PFNGLRASTERPOS4FPROC __glewRasterPos4f = NULL; +PFNGLRASTERPOS4FVPROC __glewRasterPos4fv = NULL; +PFNGLRASTERPOS4IPROC __glewRasterPos4i = NULL; +PFNGLRASTERPOS4IVPROC __glewRasterPos4iv = NULL; +PFNGLRASTERPOS4SPROC __glewRasterPos4s = NULL; +PFNGLRASTERPOS4SVPROC __glewRasterPos4sv = NULL; +PFNGLREADBUFFERPROC __glewReadBuffer = NULL; +PFNGLREADPIXELSPROC __glewReadPixels = NULL; +PFNGLRECTDPROC __glewRectd = NULL; +PFNGLRECTDVPROC __glewRectdv = NULL; +PFNGLRECTFPROC __glewRectf = NULL; +PFNGLRECTFVPROC __glewRectfv = NULL; +PFNGLRECTIPROC __glewRecti = NULL; +PFNGLRECTIVPROC __glewRectiv = NULL; +PFNGLRECTSPROC __glewRects = NULL; +PFNGLRECTSVPROC __glewRectsv = NULL; +PFNGLRENDERMODEPROC __glewRenderMode = NULL; +PFNGLROTATEDPROC __glewRotated = NULL; +PFNGLROTATEFPROC __glewRotatef = NULL; +PFNGLSCALEDPROC __glewScaled = NULL; +PFNGLSCALEFPROC __glewScalef = NULL; +PFNGLSCISSORPROC __glewScissor = NULL; +PFNGLSELECTBUFFERPROC __glewSelectBuffer = NULL; +PFNGLSHADEMODELPROC __glewShadeModel = NULL; +PFNGLSTENCILFUNCPROC __glewStencilFunc = NULL; +PFNGLSTENCILMASKPROC __glewStencilMask = NULL; +PFNGLSTENCILOPPROC __glewStencilOp = NULL; +PFNGLTEXCOORD1DPROC __glewTexCoord1d = NULL; +PFNGLTEXCOORD1DVPROC __glewTexCoord1dv = NULL; +PFNGLTEXCOORD1FPROC __glewTexCoord1f = NULL; +PFNGLTEXCOORD1FVPROC __glewTexCoord1fv = NULL; +PFNGLTEXCOORD1IPROC __glewTexCoord1i = NULL; +PFNGLTEXCOORD1IVPROC __glewTexCoord1iv = NULL; +PFNGLTEXCOORD1SPROC __glewTexCoord1s = NULL; +PFNGLTEXCOORD1SVPROC __glewTexCoord1sv = NULL; +PFNGLTEXCOORD2DPROC __glewTexCoord2d = NULL; +PFNGLTEXCOORD2DVPROC __glewTexCoord2dv = NULL; +PFNGLTEXCOORD2FPROC __glewTexCoord2f = NULL; +PFNGLTEXCOORD2FVPROC __glewTexCoord2fv = NULL; +PFNGLTEXCOORD2IPROC __glewTexCoord2i = NULL; +PFNGLTEXCOORD2IVPROC __glewTexCoord2iv = NULL; +PFNGLTEXCOORD2SPROC __glewTexCoord2s = NULL; +PFNGLTEXCOORD2SVPROC __glewTexCoord2sv = NULL; +PFNGLTEXCOORD3DPROC __glewTexCoord3d = NULL; +PFNGLTEXCOORD3DVPROC __glewTexCoord3dv = NULL; +PFNGLTEXCOORD3FPROC __glewTexCoord3f = NULL; +PFNGLTEXCOORD3FVPROC __glewTexCoord3fv = NULL; +PFNGLTEXCOORD3IPROC __glewTexCoord3i = NULL; +PFNGLTEXCOORD3IVPROC __glewTexCoord3iv = NULL; +PFNGLTEXCOORD3SPROC __glewTexCoord3s = NULL; +PFNGLTEXCOORD3SVPROC __glewTexCoord3sv = NULL; +PFNGLTEXCOORD4DPROC __glewTexCoord4d = NULL; +PFNGLTEXCOORD4DVPROC __glewTexCoord4dv = NULL; +PFNGLTEXCOORD4FPROC __glewTexCoord4f = NULL; +PFNGLTEXCOORD4FVPROC __glewTexCoord4fv = NULL; +PFNGLTEXCOORD4IPROC __glewTexCoord4i = NULL; +PFNGLTEXCOORD4IVPROC __glewTexCoord4iv = NULL; +PFNGLTEXCOORD4SPROC __glewTexCoord4s = NULL; +PFNGLTEXCOORD4SVPROC __glewTexCoord4sv = NULL; +PFNGLTEXCOORDPOINTERPROC __glewTexCoordPointer = NULL; +PFNGLTEXENVFPROC __glewTexEnvf = NULL; +PFNGLTEXENVFVPROC __glewTexEnvfv = NULL; +PFNGLTEXENVIPROC __glewTexEnvi = NULL; +PFNGLTEXENVIVPROC __glewTexEnviv = NULL; +PFNGLTEXGENDPROC __glewTexGend = NULL; +PFNGLTEXGENDVPROC __glewTexGendv = NULL; +PFNGLTEXGENFPROC __glewTexGenf = NULL; +PFNGLTEXGENFVPROC __glewTexGenfv = NULL; +PFNGLTEXGENIPROC __glewTexGeni = NULL; +PFNGLTEXGENIVPROC __glewTexGeniv = NULL; +PFNGLTEXIMAGE1DPROC __glewTexImage1D = NULL; +PFNGLTEXIMAGE2DPROC __glewTexImage2D = NULL; +PFNGLTEXPARAMETERFPROC __glewTexParameterf = NULL; +PFNGLTEXPARAMETERFVPROC __glewTexParameterfv = NULL; +PFNGLTEXPARAMETERIPROC __glewTexParameteri = NULL; +PFNGLTEXPARAMETERIVPROC __glewTexParameteriv = NULL; +PFNGLTEXSUBIMAGE1DPROC __glewTexSubImage1D = NULL; +PFNGLTEXSUBIMAGE2DPROC __glewTexSubImage2D = NULL; +PFNGLTRANSLATEDPROC __glewTranslated = NULL; +PFNGLTRANSLATEFPROC __glewTranslatef = NULL; +PFNGLVERTEX2DPROC __glewVertex2d = NULL; +PFNGLVERTEX2DVPROC __glewVertex2dv = NULL; +PFNGLVERTEX2FPROC __glewVertex2f = NULL; +PFNGLVERTEX2FVPROC __glewVertex2fv = NULL; +PFNGLVERTEX2IPROC __glewVertex2i = NULL; +PFNGLVERTEX2IVPROC __glewVertex2iv = NULL; +PFNGLVERTEX2SPROC __glewVertex2s = NULL; +PFNGLVERTEX2SVPROC __glewVertex2sv = NULL; +PFNGLVERTEX3DPROC __glewVertex3d = NULL; +PFNGLVERTEX3DVPROC __glewVertex3dv = NULL; +PFNGLVERTEX3FPROC __glewVertex3f = NULL; +PFNGLVERTEX3FVPROC __glewVertex3fv = NULL; +PFNGLVERTEX3IPROC __glewVertex3i = NULL; +PFNGLVERTEX3IVPROC __glewVertex3iv = NULL; +PFNGLVERTEX3SPROC __glewVertex3s = NULL; +PFNGLVERTEX3SVPROC __glewVertex3sv = NULL; +PFNGLVERTEX4DPROC __glewVertex4d = NULL; +PFNGLVERTEX4DVPROC __glewVertex4dv = NULL; +PFNGLVERTEX4FPROC __glewVertex4f = NULL; +PFNGLVERTEX4FVPROC __glewVertex4fv = NULL; +PFNGLVERTEX4IPROC __glewVertex4i = NULL; +PFNGLVERTEX4IVPROC __glewVertex4iv = NULL; +PFNGLVERTEX4SPROC __glewVertex4s = NULL; +PFNGLVERTEX4SVPROC __glewVertex4sv = NULL; +PFNGLVERTEXPOINTERPROC __glewVertexPointer = NULL; +PFNGLVIEWPORTPROC __glewViewport = NULL; + +#define fqn_from_convention(convention, fqn) \ + (const GLubyte*)fqn + +GLboolean GLEWAPIENTRY glewOpenGL11Init(void) +{ + GLboolean r = GL_FALSE; + + r = ((glAccum = (PFNGLACCUMPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glAccum"))) == NULL) || r; + r = ((glAlphaFunc = (PFNGLALPHAFUNCPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glAlphaFunc"))) == NULL) || r; + r = ((glAreTexturesResident = (PFNGLARETEXTURESRESIDENTPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glAreTexturesResident"))) == NULL) || r; + r = ((glArrayElement = (PFNGLARRAYELEMENTPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glArrayElement"))) == NULL) || r; + r = ((glBegin = (PFNGLBEGINPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glBegin"))) == NULL) || r; + r = ((glBindTexture = (PFNGLBINDTEXTUREPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glBindTexture"))) == NULL) || r; + r = ((glBitmap = (PFNGLBITMAPPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glBitmap"))) == NULL) || r; + r = ((glBlendFunc = (PFNGLBLENDFUNCPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glBlendFunc"))) == NULL) || r; + r = ((glCallList = (PFNGLCALLLISTPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glCallList"))) == NULL) || r; + r = ((glCallLists = (PFNGLCALLLISTSPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glCallLists"))) == NULL) || r; + r = ((glClear = (PFNGLCLEARPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glClear"))) == NULL) || r; + r = ((glClearAccum = (PFNGLCLEARACCUMPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glClearAccum"))) == NULL) || r; + r = ((glClearColor = (PFNGLCLEARCOLORPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glClearColor"))) == NULL) || r; + r = ((glClearDepth = (PFNGLCLEARDEPTHPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glClearDepth"))) == NULL) || r; + r = ((glClearIndex = (PFNGLCLEARINDEXPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glClearIndex"))) == NULL) || r; + r = ((glClearStencil = (PFNGLCLEARSTENCILPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glClearStencil"))) == NULL) || r; + r = ((glClipPlane = (PFNGLCLIPPLANEPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glClipPlane"))) == NULL) || r; + r = ((glColor3b = (PFNGLCOLOR3BPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glColor3b"))) == NULL) || r; + r = ((glColor3bv = (PFNGLCOLOR3BVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glColor3bv"))) == NULL) || r; + r = ((glColor3d = (PFNGLCOLOR3DPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glColor3d"))) == NULL) || r; + r = ((glColor3dv = (PFNGLCOLOR3DVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glColor3dv"))) == NULL) || r; + r = ((glColor3f = (PFNGLCOLOR3FPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glColor3f"))) == NULL) || r; + r = ((glColor3fv = (PFNGLCOLOR3FVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glColor3fv"))) == NULL) || r; + r = ((glColor3i = (PFNGLCOLOR3IPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glColor3i"))) == NULL) || r; + r = ((glColor3iv = (PFNGLCOLOR3IVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glColor3iv"))) == NULL) || r; + r = ((glColor3s = (PFNGLCOLOR3SPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glColor3s"))) == NULL) || r; + r = ((glColor3sv = (PFNGLCOLOR3SVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glColor3sv"))) == NULL) || r; + r = ((glColor3ub = (PFNGLCOLOR3UBPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glColor3ub"))) == NULL) || r; + r = ((glColor3ubv = (PFNGLCOLOR3UBVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glColor3ubv"))) == NULL) || r; + r = ((glColor3ui = (PFNGLCOLOR3UIPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glColor3ui"))) == NULL) || r; + r = ((glColor3uiv = (PFNGLCOLOR3UIVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glColor3uiv"))) == NULL) || r; + r = ((glColor3us = (PFNGLCOLOR3USPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glColor3us"))) == NULL) || r; + r = ((glColor3usv = (PFNGLCOLOR3USVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glColor3usv"))) == NULL) || r; + r = ((glColor4b = (PFNGLCOLOR4BPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glColor4b"))) == NULL) || r; + r = ((glColor4bv = (PFNGLCOLOR4BVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glColor4bv"))) == NULL) || r; + r = ((glColor4d = (PFNGLCOLOR4DPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glColor4d"))) == NULL) || r; + r = ((glColor4dv = (PFNGLCOLOR4DVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glColor4dv"))) == NULL) || r; + r = ((glColor4f = (PFNGLCOLOR4FPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glColor4f"))) == NULL) || r; + r = ((glColor4fv = (PFNGLCOLOR4FVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glColor4fv"))) == NULL) || r; + r = ((glColor4i = (PFNGLCOLOR4IPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glColor4i"))) == NULL) || r; + r = ((glColor4iv = (PFNGLCOLOR4IVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glColor4iv"))) == NULL) || r; + r = ((glColor4s = (PFNGLCOLOR4SPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glColor4s"))) == NULL) || r; + r = ((glColor4sv = (PFNGLCOLOR4SVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glColor4sv"))) == NULL) || r; + r = ((glColor4ub = (PFNGLCOLOR4UBPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glColor4ub"))) == NULL) || r; + r = ((glColor4ubv = (PFNGLCOLOR4UBVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glColor4ubv"))) == NULL) || r; + r = ((glColor4ui = (PFNGLCOLOR4UIPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glColor4ui"))) == NULL) || r; + r = ((glColor4uiv = (PFNGLCOLOR4UIVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glColor4uiv"))) == NULL) || r; + r = ((glColor4us = (PFNGLCOLOR4USPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glColor4us"))) == NULL) || r; + r = ((glColor4usv = (PFNGLCOLOR4USVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glColor4usv"))) == NULL) || r; + r = ((glColorMask = (PFNGLCOLORMASKPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glColorMask"))) == NULL) || r; + r = ((glColorMaterial = (PFNGLCOLORMATERIALPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glColorMaterial"))) == NULL) || r; + r = ((glColorPointer = (PFNGLCOLORPOINTERPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glColorPointer"))) == NULL) || r; + r = ((glCopyPixels = (PFNGLCOPYPIXELSPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glCopyPixels"))) == NULL) || r; + r = ((glCopyTexImage1D = (PFNGLCOPYTEXIMAGE1DPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glCopyTexImage1D"))) == NULL) || r; + r = ((glCopyTexImage2D = (PFNGLCOPYTEXIMAGE2DPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glCopyTexImage2D"))) == NULL) || r; + r = ((glCopyTexSubImage1D = (PFNGLCOPYTEXSUBIMAGE1DPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glCopyTexSubImage1D"))) == NULL) || r; + r = ((glCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glCopyTexSubImage2D"))) == NULL) || r; + r = ((glCullFace = (PFNGLCULLFACEPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glCullFace"))) == NULL) || r; + r = ((glDeleteLists = (PFNGLDELETELISTSPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glDeleteLists"))) == NULL) || r; + r = ((glDeleteTextures = (PFNGLDELETETEXTURESPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glDeleteTextures"))) == NULL) || r; + r = ((glDepthFunc = (PFNGLDEPTHFUNCPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glDepthFunc"))) == NULL) || r; + r = ((glDepthMask = (PFNGLDEPTHMASKPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glDepthMask"))) == NULL) || r; + r = ((glDepthRange = (PFNGLDEPTHRANGEPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glDepthRange"))) == NULL) || r; + r = ((glDisable = (PFNGLDISABLEPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glDisable"))) == NULL) || r; + r = ((glDisableClientState = (PFNGLDISABLECLIENTSTATEPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glDisableClientState"))) == NULL) || r; + r = ((glDrawArrays = (PFNGLDRAWARRAYSPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glDrawArrays"))) == NULL) || r; + r = ((glDrawBuffer = (PFNGLDRAWBUFFERPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glDrawBuffer"))) == NULL) || r; + r = ((glDrawElements = (PFNGLDRAWELEMENTSPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glDrawElements"))) == NULL) || r; + r = ((glDrawPixels = (PFNGLDRAWPIXELSPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glDrawPixels"))) == NULL) || r; + r = ((glEdgeFlag = (PFNGLEDGEFLAGPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glEdgeFlag"))) == NULL) || r; + r = ((glEdgeFlagPointer = (PFNGLEDGEFLAGPOINTERPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glEdgeFlagPointer"))) == NULL) || r; + r = ((glEdgeFlagv = (PFNGLEDGEFLAGVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glEdgeFlagv"))) == NULL) || r; + r = ((glEnable = (PFNGLENABLEPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glEnable"))) == NULL) || r; + r = ((glEnableClientState = (PFNGLENABLECLIENTSTATEPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glEnableClientState"))) == NULL) || r; + r = ((glEnd = (PFNGLENDPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glEnd"))) == NULL) || r; + r = ((glEndList = (PFNGLENDLISTPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glEndList"))) == NULL) || r; + r = ((glEvalCoord1d = (PFNGLEVALCOORD1DPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glEvalCoord1d"))) == NULL) || r; + r = ((glEvalCoord1dv = (PFNGLEVALCOORD1DVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glEvalCoord1dv"))) == NULL) || r; + r = ((glEvalCoord1f = (PFNGLEVALCOORD1FPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glEvalCoord1f"))) == NULL) || r; + r = ((glEvalCoord1fv = (PFNGLEVALCOORD1FVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glEvalCoord1fv"))) == NULL) || r; + r = ((glEvalCoord2d = (PFNGLEVALCOORD2DPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glEvalCoord2d"))) == NULL) || r; + r = ((glEvalCoord2dv = (PFNGLEVALCOORD2DVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glEvalCoord2dv"))) == NULL) || r; + r = ((glEvalCoord2f = (PFNGLEVALCOORD2FPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glEvalCoord2f"))) == NULL) || r; + r = ((glEvalCoord2fv = (PFNGLEVALCOORD2FVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glEvalCoord2fv"))) == NULL) || r; + r = ((glEvalMesh1 = (PFNGLEVALMESH1PROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glEvalMesh1"))) == NULL) || r; + r = ((glEvalMesh2 = (PFNGLEVALMESH2PROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glEvalMesh2"))) == NULL) || r; + r = ((glEvalPoint1 = (PFNGLEVALPOINT1PROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glEvalPoint1"))) == NULL) || r; + r = ((glEvalPoint2 = (PFNGLEVALPOINT2PROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glEvalPoint2"))) == NULL) || r; + r = ((glFeedbackBuffer = (PFNGLFEEDBACKBUFFERPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glFeedbackBuffer"))) == NULL) || r; + r = ((glFinish = (PFNGLFINISHPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glFinish"))) == NULL) || r; + r = ((glFlush = (PFNGLFLUSHPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glFlush"))) == NULL) || r; + r = ((glFogf = (PFNGLFOGFPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glFogf"))) == NULL) || r; + r = ((glFogfv = (PFNGLFOGFVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glFogfv"))) == NULL) || r; + r = ((glFogi = (PFNGLFOGIPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glFogi"))) == NULL) || r; + r = ((glFogiv = (PFNGLFOGIVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glFogiv"))) == NULL) || r; + r = ((glFrontFace = (PFNGLFRONTFACEPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glFrontFace"))) == NULL) || r; + r = ((glFrustum = (PFNGLFRUSTUMPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glFrustum"))) == NULL) || r; + r = ((glGenLists = (PFNGLGENLISTSPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glGenLists"))) == NULL) || r; + r = ((glGenTextures = (PFNGLGENTEXTURESPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glGenTextures"))) == NULL) || r; + r = ((glGetBooleanv = (PFNGLGETBOOLEANVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glGetBooleanv"))) == NULL) || r; + r = ((glGetClipPlane = (PFNGLGETCLIPPLANEPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glGetClipPlane"))) == NULL) || r; + r = ((glGetDoublev = (PFNGLGETDOUBLEVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glGetDoublev"))) == NULL) || r; + r = ((glGetError = (PFNGLGETERRORPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glGetError"))) == NULL) || r; + r = ((glGetFloatv = (PFNGLGETFLOATVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glGetFloatv"))) == NULL) || r; + r = ((glGetIntegerv = (PFNGLGETINTEGERVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glGetIntegerv"))) == NULL) || r; + r = ((glGetLightfv = (PFNGLGETLIGHTFVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glGetLightfv"))) == NULL) || r; + r = ((glGetLightiv = (PFNGLGETLIGHTIVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glGetLightiv"))) == NULL) || r; + r = ((glGetMapdv = (PFNGLGETMAPDVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glGetMapdv"))) == NULL) || r; + r = ((glGetMapfv = (PFNGLGETMAPFVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glGetMapfv"))) == NULL) || r; + r = ((glGetMapiv = (PFNGLGETMAPIVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glGetMapiv"))) == NULL) || r; + r = ((glGetMaterialfv = (PFNGLGETMATERIALFVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glGetMaterialfv"))) == NULL) || r; + r = ((glGetMaterialiv = (PFNGLGETMATERIALIVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glGetMaterialiv"))) == NULL) || r; + r = ((glGetPixelMapfv = (PFNGLGETPIXELMAPFVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glGetPixelMapfv"))) == NULL) || r; + r = ((glGetPixelMapuiv = (PFNGLGETPIXELMAPUIVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glGetPixelMapuiv"))) == NULL) || r; + r = ((glGetPixelMapusv = (PFNGLGETPIXELMAPUSVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glGetPixelMapusv"))) == NULL) || r; + r = ((glGetPointerv = (PFNGLGETPOINTERVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glGetPointerv"))) == NULL) || r; + r = ((glGetPolygonStipple = (PFNGLGETPOLYGONSTIPPLEPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glGetPolygonStipple"))) == NULL) || r; + r = ((glGetString = (PFNGLGETSTRINGPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glGetString"))) == NULL) || r; + r = ((glGetTexEnvfv = (PFNGLGETTEXENVFVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glGetTexEnvfv"))) == NULL) || r; + r = ((glGetTexEnviv = (PFNGLGETTEXENVIVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glGetTexEnviv"))) == NULL) || r; + r = ((glGetTexGendv = (PFNGLGETTEXGENDVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glGetTexGendv"))) == NULL) || r; + r = ((glGetTexGenfv = (PFNGLGETTEXGENFVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glGetTexGenfv"))) == NULL) || r; + r = ((glGetTexGeniv = (PFNGLGETTEXGENIVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glGetTexGeniv"))) == NULL) || r; + r = ((glGetTexImage = (PFNGLGETTEXIMAGEPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glGetTexImage"))) == NULL) || r; + r = ((glGetTexLevelParameterfv = (PFNGLGETTEXLEVELPARAMETERFVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glGetTexLevelParameterfv"))) == NULL) || r; + r = ((glGetTexLevelParameteriv = (PFNGLGETTEXLEVELPARAMETERIVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glGetTexLevelParameteriv"))) == NULL) || r; + r = ((glGetTexParameterfv = (PFNGLGETTEXPARAMETERFVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glGetTexParameterfv"))) == NULL) || r; + r = ((glGetTexParameteriv = (PFNGLGETTEXPARAMETERIVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glGetTexParameteriv"))) == NULL) || r; + r = ((glHint = (PFNGLHINTPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glHint"))) == NULL) || r; + r = ((glIndexMask = (PFNGLINDEXMASKPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glIndexMask"))) == NULL) || r; + r = ((glIndexPointer = (PFNGLINDEXPOINTERPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glIndexPointer"))) == NULL) || r; + r = ((glIndexd = (PFNGLINDEXDPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glIndexd"))) == NULL) || r; + r = ((glIndexdv = (PFNGLINDEXDVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glIndexdv"))) == NULL) || r; + r = ((glIndexf = (PFNGLINDEXFPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glIndexf"))) == NULL) || r; + r = ((glIndexfv = (PFNGLINDEXFVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glIndexfv"))) == NULL) || r; + r = ((glIndexi = (PFNGLINDEXIPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glIndexi"))) == NULL) || r; + r = ((glIndexiv = (PFNGLINDEXIVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glIndexiv"))) == NULL) || r; + r = ((glIndexs = (PFNGLINDEXSPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glIndexs"))) == NULL) || r; + r = ((glIndexsv = (PFNGLINDEXSVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glIndexsv"))) == NULL) || r; + r = ((glIndexub = (PFNGLINDEXUBPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glIndexub"))) == NULL) || r; + r = ((glIndexubv = (PFNGLINDEXUBVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glIndexubv"))) == NULL) || r; + r = ((glInitNames = (PFNGLINITNAMESPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glInitNames"))) == NULL) || r; + r = ((glInterleavedArrays = (PFNGLINTERLEAVEDARRAYSPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glInterleavedArrays"))) == NULL) || r; + r = ((glIsEnabled = (PFNGLISENABLEDPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glIsEnabled"))) == NULL) || r; + r = ((glIsList = (PFNGLISLISTPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glIsList"))) == NULL) || r; + r = ((glIsTexture = (PFNGLISTEXTUREPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glIsTexture"))) == NULL) || r; + r = ((glLightModelf = (PFNGLLIGHTMODELFPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glLightModelf"))) == NULL) || r; + r = ((glLightModelfv = (PFNGLLIGHTMODELFVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glLightModelfv"))) == NULL) || r; + r = ((glLightModeli = (PFNGLLIGHTMODELIPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glLightModeli"))) == NULL) || r; + r = ((glLightModeliv = (PFNGLLIGHTMODELIVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glLightModeliv"))) == NULL) || r; + r = ((glLightf = (PFNGLLIGHTFPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glLightf"))) == NULL) || r; + r = ((glLightfv = (PFNGLLIGHTFVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glLightfv"))) == NULL) || r; + r = ((glLighti = (PFNGLLIGHTIPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glLighti"))) == NULL) || r; + r = ((glLightiv = (PFNGLLIGHTIVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glLightiv"))) == NULL) || r; + r = ((glLineStipple = (PFNGLLINESTIPPLEPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glLineStipple"))) == NULL) || r; + r = ((glLineWidth = (PFNGLLINEWIDTHPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glLineWidth"))) == NULL) || r; + r = ((glListBase = (PFNGLLISTBASEPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glListBase"))) == NULL) || r; + r = ((glLoadIdentity = (PFNGLLOADIDENTITYPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glLoadIdentity"))) == NULL) || r; + r = ((glLoadMatrixd = (PFNGLLOADMATRIXDPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glLoadMatrixd"))) == NULL) || r; + r = ((glLoadMatrixf = (PFNGLLOADMATRIXFPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glLoadMatrixf"))) == NULL) || r; + r = ((glLoadName = (PFNGLLOADNAMEPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glLoadName"))) == NULL) || r; + r = ((glLogicOp = (PFNGLLOGICOPPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glLogicOp"))) == NULL) || r; + r = ((glMap1d = (PFNGLMAP1DPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glMap1d"))) == NULL) || r; + r = ((glMap1f = (PFNGLMAP1FPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glMap1f"))) == NULL) || r; + r = ((glMap2d = (PFNGLMAP2DPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glMap2d"))) == NULL) || r; + r = ((glMap2f = (PFNGLMAP2FPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glMap2f"))) == NULL) || r; + r = ((glMapGrid1d = (PFNGLMAPGRID1DPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glMapGrid1d"))) == NULL) || r; + r = ((glMapGrid1f = (PFNGLMAPGRID1FPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glMapGrid1f"))) == NULL) || r; + r = ((glMapGrid2d = (PFNGLMAPGRID2DPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glMapGrid2d"))) == NULL) || r; + r = ((glMapGrid2f = (PFNGLMAPGRID2FPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glMapGrid2f"))) == NULL) || r; + r = ((glMaterialf = (PFNGLMATERIALFPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glMaterialf"))) == NULL) || r; + r = ((glMaterialfv = (PFNGLMATERIALFVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glMaterialfv"))) == NULL) || r; + r = ((glMateriali = (PFNGLMATERIALIPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glMateriali"))) == NULL) || r; + r = ((glMaterialiv = (PFNGLMATERIALIVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glMaterialiv"))) == NULL) || r; + r = ((glMatrixMode = (PFNGLMATRIXMODEPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glMatrixMode"))) == NULL) || r; + r = ((glMultMatrixd = (PFNGLMULTMATRIXDPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glMultMatrixd"))) == NULL) || r; + r = ((glMultMatrixf = (PFNGLMULTMATRIXFPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glMultMatrixf"))) == NULL) || r; + r = ((glNewList = (PFNGLNEWLISTPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glNewList"))) == NULL) || r; + r = ((glNormal3b = (PFNGLNORMAL3BPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glNormal3b"))) == NULL) || r; + r = ((glNormal3bv = (PFNGLNORMAL3BVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glNormal3bv"))) == NULL) || r; + r = ((glNormal3d = (PFNGLNORMAL3DPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glNormal3d"))) == NULL) || r; + r = ((glNormal3dv = (PFNGLNORMAL3DVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glNormal3dv"))) == NULL) || r; + r = ((glNormal3f = (PFNGLNORMAL3FPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glNormal3f"))) == NULL) || r; + r = ((glNormal3fv = (PFNGLNORMAL3FVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glNormal3fv"))) == NULL) || r; + r = ((glNormal3i = (PFNGLNORMAL3IPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glNormal3i"))) == NULL) || r; + r = ((glNormal3iv = (PFNGLNORMAL3IVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glNormal3iv"))) == NULL) || r; + r = ((glNormal3s = (PFNGLNORMAL3SPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glNormal3s"))) == NULL) || r; + r = ((glNormal3sv = (PFNGLNORMAL3SVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glNormal3sv"))) == NULL) || r; + r = ((glNormalPointer = (PFNGLNORMALPOINTERPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glNormalPointer"))) == NULL) || r; + r = ((glOrtho = (PFNGLORTHOPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glOrtho"))) == NULL) || r; + r = ((glPassThrough = (PFNGLPASSTHROUGHPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glPassThrough"))) == NULL) || r; + r = ((glPixelMapfv = (PFNGLPIXELMAPFVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glPixelMapfv"))) == NULL) || r; + r = ((glPixelMapuiv = (PFNGLPIXELMAPUIVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glPixelMapuiv"))) == NULL) || r; + r = ((glPixelMapusv = (PFNGLPIXELMAPUSVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glPixelMapusv"))) == NULL) || r; + r = ((glPixelStoref = (PFNGLPIXELSTOREFPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glPixelStoref"))) == NULL) || r; + r = ((glPixelStorei = (PFNGLPIXELSTOREIPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glPixelStorei"))) == NULL) || r; + r = ((glPixelTransferf = (PFNGLPIXELTRANSFERFPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glPixelTransferf"))) == NULL) || r; + r = ((glPixelTransferi = (PFNGLPIXELTRANSFERIPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glPixelTransferi"))) == NULL) || r; + r = ((glPixelZoom = (PFNGLPIXELZOOMPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glPixelZoom"))) == NULL) || r; + r = ((glPointSize = (PFNGLPOINTSIZEPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glPointSize"))) == NULL) || r; + r = ((glPolygonMode = (PFNGLPOLYGONMODEPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glPolygonMode"))) == NULL) || r; + r = ((glPolygonOffset = (PFNGLPOLYGONOFFSETPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glPolygonOffset"))) == NULL) || r; + r = ((glPolygonStipple = (PFNGLPOLYGONSTIPPLEPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glPolygonStipple"))) == NULL) || r; + r = ((glPopAttrib = (PFNGLPOPATTRIBPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glPopAttrib"))) == NULL) || r; + r = ((glPopClientAttrib = (PFNGLPOPCLIENTATTRIBPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glPopClientAttrib"))) == NULL) || r; + r = ((glPopMatrix = (PFNGLPOPMATRIXPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glPopMatrix"))) == NULL) || r; + r = ((glPopName = (PFNGLPOPNAMEPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glPopName"))) == NULL) || r; + r = ((glPrioritizeTextures = (PFNGLPRIORITIZETEXTURESPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glPrioritizeTextures"))) == NULL) || r; + r = ((glPushAttrib = (PFNGLPUSHATTRIBPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glPushAttrib"))) == NULL) || r; + r = ((glPushClientAttrib = (PFNGLPUSHCLIENTATTRIBPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glPushClientAttrib"))) == NULL) || r; + r = ((glPushMatrix = (PFNGLPUSHMATRIXPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glPushMatrix"))) == NULL) || r; + r = ((glPushName = (PFNGLPUSHNAMEPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glPushName"))) == NULL) || r; + r = ((glRasterPos2d = (PFNGLRASTERPOS2DPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glRasterPos2d"))) == NULL) || r; + r = ((glRasterPos2dv = (PFNGLRASTERPOS2DVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glRasterPos2dv"))) == NULL) || r; + r = ((glRasterPos2f = (PFNGLRASTERPOS2FPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glRasterPos2f"))) == NULL) || r; + r = ((glRasterPos2fv = (PFNGLRASTERPOS2FVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glRasterPos2fv"))) == NULL) || r; + r = ((glRasterPos2i = (PFNGLRASTERPOS2IPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glRasterPos2i"))) == NULL) || r; + r = ((glRasterPos2iv = (PFNGLRASTERPOS2IVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glRasterPos2iv"))) == NULL) || r; + r = ((glRasterPos2s = (PFNGLRASTERPOS2SPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glRasterPos2s"))) == NULL) || r; + r = ((glRasterPos2sv = (PFNGLRASTERPOS2SVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glRasterPos2sv"))) == NULL) || r; + r = ((glRasterPos3d = (PFNGLRASTERPOS3DPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glRasterPos3d"))) == NULL) || r; + r = ((glRasterPos3dv = (PFNGLRASTERPOS3DVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glRasterPos3dv"))) == NULL) || r; + r = ((glRasterPos3f = (PFNGLRASTERPOS3FPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glRasterPos3f"))) == NULL) || r; + r = ((glRasterPos3fv = (PFNGLRASTERPOS3FVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glRasterPos3fv"))) == NULL) || r; + r = ((glRasterPos3i = (PFNGLRASTERPOS3IPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glRasterPos3i"))) == NULL) || r; + r = ((glRasterPos3iv = (PFNGLRASTERPOS3IVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glRasterPos3iv"))) == NULL) || r; + r = ((glRasterPos3s = (PFNGLRASTERPOS3SPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glRasterPos3s"))) == NULL) || r; + r = ((glRasterPos3sv = (PFNGLRASTERPOS3SVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glRasterPos3sv"))) == NULL) || r; + r = ((glRasterPos4d = (PFNGLRASTERPOS4DPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glRasterPos4d"))) == NULL) || r; + r = ((glRasterPos4dv = (PFNGLRASTERPOS4DVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glRasterPos4dv"))) == NULL) || r; + r = ((glRasterPos4f = (PFNGLRASTERPOS4FPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glRasterPos4f"))) == NULL) || r; + r = ((glRasterPos4fv = (PFNGLRASTERPOS4FVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glRasterPos4fv"))) == NULL) || r; + r = ((glRasterPos4i = (PFNGLRASTERPOS4IPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glRasterPos4i"))) == NULL) || r; + r = ((glRasterPos4iv = (PFNGLRASTERPOS4IVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glRasterPos4iv"))) == NULL) || r; + r = ((glRasterPos4s = (PFNGLRASTERPOS4SPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glRasterPos4s"))) == NULL) || r; + r = ((glRasterPos4sv = (PFNGLRASTERPOS4SVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glRasterPos4sv"))) == NULL) || r; + r = ((glReadBuffer = (PFNGLREADBUFFERPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glReadBuffer"))) == NULL) || r; + r = ((glReadPixels = (PFNGLREADPIXELSPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glReadPixels"))) == NULL) || r; + r = ((glRectd = (PFNGLRECTDPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glRectd"))) == NULL) || r; + r = ((glRectdv = (PFNGLRECTDVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glRectdv"))) == NULL) || r; + r = ((glRectf = (PFNGLRECTFPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glRectf"))) == NULL) || r; + r = ((glRectfv = (PFNGLRECTFVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glRectfv"))) == NULL) || r; + r = ((glRecti = (PFNGLRECTIPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glRecti"))) == NULL) || r; + r = ((glRectiv = (PFNGLRECTIVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glRectiv"))) == NULL) || r; + r = ((glRects = (PFNGLRECTSPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glRects"))) == NULL) || r; + r = ((glRectsv = (PFNGLRECTSVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glRectsv"))) == NULL) || r; + r = ((glRenderMode = (PFNGLRENDERMODEPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glRenderMode"))) == NULL) || r; + r = ((glRotated = (PFNGLROTATEDPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glRotated"))) == NULL) || r; + r = ((glRotatef = (PFNGLROTATEFPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glRotatef"))) == NULL) || r; + r = ((glScaled = (PFNGLSCALEDPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glScaled"))) == NULL) || r; + r = ((glScalef = (PFNGLSCALEFPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glScalef"))) == NULL) || r; + r = ((glScissor = (PFNGLSCISSORPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glScissor"))) == NULL) || r; + r = ((glSelectBuffer = (PFNGLSELECTBUFFERPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glSelectBuffer"))) == NULL) || r; + r = ((glShadeModel = (PFNGLSHADEMODELPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glShadeModel"))) == NULL) || r; + r = ((glStencilFunc = (PFNGLSTENCILFUNCPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glStencilFunc"))) == NULL) || r; + r = ((glStencilMask = (PFNGLSTENCILMASKPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glStencilMask"))) == NULL) || r; + r = ((glStencilOp = (PFNGLSTENCILOPPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glStencilOp"))) == NULL) || r; + r = ((glTexCoord1d = (PFNGLTEXCOORD1DPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexCoord1d"))) == NULL) || r; + r = ((glTexCoord1dv = (PFNGLTEXCOORD1DVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexCoord1dv"))) == NULL) || r; + r = ((glTexCoord1f = (PFNGLTEXCOORD1FPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexCoord1f"))) == NULL) || r; + r = ((glTexCoord1fv = (PFNGLTEXCOORD1FVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexCoord1fv"))) == NULL) || r; + r = ((glTexCoord1i = (PFNGLTEXCOORD1IPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexCoord1i"))) == NULL) || r; + r = ((glTexCoord1iv = (PFNGLTEXCOORD1IVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexCoord1iv"))) == NULL) || r; + r = ((glTexCoord1s = (PFNGLTEXCOORD1SPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexCoord1s"))) == NULL) || r; + r = ((glTexCoord1sv = (PFNGLTEXCOORD1SVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexCoord1sv"))) == NULL) || r; + r = ((glTexCoord2d = (PFNGLTEXCOORD2DPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexCoord2d"))) == NULL) || r; + r = ((glTexCoord2dv = (PFNGLTEXCOORD2DVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexCoord2dv"))) == NULL) || r; + r = ((glTexCoord2f = (PFNGLTEXCOORD2FPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexCoord2f"))) == NULL) || r; + r = ((glTexCoord2fv = (PFNGLTEXCOORD2FVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexCoord2fv"))) == NULL) || r; + r = ((glTexCoord2i = (PFNGLTEXCOORD2IPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexCoord2i"))) == NULL) || r; + r = ((glTexCoord2iv = (PFNGLTEXCOORD2IVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexCoord2iv"))) == NULL) || r; + r = ((glTexCoord2s = (PFNGLTEXCOORD2SPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexCoord2s"))) == NULL) || r; + r = ((glTexCoord2sv = (PFNGLTEXCOORD2SVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexCoord2sv"))) == NULL) || r; + r = ((glTexCoord3d = (PFNGLTEXCOORD3DPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexCoord3d"))) == NULL) || r; + r = ((glTexCoord3dv = (PFNGLTEXCOORD3DVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexCoord3dv"))) == NULL) || r; + r = ((glTexCoord3f = (PFNGLTEXCOORD3FPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexCoord3f"))) == NULL) || r; + r = ((glTexCoord3fv = (PFNGLTEXCOORD3FVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexCoord3fv"))) == NULL) || r; + r = ((glTexCoord3i = (PFNGLTEXCOORD3IPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexCoord3i"))) == NULL) || r; + r = ((glTexCoord3iv = (PFNGLTEXCOORD3IVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexCoord3iv"))) == NULL) || r; + r = ((glTexCoord3s = (PFNGLTEXCOORD3SPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexCoord3s"))) == NULL) || r; + r = ((glTexCoord3sv = (PFNGLTEXCOORD3SVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexCoord3sv"))) == NULL) || r; + r = ((glTexCoord4d = (PFNGLTEXCOORD4DPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexCoord4d"))) == NULL) || r; + r = ((glTexCoord4dv = (PFNGLTEXCOORD4DVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexCoord4dv"))) == NULL) || r; + r = ((glTexCoord4f = (PFNGLTEXCOORD4FPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexCoord4f"))) == NULL) || r; + r = ((glTexCoord4fv = (PFNGLTEXCOORD4FVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexCoord4fv"))) == NULL) || r; + r = ((glTexCoord4i = (PFNGLTEXCOORD4IPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexCoord4i"))) == NULL) || r; + r = ((glTexCoord4iv = (PFNGLTEXCOORD4IVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexCoord4iv"))) == NULL) || r; + r = ((glTexCoord4s = (PFNGLTEXCOORD4SPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexCoord4s"))) == NULL) || r; + r = ((glTexCoord4sv = (PFNGLTEXCOORD4SVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexCoord4sv"))) == NULL) || r; + r = ((glTexCoordPointer = (PFNGLTEXCOORDPOINTERPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexCoordPointer"))) == NULL) || r; + r = ((glTexEnvf = (PFNGLTEXENVFPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexEnvf"))) == NULL) || r; + r = ((glTexEnvfv = (PFNGLTEXENVFVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexEnvfv"))) == NULL) || r; + r = ((glTexEnvi = (PFNGLTEXENVIPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexEnvi"))) == NULL) || r; + r = ((glTexEnviv = (PFNGLTEXENVIVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexEnviv"))) == NULL) || r; + r = ((glTexGend = (PFNGLTEXGENDPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexGend"))) == NULL) || r; + r = ((glTexGendv = (PFNGLTEXGENDVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexGendv"))) == NULL) || r; + r = ((glTexGenf = (PFNGLTEXGENFPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexGenf"))) == NULL) || r; + r = ((glTexGenfv = (PFNGLTEXGENFVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexGenfv"))) == NULL) || r; + r = ((glTexGeni = (PFNGLTEXGENIPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexGeni"))) == NULL) || r; + r = ((glTexGeniv = (PFNGLTEXGENIVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexGeniv"))) == NULL) || r; + r = ((glTexImage1D = (PFNGLTEXIMAGE1DPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexImage1D"))) == NULL) || r; + r = ((glTexImage2D = (PFNGLTEXIMAGE2DPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexImage2D"))) == NULL) || r; + r = ((glTexParameterf = (PFNGLTEXPARAMETERFPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexParameterf"))) == NULL) || r; + r = ((glTexParameterfv = (PFNGLTEXPARAMETERFVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexParameterfv"))) == NULL) || r; + r = ((glTexParameteri = (PFNGLTEXPARAMETERIPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexParameteri"))) == NULL) || r; + r = ((glTexParameteriv = (PFNGLTEXPARAMETERIVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexParameteriv"))) == NULL) || r; + r = ((glTexSubImage1D = (PFNGLTEXSUBIMAGE1DPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexSubImage1D"))) == NULL) || r; + r = ((glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTexSubImage2D"))) == NULL) || r; + r = ((glTranslated = (PFNGLTRANSLATEDPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTranslated"))) == NULL) || r; + r = ((glTranslatef = (PFNGLTRANSLATEFPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glTranslatef"))) == NULL) || r; + r = ((glVertex2d = (PFNGLVERTEX2DPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glVertex2d"))) == NULL) || r; + r = ((glVertex2dv = (PFNGLVERTEX2DVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glVertex2dv"))) == NULL) || r; + r = ((glVertex2f = (PFNGLVERTEX2FPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glVertex2f"))) == NULL) || r; + r = ((glVertex2fv = (PFNGLVERTEX2FVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glVertex2fv"))) == NULL) || r; + r = ((glVertex2i = (PFNGLVERTEX2IPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glVertex2i"))) == NULL) || r; + r = ((glVertex2iv = (PFNGLVERTEX2IVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glVertex2iv"))) == NULL) || r; + r = ((glVertex2s = (PFNGLVERTEX2SPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glVertex2s"))) == NULL) || r; + r = ((glVertex2sv = (PFNGLVERTEX2SVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glVertex2sv"))) == NULL) || r; + r = ((glVertex3d = (PFNGLVERTEX3DPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glVertex3d"))) == NULL) || r; + r = ((glVertex3dv = (PFNGLVERTEX3DVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glVertex3dv"))) == NULL) || r; + r = ((glVertex3f = (PFNGLVERTEX3FPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glVertex3f"))) == NULL) || r; + r = ((glVertex3fv = (PFNGLVERTEX3FVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glVertex3fv"))) == NULL) || r; + r = ((glVertex3i = (PFNGLVERTEX3IPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glVertex3i"))) == NULL) || r; + r = ((glVertex3iv = (PFNGLVERTEX3IVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glVertex3iv"))) == NULL) || r; + r = ((glVertex3s = (PFNGLVERTEX3SPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glVertex3s"))) == NULL) || r; + r = ((glVertex3sv = (PFNGLVERTEX3SVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glVertex3sv"))) == NULL) || r; + r = ((glVertex4d = (PFNGLVERTEX4DPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glVertex4d"))) == NULL) || r; + r = ((glVertex4dv = (PFNGLVERTEX4DVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glVertex4dv"))) == NULL) || r; + r = ((glVertex4f = (PFNGLVERTEX4FPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glVertex4f"))) == NULL) || r; + r = ((glVertex4fv = (PFNGLVERTEX4FVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glVertex4fv"))) == NULL) || r; + r = ((glVertex4i = (PFNGLVERTEX4IPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glVertex4i"))) == NULL) || r; + r = ((glVertex4iv = (PFNGLVERTEX4IVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glVertex4iv"))) == NULL) || r; + r = ((glVertex4s = (PFNGLVERTEX4SPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glVertex4s"))) == NULL) || r; + r = ((glVertex4sv = (PFNGLVERTEX4SVPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glVertex4sv"))) == NULL) || r; + r = ((glVertexPointer = (PFNGLVERTEXPOINTERPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glVertexPointer"))) == NULL) || r; + r = ((glViewport = (PFNGLVIEWPORTPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glViewport"))) == NULL) || r; + + if (r==0) + { + printf("glewOpenGL11Init dynamically loaded using dlopen/dlsym OK\n"); + } + return r; +} +#endif //GLEW_INIT_OPENGL11_FUNCTIONS + GLenum GLEWAPIENTRY glewInit (void) { @@ -12672,7 +14257,7 @@ GLenum GLEWAPIENTRY glewInit (void) if ( r != 0 ) return r; #if defined(_WIN32) return wglewContextInit(); -#elif !defined(__ANDROID__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) /* _UNIX */ +#elif !defined(__ANDROID__) && !defined(__native_client__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) /* _UNIX */ return glxewContextInit(); #else return r; @@ -12799,6 +14384,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) ret = GLEW_VERSION_4_3; continue; } +#endif +#ifdef GL_VERSION_4_4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_4", 3)) + { + ret = GLEW_VERSION_4_4; + continue; + } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DFX_", 5)) @@ -12862,6 +14454,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_AMD_interleaved_elements + if (_glewStrSame3(&pos, &len, (const GLubyte*)"interleaved_elements", 20)) + { + ret = GLEW_AMD_interleaved_elements; + continue; + } +#endif #ifdef GL_AMD_multi_draw_indirect if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_draw_indirect", 19)) { @@ -12918,6 +14517,20 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_AMD_shader_trinary_minmax + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_trinary_minmax", 21)) + { + ret = GLEW_AMD_shader_trinary_minmax; + continue; + } +#endif +#ifdef GL_AMD_sparse_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture", 14)) + { + ret = GLEW_AMD_sparse_texture; + continue; + } +#endif #ifdef GL_AMD_stencil_operation_extended if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_operation_extended", 26)) { @@ -12959,6 +14572,93 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) ret = GLEW_AMD_vertex_shader_viewport_index; continue; } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"ANGLE_", 6)) + { +#ifdef GL_ANGLE_depth_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_texture", 13)) + { + ret = GLEW_ANGLE_depth_texture; + continue; + } +#endif +#ifdef GL_ANGLE_framebuffer_blit + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_blit", 16)) + { + ret = GLEW_ANGLE_framebuffer_blit; + continue; + } +#endif +#ifdef GL_ANGLE_framebuffer_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample", 23)) + { + ret = GLEW_ANGLE_framebuffer_multisample; + continue; + } +#endif +#ifdef GL_ANGLE_instanced_arrays + if (_glewStrSame3(&pos, &len, (const GLubyte*)"instanced_arrays", 16)) + { + ret = GLEW_ANGLE_instanced_arrays; + continue; + } +#endif +#ifdef GL_ANGLE_pack_reverse_row_order + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pack_reverse_row_order", 22)) + { + ret = GLEW_ANGLE_pack_reverse_row_order; + continue; + } +#endif +#ifdef GL_ANGLE_program_binary + if (_glewStrSame3(&pos, &len, (const GLubyte*)"program_binary", 14)) + { + ret = GLEW_ANGLE_program_binary; + continue; + } +#endif +#ifdef GL_ANGLE_texture_compression_dxt1 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt1", 24)) + { + ret = GLEW_ANGLE_texture_compression_dxt1; + continue; + } +#endif +#ifdef GL_ANGLE_texture_compression_dxt3 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt3", 24)) + { + ret = GLEW_ANGLE_texture_compression_dxt3; + continue; + } +#endif +#ifdef GL_ANGLE_texture_compression_dxt5 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt5", 24)) + { + ret = GLEW_ANGLE_texture_compression_dxt5; + continue; + } +#endif +#ifdef GL_ANGLE_texture_usage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_usage", 13)) + { + ret = GLEW_ANGLE_texture_usage; + continue; + } +#endif +#ifdef GL_ANGLE_timer_query + if (_glewStrSame3(&pos, &len, (const GLubyte*)"timer_query", 11)) + { + ret = GLEW_ANGLE_timer_query; + continue; + } +#endif +#ifdef GL_ANGLE_translated_shader_source + if (_glewStrSame3(&pos, &len, (const GLubyte*)"translated_shader_source", 24)) + { + ret = GLEW_ANGLE_translated_shader_source; + continue; + } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"APPLE_", 6)) @@ -13113,6 +14813,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_ARB_bindless_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_texture", 16)) + { + ret = GLEW_ARB_bindless_texture; + continue; + } +#endif #ifdef GL_ARB_blend_func_extended if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_func_extended", 19)) { @@ -13120,6 +14827,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_ARB_buffer_storage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_storage", 14)) + { + ret = GLEW_ARB_buffer_storage; + continue; + } +#endif #ifdef GL_ARB_cl_event if (_glewStrSame3(&pos, &len, (const GLubyte*)"cl_event", 8)) { @@ -13134,6 +14848,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_ARB_clear_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"clear_texture", 13)) + { + ret = GLEW_ARB_clear_texture; + continue; + } +#endif #ifdef GL_ARB_color_buffer_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_buffer_float", 18)) { @@ -13162,6 +14883,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_ARB_compute_variable_group_size + if (_glewStrSame3(&pos, &len, (const GLubyte*)"compute_variable_group_size", 27)) + { + ret = GLEW_ARB_compute_variable_group_size; + continue; + } +#endif #ifdef GL_ARB_conservative_depth if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_depth", 18)) { @@ -13246,6 +14974,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_ARB_enhanced_layouts + if (_glewStrSame3(&pos, &len, (const GLubyte*)"enhanced_layouts", 16)) + { + ret = GLEW_ARB_enhanced_layouts; + continue; + } +#endif #ifdef GL_ARB_explicit_attrib_location if (_glewStrSame3(&pos, &len, (const GLubyte*)"explicit_attrib_location", 24)) { @@ -13365,6 +15100,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_ARB_indirect_parameters + if (_glewStrSame3(&pos, &len, (const GLubyte*)"indirect_parameters", 19)) + { + ret = GLEW_ARB_indirect_parameters; + continue; + } +#endif #ifdef GL_ARB_instanced_arrays if (_glewStrSame3(&pos, &len, (const GLubyte*)"instanced_arrays", 16)) { @@ -13414,6 +15156,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_ARB_multi_bind + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_bind", 10)) + { + ret = GLEW_ARB_multi_bind; + continue; + } +#endif #ifdef GL_ARB_multi_draw_indirect if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_draw_indirect", 19)) { @@ -13484,6 +15233,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_ARB_query_buffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"query_buffer_object", 19)) + { + ret = GLEW_ARB_query_buffer_object; + continue; + } +#endif #ifdef GL_ARB_robust_buffer_access_behavior if (_glewStrSame3(&pos, &len, (const GLubyte*)"robust_buffer_access_behavior", 29)) { @@ -13533,6 +15289,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_ARB_seamless_cubemap_per_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"seamless_cubemap_per_texture", 28)) + { + ret = GLEW_ARB_seamless_cubemap_per_texture; + continue; + } +#endif #ifdef GL_ARB_separate_shader_objects if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_shader_objects", 23)) { @@ -13554,6 +15317,20 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_ARB_shader_draw_parameters + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_draw_parameters", 22)) + { + ret = GLEW_ARB_shader_draw_parameters; + continue; + } +#endif +#ifdef GL_ARB_shader_group_vote + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_group_vote", 17)) + { + ret = GLEW_ARB_shader_group_vote; + continue; + } +#endif #ifdef GL_ARB_shader_image_load_store if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_load_store", 23)) { @@ -13652,6 +15429,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_ARB_sparse_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture", 14)) + { + ret = GLEW_ARB_sparse_texture; + continue; + } +#endif #ifdef GL_ARB_stencil_texturing if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_texturing", 17)) { @@ -13778,6 +15562,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_ARB_texture_mirror_clamp_to_edge + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirror_clamp_to_edge", 28)) + { + ret = GLEW_ARB_texture_mirror_clamp_to_edge; + continue; + } +#endif #ifdef GL_ARB_texture_mirrored_repeat if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirrored_repeat", 23)) { @@ -13834,6 +15625,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_ARB_texture_stencil8 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_stencil8", 16)) + { + ret = GLEW_ARB_texture_stencil8; + continue; + } +#endif #ifdef GL_ARB_texture_storage if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_storage", 15)) { @@ -13960,6 +15758,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_ARB_vertex_type_10f_11f_11f_rev + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_type_10f_11f_11f_rev", 27)) + { + ret = GLEW_ARB_vertex_type_10f_11f_11f_rev; + continue; + } +#endif #ifdef GL_ARB_vertex_type_2_10_10_10_rev if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_type_2_10_10_10_rev", 26)) { @@ -14950,6 +16755,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) } if (_glewStrSame2(&pos, &len, (const GLubyte*)"INTEL_", 6)) { +#ifdef GL_INTEL_map_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_texture", 11)) + { + ret = GLEW_INTEL_map_texture; + continue; + } +#endif #ifdef GL_INTEL_parallel_arrays if (_glewStrSame3(&pos, &len, (const GLubyte*)"parallel_arrays", 15)) { @@ -15035,6 +16847,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) } if (_glewStrSame2(&pos, &len, (const GLubyte*)"NVX_", 4)) { +#ifdef GL_NVX_conditional_render + if (_glewStrSame3(&pos, &len, (const GLubyte*)"conditional_render", 18)) + { + ret = GLEW_NVX_conditional_render; + continue; + } +#endif #ifdef GL_NVX_gpu_memory_info if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_memory_info", 15)) { @@ -15045,6 +16864,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) } if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3)) { +#ifdef GL_NV_bindless_multi_draw_indirect + if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_multi_draw_indirect", 28)) + { + ret = GLEW_NV_bindless_multi_draw_indirect; + continue; + } +#endif #ifdef GL_NV_bindless_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_texture", 16)) { @@ -15052,6 +16878,20 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_NV_blend_equation_advanced + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced", 23)) + { + ret = GLEW_NV_blend_equation_advanced; + continue; + } +#endif +#ifdef GL_NV_blend_equation_advanced_coherent + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced_coherent", 32)) + { + ret = GLEW_NV_blend_equation_advanced_coherent; + continue; + } +#endif #ifdef GL_NV_blend_square if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_square", 12)) { @@ -15059,6 +16899,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_NV_compute_program5 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"compute_program5", 16)) + { + ret = GLEW_NV_compute_program5; + continue; + } +#endif #ifdef GL_NV_conditional_render if (_glewStrSame3(&pos, &len, (const GLubyte*)"conditional_render", 18)) { @@ -15080,6 +16927,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_NV_deep_texture3D + if (_glewStrSame3(&pos, &len, (const GLubyte*)"deep_texture3D", 14)) + { + ret = GLEW_NV_deep_texture3D; + continue; + } +#endif #ifdef GL_NV_depth_buffer_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_buffer_float", 18)) { @@ -15101,6 +16955,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_NV_draw_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_texture", 12)) + { + ret = GLEW_NV_draw_texture; + continue; + } +#endif #ifdef GL_NV_evaluators if (_glewStrSame3(&pos, &len, (const GLubyte*)"evaluators", 10)) { @@ -15199,6 +17060,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_NV_gpu_program5_mem_extended + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program5_mem_extended", 25)) + { + ret = GLEW_NV_gpu_program5_mem_extended; + continue; + } +#endif #ifdef GL_NV_gpu_program_fp64 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program_fp64", 16)) { @@ -15318,6 +17186,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_NV_shader_atomic_counters + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_counters", 22)) + { + ret = GLEW_NV_shader_atomic_counters; + continue; + } +#endif #ifdef GL_NV_shader_atomic_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_float", 19)) { @@ -15332,6 +17207,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_NV_shader_storage_buffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_storage_buffer_object", 28)) + { + ret = GLEW_NV_shader_storage_buffer_object; + continue; + } +#endif #ifdef GL_NV_tessellation_program5 if (_glewStrSame3(&pos, &len, (const GLubyte*)"tessellation_program5", 21)) { @@ -15589,6 +17471,27 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) } if (_glewStrSame2(&pos, &len, (const GLubyte*)"REGAL_", 6)) { +#ifdef GL_REGAL_ES1_0_compatibility + if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES1_0_compatibility", 19)) + { + ret = GLEW_REGAL_ES1_0_compatibility; + continue; + } +#endif +#ifdef GL_REGAL_ES1_1_compatibility + if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES1_1_compatibility", 19)) + { + ret = GLEW_REGAL_ES1_1_compatibility; + continue; + } +#endif +#ifdef GL_REGAL_enable + if (_glewStrSame3(&pos, &len, (const GLubyte*)"enable", 6)) + { + ret = GLEW_REGAL_enable; + continue; + } +#endif #ifdef GL_REGAL_error_string if (_glewStrSame3(&pos, &len, (const GLubyte*)"error_string", 12)) { @@ -16205,6 +18108,20 @@ GLboolean GLEWAPIENTRY wglewIsSupported (const char* name) ret = WGLEW_ARB_render_texture; continue; } +#endif +#ifdef WGL_ARB_robustness_application_isolation + if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_application_isolation", 32)) + { + ret = WGLEW_ARB_robustness_application_isolation; + continue; + } +#endif +#ifdef WGL_ARB_robustness_share_group_isolation + if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_share_group_isolation", 32)) + { + ret = WGLEW_ARB_robustness_share_group_isolation; + continue; + } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATI_", 4)) @@ -16473,7 +18390,7 @@ GLboolean GLEWAPIENTRY wglewIsSupported (const char* name) return ret; } -#elif !defined(__ANDROID__) && !defined(__APPLE__) || defined(GLEW_APPLE_GLX) +#elif !defined(__ANDROID__) && !defined(__native_client__) && !defined(__APPLE__) || defined(GLEW_APPLE_GLX) #if defined(GLEW_MX) GLboolean glxewContextIsSupported (const GLXEWContext* ctx, const char* name) @@ -16624,6 +18541,13 @@ GLboolean glxewIsSupported (const char* name) } if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4)) { +#ifdef GLX_EXT_buffer_age + if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_age", 10)) + { + ret = GLXEW_EXT_buffer_age; + continue; + } +#endif #ifdef GLX_EXT_create_context_es2_profile if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es2_profile", 26)) { @@ -16808,10 +18732,10 @@ GLboolean glxewIsSupported (const char* name) continue; } #endif -#ifdef GLX_NV_video_out - if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_out", 9)) +#ifdef GLX_NV_video_output + if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_output", 12)) { - ret = GLXEW_NV_video_out; + ret = GLXEW_NV_video_output; continue; } #endif diff --git a/btgui/OpenGLWindow/GwenOpenGL3CoreRenderer.h b/btgui/OpenGLWindow/GwenOpenGL3CoreRenderer.h index e938ad453..cb3f06e20 100644 --- a/btgui/OpenGLWindow/GwenOpenGL3CoreRenderer.h +++ b/btgui/OpenGLWindow/GwenOpenGL3CoreRenderer.h @@ -83,7 +83,7 @@ public: { TwDeleteDefaultFonts(); } - void resize(int width, int height) + virtual void Resize(int width, int height) { m_screenWidth = width; m_screenHeight = height; @@ -208,8 +208,8 @@ public: // //printf("str = %s\n",unicodeText); - int xpos=0; - int ypos=0; + //int xpos=0; + //int ypos=0; float dx; int measureOnly=0; @@ -232,7 +232,7 @@ public: { //float width = 0.f; int pos=0; - float color[]={0.2f,0.2,0.2f,1.f}; + //float color[]={0.2f,0.2,0.2f,1.f}; glBindTexture(GL_TEXTURE_2D,m_fontTextureId); float width = r.x; @@ -299,7 +299,7 @@ public: int pos=0; while (unicodeText[pos]) { - width += m_currentFont->m_CharWidth[unicodeText[pos]]+extraSpacing; + width += m_currentFont->m_CharWidth[(int)unicodeText[pos]]+extraSpacing; pos++; } Gwen::Point pt; @@ -318,4 +318,4 @@ public: }; -#endif //__GWEN_OPENGL3_CORE_RENDERER_H \ No newline at end of file +#endif //__GWEN_OPENGL3_CORE_RENDERER_H diff --git a/btgui/OpenGLWindow/LoadShader.cpp b/btgui/OpenGLWindow/LoadShader.cpp index aa2971337..efef4550a 100644 --- a/btgui/OpenGLWindow/LoadShader.cpp +++ b/btgui/OpenGLWindow/LoadShader.cpp @@ -9,7 +9,7 @@ void gltLoadShaderSrc(const char *szShaderSrc, GLuint shader) { GLchar *fsStringPtr[1]; - + fsStringPtr[0] = (GLchar *)szShaderSrc; glShaderSource(shader, 1, (const GLchar **)fsStringPtr, NULL); } @@ -17,29 +17,27 @@ void gltLoadShaderSrc(const char *szShaderSrc, GLuint shader) GLuint gltLoadShaderPair(const char *szVertexProg, const char *szFragmentProg) { + + GLuint err = glGetError(); + assert(err==GL_NO_ERROR); + // Temporary Shader objects GLuint hVertexShader; GLuint hFragmentShader; GLuint hReturn = 0; GLint testVal; - + // Create shader objects hVertexShader = glCreateShader(GL_VERTEX_SHADER); hFragmentShader = glCreateShader(GL_FRAGMENT_SHADER); - + gltLoadShaderSrc(szVertexProg, hVertexShader); gltLoadShaderSrc(szFragmentProg, hFragmentShader); - + // Compile them glCompileShader(hVertexShader); - GLuint err = glGetError(); - assert(err==GL_NO_ERROR); - - glCompileShader(hFragmentShader); err = glGetError(); - assert(err==GL_NO_ERROR); - - // Check for errors + glGetShaderiv(hVertexShader, GL_COMPILE_STATUS, &testVal); if(testVal == GL_FALSE) { @@ -52,8 +50,13 @@ GLuint gltLoadShaderPair(const char *szVertexProg, const char *szFragmentProg) glDeleteShader(hFragmentShader); return (GLuint)NULL; } - - glGetShaderiv(hFragmentShader, GL_COMPILE_STATUS, &testVal); + + assert(err==GL_NO_ERROR); + + glCompileShader(hFragmentShader); + err = glGetError(); + + glGetShaderiv(hFragmentShader, GL_COMPILE_STATUS, &testVal); if(testVal == GL_FALSE) { char temp[256] = ""; @@ -65,18 +68,25 @@ GLuint gltLoadShaderPair(const char *szVertexProg, const char *szFragmentProg) glDeleteShader(hFragmentShader); return (GLuint)NULL; } - + + assert(err==GL_NO_ERROR); + + // Check for errors + + + + // Link them - assuming it works... hReturn = glCreateProgram(); glAttachShader(hReturn, hVertexShader); glAttachShader(hReturn, hFragmentShader); - + glLinkProgram(hReturn); - + // These are no longer needed glDeleteShader(hVertexShader); glDeleteShader(hFragmentShader); - + // Make sure link worked too glGetProgramiv(hReturn, GL_LINK_STATUS, &testVal); if(testVal == GL_FALSE) @@ -84,7 +94,7 @@ GLuint gltLoadShaderPair(const char *szVertexProg, const char *szFragmentProg) GLsizei maxLen = 4096; GLchar infoLog[4096]; GLsizei actualLen; - + glGetProgramInfoLog( hReturn, maxLen, &actualLen, @@ -95,8 +105,8 @@ GLuint gltLoadShaderPair(const char *szVertexProg, const char *szFragmentProg) glDeleteProgram(hReturn); return (GLuint)NULL; } - - return hReturn; + + return hReturn; } diff --git a/btgui/OpenGLWindow/MacOpenGLWindow.mm b/btgui/OpenGLWindow/MacOpenGLWindow.mm index d765a4e78..8cab0de5e 100644 --- a/btgui/OpenGLWindow/MacOpenGLWindow.mm +++ b/btgui/OpenGLWindow/MacOpenGLWindow.mm @@ -91,6 +91,7 @@ float loop; // Get view dimensions in pixels // glViewport(0,0,10,10); + if (m_resizeCallback) { (*m_resizeCallback)(width,height); @@ -329,6 +330,7 @@ void MacOpenGLWindow::createWindow(const b3gWindowConstructionInfo& ci) m_internalData->m_myview = [TestView alloc]; [m_internalData->m_myview setResizeCallback:0]; + ///ci.m_resizeCallback]; [m_internalData->m_myview initWithFrame: frame]; @@ -337,8 +339,10 @@ void MacOpenGLWindow::createWindow(const b3gWindowConstructionInfo& ci) // https://developer.apple.com/library/mac/#documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/CapturingScreenContents/CapturingScreenContents.html#//apple_ref/doc/uid/TP40012302-CH10-SW1 //support HighResolutionOSX for Retina Macbook - [m_internalData->m_myview setWantsBestResolutionOpenGLSurface:YES]; - + if (ci.m_openglVersion>=3) + { + [m_internalData->m_myview setWantsBestResolutionOpenGLSurface:YES]; + } NSSize sz; sz.width = 1; sz.height = 1; @@ -352,27 +356,18 @@ void MacOpenGLWindow::createWindow(const b3gWindowConstructionInfo& ci) [m_internalData->m_window setContentView: m_internalData->m_myview]; - GLuint n = 1; - GLuint vbo[3]={-1,-1,-1}; - - glGenBuffers(n, vbo); - checkError("glGenBuffers"); - + [m_internalData->m_window setDelegate:(id) m_internalData->m_myview]; - glGenBuffers(n, vbo); - checkError("glGenBuffers"); - + [m_internalData->m_window makeKeyAndOrderFront: nil]; [m_internalData->m_myview MakeCurrent]; + m_internalData->m_width = m_internalData->m_myview.GetWindowWidth; + m_internalData->m_height = m_internalData->m_myview.GetWindowHeight; - glGenBuffers(n, vbo); - checkError("glGenBuffers"); [NSApp activateIgnoringOtherApps:YES]; - glGenBuffers(n, vbo); - checkError("glGenBuffers"); //[m_internalData->m_window setLevel:NSMainMenuWindowLevel]; @@ -589,32 +584,32 @@ int getAsciiCodeFromVirtualKeycode(int virtualKeyCode) switch (virtualKeyCode) { - case kVK_ANSI_A : {keycode = 'A'; break;} - case kVK_ANSI_B : {keycode = 'B'; break;} - case kVK_ANSI_C : {keycode = 'C'; break;} - case kVK_ANSI_D : {keycode = 'D';break;} - case kVK_ANSI_E : {keycode = 'E'; break;} - case kVK_ANSI_F : {keycode = 'F'; break;} - case kVK_ANSI_G : {keycode = 'G'; break;} - case kVK_ANSI_H : {keycode = 'H'; break;} - case kVK_ANSI_I : {keycode = 'I'; break;} - case kVK_ANSI_J : {keycode = 'J'; break;} - case kVK_ANSI_K : {keycode = 'K'; break;} - case kVK_ANSI_L : {keycode = 'L'; break;} - case kVK_ANSI_M : {keycode = 'M'; break;} - case kVK_ANSI_N : {keycode = 'N'; break;} - case kVK_ANSI_O : {keycode = 'O'; break;} - case kVK_ANSI_P : {keycode = 'P'; break;} - case kVK_ANSI_Q : {keycode = 'Q'; break;} - case kVK_ANSI_R : {keycode = 'R'; break;} - case kVK_ANSI_S : {keycode = 'S';break;} - case kVK_ANSI_T : {keycode = 'T'; break;} - case kVK_ANSI_U : {keycode = 'U'; break;} - case kVK_ANSI_V : {keycode = 'V'; break;} - case kVK_ANSI_W : {keycode = 'W'; break;} - case kVK_ANSI_X : {keycode = 'X'; break;} - case kVK_ANSI_Y : {keycode = 'Y'; break;} - case kVK_ANSI_Z : {keycode = 'Z'; break;} + case kVK_ANSI_A : {keycode = 'a'; break;} + case kVK_ANSI_B : {keycode = 'b'; break;} + case kVK_ANSI_C : {keycode = 'c'; break;} + case kVK_ANSI_D : {keycode = 'd';break;} + case kVK_ANSI_E : {keycode = 'e'; break;} + case kVK_ANSI_F : {keycode = 'f'; break;} + case kVK_ANSI_G : {keycode = 'g'; break;} + case kVK_ANSI_H : {keycode = 'h'; break;} + case kVK_ANSI_I : {keycode = 'i'; break;} + case kVK_ANSI_J : {keycode = 'j'; break;} + case kVK_ANSI_K : {keycode = 'k'; break;} + case kVK_ANSI_L : {keycode = 'l'; break;} + case kVK_ANSI_M : {keycode = 'm'; break;} + case kVK_ANSI_N : {keycode = 'n'; break;} + case kVK_ANSI_O : {keycode = 'o'; break;} + case kVK_ANSI_P : {keycode = 'p'; break;} + case kVK_ANSI_Q : {keycode = 'q'; break;} + case kVK_ANSI_R : {keycode = 'r'; break;} + case kVK_ANSI_S : {keycode = 's';break;} + case kVK_ANSI_T : {keycode = 't'; break;} + case kVK_ANSI_U : {keycode = 'u'; break;} + case kVK_ANSI_V : {keycode = 'v'; break;} + case kVK_ANSI_W : {keycode = 'w'; break;} + case kVK_ANSI_X : {keycode = 'x'; break;} + case kVK_ANSI_Y : {keycode = 'y'; break;} + case kVK_ANSI_Z : {keycode = 'z'; break;} case kVK_ANSI_1 : {keycode = '1'; break;} case kVK_ANSI_2 : {keycode = '2'; break;} @@ -678,7 +673,7 @@ int getAsciiCodeFromVirtualKeycode(int virtualKeyCode) case kVK_ANSI_KeypadPlus : {keycode = '+'; break;} case kVK_ANSI_KeypadClear : {keycode = '?'; break;} case kVK_ANSI_KeypadDivide : {keycode = '/'; break;} - case kVK_ANSI_KeypadEnter : {keycode = 13; break;} + case kVK_ANSI_KeypadEnter : {keycode = B3G_RETURN; break;} case kVK_ANSI_KeypadMinus : {keycode = '-'; break;} case kVK_ANSI_KeypadEquals : {keycode = '='; break;} case kVK_ANSI_Keypad0 : {keycode = '0'; break;} @@ -691,7 +686,11 @@ int getAsciiCodeFromVirtualKeycode(int virtualKeyCode) case kVK_ANSI_Keypad7 : {keycode = '7'; break;} case kVK_ANSI_Keypad8 : {keycode = '8'; break;} case kVK_ANSI_Keypad9 : {keycode = '9'; break;} - + case kVK_Return: + { + keycode = B3G_RETURN; break; + } + default: { @@ -943,7 +942,7 @@ void MacOpenGLWindow::startRendering() assert(err==GL_NO_ERROR); - glClearColor(1,1,1,1); + // glClearColor(1,1,1,1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); //clear buffers err = glGetError(); @@ -1012,6 +1011,10 @@ void MacOpenGLWindow::getMouseCoordinates(int& x, int& y) void MacOpenGLWindow::setResizeCallback(b3ResizeCallback resizeCallback) { [m_internalData->m_myview setResizeCallback:resizeCallback]; + if (resizeCallback) + { + (resizeCallback)(m_internalData->m_width,m_internalData->m_height); + } } diff --git a/btgui/OpenGLWindow/OpenGLInclude.h b/btgui/OpenGLWindow/OpenGLInclude.h index 665bdd725..19d4f3725 100644 --- a/btgui/OpenGLWindow/OpenGLInclude.h +++ b/btgui/OpenGLWindow/OpenGLInclude.h @@ -1,10 +1,10 @@ /* -Copyright (c) 2012 Advanced Micro Devices, Inc. +Copyright (c) 2012 Advanced Micro Devices, 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, +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. @@ -22,19 +22,19 @@ subject to the following restrictions: #if defined(__APPLE__) && !defined (VMDMESA) #include //#include -#include +//#include //#import #include #else -#include +#include "GlewWindows/GL/glew.h" #ifdef _WINDOWS #include -#include -#include +//#include +//#include #else -#include +//#include //#include #endif //_WINDOWS #endif //APPLE diff --git a/btgui/OpenGLWindow/Shaders/createShadowMapInstancingVS.h b/btgui/OpenGLWindow/Shaders/createShadowMapInstancingVS.h index 2a8aef96b..58fc1da51 100644 --- a/btgui/OpenGLWindow/Shaders/createShadowMapInstancingVS.h +++ b/btgui/OpenGLWindow/Shaders/createShadowMapInstancingVS.h @@ -5,9 +5,6 @@ static const char* createShadowMapInstancingVertexShader= \ "layout (location = 0) in vec4 position;\n" "layout (location = 1) in vec4 instance_position;\n" "layout (location = 2) in vec4 instance_quaternion;\n" -"layout (location = 3) in vec2 uvcoords;\n" -"layout (location = 4) in vec3 vertexnormal;\n" -"layout (location = 5) in vec4 instance_color;\n" "layout (location = 6) in vec3 instance_scale;\n" "uniform mat4 depthMVP;\n" "vec4 quatMul ( in vec4 q1, in vec4 q2 )\n" diff --git a/btgui/OpenGLWindow/Shaders/useShadowMapInstancingVS.glsl b/btgui/OpenGLWindow/Shaders/useShadowMapInstancingVS.glsl index 7d175fb57..fe16aaf4c 100644 --- a/btgui/OpenGLWindow/Shaders/useShadowMapInstancingVS.glsl +++ b/btgui/OpenGLWindow/Shaders/useShadowMapInstancingVS.glsl @@ -15,6 +15,7 @@ uniform mat4 ModelViewMatrix; uniform mat4 ProjectionMatrix; uniform mat4 DepthBiasModelViewProjectionMatrix; uniform mat4 MVP; +uniform vec3 lightDirIn; out vec4 ShadowCoord; @@ -65,13 +66,12 @@ void main(void) { vec4 q = instance_quaternion; ambient = vec3(0.3,.3,0.3); - - + vec4 worldNormal = (quatRotate3( vertexnormal,q)); - vec3 light_pos = vec3(-5.f,100,-40); + normal = normalize(worldNormal).xyz; - lightDir = normalize(light_pos);//gl_LightSource[0].position.xyz)); + lightDir = lightDirIn; vec4 axis = vec4(1,1,1,0); vec4 localcoord = quatRotate3( position.xyz*instance_scale,q); diff --git a/btgui/OpenGLWindow/Shaders/useShadowMapInstancingVS.h b/btgui/OpenGLWindow/Shaders/useShadowMapInstancingVS.h index f8ed25a2d..8c2ee8765 100644 --- a/btgui/OpenGLWindow/Shaders/useShadowMapInstancingVS.h +++ b/btgui/OpenGLWindow/Shaders/useShadowMapInstancingVS.h @@ -13,6 +13,7 @@ static const char* useShadowMapInstancingVertexShader= \ "uniform mat4 ProjectionMatrix;\n" "uniform mat4 DepthBiasModelViewProjectionMatrix;\n" "uniform mat4 MVP;\n" +"uniform vec3 lightDirIn;\n" "out vec4 ShadowCoord;\n" "out Fragment\n" "{\n" @@ -55,12 +56,11 @@ static const char* useShadowMapInstancingVertexShader= \ "{\n" " vec4 q = instance_quaternion;\n" " ambient = vec3(0.3,.3,0.3);\n" -" \n" -" \n" +" \n" " vec4 worldNormal = (quatRotate3( vertexnormal,q));\n" -" vec3 light_pos = vec3(-5.f,100,-40);\n" +" \n" " normal = normalize(worldNormal).xyz;\n" -" lightDir = normalize(light_pos);//gl_LightSource[0].position.xyz));\n" +" lightDir = lightDirIn;\n" " \n" " vec4 axis = vec4(1,1,1,0);\n" " vec4 localcoord = quatRotate3( position.xyz*instance_scale,q);\n" diff --git a/btgui/OpenGLWindow/ShapeData.h b/btgui/OpenGLWindow/ShapeData.h index 1325fbf2b..f538f1e5f 100644 --- a/btgui/OpenGLWindow/ShapeData.h +++ b/btgui/OpenGLWindow/ShapeData.h @@ -1,6 +1,7 @@ #ifndef SHAPE_DATA_H #define SHAPE_DATA_H +#ifdef USE_BARREL_VERTICES static float barrel_vertices[] = { 0.0f,-0.5f,0.0f, 1.0f, 0.0f,-1.0f,0.0f, 0.5f, 0.5f, 0.282362f,-0.5f,-0.205148f, 1.0f, 0.0f,-1.0f,0.0f, 0.5f, 0.5f, @@ -125,7 +126,7 @@ static int barrel_indices[] = { 44,47,56, 44,26,47, }; - +#endif //USE_BARREL_VERTICES ///position xyz, unused w, normal, uv static const float cube_vertices[] = diff --git a/btgui/OpenGLWindow/SimpleOpenGL3App.cpp b/btgui/OpenGLWindow/SimpleOpenGL3App.cpp index 8bb2b47a6..80799a12f 100644 --- a/btgui/OpenGLWindow/SimpleOpenGL3App.cpp +++ b/btgui/OpenGLWindow/SimpleOpenGL3App.cpp @@ -1,11 +1,11 @@ #include "SimpleOpenGL3App.h" #include "ShapeData.h" - #ifdef __APPLE__ #include "OpenGLWindow/MacOpenGLWindow.h" #else -#include "GL/glew.h" +#include "OpenGLWindow/GlewWindows/GL/glew.h" +//#include "GL/glew.h" #ifdef _WIN32 #include "OpenGLWindow/Win32OpenGLWindow.h" #else @@ -13,6 +13,7 @@ #include "OpenGLWindow/X11OpenGLWindow.h" #endif //_WIN32 #endif//__APPLE__ +#include #include "OpenGLWindow/GLPrimitiveRenderer.h" #include "OpenGLWindow/GLInstancingRenderer.h" @@ -20,10 +21,16 @@ #include "Bullet3Common/b3Vector3.h" #include "Bullet3Common/b3Logging.h" -#include "../btgui/OpenGLTrueTypeFont/fontstash.h" -#include "../btgui/OpenGLWindow/TwFonts.h" +#include "OpenGLTrueTypeFont/fontstash.h" +#include "OpenGLWindow/TwFonts.h" #include "OpenGLTrueTypeFont/opengl_fontstashcallbacks.h" #include +#include "GLRenderToTexture.h" + +#ifdef _WIN32 + #define popen _popen + #define pclose _pclose +#endif // _WIN32 struct SimpleInternalData { @@ -31,6 +38,10 @@ struct SimpleInternalData struct sth_stash* m_fontStash; OpenGL2RenderCallbacks* m_renderCallbacks; int m_droidRegular; + const char* m_frameDumpPngFileName; + FILE* m_ffmpegFile; + GLRenderToTexture* m_renderTexture; + void* m_userPointer; }; @@ -40,7 +51,7 @@ void SimpleResizeCallback( float width, float height) { gApp->m_instancingRenderer->resize(width,height); gApp->m_primRenderer->setScreenSize(width,height); - + } static GLuint BindFont(const CTexFont *_Font) @@ -70,25 +81,54 @@ SimpleOpenGL3App::SimpleOpenGL3App( const char* title, int width,int height) { gApp = this; m_data = new SimpleInternalData; + m_data->m_frameDumpPngFileName = 0; + m_data->m_renderTexture = 0; + m_data->m_ffmpegFile = 0; + m_data->m_userPointer = 0; + m_window = new b3gDefaultOpenGLWindow(); b3gWindowConstructionInfo ci; ci.m_title = title; ci.m_width = width; ci.m_height = height; m_window->createWindow(ci); - + m_window->setWindowTitle(title); - glClearColor(1,1,1,1); + + b3Assert(glGetError() ==GL_NO_ERROR); + + glClearColor(0.9,0.9,1,1); m_window->startRendering(); + b3Assert(glGetError() ==GL_NO_ERROR); + #ifndef __APPLE__ - glewInit(); +#ifndef _WIN32 +//some Linux implementations need the 'glewExperimental' to be true + glewExperimental = GL_TRUE; #endif + + if (glewInit() != GLEW_OK) + exit(1); // or handle the error in a nicer way + if (!GLEW_VERSION_2_1) // check that the machine supports the 2.1 API. + exit(1); // or handle the error in a nicer way + +#endif + glGetError();//don't remove this call, it is needed for Ubuntu + + b3Assert(glGetError() ==GL_NO_ERROR); + m_primRenderer = new GLPrimitiveRenderer(width,height); - + m_parameterInterface = 0; + + b3Assert(glGetError() ==GL_NO_ERROR); + m_instancingRenderer = new GLInstancingRenderer(128*1024,4*1024*1024); m_instancingRenderer->init(); m_instancingRenderer->resize(width,height); + + b3Assert(glGetError() ==GL_NO_ERROR); + m_instancingRenderer->InitShaders(); m_window->setMouseMoveCallback(b3DefaultMouseMoveCallback); @@ -102,23 +142,19 @@ SimpleOpenGL3App::SimpleOpenGL3App( const char* title, int width,int height) { - GLint err; - - int datasize; - float sx,sy,dx,dy,lh; - GLuint texture; + + m_data->m_renderCallbacks = new OpenGL2RenderCallbacks(m_primRenderer); m_data->m_fontStash = sth_create(512,512,m_data->m_renderCallbacks);//256,256);//,1024);//512,512); - err = glGetError(); - assert(err==GL_NO_ERROR); + b3Assert(glGetError() ==GL_NO_ERROR); if (!m_data->m_fontStash) { b3Warning("Could not create stash"); //fprintf(stderr, "Could not create stash.\n"); } - int droidRegular=0; + char* data2 = OpenSansData; unsigned char* data = (unsigned char*) data2; @@ -126,8 +162,7 @@ SimpleOpenGL3App::SimpleOpenGL3App( const char* title, int width,int height) { b3Warning("error!\n"); } - err = glGetError(); - assert(err==GL_NO_ERROR); + b3Assert(glGetError() ==GL_NO_ERROR); } } @@ -141,25 +176,25 @@ struct sth_stash* SimpleOpenGL3App::getFontStash() void SimpleOpenGL3App::drawText( const char* txt, int posX, int posY) { - - - - + + + + // //printf("str = %s\n",unicodeText); float dx=0; - - int measureOnly=0; - + + //int measureOnly=0; + glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - + if (1)//m_useTrueTypeFont) { bool measureOnly = false; - + float fontSize= 64;//512;//128; sth_draw_text(m_data->m_fontStash, m_data->m_droidRegular,fontSize,posX,posY, @@ -170,16 +205,16 @@ void SimpleOpenGL3App::drawText( const char* txt, int posX, int posY) { //float width = 0.f; int pos=0; - float color[]={0.2f,0.2,0.2f,1.f}; + //float color[]={0.2f,0.2,0.2f,1.f}; glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D,m_data->m_fontTextureId); - + //float width = r.x; - float extraSpacing = 0.; + //float extraSpacing = 0.; int startX = posX; int startY = posY; - + while (txt[pos]) { @@ -191,7 +226,7 @@ void SimpleOpenGL3App::drawText( const char* txt, int posX, int posY) //Gwen::Rect rect = r; //Translate( rect ); - + float currentColor[]={0.2f,0.2,0.2f,1.f}; m_primRenderer->drawTexturedRect(startX, startY, endX, endY, currentColor,g_DefaultNormalFont->m_CharU0[c],g_DefaultNormalFont->m_CharV0[c],g_DefaultNormalFont->m_CharU1[c],g_DefaultNormalFont->m_CharV1[c]); @@ -201,32 +236,58 @@ void SimpleOpenGL3App::drawText( const char* txt, int posX, int posY) startX = endX; //startY = endY; - + pos++; - + } glBindTexture(GL_TEXTURE_2D,0); } glDisable(GL_BLEND); } -int SimpleOpenGL3App::registerCubeShape() + +struct GfxVertex + { + float x,y,z,w; + float nx,ny,nz; + float u,v; + }; + +int SimpleOpenGL3App::registerCubeShape(float halfExtentsX,float halfExtentsY, float halfExtentsZ) { + + int strideInBytes = 9*sizeof(float); int numVertices = sizeof(cube_vertices)/strideInBytes; int numIndices = sizeof(cube_indices)/sizeof(int); - int shapeId = m_instancingRenderer->registerShape(&cube_vertices[0],numVertices,cube_indices,numIndices); + + b3AlignedObjectArray verts; + verts.resize(numVertices); + for (int i=0;iregisterShape(&verts[0].x,numVertices,cube_indices,numIndices); return shapeId; } int SimpleOpenGL3App::registerGraphicsSphereShape(float radius, bool usePointSprites, int largeSphereThreshold, int mediumSphereThreshold) { - + int strideInBytes = 9*sizeof(float); - + int graphicsShapeIndex = -1; - + if (radius>=largeSphereThreshold) { int numVertices = sizeof(detailed_sphere_vertices)/strideInBytes; @@ -234,7 +295,7 @@ int SimpleOpenGL3App::registerGraphicsSphereShape(float radius, bool usePointSpr graphicsShapeIndex = m_instancingRenderer->registerShape(&detailed_sphere_vertices[0],numVertices,detailed_sphere_indices,numIndices); } else { - + if (usePointSprites) { int numVertices = sizeof(point_sphere_vertices)/strideInBytes; @@ -258,28 +319,95 @@ int SimpleOpenGL3App::registerGraphicsSphereShape(float radius, bool usePointSpr return graphicsShapeIndex; } -void SimpleOpenGL3App::drawGrid(int gridSize, float yOffset) + +void SimpleOpenGL3App::drawGrid(DrawGridData data) { - - b3Vector3 gridColor = b3MakeVector3(0.5,0.5,0.5); + int gridSize = data.gridSize; + float upOffset = data.upOffset; + int upAxis = data.upAxis; + float gridColor[4]; + gridColor[0] = data.gridColor[0]; + gridColor[1] = data.gridColor[1]; + gridColor[2] = data.gridColor[2]; + gridColor[3] = data.gridColor[3]; + + int sideAxis=-1; + int forwardAxis=-1; + + switch (upAxis) + { + case 1: + forwardAxis=2; + sideAxis=0; + break; + case 2: + forwardAxis=1; + sideAxis=0; + break; + default: + b3Assert(0); + }; + //b3Vector3 gridColor = b3MakeVector3(0.5,0.5,0.5); + + b3AlignedObjectArray indices; + b3AlignedObjectArray vertices; + int lineIndex=0; for(int i=-gridSize;i<=gridSize;i++) { - - GLint err = glGetError(); - b3Assert(err==GL_NO_ERROR); - - m_instancingRenderer->drawLine(b3MakeVector3(float(i),yOffset,float(-gridSize)),b3MakeVector3(float(i),yOffset,float(gridSize)),gridColor); - - err = glGetError(); - b3Assert(err==GL_NO_ERROR); - - m_instancingRenderer->drawLine(b3MakeVector3(float(-gridSize),yOffset,float(i)),b3MakeVector3(float(gridSize),yOffset,float(i)),gridColor); + { + b3Assert(glGetError() ==GL_NO_ERROR); + b3Vector3 from = b3MakeVector3(0,0,0); + from[sideAxis] = float(i); + from[upAxis] = upOffset; + from[forwardAxis] = float(-gridSize); + b3Vector3 to=b3MakeVector3(0,0,0); + to[sideAxis] = float(i); + to[upAxis] = upOffset; + to[forwardAxis] = float(gridSize); + vertices.push_back(from); + indices.push_back(lineIndex++); + vertices.push_back(to); + indices.push_back(lineIndex++); + m_instancingRenderer->drawLine(from,to,gridColor); + } + + b3Assert(glGetError() ==GL_NO_ERROR); + { + + b3Assert(glGetError() ==GL_NO_ERROR); + b3Vector3 from=b3MakeVector3(0,0,0); + from[sideAxis] = float(-gridSize); + from[upAxis] = upOffset; + from[forwardAxis] = float(i); + b3Vector3 to=b3MakeVector3(0,0,0); + to[sideAxis] = float(gridSize); + to[upAxis] = upOffset; + to[forwardAxis] = float(i); + vertices.push_back(from); + indices.push_back(lineIndex++); + vertices.push_back(to); + indices.push_back(lineIndex++); + m_instancingRenderer->drawLine(from,to,gridColor); + } + } - + + + /*m_instancingRenderer->drawLines(&vertices[0].x, + gridColor, + vertices.size(),sizeof(b3Vector3),&indices[0],indices.size(),1); + */ + m_instancingRenderer->drawLine(b3MakeVector3(0,0,0),b3MakeVector3(1,0,0),b3MakeVector3(1,0,0),3); m_instancingRenderer->drawLine(b3MakeVector3(0,0,0),b3MakeVector3(0,1,0),b3MakeVector3(0,1,0),3); m_instancingRenderer->drawLine(b3MakeVector3(0,0,0),b3MakeVector3(0,0,1),b3MakeVector3(0,0,1),3); +// void GLInstancingRenderer::drawPoints(const float* positions, const float color[4], int numPoints, int pointStrideInBytes, float pointDrawSize) + + //we don't use drawPoints because all points would have the same color +// b3Vector3 points[3] = { b3MakeVector3(1, 0, 0), b3MakeVector3(0, 1, 0), b3MakeVector3(0, 0, 1) }; +// m_instancingRenderer->drawPoints(&points[0].x, b3MakeVector3(1, 0, 0), 3, sizeof(b3Vector3), 6); + m_instancingRenderer->drawPoint(b3MakeVector3(1,0,0),b3MakeVector3(1,0,0),6); m_instancingRenderer->drawPoint(b3MakeVector3(0,1,0),b3MakeVector3(0,1,0),6); m_instancingRenderer->drawPoint(b3MakeVector3(0,0,1),b3MakeVector3(0,0,1),6); @@ -294,8 +422,143 @@ SimpleOpenGL3App::~SimpleOpenGL3App() delete m_data ; } +//#define STB_IMAGE_WRITE_IMPLEMENTATION +#include "OpenGLTrueTypeFont/stb_image_write.h" +static void writeTextureToFile(int textureWidth, int textureHeight, const char* fileName, FILE* ffmpegVideo) +{ + int numComponents = 4; + //glPixelStorei(GL_PACK_ALIGNMENT,1); + GLuint err=glGetError(); + assert(err==GL_NO_ERROR); + //glReadBuffer(GL_BACK);//COLOR_ATTACHMENT0); + err=glGetError(); + assert(err==GL_NO_ERROR); + float* orgPixels = (float*)malloc(textureWidth*textureHeight*numComponents*4); + glReadPixels(0,0,textureWidth, textureHeight, GL_RGBA, GL_FLOAT, orgPixels); + //it is useful to have the actual float values for debugging purposes + + //convert float->char + char* pixels = (char*)malloc(textureWidth*textureHeight*numComponents); + err=glGetError(); + assert(err==GL_NO_ERROR); + + for (int j=0;jendRendering(); + if (m_data->m_frameDumpPngFileName) + { + writeTextureToFile(m_window->getRetinaScale()*m_instancingRenderer->getScreenWidth(), + m_window->getRetinaScale()*this->m_instancingRenderer->getScreenHeight(),m_data->m_frameDumpPngFileName, + m_data->m_ffmpegFile); + //m_data->m_renderTexture->disable(); + //if (m_data->m_ffmpegFile==0) + //{ + // m_data->m_frameDumpPngFileName = 0; + //} + } m_window->startRendering(); -} \ No newline at end of file +} +// see also http://blog.mmacklin.com/2013/06/11/real-time-video-capture-with-ffmpeg/ +void SimpleOpenGL3App::dumpFramesToVideo(const char* mp4FileName) +{ + int width = m_window->getRetinaScale()*m_instancingRenderer->getScreenWidth(); + int height = m_window->getRetinaScale()*m_instancingRenderer->getScreenHeight(); + char cmd[8192]; + + sprintf(cmd,"ffmpeg -r 60 -f rawvideo -pix_fmt rgba -s %dx%d -i - " + "-threads 0 -y -crf 0 -b 50000k -vf vflip %s",width,height,mp4FileName); + + // sprintf(cmd,"ffmpeg -r 60 -f rawvideo -pix_fmt rgba -s %dx%d -i - " + // "-threads 0 -preset fast -y -crf 21 -vf vflip %s",width,height,mp4FileName); + + if (m_data->m_ffmpegFile) + { + pclose(m_data->m_ffmpegFile); + } + m_data->m_ffmpegFile = popen(cmd, "w"); + + m_data->m_frameDumpPngFileName = mp4FileName; +} +void SimpleOpenGL3App::dumpNextFrameToPng(const char* filename) +{ + + // open pipe to ffmpeg's stdin in binary write mode + + m_data->m_frameDumpPngFileName = filename; + +//you could use m_renderTexture to allow to render at higher resolutions, such as 4k or so + /*if (!m_data->m_renderTexture) + { + m_data->m_renderTexture = new GLRenderToTexture(); + GLuint renderTextureId; + glGenTextures(1, &renderTextureId); + + // "Bind" the newly created texture : all future texture functions will modify this texture + glBindTexture(GL_TEXTURE_2D, renderTextureId); + + // Give an empty image to OpenGL ( the last "0" ) + //glTexImage2D(GL_TEXTURE_2D, 0,GL_RGB, g_OpenGLWidth,g_OpenGLHeight, 0,GL_RGBA, GL_UNSIGNED_BYTE, 0); + //glTexImage2D(GL_TEXTURE_2D, 0,GL_RGBA32F, g_OpenGLWidth,g_OpenGLHeight, 0,GL_RGBA, GL_FLOAT, 0); + glTexImage2D(GL_TEXTURE_2D, 0,GL_RGBA32F, + m_instancingRenderer->getScreenWidth(),m_instancingRenderer->getScreenHeight() + , 0,GL_RGBA, GL_FLOAT, 0); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + m_data->m_renderTexture->init(m_instancingRenderer->getScreenWidth(),this->m_instancingRenderer->getScreenHeight(),renderTextureId, RENDERTEXTURE_COLOR); + } + + bool result = m_data->m_renderTexture->enable(); +*/ +} diff --git a/btgui/OpenGLWindow/SimpleOpenGL3App.h b/btgui/OpenGLWindow/SimpleOpenGL3App.h index be50ee095..adce19245 100644 --- a/btgui/OpenGLWindow/SimpleOpenGL3App.h +++ b/btgui/OpenGLWindow/SimpleOpenGL3App.h @@ -5,6 +5,25 @@ #include "OpenGLWindow/GLPrimitiveRenderer.h" #include "OpenGLWindow/b3gWindowInterface.h" +struct DrawGridData +{ + int gridSize; + float upOffset; + int upAxis; + float gridColor[4]; + + DrawGridData() + :gridSize(10), + upOffset(0.001f), + upAxis(1) + { + gridColor[0] = 0.6f; + gridColor[1] = 0.6f; + gridColor[2] = 0.6f; + gridColor[3] = 1.f; + } +}; + struct SimpleOpenGL3App { struct SimpleInternalData* m_data; @@ -12,18 +31,23 @@ struct SimpleOpenGL3App class b3gWindowInterface* m_window; class GLPrimitiveRenderer* m_primRenderer; class GLInstancingRenderer* m_instancingRenderer; + struct CommonParameterInterface* m_parameterInterface; SimpleOpenGL3App(const char* title, int width,int height); virtual ~SimpleOpenGL3App(); - - int registerCubeShape(); + + int registerCubeShape(float halfExtentsX=1.f,float halfExtentsY=1.f, float halfExtentsZ = 1.f); int registerGraphicsSphereShape(float radius, bool usePointSprites=true, int largeSphereThreshold=100, int mediumSphereThreshold=10); - void drawGrid(int gridSize=10, float yOffset=0.001); + void dumpNextFrameToPng(const char* pngFilename); + void dumpFramesToVideo(const char* mp4Filename); + + void drawGrid(DrawGridData data=DrawGridData()); void swapBuffer(); void drawText( const char* txt, int posX, int posY); struct sth_stash* getFontStash(); + }; #endif //SIMPLE_OPENGL3_APP_H diff --git a/btgui/OpenGLWindow/Win32Window.cpp b/btgui/OpenGLWindow/Win32Window.cpp index b4afe623c..19615e18c 100644 --- a/btgui/OpenGLWindow/Win32Window.cpp +++ b/btgui/OpenGLWindow/Win32Window.cpp @@ -55,8 +55,21 @@ void Win32Window::pumpMessage() int getAsciiCodeFromVirtualKeycode(int virtualKeyCode) { int keycode = 0xffffffff; + if (virtualKeyCode >= '0' && virtualKeyCode <= '9') + { + return virtualKeyCode; + } + if (virtualKeyCode >= 'a' && virtualKeyCode <= 'z') + { + return virtualKeyCode; + } + if (virtualKeyCode >= 'A' && virtualKeyCode <= 'Z') + { + return virtualKeyCode+32;//todo: fix the ascii A vs a input + } switch (virtualKeyCode) { + case VK_RETURN: {keycode = B3G_RETURN; break; }; case VK_F1: {keycode = B3G_F1; break;} case VK_F2: {keycode = B3G_F2; break;} case VK_F3: {keycode = B3G_F3; break;} @@ -126,7 +139,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) case WM_SYSKEYUP: case WM_KEYUP: - { + { int keycode = getAsciiCodeFromVirtualKeycode(wParam); @@ -140,12 +153,15 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) } case WM_CHAR: { - int keycode = wParam; - - if (sData && sData->m_keyboardCallback && ((HIWORD(lParam) & KF_REPEAT) == 0)) + //skip 'enter' key, it is processed in WM_KEYUP/WM_KEYDOWN + int keycode = getAsciiCodeFromVirtualKeycode(wParam); + if (keycode < 0) { - int state = 1; - (*sData->m_keyboardCallback)(keycode,state); + if (sData && sData->m_keyboardCallback && ((HIWORD(lParam) & KF_REPEAT) == 0)) + { + int state = 1; + (*sData->m_keyboardCallback)(wParam, state); + } } return 0; } @@ -154,7 +170,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int keycode = getAsciiCodeFromVirtualKeycode(wParam); - if (keycode>=0 && sData && sData->m_keyboardCallback && ((HIWORD(lParam) & KF_REPEAT) == 0)) + if (keycode>=0 && sData && sData->m_keyboardCallback)// && ((HIWORD(lParam) & KF_REPEAT) == 0)) { int state = 1; (*sData->m_keyboardCallback)(keycode,state); @@ -322,6 +338,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) break; default:{ + } }; diff --git a/btgui/OpenGLWindow/X11OpenGLWindow.cpp b/btgui/OpenGLWindow/X11OpenGLWindow.cpp index 0a525b081..64211f8de 100644 --- a/btgui/OpenGLWindow/X11OpenGLWindow.cpp +++ b/btgui/OpenGLWindow/X11OpenGLWindow.cpp @@ -3,17 +3,113 @@ #include #include -#include -#include -#include +#include "GlewWindows/GL/glew.h" +#ifdef GLEW_DYNAMIC_LOAD_ALL_GLX_FUNCTIONS +#include "GlewWindows/GL/glxew.h" +#else #include -//#include +#endif // GLEW_DYNAMIC_LOAD_ALL_GLX_FUNCTIONS +#include +//#define DYNAMIC_LOAD_X11_FUNCTIONS +#ifdef DYNAMIC_LOAD_X11_FUNCTIONS +#include +#endif //DYNAMIC_LOAD_X11_FUNCTIONS + +//#include +//#include +//#include + +//defined in GL/glxew.h +//#include #include +#include +#include +#include + +#include GLint att[] = { GLX_RGBA, GLX_DEPTH_SIZE, 24, GLX_DOUBLEBUFFER, None }; +static bool forceOpenGL3 = true; + +#ifdef DYNAMIC_LOAD_X11_FUNCTIONS + +///our X11 function typedefs +typedef int (*PFNXFREE)(void*); +typedef XErrorHandler (* PFNXSETERRORHANDLER) (XErrorHandler); +typedef int (* PFNXSYNC) (Display* a,Bool b); +typedef Display* (* PFNXOPENDISPLAY) (_Xconst char* a); +typedef Colormap (*PFNXCREATECOLORMAP) (Display* a,Window b,Visual* c,int d); +typedef Window (*PFNXCREATEWINDOW) (Display* a,Window b,int c,int d,unsigned int e,unsigned int f,unsigned int g,int h,unsigned int i,Visual* j,unsigned long k,XSetWindowAttributes* l); +typedef int (*PFNXMAPWINDOW) (Display*, Window); +typedef int (*PFNXSTORENAME) (Display* a,Window b,_Xconst char* c); +typedef int (*PFNXCLOSEDISPLAY) (Display* a); +typedef int (*PFNXDESTROYWINDOW) (Display* a,Window b); +#if NeedWidePrototypes +typedef KeySym (*PFNXKEYCODETOKEYSYM) (Display* a,unsigned int b,int c); +#else +typedef KeySym (*PFNXKEYCODETOKEYSYM) (Display* a,KeyCode b,int c); +#endif +typedef void (*PFNXCONVERTCASE) (KeySym /* sym */,KeySym * /* lower */,KeySym * /* upper */); +typedef int (*PFNXPENDING) (Display* a); +typedef int (*PFNXNEXTEVENT) (Display* a,XEvent* b); +typedef int (*PFNXEVENTSQUEUED) (Display* a,int b); +typedef int (*PFNXPEEKEVENT) (Display* a,XEvent* b); +typedef KeySym (*PFNXLOOKUPKEYSYM) (XKeyEvent* a,int b); +typedef Status (*PFNXGETWINDOWATTRIBUTES) (Display* a,Window b,XWindowAttributes* c); + +#define X11_LIBRARY "libX11.so.6" + +#define MyXSync m_data->m_x11_XSync +#define MyXSetErrorHandler m_data->m_x11_XSetErrorHandler +#define MyXOpenDisplay m_data->m_x11_XOpenDisplay +#define MyXCreateColormap m_data->m_x11_XCreateColormap +#define MyXCreateWindow m_data->m_x11_XCreateWindow +#define MyXMapWindow m_data->m_x11_XMapWindow +#define MyXStoreName m_data->m_x11_XStoreName +#define MyXDestroyWindow m_data->m_x11_XDestroyWindow +#define MyXCloseDisplay m_data->m_x11_XCloseDisplay +#define MyXKeycodeToKeysym m_data->m_x11_XKeycodeToKeysym +#define MyXConvertCase m_data->m_x11_XConvertCase +#define MyXPending m_data->m_x11_XPending +#define MyXNextEvent m_data->m_x11_XNextEvent +#define MyXEventsQueued m_data->m_x11_XEventsQueued +#define MyXPeekEvent m_data->m_x11_XPeekEvent +#define MyXNextEvent m_data->m_x11_XNextEvent +#define MyXGetWindowAttributes m_data->m_x11_XGetWindowAttributes +#define MyXStoreName m_data->m_x11_XStoreName +#define MyXFree m_data->m_x11_XFree +#define MyXMapWindow m_data->m_x11_XMapWindow +#define MyXStoreName m_data->m_x11_XStoreName +#define MyXLookupKeysym m_data->m_x11_XLookupKeysym + +#else +#define MyXSync XSync +#define MyXSetErrorHandler XSetErrorHandler +#define MyXOpenDisplay XOpenDisplay +#define MyXCreateColormap XCreateColormap +#define MyXCreateWindow XCreateWindow +#define MyXMapWindow XMapWindow +#define MyXStoreName XStoreName +#define MyXDestroyWindow XDestroyWindow +#define MyXCloseDisplay XCloseDisplay +#define MyXKeycodeToKeysym XKeycodeToKeysym +#define MyXConvertCase XConvertCase +#define MyXPending XPending +#define MyXNextEvent XNextEvent +#define MyXEventsQueued XEventsQueued +#define MyXPeekEvent XPeekEvent +#define MyXNextEvent XNextEvent +#define MyXGetWindowAttributes XGetWindowAttributes +#define MyXStoreName XStoreName +#define MyXFree XFree +#define MyXMapWindow XMapWindow +#define MyXStoreName XStoreName +#define MyXLookupKeysym XLookupKeysym + +#endif//DYNAMIC_LOAD_X11_FUNCTIONS struct InternalData2 { Display* m_dpy; @@ -25,8 +121,32 @@ struct InternalData2 GLXContext m_glc; XWindowAttributes m_gwa; XEvent m_xev; + GLXFBConfig m_bestFbc; - b3WheelCallback m_wheelCallback; +#ifdef DYNAMIC_LOAD_X11_FUNCTIONS + //dynamically load stuff + void* m_x11_library; + PFNXFREE m_x11_XFree; + PFNXSETERRORHANDLER m_x11_XSetErrorHandler; + PFNXSYNC m_x11_XSync; + PFNXOPENDISPLAY m_x11_XOpenDisplay; + PFNXCREATECOLORMAP m_x11_XCreateColormap; + PFNXCREATEWINDOW m_x11_XCreateWindow; + PFNXMAPWINDOW m_x11_XMapWindow; + PFNXSTORENAME m_x11_XStoreName; + PFNXCLOSEDISPLAY m_x11_XCloseDisplay; + PFNXDESTROYWINDOW m_x11_XDestroyWindow; + PFNXKEYCODETOKEYSYM m_x11_XKeycodeToKeysym; + PFNXCONVERTCASE m_x11_XConvertCase; + PFNXPENDING m_x11_XPending; + PFNXNEXTEVENT m_x11_XNextEvent; + PFNXEVENTSQUEUED m_x11_XEventsQueued; + PFNXPEEKEVENT m_x11_XPeekEvent; + PFNXLOOKUPKEYSYM m_x11_XLookupKeysym; + PFNXGETWINDOWATTRIBUTES m_x11_XGetWindowAttributes; +#endif //DYNAMIC_LOAD_X11_FUNCTIONS + + b3WheelCallback m_wheelCallback; b3MouseMoveCallback m_mouseMoveCallback; b3MouseButtonCallback m_mouseButtonCallback; b3ResizeCallback m_resizeCallback; @@ -41,10 +161,114 @@ struct InternalData2 m_resizeCallback(0), m_keyboardCallback(0) { +#ifdef DYNAMIC_LOAD_X11_FUNCTIONS + m_x11_library = dlopen(X11_LIBRARY, RTLD_LOCAL | RTLD_NOW); + if (!m_x11_library) + { + printf("Error opening X11 library %s\n", X11_LIBRARY); + exit(0); + } + bool missingFunc = false; + + missingFunc = ((m_x11_XFree = (PFNXFREE) dlsym(m_x11_library, "XFree"))==NULL) | missingFunc; + assert(!missingFunc); + if (missingFunc) { printf("Error: missing func XFree in %s, exiting!\n", X11_LIBRARY); exit(0);} + missingFunc = ((m_x11_XSetErrorHandler = (PFNXSETERRORHANDLER) dlsym(m_x11_library,"XSetErrorHandler"))==NULL) | missingFunc; + if (missingFunc) { printf("Error: missing func XSetErrorHandler in %s, exiting!\n", X11_LIBRARY); exit(0);} + missingFunc = ((m_x11_XSetErrorHandler = (PFNXSETERRORHANDLER) dlsym(m_x11_library,"XSetErrorHandler"))==NULL) | missingFunc; + if (missingFunc) { printf("Error: missing func XSetErrorHandler in %s, exiting!\n", X11_LIBRARY); exit(0);} + missingFunc = ((m_x11_XSync = (PFNXSYNC) dlsym(m_x11_library,"XSync"))==NULL) | missingFunc; + if (missingFunc) { printf("Error: missing func XSync in %s, exiting!\n", X11_LIBRARY); exit(0);} + missingFunc = ((m_x11_XOpenDisplay = (PFNXOPENDISPLAY) dlsym(m_x11_library,"XOpenDisplay"))==NULL) | missingFunc; + if (missingFunc) { printf("Error: missing func XOpenDisplay in %s, exiting!\n", X11_LIBRARY); exit(0);} + missingFunc = ((m_x11_XCreateColormap = (PFNXCREATECOLORMAP) dlsym(m_x11_library,"XCreateColormap"))==NULL) | missingFunc; + if (missingFunc) { printf("Error: missing func XCreateColormap in %s, exiting!\n", X11_LIBRARY); exit(0);} + missingFunc = ((m_x11_XCreateWindow = (PFNXCREATEWINDOW) dlsym(m_x11_library,"XCreateWindow"))==NULL) | missingFunc; + if (missingFunc) { printf("Error: missing func XCreateWindow in %s, exiting!\n", X11_LIBRARY); exit(0);} + missingFunc = ((m_x11_XMapWindow = (PFNXMAPWINDOW) dlsym(m_x11_library,"XMapWindow"))==NULL) | missingFunc; + if (missingFunc) { printf("Error: missing func XMapWindow in %s, exiting!\n", X11_LIBRARY); exit(0);} + missingFunc = ((m_x11_XStoreName = (PFNXSTORENAME) dlsym(m_x11_library,"XStoreName"))==NULL) | missingFunc; + if (missingFunc) { printf("Error: missing func XStoreName in %s, exiting!\n", X11_LIBRARY); exit(0);} + + missingFunc = ((m_x11_XCloseDisplay = (PFNXCLOSEDISPLAY) dlsym(m_x11_library,"XCloseDisplay"))==NULL) | missingFunc; + if (missingFunc) { printf("Error: missing func XCloseDisplay in %s, exiting!\n", X11_LIBRARY); exit(0);} + + missingFunc = ((m_x11_XDestroyWindow = (PFNXDESTROYWINDOW) dlsym(m_x11_library,"XDestroyWindow"))==NULL) | missingFunc; + if (missingFunc) { printf("Error: missing func XMapWindow in %s, exiting!\n", X11_LIBRARY); exit(0);} + + missingFunc = ((m_x11_XKeycodeToKeysym = (PFNXKEYCODETOKEYSYM) dlsym(m_x11_library,"XKeycodeToKeysym"))==NULL) | missingFunc; + if (missingFunc) { printf("Error: missing func XKeycodeToKeysym in %s, exiting!\n", X11_LIBRARY); exit(0);} + missingFunc = ((m_x11_XConvertCase = (PFNXCONVERTCASE) dlsym(m_x11_library,"XConvertCase"))==NULL) | missingFunc; + if (missingFunc) { printf("Error: missing func XConvertCase in %s, exiting!\n", X11_LIBRARY); exit(0);} + missingFunc = ((m_x11_XPending = (PFNXPENDING) dlsym(m_x11_library,"XPending"))==NULL) | missingFunc; + if (missingFunc) { printf("Error: missing func XPending in %s, exiting!\n", X11_LIBRARY); exit(0);} + missingFunc = ((m_x11_XNextEvent = (PFNXNEXTEVENT) dlsym(m_x11_library,"XNextEvent"))==NULL) | missingFunc; + if (missingFunc) { printf("Error: missing func XNextEvent in %s, exiting!\n", X11_LIBRARY); exit(0);} + missingFunc = ((m_x11_XEventsQueued = (PFNXEVENTSQUEUED) dlsym(m_x11_library,"XEventsQueued"))==NULL) | missingFunc; + if (missingFunc) { printf("Error: missing func XEventsQueued in %s, exiting!\n", X11_LIBRARY); exit(0);} + missingFunc = ((m_x11_XPeekEvent = (PFNXPEEKEVENT) dlsym(m_x11_library,"XPeekEvent"))==NULL) | missingFunc; + if (missingFunc) { printf("Error: missing func XPeekEvent in %s, exiting!\n", X11_LIBRARY); exit(0);} + missingFunc = ((m_x11_XLookupKeysym = (PFNXLOOKUPKEYSYM) dlsym(m_x11_library,"XLookupKeysym"))==NULL) | missingFunc; + if (missingFunc) { printf("Error: missing func XLookupKeysym in %s, exiting!\n", X11_LIBRARY); exit(0);} + missingFunc = ((m_x11_XGetWindowAttributes = (PFNXGETWINDOWATTRIBUTES) dlsym(m_x11_library,"XGetWindowAttributes"))==NULL) | missingFunc; + if (missingFunc) { printf("Error: missing func XGetWindowAttributes in %s, exiting!\n", X11_LIBRARY); exit(0);} + + if (missingFunc) + { + printf("Error: a missing func in %s, exiting!\n", X11_LIBRARY); + exit(0); + } else + { + printf("X11 functions dynamically loaded using dlopen/dlsym OK!\n"); + } +#endif //DYNAMIC_LOAD_X11_FUNCTIONS } }; +#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091 +#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092 +typedef GLXContext (*glXCreateContextAttribsARBProc)(Display*, GLXFBConfig, GLXContext, Bool, const int*); + +// Helper to check for extension string presence. Adapted from: +// http://www.opengl.org/resources/features/OGLextensions/ +static bool isExtensionSupported(const char *extList, const char *extension) +{ + const char *start; + const char *where, *terminator; + + /* Extension names should not have spaces. */ + where = strchr(extension, ' '); + if (where || *extension == '\0') + return false; + + /* It takes a bit of care to be fool-proof about parsing the + OpenGL extensions string. Don't be fooled by sub-strings, + etc. */ + for (start=extList;;) { + where = strstr(start, extension); + + if (!where) + break; + + terminator = where + strlen(extension); + + if ( where == start || *(where - 1) == ' ' ) + if ( *terminator == ' ' || *terminator == '\0' ) + return true; + + start = terminator; + } + + return false; +} + +static bool ctxErrorOccurred = false; +static int ctxErrorHandler( Display *dpy, XErrorEvent *ev ) +{ + ctxErrorOccurred = true; + return 0; +} @@ -71,17 +295,151 @@ X11OpenGLWindow::~X11OpenGLWindow() void X11OpenGLWindow::enableOpenGL() { - m_data->m_glc = glXCreateContext(m_data->m_dpy, m_data->m_vi, NULL, GL_TRUE); - glXMakeCurrent(m_data->m_dpy, m_data->m_win, m_data->m_glc); + + if (forceOpenGL3) + { + // Get the default screen's GLX extension list + const char *glxExts = glXQueryExtensionsString( m_data->m_dpy, + DefaultScreen( m_data->m_dpy ) ); + + // NOTE: It is not necessary to create or make current to a context before + // calling glXGetProcAddressARB, unless we dynamically load OpenGL/GLX/X11 + + glXCreateContextAttribsARBProc glXCreateContextAttribsARB = 0; + glXCreateContextAttribsARB = (glXCreateContextAttribsARBProc) + glXGetProcAddressARB( (const GLubyte *) "glXCreateContextAttribsARB" ); + + GLXContext ctx = 0; + + // Install an X error handler so the application won't exit if GL 3.0 + // context allocation fails. + // + // Note this error handler is global. All display connections in all threads + // of a process use the same error handler, so be sure to guard against other + // threads issuing X commands while this code is running. + ctxErrorOccurred = false; + int (*oldHandler)(Display*, XErrorEvent*) = + MyXSetErrorHandler(&ctxErrorHandler); + + // Check for the GLX_ARB_create_context extension string and the function. + // If either is not present, use GLX 1.3 context creation method. + if ( !isExtensionSupported( glxExts, "GLX_ARB_create_context" ) || + !glXCreateContextAttribsARB ) + { + printf( "glXCreateContextAttribsARB() not found" + " ... using old-style GLX context\n" ); + ctx = glXCreateNewContext( m_data->m_dpy, m_data->m_bestFbc, GLX_RGBA_TYPE, 0, True ); + } + + // If it does, try to get a GL 3.0 context! + else + { + int context_attribs[] = { + GLX_CONTEXT_MAJOR_VERSION_ARB ,3, + GLX_CONTEXT_MINOR_VERSION_ARB, 2, + GLX_CONTEXT_FLAGS_ARB, GLX_CONTEXT_DEBUG_BIT_ARB, + GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB,None + }; +/* + int context_attribs[] = + { + GLX_CONTEXT_MAJOR_VERSION_ARB, 3, + GLX_CONTEXT_MINOR_VERSION_ARB, 2, + + //GLX_CONTEXT_FLAGS_ARB , GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB, + None + }; +*/ + printf( "Creating context\n" ); + ctx = glXCreateContextAttribsARB( m_data->m_dpy, m_data->m_bestFbc, 0, + True, context_attribs ); + + // Sync to ensure any errors generated are processed. + MyXSync( m_data->m_dpy, False ); + if ( !ctxErrorOccurred && ctx ) + printf( "Created GL 3.0 context\n" ); + else + { + // Couldn't create GL 3.0 context. Fall back to old-style 2.x context. + // When a context version below 3.0 is requested, implementations will + // return the newest context version compatible with OpenGL versions less + // than version 3.0. + // GLX_CONTEXT_MAJOR_VERSION_ARB = 1 + context_attribs[1] = 1; + // GLX_CONTEXT_MINOR_VERSION_ARB = 0 + context_attribs[3] = 0; + + ctxErrorOccurred = false; + + printf( "Failed to create GL 3.0 context" + " ... using old-style GLX context\n" ); + ctx = glXCreateContextAttribsARB( m_data->m_dpy, m_data->m_bestFbc, 0, + True, context_attribs ); + } + } + + // Sync to ensure any errors generated are processed. + MyXSync( m_data->m_dpy, False ); + + // Restore the original error handler + MyXSetErrorHandler( oldHandler ); + + if ( ctxErrorOccurred || !ctx ) + { + printf( "Failed to create an OpenGL context\n" ); + exit(1); + } + + // Verifying that context is a direct context + if ( ! glXIsDirect ( m_data->m_dpy, ctx ) ) + { + printf( "Indirect GLX rendering context obtained\n" ); + } + else + { + printf( "Direct GLX rendering context obtained\n" ); + } + + printf( "Making context current\n" ); + glXMakeCurrent( m_data->m_dpy, m_data->m_win, ctx ); + + } else + { + m_data->m_glc = glXCreateContext(m_data->m_dpy, m_data->m_vi, NULL, GL_TRUE); + glXMakeCurrent(m_data->m_dpy, m_data->m_win, m_data->m_glc); + } + +#ifdef GLEW_INIT_OPENGL11_FUNCTIONS +{ + GLboolean res = glewOpenGL11Init(); + if (res==0) + { + printf("glewOpenGL11Init OK!\n"); + } else + { + printf("ERROR: glewOpenGL11Init failed, exiting!\n"); + exit(0); + } +} + +#endif //GLEW_INIT_OPENGL11_FUNCTIONS const GLubyte* ven = glGetString(GL_VENDOR); printf("GL_VENDOR=%s\n", ven); + const GLubyte* ren = glGetString(GL_RENDERER); printf("GL_RENDERER=%s\n",ren); const GLubyte* ver = glGetString(GL_VERSION); printf("GL_VERSION=%s\n", ver); const GLubyte* sl = glGetString(GL_SHADING_LANGUAGE_VERSION); printf("GL_SHADING_LANGUAGE_VERSION=%s\n", sl); + +//Access pthreads as a workaround for a bug in Linux/Ubuntu +//See https://bugs.launchpad.net/ubuntu/+source/nvidia-graphics-drivers-319/+bug/1248642 + + int i=pthread_getconcurrency(); + printf("pthread_getconcurrency()=%d\n",i); + // const GLubyte* ext = glGetString(GL_EXTENSIONS); // printf("GL_EXTENSIONS=%s\n", ext); } @@ -95,35 +453,151 @@ void X11OpenGLWindow::disableOpenGL() void X11OpenGLWindow::createWindow(const b3gWindowConstructionInfo& ci) { - m_data->m_dpy = XOpenDisplay(NULL); + + m_data->m_dpy = MyXOpenDisplay(NULL); if(m_data->m_dpy == NULL) { printf("\n\tcannot connect to X server\n\n"); exit(0); } - m_data->m_root = DefaultRootWindow(m_data->m_dpy); + m_data->m_root = DefaultRootWindow(m_data->m_dpy); - m_data->m_vi = glXChooseVisual(m_data->m_dpy, 0, att); - if(m_data->m_vi == NULL) { - printf("\n\tno appropriate visual found\n\n"); +#ifdef GLEW_DYNAMIC_LOAD_ALL_GLX_FUNCTIONS +GLboolean res = glewXInit(); +if (res==0) +{ + printf("glewXInit OK\n"); +} else +{ + printf("glewXInit failed, exit\n"); + exit(0); +} +#endif //GLEW_DYNAMIC_LOAD_ALL_GLX_FUNCTIONS + + + if (ci.m_openglVersion < 3) + { + forceOpenGL3 = false; + } + + if (forceOpenGL3) + { + int glxMinor, glxMajor; + if (!glXQueryVersion(m_data->m_dpy,&glxMajor,&glxMinor) || (((glxMajor==1)&&(glxMinor<3)) || (glxMajor<1))) + { + printf("Invalid GLX version: major %d, minor %d\n",glxMajor,glxMinor); exit(0); - } - else { - printf("\n\tvisual %p selected\n", (void *)m_data->m_vi->visualid); /* %p creates hexadecimal output like in glxinfo */ - } + } + + static int visual_attribs[] = + { + GLX_X_RENDERABLE , True, + GLX_DRAWABLE_TYPE , GLX_WINDOW_BIT, + GLX_RENDER_TYPE , GLX_RGBA_BIT, + GLX_X_VISUAL_TYPE , GLX_TRUE_COLOR, + GLX_RED_SIZE , 8, + GLX_GREEN_SIZE , 8, + GLX_BLUE_SIZE , 8, + GLX_ALPHA_SIZE , 8, + GLX_DEPTH_SIZE , 24, + GLX_STENCIL_SIZE , 8, + GLX_DOUBLEBUFFER , True, + None + }; + int fbcount; + GLXFBConfig* fbc = glXChooseFBConfig(m_data->m_dpy, DefaultScreen(m_data->m_dpy), visual_attribs, &fbcount); + if (!fbc) + { + printf( "Failed to retrieve a framebuffer config\n" ); + exit(1); + } + + int best_fbc = -1, worst_fbc = -1, best_num_samp = -1, worst_num_samp = 999; + + int i; + for (i=0; im_dpy, fbc[i] ); + if ( vi ) + { + int samp_buf, samples; + glXGetFBConfigAttrib( m_data->m_dpy, fbc[i], GLX_SAMPLE_BUFFERS, &samp_buf ); + glXGetFBConfigAttrib( m_data->m_dpy, fbc[i], GLX_SAMPLES , &samples ); + + //printf( " Matching fbconfig %d, visual ID 0x%2x: SAMPLE_BUFFERS = %d," + // " SAMPLES = %d\n", + // i, vi -> visualid, samp_buf, samples ); + + if ( best_fbc < 0 || (samp_buf && (samples > best_num_samp)) ) + best_fbc = i, best_num_samp = samples; + if ( worst_fbc < 0 || (!samp_buf || (samples < worst_num_samp)) ) + worst_fbc = i, worst_num_samp = samples; + } + MyXFree( vi ); + } + + m_data->m_bestFbc = fbc[ best_fbc ]; + // Be sure to free the FBConfig list allocated by glXChooseFBConfig() + MyXFree( fbc ); + + m_data->m_vi = glXGetVisualFromFBConfig( m_data->m_dpy, m_data->m_bestFbc ); - m_data->m_cmap = XCreateColormap(m_data->m_dpy, m_data->m_root, m_data->m_vi->visual, AllocNone); + m_data->m_swa.colormap = m_data->m_cmap = MyXCreateColormap( m_data->m_dpy, + RootWindow( m_data->m_dpy, m_data->m_vi->screen ), + m_data->m_vi->visual, AllocNone ); + m_data->m_swa.background_pixmap = None ; + m_data->m_swa.border_pixel = 0; + m_data->m_swa.event_mask = ExposureMask | KeyReleaseMask | KeyPressMask |ButtonPressMask | ButtonReleaseMask |PointerMotionMask|StructureNotifyMask; +; + m_data->m_root = RootWindow( m_data->m_dpy, m_data->m_vi->screen ); - m_data->m_swa.colormap = m_data->m_cmap; - m_data->m_swa.event_mask = ExposureMask | KeyReleaseMask | KeyPressMask |ButtonPressMask | ButtonReleaseMask |PointerMotionMask|StructureNotifyMask; + m_data->m_win = MyXCreateWindow( m_data->m_dpy, m_data->m_root, + 0, 0, ci.m_width, ci.m_height, 0, m_data->m_vi->depth, InputOutput, + m_data->m_vi->visual, + CWBorderPixel|CWColormap|CWEventMask, &m_data->m_swa ); - m_data->m_win = XCreateWindow(m_data->m_dpy, m_data->m_root, 0, 0, ci.m_width, ci.m_height, 0, m_data->m_vi->depth, InputOutput, m_data->m_vi->visual, CWColormap | CWEventMask, &m_data->m_swa); + //m_data->m_win = m_data->m_x11_XCreateWindow(m_data->m_dpy, m_data->m_root, 0, 0, ci.m_width, ci.m_height, 0, m_data->m_vi->depth, InputOutput, m_data->m_vi->visual, CWColormap | CWEventMask, &m_data->m_swa); - XMapWindow(m_data->m_dpy, m_data->m_win); - XStoreName(m_data->m_dpy, m_data->m_win, "VERY SIMPLE APPLICATION"); + + if (!m_data->m_win) + { + printf("Cannot create window\n"); + exit(0); + } + + MyXMapWindow(m_data->m_dpy, m_data->m_win); + MyXStoreName(m_data->m_dpy, m_data->m_win, "OpenGL3 Window"); + + + } else + { + m_data->m_vi = glXChooseVisual(m_data->m_dpy, 0, att); + + printf("4\n"); + + if(m_data->m_vi == NULL) { + printf("\n\tno appropriate visual found\n\n"); + exit(0); + } + else { + printf("\n\tvisual %p selected\n", (void *)m_data->m_vi->visualid); /* %p creates hexadecimal output like in glxinfo */ + } + + + m_data->m_cmap = MyXCreateColormap(m_data->m_dpy, m_data->m_root, m_data->m_vi->visual, AllocNone); + m_data->m_swa.colormap = m_data->m_cmap; + m_data->m_swa.event_mask = ExposureMask | KeyReleaseMask | KeyPressMask |ButtonPressMask | ButtonReleaseMask |PointerMotionMask|StructureNotifyMask; + m_data->m_win = MyXCreateWindow(m_data->m_dpy, m_data->m_root, 0, 0, ci.m_width, ci.m_height, 0, m_data->m_vi->depth, InputOutput, m_data->m_vi->visual, CWColormap | CWEventMask, &m_data->m_swa); + + MyXMapWindow(m_data->m_dpy, m_data->m_win); + + MyXStoreName(m_data->m_dpy, m_data->m_win, "OpenGL2 Window"); + + + } enableOpenGL(); } @@ -132,25 +606,31 @@ void X11OpenGLWindow::closeWindow() { disableOpenGL(); - XDestroyWindow(m_data->m_dpy, m_data->m_win); - XCloseDisplay(m_data->m_dpy); + MyXDestroyWindow(m_data->m_dpy, m_data->m_win); + MyXCloseDisplay(m_data->m_dpy); } int X11OpenGLWindow::getAsciiCodeFromVirtualKeycode(int keycode) { KeySym key, key_lc, key_uc; - key = XKeycodeToKeysym( m_data->m_dpy, keycode, 0 ); + key = MyXKeycodeToKeysym( m_data->m_dpy, keycode, 0 ); switch( key ) { case XK_Escape: return B3G_ESCAPE; - + case XK_Return: return B3G_RETURN; + case XK_Control_L: case XK_Control_R: { return B3G_CONTROL; - } - case XK_Alt_L: - case XK_Alt_R: + } + case XK_Left: return B3G_LEFT_ARROW; + case XK_Right: return B3G_RIGHT_ARROW; + case XK_Up: return B3G_UP_ARROW; + case XK_Down: return B3G_DOWN_ARROW; + + case XK_Alt_L: + case XK_Alt_R: { return B3G_ALT; } @@ -172,9 +652,9 @@ int X11OpenGLWindow::getAsciiCodeFromVirtualKeycode(int keycode) case XK_F14: return B3G_F14; case XK_F15: return B3G_F15; default: - // Make uppercase - XConvertCase( key, &key_lc, &key_uc ); - key = key_uc; + // Make lowercase + MyXConvertCase( key, &key_lc, &key_uc ); + key = key_lc; // Valid ISO 8859-1 character? if( (key >= 32 && key <= 126) ||(key >= 160 && key <= 255) ) { @@ -191,9 +671,9 @@ void X11OpenGLWindow::pumpMessage() int buttonState = 1; // Process all pending events - while( XPending( m_data->m_dpy ) ) + while( MyXPending( m_data->m_dpy ) ) { - XNextEvent(m_data->m_dpy, &m_data->m_xev); + MyXNextEvent(m_data->m_dpy, &m_data->m_xev); // printf("#"); // fflush(stdout); switch( m_data->m_xev.type ) @@ -218,26 +698,27 @@ void X11OpenGLWindow::pumpMessage() if (m_data->m_keyboardCallback) { - +#if 0 unsigned short is_retriggered = 0; ///filter out keyboard repeat //see http://stackoverflow.com/questions/2100654/ignore-auto-repeat-in-x11-applications - if (XEventsQueued(m_data->m_dpy, QueuedAfterReading)) + if (MyXEventsQueued(m_data->m_dpy, QueuedAfterReading)) { XEvent nev; - XPeekEvent(m_data->m_dpy, &nev); + MyXPeekEvent(m_data->m_dpy, &nev); if (nev.type == KeyPress && nev.xkey.time == m_data->m_xev.xkey.time && nev.xkey.keycode == m_data->m_xev.xkey.keycode) { fprintf (stdout, "key #%ld was retriggered.\n", - (long) XLookupKeysym (&nev.xkey, 0)); + (long) MyXLookupKeysym(&nev.xkey, 0)); // delete retriggered KeyPress event - XNextEvent (m_data->m_dpy, & m_data->m_xev); + MyXNextEvent(m_data->m_dpy, & m_data->m_xev); is_retriggered = 1; } } +#endif int keycode = getAsciiCodeFromVirtualKeycode( m_data->m_xev.xkey.keycode); int state = 0; (*m_data->m_keyboardCallback)(keycode,state); @@ -351,7 +832,7 @@ void X11OpenGLWindow::startRendering() { pumpMessage(); - XGetWindowAttributes(m_data->m_dpy, m_data->m_win, &m_data->m_gwa); + MyXGetWindowAttributes(m_data->m_dpy, m_data->m_win, &m_data->m_gwa); glViewport(0, 0, m_data->m_gwa.width, m_data->m_gwa.height); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); //clear buffers @@ -398,7 +879,7 @@ void X11OpenGLWindow::setRenderCallback( b3RenderCallback renderCallback) void X11OpenGLWindow::setWindowTitle(const char* title) { - XStoreName(m_data->m_dpy, m_data->m_win, title); + MyXStoreName(m_data->m_dpy, m_data->m_win, title); } diff --git a/btgui/OpenGLWindow/b3gWindowInterface.h b/btgui/OpenGLWindow/b3gWindowInterface.h index 2141fd65e..e404e4629 100644 --- a/btgui/OpenGLWindow/b3gWindowInterface.h +++ b/btgui/OpenGLWindow/b3gWindowInterface.h @@ -39,7 +39,8 @@ enum { B3G_BACKSPACE, B3G_SHIFT, B3G_CONTROL, - B3G_ALT + B3G_ALT, + B3G_RETURN }; struct b3gWindowConstructionInfo @@ -51,6 +52,7 @@ struct b3gWindowConstructionInfo void* m_windowHandle; const char* m_title; int m_openglVersion; + b3gWindowConstructionInfo(int width=1024, int height=768) :m_width(width), diff --git a/btgui/OpenGLWindow/premake4.lua b/btgui/OpenGLWindow/premake4.lua index be45bbe0d..100379855 100644 --- a/btgui/OpenGLWindow/premake4.lua +++ b/btgui/OpenGLWindow/premake4.lua @@ -4,7 +4,6 @@ language "C++" kind "StaticLib" - targetdir "../../bin" initOpenGL() initGlew() @@ -43,4 +42,3 @@ "../OpenGLWindow/MacOpenGLWindow.mm", } end - diff --git a/btgui/tinyxml/tinystr.cpp b/btgui/tinyxml/tinystr.cpp new file mode 100755 index 000000000..066576820 --- /dev/null +++ b/btgui/tinyxml/tinystr.cpp @@ -0,0 +1,111 @@ +/* +www.sourceforge.net/projects/tinyxml + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as 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 TIXML_USE_STL + +#include "tinystr.h" + +// Error value for find primitive +const TiXmlString::size_type TiXmlString::npos = static_cast< TiXmlString::size_type >(-1); + + +// Null rep. +TiXmlString::Rep TiXmlString::nullrep_ = { 0, 0, { '\0' } }; + + +void TiXmlString::reserve (size_type cap) +{ + if (cap > capacity()) + { + TiXmlString tmp; + tmp.init(length(), cap); + memcpy(tmp.start(), data(), length()); + swap(tmp); + } +} + + +TiXmlString& TiXmlString::assign(const char* str, size_type len) +{ + size_type cap = capacity(); + if (len > cap || cap > 3*(len + 8)) + { + TiXmlString tmp; + tmp.init(len); + memcpy(tmp.start(), str, len); + swap(tmp); + } + else + { + memmove(start(), str, len); + set_size(len); + } + return *this; +} + + +TiXmlString& TiXmlString::append(const char* str, size_type len) +{ + size_type newsize = length() + len; + if (newsize > capacity()) + { + reserve (newsize + capacity()); + } + memmove(finish(), str, len); + set_size(newsize); + return *this; +} + + +TiXmlString operator + (const TiXmlString & a, const TiXmlString & b) +{ + TiXmlString tmp; + tmp.reserve(a.length() + b.length()); + tmp += a; + tmp += b; + return tmp; +} + +TiXmlString operator + (const TiXmlString & a, const char* b) +{ + TiXmlString tmp; + TiXmlString::size_type b_len = static_cast( strlen(b) ); + tmp.reserve(a.length() + b_len); + tmp += a; + tmp.append(b, b_len); + return tmp; +} + +TiXmlString operator + (const char* a, const TiXmlString & b) +{ + TiXmlString tmp; + TiXmlString::size_type a_len = static_cast( strlen(a) ); + tmp.reserve(a_len + b.length()); + tmp.append(a, a_len); + tmp += b; + return tmp; +} + + +#endif // TIXML_USE_STL diff --git a/btgui/tinyxml/tinystr.h b/btgui/tinyxml/tinystr.h new file mode 100755 index 000000000..89cca3341 --- /dev/null +++ b/btgui/tinyxml/tinystr.h @@ -0,0 +1,305 @@ +/* +www.sourceforge.net/projects/tinyxml + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as 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 TIXML_USE_STL + +#ifndef TIXML_STRING_INCLUDED +#define TIXML_STRING_INCLUDED + +#include +#include + +/* The support for explicit isn't that universal, and it isn't really + required - it is used to check that the TiXmlString class isn't incorrectly + used. Be nice to old compilers and macro it here: +*/ +#if defined(_MSC_VER) && (_MSC_VER >= 1200 ) + // Microsoft visual studio, version 6 and higher. + #define TIXML_EXPLICIT explicit +#elif defined(__GNUC__) && (__GNUC__ >= 3 ) + // GCC version 3 and higher.s + #define TIXML_EXPLICIT explicit +#else + #define TIXML_EXPLICIT +#endif + + +/* + TiXmlString is an emulation of a subset of the std::string template. + Its purpose is to allow compiling TinyXML on compilers with no or poor STL support. + Only the member functions relevant to the TinyXML project have been implemented. + The buffer allocation is made by a simplistic power of 2 like mechanism : if we increase + a string and there's no more room, we allocate a buffer twice as big as we need. +*/ +class TiXmlString +{ + public : + // The size type used + typedef size_t size_type; + + // Error value for find primitive + static const size_type npos; // = -1; + + + // TiXmlString empty constructor + TiXmlString () : rep_(&nullrep_) + { + } + + // TiXmlString copy constructor + TiXmlString ( const TiXmlString & copy) : rep_(0) + { + init(copy.length()); + memcpy(start(), copy.data(), length()); + } + + // TiXmlString constructor, based on a string + TIXML_EXPLICIT TiXmlString ( const char * copy) : rep_(0) + { + init( static_cast( strlen(copy) )); + memcpy(start(), copy, length()); + } + + // TiXmlString constructor, based on a string + TIXML_EXPLICIT TiXmlString ( const char * str, size_type len) : rep_(0) + { + init(len); + memcpy(start(), str, len); + } + + // TiXmlString destructor + ~TiXmlString () + { + quit(); + } + + TiXmlString& operator = (const char * copy) + { + return assign( copy, (size_type)strlen(copy)); + } + + TiXmlString& operator = (const TiXmlString & copy) + { + return assign(copy.start(), copy.length()); + } + + + // += operator. Maps to append + TiXmlString& operator += (const char * suffix) + { + return append(suffix, static_cast( strlen(suffix) )); + } + + // += operator. Maps to append + TiXmlString& operator += (char single) + { + return append(&single, 1); + } + + // += operator. Maps to append + TiXmlString& operator += (const TiXmlString & suffix) + { + return append(suffix.data(), suffix.length()); + } + + + // Convert a TiXmlString into a null-terminated char * + const char * c_str () const { return rep_->str; } + + // Convert a TiXmlString into a char * (need not be null terminated). + const char * data () const { return rep_->str; } + + // Return the length of a TiXmlString + size_type length () const { return rep_->size; } + + // Alias for length() + size_type size () const { return rep_->size; } + + // Checks if a TiXmlString is empty + bool empty () const { return rep_->size == 0; } + + // Return capacity of string + size_type capacity () const { return rep_->capacity; } + + + // single char extraction + const char& at (size_type index) const + { + assert( index < length() ); + return rep_->str[ index ]; + } + + // [] operator + char& operator [] (size_type index) const + { + assert( index < length() ); + return rep_->str[ index ]; + } + + // find a char in a string. Return TiXmlString::npos if not found + size_type find (char lookup) const + { + return find(lookup, 0); + } + + // find a char in a string from an offset. Return TiXmlString::npos if not found + size_type find (char tofind, size_type offset) const + { + if (offset >= length()) return npos; + + for (const char* p = c_str() + offset; *p != '\0'; ++p) + { + if (*p == tofind) return static_cast< size_type >( p - c_str() ); + } + return npos; + } + + void clear () + { + //Lee: + //The original was just too strange, though correct: + // TiXmlString().swap(*this); + //Instead use the quit & re-init: + quit(); + init(0,0); + } + + /* Function to reserve a big amount of data when we know we'll need it. Be aware that this + function DOES NOT clear the content of the TiXmlString if any exists. + */ + void reserve (size_type cap); + + TiXmlString& assign (const char* str, size_type len); + + TiXmlString& append (const char* str, size_type len); + + void swap (TiXmlString& other) + { + Rep* r = rep_; + rep_ = other.rep_; + other.rep_ = r; + } + + private: + + void init(size_type sz) { init(sz, sz); } + void set_size(size_type sz) { rep_->str[ rep_->size = sz ] = '\0'; } + char* start() const { return rep_->str; } + char* finish() const { return rep_->str + rep_->size; } + + struct Rep + { + size_type size, capacity; + char str[1]; + }; + + void init(size_type sz, size_type cap) + { + if (cap) + { + // Lee: the original form: + // rep_ = static_cast(operator new(sizeof(Rep) + cap)); + // doesn't work in some cases of new being overloaded. Switching + // to the normal allocation, although use an 'int' for systems + // that are overly picky about structure alignment. + const size_type bytesNeeded = sizeof(Rep) + cap; + const size_type intsNeeded = ( bytesNeeded + sizeof(int) - 1 ) / sizeof( int ); + rep_ = reinterpret_cast( new int[ intsNeeded ] ); + + rep_->str[ rep_->size = sz ] = '\0'; + rep_->capacity = cap; + } + else + { + rep_ = &nullrep_; + } + } + + void quit() + { + if (rep_ != &nullrep_) + { + // The rep_ is really an array of ints. (see the allocator, above). + // Cast it back before delete, so the compiler won't incorrectly call destructors. + delete [] ( reinterpret_cast( rep_ ) ); + } + } + + Rep * rep_; + static Rep nullrep_; + +} ; + + +inline bool operator == (const TiXmlString & a, const TiXmlString & b) +{ + return ( a.length() == b.length() ) // optimization on some platforms + && ( strcmp(a.c_str(), b.c_str()) == 0 ); // actual compare +} +inline bool operator < (const TiXmlString & a, const TiXmlString & b) +{ + return strcmp(a.c_str(), b.c_str()) < 0; +} + +inline bool operator != (const TiXmlString & a, const TiXmlString & b) { return !(a == b); } +inline bool operator > (const TiXmlString & a, const TiXmlString & b) { return b < a; } +inline bool operator <= (const TiXmlString & a, const TiXmlString & b) { return !(b < a); } +inline bool operator >= (const TiXmlString & a, const TiXmlString & b) { return !(a < b); } + +inline bool operator == (const TiXmlString & a, const char* b) { return strcmp(a.c_str(), b) == 0; } +inline bool operator == (const char* a, const TiXmlString & b) { return b == a; } +inline bool operator != (const TiXmlString & a, const char* b) { return !(a == b); } +inline bool operator != (const char* a, const TiXmlString & b) { return !(b == a); } + +TiXmlString operator + (const TiXmlString & a, const TiXmlString & b); +TiXmlString operator + (const TiXmlString & a, const char* b); +TiXmlString operator + (const char* a, const TiXmlString & b); + + +/* + TiXmlOutStream is an emulation of std::ostream. It is based on TiXmlString. + Only the operators that we need for TinyXML have been developped. +*/ +class TiXmlOutStream : public TiXmlString +{ +public : + + // TiXmlOutStream << operator. + TiXmlOutStream & operator << (const TiXmlString & in) + { + *this += in; + return *this; + } + + // TiXmlOutStream << operator. + TiXmlOutStream & operator << (const char * in) + { + *this += in; + return *this; + } + +} ; + +#endif // TIXML_STRING_INCLUDED +#endif // TIXML_USE_STL diff --git a/btgui/tinyxml/tinyxml.cpp b/btgui/tinyxml/tinyxml.cpp new file mode 100755 index 000000000..9c161dfcb --- /dev/null +++ b/btgui/tinyxml/tinyxml.cpp @@ -0,0 +1,1886 @@ +/* +www.sourceforge.net/projects/tinyxml +Original code by Lee Thomason (www.grinninglizard.com) + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as 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 TIXML_USE_STL +#include +#include +#endif + +#include "tinyxml.h" + +FILE* TiXmlFOpen( const char* filename, const char* mode ); + +bool TiXmlBase::condenseWhiteSpace = true; + +// Microsoft compiler security +FILE* TiXmlFOpen( const char* filename, const char* mode ) +{ + #if defined(_MSC_VER) && (_MSC_VER >= 1400 ) + FILE* fp = 0; + errno_t err = fopen_s( &fp, filename, mode ); + if ( !err && fp ) + return fp; + return 0; + #else + return fopen( filename, mode ); + #endif +} + +void TiXmlBase::EncodeString( const TIXML_STRING& str, TIXML_STRING* outString ) +{ + int i=0; + + while( i<(int)str.length() ) + { + unsigned char c = (unsigned char) str[i]; + + if ( c == '&' + && i < ( (int)str.length() - 2 ) + && str[i+1] == '#' + && str[i+2] == 'x' ) + { + // Hexadecimal character reference. + // Pass through unchanged. + // © -- copyright symbol, for example. + // + // The -1 is a bug fix from Rob Laveaux. It keeps + // an overflow from happening if there is no ';'. + // There are actually 2 ways to exit this loop - + // while fails (error case) and break (semicolon found). + // However, there is no mechanism (currently) for + // this function to return an error. + while ( i<(int)str.length()-1 ) + { + outString->append( str.c_str() + i, 1 ); + ++i; + if ( str[i] == ';' ) + break; + } + } + else if ( c == '&' ) + { + outString->append( entity[0].str, entity[0].strLength ); + ++i; + } + else if ( c == '<' ) + { + outString->append( entity[1].str, entity[1].strLength ); + ++i; + } + else if ( c == '>' ) + { + outString->append( entity[2].str, entity[2].strLength ); + ++i; + } + else if ( c == '\"' ) + { + outString->append( entity[3].str, entity[3].strLength ); + ++i; + } + else if ( c == '\'' ) + { + outString->append( entity[4].str, entity[4].strLength ); + ++i; + } + else if ( c < 32 ) + { + // Easy pass at non-alpha/numeric/symbol + // Below 32 is symbolic. + char buf[ 32 ]; + + #if defined(TIXML_SNPRINTF) + TIXML_SNPRINTF( buf, sizeof(buf), "&#x%02X;", (unsigned) ( c & 0xff ) ); + #else + sprintf( buf, "&#x%02X;", (unsigned) ( c & 0xff ) ); + #endif + + //*ME: warning C4267: convert 'size_t' to 'int' + //*ME: Int-Cast to make compiler happy ... + outString->append( buf, (int)strlen( buf ) ); + ++i; + } + else + { + //char realc = (char) c; + //outString->append( &realc, 1 ); + *outString += (char) c; // somewhat more efficient function call. + ++i; + } + } +} + + +TiXmlNode::TiXmlNode( NodeType _type ) : TiXmlBase() +{ + parent = 0; + type = _type; + firstChild = 0; + lastChild = 0; + prev = 0; + next = 0; +} + + +TiXmlNode::~TiXmlNode() +{ + TiXmlNode* node = firstChild; + TiXmlNode* temp = 0; + + while ( node ) + { + temp = node; + node = node->next; + delete temp; + } +} + + +void TiXmlNode::CopyTo( TiXmlNode* target ) const +{ + target->SetValue (value.c_str() ); + target->userData = userData; + target->location = location; +} + + +void TiXmlNode::Clear() +{ + TiXmlNode* node = firstChild; + TiXmlNode* temp = 0; + + while ( node ) + { + temp = node; + node = node->next; + delete temp; + } + + firstChild = 0; + lastChild = 0; +} + + +TiXmlNode* TiXmlNode::LinkEndChild( TiXmlNode* node ) +{ + assert( node->parent == 0 || node->parent == this ); + assert( node->GetDocument() == 0 || node->GetDocument() == this->GetDocument() ); + + if ( node->Type() == TiXmlNode::TINYXML_DOCUMENT ) + { + delete node; + if ( GetDocument() ) + GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); + return 0; + } + + node->parent = this; + + node->prev = lastChild; + node->next = 0; + + if ( lastChild ) + lastChild->next = node; + else + firstChild = node; // it was an empty list. + + lastChild = node; + return node; +} + + +TiXmlNode* TiXmlNode::InsertEndChild( const TiXmlNode& addThis ) +{ + if ( addThis.Type() == TiXmlNode::TINYXML_DOCUMENT ) + { + if ( GetDocument() ) + GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); + return 0; + } + TiXmlNode* node = addThis.Clone(); + if ( !node ) + return 0; + + return LinkEndChild( node ); +} + + +TiXmlNode* TiXmlNode::InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis ) +{ + if ( !beforeThis || beforeThis->parent != this ) { + return 0; + } + if ( addThis.Type() == TiXmlNode::TINYXML_DOCUMENT ) + { + if ( GetDocument() ) + GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); + return 0; + } + + TiXmlNode* node = addThis.Clone(); + if ( !node ) + return 0; + node->parent = this; + + node->next = beforeThis; + node->prev = beforeThis->prev; + if ( beforeThis->prev ) + { + beforeThis->prev->next = node; + } + else + { + assert( firstChild == beforeThis ); + firstChild = node; + } + beforeThis->prev = node; + return node; +} + + +TiXmlNode* TiXmlNode::InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis ) +{ + if ( !afterThis || afterThis->parent != this ) { + return 0; + } + if ( addThis.Type() == TiXmlNode::TINYXML_DOCUMENT ) + { + if ( GetDocument() ) + GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); + return 0; + } + + TiXmlNode* node = addThis.Clone(); + if ( !node ) + return 0; + node->parent = this; + + node->prev = afterThis; + node->next = afterThis->next; + if ( afterThis->next ) + { + afterThis->next->prev = node; + } + else + { + assert( lastChild == afterThis ); + lastChild = node; + } + afterThis->next = node; + return node; +} + + +TiXmlNode* TiXmlNode::ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis ) +{ + if ( !replaceThis ) + return 0; + + if ( replaceThis->parent != this ) + return 0; + + if ( withThis.ToDocument() ) { + // A document can never be a child. Thanks to Noam. + TiXmlDocument* document = GetDocument(); + if ( document ) + document->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); + return 0; + } + + TiXmlNode* node = withThis.Clone(); + if ( !node ) + return 0; + + node->next = replaceThis->next; + node->prev = replaceThis->prev; + + if ( replaceThis->next ) + replaceThis->next->prev = node; + else + lastChild = node; + + if ( replaceThis->prev ) + replaceThis->prev->next = node; + else + firstChild = node; + + delete replaceThis; + node->parent = this; + return node; +} + + +bool TiXmlNode::RemoveChild( TiXmlNode* removeThis ) +{ + if ( !removeThis ) { + return false; + } + + if ( removeThis->parent != this ) + { + assert( 0 ); + return false; + } + + if ( removeThis->next ) + removeThis->next->prev = removeThis->prev; + else + lastChild = removeThis->prev; + + if ( removeThis->prev ) + removeThis->prev->next = removeThis->next; + else + firstChild = removeThis->next; + + delete removeThis; + return true; +} + +const TiXmlNode* TiXmlNode::FirstChild( const char * _value ) const +{ + const TiXmlNode* node; + for ( node = firstChild; node; node = node->next ) + { + if ( strcmp( node->Value(), _value ) == 0 ) + return node; + } + return 0; +} + + +const TiXmlNode* TiXmlNode::LastChild( const char * _value ) const +{ + const TiXmlNode* node; + for ( node = lastChild; node; node = node->prev ) + { + if ( strcmp( node->Value(), _value ) == 0 ) + return node; + } + return 0; +} + + +const TiXmlNode* TiXmlNode::IterateChildren( const TiXmlNode* previous ) const +{ + if ( !previous ) + { + return FirstChild(); + } + else + { + assert( previous->parent == this ); + return previous->NextSibling(); + } +} + + +const TiXmlNode* TiXmlNode::IterateChildren( const char * val, const TiXmlNode* previous ) const +{ + if ( !previous ) + { + return FirstChild( val ); + } + else + { + assert( previous->parent == this ); + return previous->NextSibling( val ); + } +} + + +const TiXmlNode* TiXmlNode::NextSibling( const char * _value ) const +{ + const TiXmlNode* node; + for ( node = next; node; node = node->next ) + { + if ( strcmp( node->Value(), _value ) == 0 ) + return node; + } + return 0; +} + + +const TiXmlNode* TiXmlNode::PreviousSibling( const char * _value ) const +{ + const TiXmlNode* node; + for ( node = prev; node; node = node->prev ) + { + if ( strcmp( node->Value(), _value ) == 0 ) + return node; + } + return 0; +} + + +void TiXmlElement::RemoveAttribute( const char * name ) +{ + #ifdef TIXML_USE_STL + TIXML_STRING str( name ); + TiXmlAttribute* node = attributeSet.Find( str ); + #else + TiXmlAttribute* node = attributeSet.Find( name ); + #endif + if ( node ) + { + attributeSet.Remove( node ); + delete node; + } +} + +const TiXmlElement* TiXmlNode::FirstChildElement() const +{ + const TiXmlNode* node; + + for ( node = FirstChild(); + node; + node = node->NextSibling() ) + { + if ( node->ToElement() ) + return node->ToElement(); + } + return 0; +} + + +const TiXmlElement* TiXmlNode::FirstChildElement( const char * _value ) const +{ + const TiXmlNode* node; + + for ( node = FirstChild( _value ); + node; + node = node->NextSibling( _value ) ) + { + if ( node->ToElement() ) + return node->ToElement(); + } + return 0; +} + + +const TiXmlElement* TiXmlNode::NextSiblingElement() const +{ + const TiXmlNode* node; + + for ( node = NextSibling(); + node; + node = node->NextSibling() ) + { + if ( node->ToElement() ) + return node->ToElement(); + } + return 0; +} + + +const TiXmlElement* TiXmlNode::NextSiblingElement( const char * _value ) const +{ + const TiXmlNode* node; + + for ( node = NextSibling( _value ); + node; + node = node->NextSibling( _value ) ) + { + if ( node->ToElement() ) + return node->ToElement(); + } + return 0; +} + + +const TiXmlDocument* TiXmlNode::GetDocument() const +{ + const TiXmlNode* node; + + for( node = this; node; node = node->parent ) + { + if ( node->ToDocument() ) + return node->ToDocument(); + } + return 0; +} + + +TiXmlElement::TiXmlElement (const char * _value) + : TiXmlNode( TiXmlNode::TINYXML_ELEMENT ) +{ + firstChild = lastChild = 0; + value = _value; +} + + +#ifdef TIXML_USE_STL +TiXmlElement::TiXmlElement( const std::string& _value ) + : TiXmlNode( TiXmlNode::TINYXML_ELEMENT ) +{ + firstChild = lastChild = 0; + value = _value; +} +#endif + + +TiXmlElement::TiXmlElement( const TiXmlElement& copy) + : TiXmlNode( TiXmlNode::TINYXML_ELEMENT ) +{ + firstChild = lastChild = 0; + copy.CopyTo( this ); +} + + +TiXmlElement& TiXmlElement::operator=( const TiXmlElement& base ) +{ + ClearThis(); + base.CopyTo( this ); + return *this; +} + + +TiXmlElement::~TiXmlElement() +{ + ClearThis(); +} + + +void TiXmlElement::ClearThis() +{ + Clear(); + while( attributeSet.First() ) + { + TiXmlAttribute* node = attributeSet.First(); + attributeSet.Remove( node ); + delete node; + } +} + + +const char* TiXmlElement::Attribute( const char* name ) const +{ + const TiXmlAttribute* node = attributeSet.Find( name ); + if ( node ) + return node->Value(); + return 0; +} + + +#ifdef TIXML_USE_STL +const std::string* TiXmlElement::Attribute( const std::string& name ) const +{ + const TiXmlAttribute* attrib = attributeSet.Find( name ); + if ( attrib ) + return &attrib->ValueStr(); + return 0; +} +#endif + + +const char* TiXmlElement::Attribute( const char* name, int* i ) const +{ + const TiXmlAttribute* attrib = attributeSet.Find( name ); + const char* result = 0; + + if ( attrib ) { + result = attrib->Value(); + if ( i ) { + attrib->QueryIntValue( i ); + } + } + return result; +} + + +#ifdef TIXML_USE_STL +const std::string* TiXmlElement::Attribute( const std::string& name, int* i ) const +{ + const TiXmlAttribute* attrib = attributeSet.Find( name ); + const std::string* result = 0; + + if ( attrib ) { + result = &attrib->ValueStr(); + if ( i ) { + attrib->QueryIntValue( i ); + } + } + return result; +} +#endif + + +const char* TiXmlElement::Attribute( const char* name, double* d ) const +{ + const TiXmlAttribute* attrib = attributeSet.Find( name ); + const char* result = 0; + + if ( attrib ) { + result = attrib->Value(); + if ( d ) { + attrib->QueryDoubleValue( d ); + } + } + return result; +} + + +#ifdef TIXML_USE_STL +const std::string* TiXmlElement::Attribute( const std::string& name, double* d ) const +{ + const TiXmlAttribute* attrib = attributeSet.Find( name ); + const std::string* result = 0; + + if ( attrib ) { + result = &attrib->ValueStr(); + if ( d ) { + attrib->QueryDoubleValue( d ); + } + } + return result; +} +#endif + + +int TiXmlElement::QueryIntAttribute( const char* name, int* ival ) const +{ + const TiXmlAttribute* attrib = attributeSet.Find( name ); + if ( !attrib ) + return TIXML_NO_ATTRIBUTE; + return attrib->QueryIntValue( ival ); +} + + +int TiXmlElement::QueryUnsignedAttribute( const char* name, unsigned* value ) const +{ + const TiXmlAttribute* node = attributeSet.Find( name ); + if ( !node ) + return TIXML_NO_ATTRIBUTE; + + int ival = 0; + int result = node->QueryIntValue( &ival ); + *value = (unsigned)ival; + return result; +} + + +int TiXmlElement::QueryBoolAttribute( const char* name, bool* bval ) const +{ + const TiXmlAttribute* node = attributeSet.Find( name ); + if ( !node ) + return TIXML_NO_ATTRIBUTE; + + int result = TIXML_WRONG_TYPE; + if ( StringEqual( node->Value(), "true", true, TIXML_ENCODING_UNKNOWN ) + || StringEqual( node->Value(), "yes", true, TIXML_ENCODING_UNKNOWN ) + || StringEqual( node->Value(), "1", true, TIXML_ENCODING_UNKNOWN ) ) + { + *bval = true; + result = TIXML_SUCCESS; + } + else if ( StringEqual( node->Value(), "false", true, TIXML_ENCODING_UNKNOWN ) + || StringEqual( node->Value(), "no", true, TIXML_ENCODING_UNKNOWN ) + || StringEqual( node->Value(), "0", true, TIXML_ENCODING_UNKNOWN ) ) + { + *bval = false; + result = TIXML_SUCCESS; + } + return result; +} + + + +#ifdef TIXML_USE_STL +int TiXmlElement::QueryIntAttribute( const std::string& name, int* ival ) const +{ + const TiXmlAttribute* attrib = attributeSet.Find( name ); + if ( !attrib ) + return TIXML_NO_ATTRIBUTE; + return attrib->QueryIntValue( ival ); +} +#endif + + +int TiXmlElement::QueryDoubleAttribute( const char* name, double* dval ) const +{ + const TiXmlAttribute* attrib = attributeSet.Find( name ); + if ( !attrib ) + return TIXML_NO_ATTRIBUTE; + return attrib->QueryDoubleValue( dval ); +} + + +#ifdef TIXML_USE_STL +int TiXmlElement::QueryDoubleAttribute( const std::string& name, double* dval ) const +{ + const TiXmlAttribute* attrib = attributeSet.Find( name ); + if ( !attrib ) + return TIXML_NO_ATTRIBUTE; + return attrib->QueryDoubleValue( dval ); +} +#endif + + +void TiXmlElement::SetAttribute( const char * name, int val ) +{ + TiXmlAttribute* attrib = attributeSet.FindOrCreate( name ); + if ( attrib ) { + attrib->SetIntValue( val ); + } +} + + +#ifdef TIXML_USE_STL +void TiXmlElement::SetAttribute( const std::string& name, int val ) +{ + TiXmlAttribute* attrib = attributeSet.FindOrCreate( name ); + if ( attrib ) { + attrib->SetIntValue( val ); + } +} +#endif + + +void TiXmlElement::SetDoubleAttribute( const char * name, double val ) +{ + TiXmlAttribute* attrib = attributeSet.FindOrCreate( name ); + if ( attrib ) { + attrib->SetDoubleValue( val ); + } +} + + +#ifdef TIXML_USE_STL +void TiXmlElement::SetDoubleAttribute( const std::string& name, double val ) +{ + TiXmlAttribute* attrib = attributeSet.FindOrCreate( name ); + if ( attrib ) { + attrib->SetDoubleValue( val ); + } +} +#endif + + +void TiXmlElement::SetAttribute( const char * cname, const char * cvalue ) +{ + TiXmlAttribute* attrib = attributeSet.FindOrCreate( cname ); + if ( attrib ) { + attrib->SetValue( cvalue ); + } +} + + +#ifdef TIXML_USE_STL +void TiXmlElement::SetAttribute( const std::string& _name, const std::string& _value ) +{ + TiXmlAttribute* attrib = attributeSet.FindOrCreate( _name ); + if ( attrib ) { + attrib->SetValue( _value ); + } +} +#endif + + +void TiXmlElement::Print( FILE* cfile, int depth ) const +{ + int i; + assert( cfile ); + for ( i=0; iNext() ) + { + fprintf( cfile, " " ); + attrib->Print( cfile, depth ); + } + + // There are 3 different formatting approaches: + // 1) An element without children is printed as a node + // 2) An element with only a text child is printed as text + // 3) An element with children is printed on multiple lines. + TiXmlNode* node; + if ( !firstChild ) + { + fprintf( cfile, " />" ); + } + else if ( firstChild == lastChild && firstChild->ToText() ) + { + fprintf( cfile, ">" ); + firstChild->Print( cfile, depth + 1 ); + fprintf( cfile, "", value.c_str() ); + } + else + { + fprintf( cfile, ">" ); + + for ( node = firstChild; node; node=node->NextSibling() ) + { + if ( !node->ToText() ) + { + fprintf( cfile, "\n" ); + } + node->Print( cfile, depth+1 ); + } + fprintf( cfile, "\n" ); + for( i=0; i", value.c_str() ); + } +} + + +void TiXmlElement::CopyTo( TiXmlElement* target ) const +{ + // superclass: + TiXmlNode::CopyTo( target ); + + // Element class: + // Clone the attributes, then clone the children. + const TiXmlAttribute* attribute = 0; + for( attribute = attributeSet.First(); + attribute; + attribute = attribute->Next() ) + { + target->SetAttribute( attribute->Name(), attribute->Value() ); + } + + TiXmlNode* node = 0; + for ( node = firstChild; node; node = node->NextSibling() ) + { + target->LinkEndChild( node->Clone() ); + } +} + +bool TiXmlElement::Accept( TiXmlVisitor* visitor ) const +{ + if ( visitor->VisitEnter( *this, attributeSet.First() ) ) + { + for ( const TiXmlNode* node=FirstChild(); node; node=node->NextSibling() ) + { + if ( !node->Accept( visitor ) ) + break; + } + } + return visitor->VisitExit( *this ); +} + + +TiXmlNode* TiXmlElement::Clone() const +{ + TiXmlElement* clone = new TiXmlElement( Value() ); + if ( !clone ) + return 0; + + CopyTo( clone ); + return clone; +} + + +const char* TiXmlElement::GetText() const +{ + const TiXmlNode* child = this->FirstChild(); + if ( child ) { + const TiXmlText* childText = child->ToText(); + if ( childText ) { + return childText->Value(); + } + } + return 0; +} + + +TiXmlDocument::TiXmlDocument() : TiXmlNode( TiXmlNode::TINYXML_DOCUMENT ) +{ + tabsize = 4; + useMicrosoftBOM = false; + ClearError(); +} + +TiXmlDocument::TiXmlDocument( const char * documentName ) : TiXmlNode( TiXmlNode::TINYXML_DOCUMENT ) +{ + tabsize = 4; + useMicrosoftBOM = false; + value = documentName; + ClearError(); +} + + +#ifdef TIXML_USE_STL +TiXmlDocument::TiXmlDocument( const std::string& documentName ) : TiXmlNode( TiXmlNode::TINYXML_DOCUMENT ) +{ + tabsize = 4; + useMicrosoftBOM = false; + value = documentName; + ClearError(); +} +#endif + + +TiXmlDocument::TiXmlDocument( const TiXmlDocument& copy ) : TiXmlNode( TiXmlNode::TINYXML_DOCUMENT ) +{ + copy.CopyTo( this ); +} + + +TiXmlDocument& TiXmlDocument::operator=( const TiXmlDocument& copy ) +{ + Clear(); + copy.CopyTo( this ); + return *this; +} + + +bool TiXmlDocument::LoadFile( TiXmlEncoding encoding ) +{ + return LoadFile( Value(), encoding ); +} + + +bool TiXmlDocument::SaveFile() const +{ + return SaveFile( Value() ); +} + +bool TiXmlDocument::LoadFile( const char* _filename, TiXmlEncoding encoding ) +{ + TIXML_STRING filename( _filename ); + value = filename; + + // reading in binary mode so that tinyxml can normalize the EOL + FILE* file = TiXmlFOpen( value.c_str (), "rb" ); + + if ( file ) + { + bool result = LoadFile( file, encoding ); + fclose( file ); + return result; + } + else + { + SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN ); + return false; + } +} + +bool TiXmlDocument::LoadFile( FILE* file, TiXmlEncoding encoding ) +{ + if ( !file ) + { + SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN ); + return false; + } + + // Delete the existing data: + Clear(); + location.Clear(); + + // Get the file size, so we can pre-allocate the string. HUGE speed impact. + long length = 0; + fseek( file, 0, SEEK_END ); + length = ftell( file ); + fseek( file, 0, SEEK_SET ); + + // Strange case, but good to handle up front. + if ( length <= 0 ) + { + SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); + return false; + } + + // Subtle bug here. TinyXml did use fgets. But from the XML spec: + // 2.11 End-of-Line Handling + // + // + // ...the XML processor MUST behave as if it normalized all line breaks in external + // parsed entities (including the document entity) on input, before parsing, by translating + // both the two-character sequence #xD #xA and any #xD that is not followed by #xA to + // a single #xA character. + // + // + // It is not clear fgets does that, and certainly isn't clear it works cross platform. + // Generally, you expect fgets to translate from the convention of the OS to the c/unix + // convention, and not work generally. + + /* + while( fgets( buf, sizeof(buf), file ) ) + { + data += buf; + } + */ + + char* buf = new char[ length+1 ]; + buf[0] = 0; + + if ( fread( buf, length, 1, file ) != 1 ) { + delete [] buf; + SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN ); + return false; + } + + // Process the buffer in place to normalize new lines. (See comment above.) + // Copies from the 'p' to 'q' pointer, where p can advance faster if + // a newline-carriage return is hit. + // + // Wikipedia: + // Systems based on ASCII or a compatible character set use either LF (Line feed, '\n', 0x0A, 10 in decimal) or + // CR (Carriage return, '\r', 0x0D, 13 in decimal) individually, or CR followed by LF (CR+LF, 0x0D 0x0A)... + // * LF: Multics, Unix and Unix-like systems (GNU/Linux, AIX, Xenix, Mac OS X, FreeBSD, etc.), BeOS, Amiga, RISC OS, and others + // * CR+LF: DEC RT-11 and most other early non-Unix, non-IBM OSes, CP/M, MP/M, DOS, OS/2, Microsoft Windows, Symbian OS + // * CR: Commodore 8-bit machines, Apple II family, Mac OS up to version 9 and OS-9 + + const char* p = buf; // the read head + char* q = buf; // the write head + const char CR = 0x0d; + const char LF = 0x0a; + + buf[length] = 0; + while( *p ) { + assert( p < (buf+length) ); + assert( q <= (buf+length) ); + assert( q <= p ); + + if ( *p == CR ) { + *q++ = LF; + p++; + if ( *p == LF ) { // check for CR+LF (and skip LF) + p++; + } + } + else { + *q++ = *p++; + } + } + assert( q <= (buf+length) ); + *q = 0; + + Parse( buf, 0, encoding ); + + delete [] buf; + return !Error(); +} + + +bool TiXmlDocument::SaveFile( const char * filename ) const +{ + // The old c stuff lives on... + FILE* fp = TiXmlFOpen( filename, "w" ); + if ( fp ) + { + bool result = SaveFile( fp ); + fclose( fp ); + return result; + } + return false; +} + + +bool TiXmlDocument::SaveFile( FILE* fp ) const +{ + if ( useMicrosoftBOM ) + { + const unsigned char TIXML_UTF_LEAD_0 = 0xefU; + const unsigned char TIXML_UTF_LEAD_1 = 0xbbU; + const unsigned char TIXML_UTF_LEAD_2 = 0xbfU; + + fputc( TIXML_UTF_LEAD_0, fp ); + fputc( TIXML_UTF_LEAD_1, fp ); + fputc( TIXML_UTF_LEAD_2, fp ); + } + Print( fp, 0 ); + return (ferror(fp) == 0); +} + + +void TiXmlDocument::CopyTo( TiXmlDocument* target ) const +{ + TiXmlNode::CopyTo( target ); + + target->error = error; + target->errorId = errorId; + target->errorDesc = errorDesc; + target->tabsize = tabsize; + target->errorLocation = errorLocation; + target->useMicrosoftBOM = useMicrosoftBOM; + + TiXmlNode* node = 0; + for ( node = firstChild; node; node = node->NextSibling() ) + { + target->LinkEndChild( node->Clone() ); + } +} + + +TiXmlNode* TiXmlDocument::Clone() const +{ + TiXmlDocument* clone = new TiXmlDocument(); + if ( !clone ) + return 0; + + CopyTo( clone ); + return clone; +} + + +void TiXmlDocument::Print( FILE* cfile, int depth ) const +{ + assert( cfile ); + for ( const TiXmlNode* node=FirstChild(); node; node=node->NextSibling() ) + { + node->Print( cfile, depth ); + fprintf( cfile, "\n" ); + } +} + + +bool TiXmlDocument::Accept( TiXmlVisitor* visitor ) const +{ + if ( visitor->VisitEnter( *this ) ) + { + for ( const TiXmlNode* node=FirstChild(); node; node=node->NextSibling() ) + { + if ( !node->Accept( visitor ) ) + break; + } + } + return visitor->VisitExit( *this ); +} + + +const TiXmlAttribute* TiXmlAttribute::Next() const +{ + // We are using knowledge of the sentinel. The sentinel + // have a value or name. + if ( next->value.empty() && next->name.empty() ) + return 0; + return next; +} + +/* +TiXmlAttribute* TiXmlAttribute::Next() +{ + // We are using knowledge of the sentinel. The sentinel + // have a value or name. + if ( next->value.empty() && next->name.empty() ) + return 0; + return next; +} +*/ + +const TiXmlAttribute* TiXmlAttribute::Previous() const +{ + // We are using knowledge of the sentinel. The sentinel + // have a value or name. + if ( prev->value.empty() && prev->name.empty() ) + return 0; + return prev; +} + +/* +TiXmlAttribute* TiXmlAttribute::Previous() +{ + // We are using knowledge of the sentinel. The sentinel + // have a value or name. + if ( prev->value.empty() && prev->name.empty() ) + return 0; + return prev; +} +*/ + +void TiXmlAttribute::Print( FILE* cfile, int /*depth*/, TIXML_STRING* str ) const +{ + TIXML_STRING n, v; + + EncodeString( name, &n ); + EncodeString( value, &v ); + + if (value.find ('\"') == TIXML_STRING::npos) { + if ( cfile ) { + fprintf (cfile, "%s=\"%s\"", n.c_str(), v.c_str() ); + } + if ( str ) { + (*str) += n; (*str) += "=\""; (*str) += v; (*str) += "\""; + } + } + else { + if ( cfile ) { + fprintf (cfile, "%s='%s'", n.c_str(), v.c_str() ); + } + if ( str ) { + (*str) += n; (*str) += "='"; (*str) += v; (*str) += "'"; + } + } +} + + +int TiXmlAttribute::QueryIntValue( int* ival ) const +{ + if ( TIXML_SSCANF( value.c_str(), "%d", ival ) == 1 ) + return TIXML_SUCCESS; + return TIXML_WRONG_TYPE; +} + +int TiXmlAttribute::QueryDoubleValue( double* dval ) const +{ + if ( TIXML_SSCANF( value.c_str(), "%lf", dval ) == 1 ) + return TIXML_SUCCESS; + return TIXML_WRONG_TYPE; +} + +void TiXmlAttribute::SetIntValue( int _value ) +{ + char buf [64]; + #if defined(TIXML_SNPRINTF) + TIXML_SNPRINTF(buf, sizeof(buf), "%d", _value); + #else + sprintf (buf, "%d", _value); + #endif + SetValue (buf); +} + +void TiXmlAttribute::SetDoubleValue( double _value ) +{ + char buf [256]; + #if defined(TIXML_SNPRINTF) + TIXML_SNPRINTF( buf, sizeof(buf), "%g", _value); + #else + sprintf (buf, "%g", _value); + #endif + SetValue (buf); +} + +int TiXmlAttribute::IntValue() const +{ + return atoi (value.c_str ()); +} + +double TiXmlAttribute::DoubleValue() const +{ + return atof (value.c_str ()); +} + + +TiXmlComment::TiXmlComment( const TiXmlComment& copy ) : TiXmlNode( TiXmlNode::TINYXML_COMMENT ) +{ + copy.CopyTo( this ); +} + + +TiXmlComment& TiXmlComment::operator=( const TiXmlComment& base ) +{ + Clear(); + base.CopyTo( this ); + return *this; +} + + +void TiXmlComment::Print( FILE* cfile, int depth ) const +{ + assert( cfile ); + for ( int i=0; i", value.c_str() ); +} + + +void TiXmlComment::CopyTo( TiXmlComment* target ) const +{ + TiXmlNode::CopyTo( target ); +} + + +bool TiXmlComment::Accept( TiXmlVisitor* visitor ) const +{ + return visitor->Visit( *this ); +} + + +TiXmlNode* TiXmlComment::Clone() const +{ + TiXmlComment* clone = new TiXmlComment(); + + if ( !clone ) + return 0; + + CopyTo( clone ); + return clone; +} + + +void TiXmlText::Print( FILE* cfile, int depth ) const +{ + assert( cfile ); + if ( cdata ) + { + int i; + fprintf( cfile, "\n" ); + for ( i=0; i\n", value.c_str() ); // unformatted output + } + else + { + TIXML_STRING buffer; + EncodeString( value, &buffer ); + fprintf( cfile, "%s", buffer.c_str() ); + } +} + + +void TiXmlText::CopyTo( TiXmlText* target ) const +{ + TiXmlNode::CopyTo( target ); + target->cdata = cdata; +} + + +bool TiXmlText::Accept( TiXmlVisitor* visitor ) const +{ + return visitor->Visit( *this ); +} + + +TiXmlNode* TiXmlText::Clone() const +{ + TiXmlText* clone = 0; + clone = new TiXmlText( "" ); + + if ( !clone ) + return 0; + + CopyTo( clone ); + return clone; +} + + +TiXmlDeclaration::TiXmlDeclaration( const char * _version, + const char * _encoding, + const char * _standalone ) + : TiXmlNode( TiXmlNode::TINYXML_DECLARATION ) +{ + version = _version; + encoding = _encoding; + standalone = _standalone; +} + + +#ifdef TIXML_USE_STL +TiXmlDeclaration::TiXmlDeclaration( const std::string& _version, + const std::string& _encoding, + const std::string& _standalone ) + : TiXmlNode( TiXmlNode::TINYXML_DECLARATION ) +{ + version = _version; + encoding = _encoding; + standalone = _standalone; +} +#endif + + +TiXmlDeclaration::TiXmlDeclaration( const TiXmlDeclaration& copy ) + : TiXmlNode( TiXmlNode::TINYXML_DECLARATION ) +{ + copy.CopyTo( this ); +} + + +TiXmlDeclaration& TiXmlDeclaration::operator=( const TiXmlDeclaration& copy ) +{ + Clear(); + copy.CopyTo( this ); + return *this; +} + + +void TiXmlDeclaration::Print( FILE* cfile, int /*depth*/, TIXML_STRING* str ) const +{ + if ( cfile ) fprintf( cfile, "" ); + if ( str ) (*str) += "?>"; +} + + +void TiXmlDeclaration::CopyTo( TiXmlDeclaration* target ) const +{ + TiXmlNode::CopyTo( target ); + + target->version = version; + target->encoding = encoding; + target->standalone = standalone; +} + + +bool TiXmlDeclaration::Accept( TiXmlVisitor* visitor ) const +{ + return visitor->Visit( *this ); +} + + +TiXmlNode* TiXmlDeclaration::Clone() const +{ + TiXmlDeclaration* clone = new TiXmlDeclaration(); + + if ( !clone ) + return 0; + + CopyTo( clone ); + return clone; +} + + +void TiXmlUnknown::Print( FILE* cfile, int depth ) const +{ + for ( int i=0; i", value.c_str() ); +} + + +void TiXmlUnknown::CopyTo( TiXmlUnknown* target ) const +{ + TiXmlNode::CopyTo( target ); +} + + +bool TiXmlUnknown::Accept( TiXmlVisitor* visitor ) const +{ + return visitor->Visit( *this ); +} + + +TiXmlNode* TiXmlUnknown::Clone() const +{ + TiXmlUnknown* clone = new TiXmlUnknown(); + + if ( !clone ) + return 0; + + CopyTo( clone ); + return clone; +} + + +TiXmlAttributeSet::TiXmlAttributeSet() +{ + sentinel.next = &sentinel; + sentinel.prev = &sentinel; +} + + +TiXmlAttributeSet::~TiXmlAttributeSet() +{ + assert( sentinel.next == &sentinel ); + assert( sentinel.prev == &sentinel ); +} + + +void TiXmlAttributeSet::Add( TiXmlAttribute* addMe ) +{ + #ifdef TIXML_USE_STL + assert( !Find( TIXML_STRING( addMe->Name() ) ) ); // Shouldn't be multiply adding to the set. + #else + assert( !Find( addMe->Name() ) ); // Shouldn't be multiply adding to the set. + #endif + + addMe->next = &sentinel; + addMe->prev = sentinel.prev; + + sentinel.prev->next = addMe; + sentinel.prev = addMe; +} + +void TiXmlAttributeSet::Remove( TiXmlAttribute* removeMe ) +{ + TiXmlAttribute* node; + + for( node = sentinel.next; node != &sentinel; node = node->next ) + { + if ( node == removeMe ) + { + node->prev->next = node->next; + node->next->prev = node->prev; + node->next = 0; + node->prev = 0; + return; + } + } + assert( 0 ); // we tried to remove a non-linked attribute. +} + + +#ifdef TIXML_USE_STL +TiXmlAttribute* TiXmlAttributeSet::Find( const std::string& name ) const +{ + for( TiXmlAttribute* node = sentinel.next; node != &sentinel; node = node->next ) + { + if ( node->name == name ) + return node; + } + return 0; +} + +TiXmlAttribute* TiXmlAttributeSet::FindOrCreate( const std::string& _name ) +{ + TiXmlAttribute* attrib = Find( _name ); + if ( !attrib ) { + attrib = new TiXmlAttribute(); + Add( attrib ); + attrib->SetName( _name ); + } + return attrib; +} +#endif + + +TiXmlAttribute* TiXmlAttributeSet::Find( const char* name ) const +{ + for( TiXmlAttribute* node = sentinel.next; node != &sentinel; node = node->next ) + { + if ( strcmp( node->name.c_str(), name ) == 0 ) + return node; + } + return 0; +} + + +TiXmlAttribute* TiXmlAttributeSet::FindOrCreate( const char* _name ) +{ + TiXmlAttribute* attrib = Find( _name ); + if ( !attrib ) { + attrib = new TiXmlAttribute(); + Add( attrib ); + attrib->SetName( _name ); + } + return attrib; +} + + +#ifdef TIXML_USE_STL +std::istream& operator>> (std::istream & in, TiXmlNode & base) +{ + TIXML_STRING tag; + tag.reserve( 8 * 1000 ); + base.StreamIn( &in, &tag ); + + base.Parse( tag.c_str(), 0, TIXML_DEFAULT_ENCODING ); + return in; +} +#endif + + +#ifdef TIXML_USE_STL +std::ostream& operator<< (std::ostream & out, const TiXmlNode & base) +{ + TiXmlPrinter printer; + printer.SetStreamPrinting(); + base.Accept( &printer ); + out << printer.Str(); + + return out; +} + + +std::string& operator<< (std::string& out, const TiXmlNode& base ) +{ + TiXmlPrinter printer; + printer.SetStreamPrinting(); + base.Accept( &printer ); + out.append( printer.Str() ); + + return out; +} +#endif + + +TiXmlHandle TiXmlHandle::FirstChild() const +{ + if ( node ) + { + TiXmlNode* child = node->FirstChild(); + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); +} + + +TiXmlHandle TiXmlHandle::FirstChild( const char * value ) const +{ + if ( node ) + { + TiXmlNode* child = node->FirstChild( value ); + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); +} + + +TiXmlHandle TiXmlHandle::FirstChildElement() const +{ + if ( node ) + { + TiXmlElement* child = node->FirstChildElement(); + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); +} + + +TiXmlHandle TiXmlHandle::FirstChildElement( const char * value ) const +{ + if ( node ) + { + TiXmlElement* child = node->FirstChildElement( value ); + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); +} + + +TiXmlHandle TiXmlHandle::Child( int count ) const +{ + if ( node ) + { + int i; + TiXmlNode* child = node->FirstChild(); + for ( i=0; + child && iNextSibling(), ++i ) + { + // nothing + } + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); +} + + +TiXmlHandle TiXmlHandle::Child( const char* value, int count ) const +{ + if ( node ) + { + int i; + TiXmlNode* child = node->FirstChild( value ); + for ( i=0; + child && iNextSibling( value ), ++i ) + { + // nothing + } + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); +} + + +TiXmlHandle TiXmlHandle::ChildElement( int count ) const +{ + if ( node ) + { + int i; + TiXmlElement* child = node->FirstChildElement(); + for ( i=0; + child && iNextSiblingElement(), ++i ) + { + // nothing + } + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); +} + + +TiXmlHandle TiXmlHandle::ChildElement( const char* value, int count ) const +{ + if ( node ) + { + int i; + TiXmlElement* child = node->FirstChildElement( value ); + for ( i=0; + child && iNextSiblingElement( value ), ++i ) + { + // nothing + } + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); +} + + +bool TiXmlPrinter::VisitEnter( const TiXmlDocument& ) +{ + return true; +} + +bool TiXmlPrinter::VisitExit( const TiXmlDocument& ) +{ + return true; +} + +bool TiXmlPrinter::VisitEnter( const TiXmlElement& element, const TiXmlAttribute* firstAttribute ) +{ + DoIndent(); + buffer += "<"; + buffer += element.Value(); + + for( const TiXmlAttribute* attrib = firstAttribute; attrib; attrib = attrib->Next() ) + { + buffer += " "; + attrib->Print( 0, 0, &buffer ); + } + + if ( !element.FirstChild() ) + { + buffer += " />"; + DoLineBreak(); + } + else + { + buffer += ">"; + if ( element.FirstChild()->ToText() + && element.LastChild() == element.FirstChild() + && element.FirstChild()->ToText()->CDATA() == false ) + { + simpleTextPrint = true; + // no DoLineBreak()! + } + else + { + DoLineBreak(); + } + } + ++depth; + return true; +} + + +bool TiXmlPrinter::VisitExit( const TiXmlElement& element ) +{ + --depth; + if ( !element.FirstChild() ) + { + // nothing. + } + else + { + if ( simpleTextPrint ) + { + simpleTextPrint = false; + } + else + { + DoIndent(); + } + buffer += ""; + DoLineBreak(); + } + return true; +} + + +bool TiXmlPrinter::Visit( const TiXmlText& text ) +{ + if ( text.CDATA() ) + { + DoIndent(); + buffer += ""; + DoLineBreak(); + } + else if ( simpleTextPrint ) + { + TIXML_STRING str; + TiXmlBase::EncodeString( text.ValueTStr(), &str ); + buffer += str; + } + else + { + DoIndent(); + TIXML_STRING str; + TiXmlBase::EncodeString( text.ValueTStr(), &str ); + buffer += str; + DoLineBreak(); + } + return true; +} + + +bool TiXmlPrinter::Visit( const TiXmlDeclaration& declaration ) +{ + DoIndent(); + declaration.Print( 0, 0, &buffer ); + DoLineBreak(); + return true; +} + + +bool TiXmlPrinter::Visit( const TiXmlComment& comment ) +{ + DoIndent(); + buffer += ""; + DoLineBreak(); + return true; +} + + +bool TiXmlPrinter::Visit( const TiXmlUnknown& unknown ) +{ + DoIndent(); + buffer += "<"; + buffer += unknown.Value(); + buffer += ">"; + DoLineBreak(); + return true; +} + diff --git a/btgui/tinyxml/tinyxml.h b/btgui/tinyxml/tinyxml.h new file mode 100755 index 000000000..a3589e5b2 --- /dev/null +++ b/btgui/tinyxml/tinyxml.h @@ -0,0 +1,1805 @@ +/* +www.sourceforge.net/projects/tinyxml +Original code by Lee Thomason (www.grinninglizard.com) + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as 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 TINYXML_INCLUDED +#define TINYXML_INCLUDED + +#ifdef _MSC_VER +#pragma warning( push ) +#pragma warning( disable : 4530 ) +#pragma warning( disable : 4786 ) +#endif + +#include +#include +#include +#include +#include + +// Help out windows: +#if defined( _DEBUG ) && !defined( DEBUG ) +#define DEBUG +#endif + +#ifdef TIXML_USE_STL + #include + #include + #include + #define TIXML_STRING std::string +#else + #include "tinystr.h" + #define TIXML_STRING TiXmlString +#endif + +// Deprecated library function hell. Compilers want to use the +// new safe versions. This probably doesn't fully address the problem, +// but it gets closer. There are too many compilers for me to fully +// test. If you get compilation troubles, undefine TIXML_SAFE +#define TIXML_SAFE + +#ifdef TIXML_SAFE + #if defined(_MSC_VER) && (_MSC_VER >= 1400 ) + // Microsoft visual studio, version 2005 and higher. + #define TIXML_SNPRINTF _snprintf_s + #define TIXML_SSCANF sscanf_s + #elif defined(_MSC_VER) && (_MSC_VER >= 1200 ) + // Microsoft visual studio, version 6 and higher. + //#pragma message( "Using _sn* functions." ) + #define TIXML_SNPRINTF _snprintf + #define TIXML_SSCANF sscanf + #elif defined(__GNUC__) && (__GNUC__ >= 3 ) + // GCC version 3 and higher.s + //#warning( "Using sn* functions." ) + #define TIXML_SNPRINTF snprintf + #define TIXML_SSCANF sscanf + #else + #define TIXML_SNPRINTF snprintf + #define TIXML_SSCANF sscanf + #endif +#endif + +class TiXmlDocument; +class TiXmlElement; +class TiXmlComment; +class TiXmlUnknown; +class TiXmlAttribute; +class TiXmlText; +class TiXmlDeclaration; +class TiXmlParsingData; + +const int TIXML_MAJOR_VERSION = 2; +const int TIXML_MINOR_VERSION = 6; +const int TIXML_PATCH_VERSION = 2; + +/* Internal structure for tracking location of items + in the XML file. +*/ +struct TiXmlCursor +{ + TiXmlCursor() { Clear(); } + void Clear() { row = col = -1; } + + int row; // 0 based. + int col; // 0 based. +}; + + +/** + Implements the interface to the "Visitor pattern" (see the Accept() method.) + If you call the Accept() method, it requires being passed a TiXmlVisitor + class to handle callbacks. For nodes that contain other nodes (Document, Element) + you will get called with a VisitEnter/VisitExit pair. Nodes that are always leaves + are simply called with Visit(). + + If you return 'true' from a Visit method, recursive parsing will continue. If you return + false, no children of this node or its sibilings will be Visited. + + All flavors of Visit methods have a default implementation that returns 'true' (continue + visiting). You need to only override methods that are interesting to you. + + Generally Accept() is called on the TiXmlDocument, although all nodes suppert Visiting. + + You should never change the document from a callback. + + @sa TiXmlNode::Accept() +*/ +class TiXmlVisitor +{ +public: + virtual ~TiXmlVisitor() {} + + /// Visit a document. + virtual bool VisitEnter( const TiXmlDocument& /*doc*/ ) { return true; } + /// Visit a document. + virtual bool VisitExit( const TiXmlDocument& /*doc*/ ) { return true; } + + /// Visit an element. + virtual bool VisitEnter( const TiXmlElement& /*element*/, const TiXmlAttribute* /*firstAttribute*/ ) { return true; } + /// Visit an element. + virtual bool VisitExit( const TiXmlElement& /*element*/ ) { return true; } + + /// Visit a declaration + virtual bool Visit( const TiXmlDeclaration& /*declaration*/ ) { return true; } + /// Visit a text node + virtual bool Visit( const TiXmlText& /*text*/ ) { return true; } + /// Visit a comment node + virtual bool Visit( const TiXmlComment& /*comment*/ ) { return true; } + /// Visit an unknown node + virtual bool Visit( const TiXmlUnknown& /*unknown*/ ) { return true; } +}; + +// Only used by Attribute::Query functions +enum +{ + TIXML_SUCCESS, + TIXML_NO_ATTRIBUTE, + TIXML_WRONG_TYPE +}; + + +// Used by the parsing routines. +enum TiXmlEncoding +{ + TIXML_ENCODING_UNKNOWN, + TIXML_ENCODING_UTF8, + TIXML_ENCODING_LEGACY +}; + +const TiXmlEncoding TIXML_DEFAULT_ENCODING = TIXML_ENCODING_UNKNOWN; + +/** TiXmlBase is a base class for every class in TinyXml. + It does little except to establish that TinyXml classes + can be printed and provide some utility functions. + + In XML, the document and elements can contain + other elements and other types of nodes. + + @verbatim + A Document can contain: Element (container or leaf) + Comment (leaf) + Unknown (leaf) + Declaration( leaf ) + + An Element can contain: Element (container or leaf) + Text (leaf) + Attributes (not on tree) + Comment (leaf) + Unknown (leaf) + + A Decleration contains: Attributes (not on tree) + @endverbatim +*/ +class TiXmlBase +{ + friend class TiXmlNode; + friend class TiXmlElement; + friend class TiXmlDocument; + +public: + TiXmlBase() : userData(0) {} + virtual ~TiXmlBase() {} + + /** All TinyXml classes can print themselves to a filestream + or the string class (TiXmlString in non-STL mode, std::string + in STL mode.) Either or both cfile and str can be null. + + This is a formatted print, and will insert + tabs and newlines. + + (For an unformatted stream, use the << operator.) + */ + virtual void Print( FILE* cfile, int depth ) const = 0; + + /** The world does not agree on whether white space should be kept or + not. In order to make everyone happy, these global, static functions + are provided to set whether or not TinyXml will condense all white space + into a single space or not. The default is to condense. Note changing this + value is not thread safe. + */ + static void SetCondenseWhiteSpace( bool condense ) { condenseWhiteSpace = condense; } + + /// Return the current white space setting. + static bool IsWhiteSpaceCondensed() { return condenseWhiteSpace; } + + /** Return the position, in the original source file, of this node or attribute. + The row and column are 1-based. (That is the first row and first column is + 1,1). If the returns values are 0 or less, then the parser does not have + a row and column value. + + Generally, the row and column value will be set when the TiXmlDocument::Load(), + TiXmlDocument::LoadFile(), or any TiXmlNode::Parse() is called. It will NOT be set + when the DOM was created from operator>>. + + The values reflect the initial load. Once the DOM is modified programmatically + (by adding or changing nodes and attributes) the new values will NOT update to + reflect changes in the document. + + There is a minor performance cost to computing the row and column. Computation + can be disabled if TiXmlDocument::SetTabSize() is called with 0 as the value. + + @sa TiXmlDocument::SetTabSize() + */ + int Row() const { return location.row + 1; } + int Column() const { return location.col + 1; } ///< See Row() + + void SetUserData( void* user ) { userData = user; } ///< Set a pointer to arbitrary user data. + void* GetUserData() { return userData; } ///< Get a pointer to arbitrary user data. + const void* GetUserData() const { return userData; } ///< Get a pointer to arbitrary user data. + + // Table that returs, for a given lead byte, the total number of bytes + // in the UTF-8 sequence. + static const int utf8ByteTable[256]; + + virtual const char* Parse( const char* p, + TiXmlParsingData* data, + TiXmlEncoding encoding /*= TIXML_ENCODING_UNKNOWN */ ) = 0; + + /** Expands entities in a string. Note this should not contian the tag's '<', '>', etc, + or they will be transformed into entities! + */ + static void EncodeString( const TIXML_STRING& str, TIXML_STRING* out ); + + enum + { + TIXML_NO_ERROR = 0, + TIXML_ERROR, + TIXML_ERROR_OPENING_FILE, + TIXML_ERROR_PARSING_ELEMENT, + TIXML_ERROR_FAILED_TO_READ_ELEMENT_NAME, + TIXML_ERROR_READING_ELEMENT_VALUE, + TIXML_ERROR_READING_ATTRIBUTES, + TIXML_ERROR_PARSING_EMPTY, + TIXML_ERROR_READING_END_TAG, + TIXML_ERROR_PARSING_UNKNOWN, + TIXML_ERROR_PARSING_COMMENT, + TIXML_ERROR_PARSING_DECLARATION, + TIXML_ERROR_DOCUMENT_EMPTY, + TIXML_ERROR_EMBEDDED_NULL, + TIXML_ERROR_PARSING_CDATA, + TIXML_ERROR_DOCUMENT_TOP_ONLY, + + TIXML_ERROR_STRING_COUNT + }; + +protected: + + static const char* SkipWhiteSpace( const char*, TiXmlEncoding encoding ); + + inline static bool IsWhiteSpace( char c ) + { + return ( isspace( (unsigned char) c ) || c == '\n' || c == '\r' ); + } + inline static bool IsWhiteSpace( int c ) + { + if ( c < 256 ) + return IsWhiteSpace( (char) c ); + return false; // Again, only truly correct for English/Latin...but usually works. + } + + #ifdef TIXML_USE_STL + static bool StreamWhiteSpace( std::istream * in, TIXML_STRING * tag ); + static bool StreamTo( std::istream * in, int character, TIXML_STRING * tag ); + #endif + + /* Reads an XML name into the string provided. Returns + a pointer just past the last character of the name, + or 0 if the function has an error. + */ + static const char* ReadName( const char* p, TIXML_STRING* name, TiXmlEncoding encoding ); + + /* Reads text. Returns a pointer past the given end tag. + Wickedly complex options, but it keeps the (sensitive) code in one place. + */ + static const char* ReadText( const char* in, // where to start + TIXML_STRING* text, // the string read + bool ignoreWhiteSpace, // whether to keep the white space + const char* endTag, // what ends this text + bool ignoreCase, // whether to ignore case in the end tag + TiXmlEncoding encoding ); // the current encoding + + // If an entity has been found, transform it into a character. + static const char* GetEntity( const char* in, char* value, int* length, TiXmlEncoding encoding ); + + // Get a character, while interpreting entities. + // The length can be from 0 to 4 bytes. + inline static const char* GetChar( const char* p, char* _value, int* length, TiXmlEncoding encoding ) + { + assert( p ); + if ( encoding == TIXML_ENCODING_UTF8 ) + { + *length = utf8ByteTable[ *((const unsigned char*)p) ]; + assert( *length >= 0 && *length < 5 ); + } + else + { + *length = 1; + } + + if ( *length == 1 ) + { + if ( *p == '&' ) + return GetEntity( p, _value, length, encoding ); + *_value = *p; + return p+1; + } + else if ( *length ) + { + //strncpy( _value, p, *length ); // lots of compilers don't like this function (unsafe), + // and the null terminator isn't needed + for( int i=0; p[i] && i<*length; ++i ) { + _value[i] = p[i]; + } + return p + (*length); + } + else + { + // Not valid text. + return 0; + } + } + + // Return true if the next characters in the stream are any of the endTag sequences. + // Ignore case only works for english, and should only be relied on when comparing + // to English words: StringEqual( p, "version", true ) is fine. + static bool StringEqual( const char* p, + const char* endTag, + bool ignoreCase, + TiXmlEncoding encoding ); + + static const char* errorString[ TIXML_ERROR_STRING_COUNT ]; + + TiXmlCursor location; + + /// Field containing a generic user pointer + void* userData; + + // None of these methods are reliable for any language except English. + // Good for approximation, not great for accuracy. + static int IsAlpha( unsigned char anyByte, TiXmlEncoding encoding ); + static int IsAlphaNum( unsigned char anyByte, TiXmlEncoding encoding ); + inline static int ToLower( int v, TiXmlEncoding encoding ) + { + if ( encoding == TIXML_ENCODING_UTF8 ) + { + if ( v < 128 ) return tolower( v ); + return v; + } + else + { + return tolower( v ); + } + } + static void ConvertUTF32ToUTF8( unsigned long input, char* output, int* length ); + +private: + TiXmlBase( const TiXmlBase& ); // not implemented. + void operator=( const TiXmlBase& base ); // not allowed. + + struct Entity + { + const char* str; + unsigned int strLength; + char chr; + }; + enum + { + NUM_ENTITY = 5, + MAX_ENTITY_LENGTH = 6 + + }; + static Entity entity[ NUM_ENTITY ]; + static bool condenseWhiteSpace; +}; + + +/** The parent class for everything in the Document Object Model. + (Except for attributes). + Nodes have siblings, a parent, and children. A node can be + in a document, or stand on its own. The type of a TiXmlNode + can be queried, and it can be cast to its more defined type. +*/ +class TiXmlNode : public TiXmlBase +{ + friend class TiXmlDocument; + friend class TiXmlElement; + +public: + #ifdef TIXML_USE_STL + + /** An input stream operator, for every class. Tolerant of newlines and + formatting, but doesn't expect them. + */ + friend std::istream& operator >> (std::istream& in, TiXmlNode& base); + + /** An output stream operator, for every class. Note that this outputs + without any newlines or formatting, as opposed to Print(), which + includes tabs and new lines. + + The operator<< and operator>> are not completely symmetric. Writing + a node to a stream is very well defined. You'll get a nice stream + of output, without any extra whitespace or newlines. + + But reading is not as well defined. (As it always is.) If you create + a TiXmlElement (for example) and read that from an input stream, + the text needs to define an element or junk will result. This is + true of all input streams, but it's worth keeping in mind. + + A TiXmlDocument will read nodes until it reads a root element, and + all the children of that root element. + */ + friend std::ostream& operator<< (std::ostream& out, const TiXmlNode& base); + + /// Appends the XML node or attribute to a std::string. + friend std::string& operator<< (std::string& out, const TiXmlNode& base ); + + #endif + + /** The types of XML nodes supported by TinyXml. (All the + unsupported types are picked up by UNKNOWN.) + */ + enum NodeType + { + TINYXML_DOCUMENT, + TINYXML_ELEMENT, + TINYXML_COMMENT, + TINYXML_UNKNOWN, + TINYXML_TEXT, + TINYXML_DECLARATION, + TINYXML_TYPECOUNT + }; + + virtual ~TiXmlNode(); + + /** The meaning of 'value' changes for the specific type of + TiXmlNode. + @verbatim + Document: filename of the xml file + Element: name of the element + Comment: the comment text + Unknown: the tag contents + Text: the text string + @endverbatim + + The subclasses will wrap this function. + */ + const char *Value() const { return value.c_str (); } + + #ifdef TIXML_USE_STL + /** Return Value() as a std::string. If you only use STL, + this is more efficient than calling Value(). + Only available in STL mode. + */ + const std::string& ValueStr() const { return value; } + #endif + + const TIXML_STRING& ValueTStr() const { return value; } + + /** Changes the value of the node. Defined as: + @verbatim + Document: filename of the xml file + Element: name of the element + Comment: the comment text + Unknown: the tag contents + Text: the text string + @endverbatim + */ + void SetValue(const char * _value) { value = _value;} + + #ifdef TIXML_USE_STL + /// STL std::string form. + void SetValue( const std::string& _value ) { value = _value; } + #endif + + /// Delete all the children of this node. Does not affect 'this'. + void Clear(); + + /// One step up the DOM. + TiXmlNode* Parent() { return parent; } + const TiXmlNode* Parent() const { return parent; } + + const TiXmlNode* FirstChild() const { return firstChild; } ///< The first child of this node. Will be null if there are no children. + TiXmlNode* FirstChild() { return firstChild; } + const TiXmlNode* FirstChild( const char * value ) const; ///< The first child of this node with the matching 'value'. Will be null if none found. + /// The first child of this node with the matching 'value'. Will be null if none found. + TiXmlNode* FirstChild( const char * _value ) { + // Call through to the const version - safe since nothing is changed. Exiting syntax: cast this to a const (always safe) + // call the method, cast the return back to non-const. + return const_cast< TiXmlNode* > ((const_cast< const TiXmlNode* >(this))->FirstChild( _value )); + } + const TiXmlNode* LastChild() const { return lastChild; } /// The last child of this node. Will be null if there are no children. + TiXmlNode* LastChild() { return lastChild; } + + const TiXmlNode* LastChild( const char * value ) const; /// The last child of this node matching 'value'. Will be null if there are no children. + TiXmlNode* LastChild( const char * _value ) { + return const_cast< TiXmlNode* > ((const_cast< const TiXmlNode* >(this))->LastChild( _value )); + } + + #ifdef TIXML_USE_STL + const TiXmlNode* FirstChild( const std::string& _value ) const { return FirstChild (_value.c_str ()); } ///< STL std::string form. + TiXmlNode* FirstChild( const std::string& _value ) { return FirstChild (_value.c_str ()); } ///< STL std::string form. + const TiXmlNode* LastChild( const std::string& _value ) const { return LastChild (_value.c_str ()); } ///< STL std::string form. + TiXmlNode* LastChild( const std::string& _value ) { return LastChild (_value.c_str ()); } ///< STL std::string form. + #endif + + /** An alternate way to walk the children of a node. + One way to iterate over nodes is: + @verbatim + for( child = parent->FirstChild(); child; child = child->NextSibling() ) + @endverbatim + + IterateChildren does the same thing with the syntax: + @verbatim + child = 0; + while( child = parent->IterateChildren( child ) ) + @endverbatim + + IterateChildren takes the previous child as input and finds + the next one. If the previous child is null, it returns the + first. IterateChildren will return null when done. + */ + const TiXmlNode* IterateChildren( const TiXmlNode* previous ) const; + TiXmlNode* IterateChildren( const TiXmlNode* previous ) { + return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->IterateChildren( previous ) ); + } + + /// This flavor of IterateChildren searches for children with a particular 'value' + const TiXmlNode* IterateChildren( const char * value, const TiXmlNode* previous ) const; + TiXmlNode* IterateChildren( const char * _value, const TiXmlNode* previous ) { + return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->IterateChildren( _value, previous ) ); + } + + #ifdef TIXML_USE_STL + const TiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous ) const { return IterateChildren (_value.c_str (), previous); } ///< STL std::string form. + TiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous ) { return IterateChildren (_value.c_str (), previous); } ///< STL std::string form. + #endif + + /** Add a new node related to this. Adds a child past the LastChild. + Returns a pointer to the new object or NULL if an error occured. + */ + TiXmlNode* InsertEndChild( const TiXmlNode& addThis ); + + + /** Add a new node related to this. Adds a child past the LastChild. + + NOTE: the node to be added is passed by pointer, and will be + henceforth owned (and deleted) by tinyXml. This method is efficient + and avoids an extra copy, but should be used with care as it + uses a different memory model than the other insert functions. + + @sa InsertEndChild + */ + TiXmlNode* LinkEndChild( TiXmlNode* addThis ); + + /** Add a new node related to this. Adds a child before the specified child. + Returns a pointer to the new object or NULL if an error occured. + */ + TiXmlNode* InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis ); + + /** Add a new node related to this. Adds a child after the specified child. + Returns a pointer to the new object or NULL if an error occured. + */ + TiXmlNode* InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis ); + + /** Replace a child of this node. + Returns a pointer to the new object or NULL if an error occured. + */ + TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis ); + + /// Delete a child of this node. + bool RemoveChild( TiXmlNode* removeThis ); + + /// Navigate to a sibling node. + const TiXmlNode* PreviousSibling() const { return prev; } + TiXmlNode* PreviousSibling() { return prev; } + + /// Navigate to a sibling node. + const TiXmlNode* PreviousSibling( const char * ) const; + TiXmlNode* PreviousSibling( const char *_prev ) { + return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->PreviousSibling( _prev ) ); + } + + #ifdef TIXML_USE_STL + const TiXmlNode* PreviousSibling( const std::string& _value ) const { return PreviousSibling (_value.c_str ()); } ///< STL std::string form. + TiXmlNode* PreviousSibling( const std::string& _value ) { return PreviousSibling (_value.c_str ()); } ///< STL std::string form. + const TiXmlNode* NextSibling( const std::string& _value) const { return NextSibling (_value.c_str ()); } ///< STL std::string form. + TiXmlNode* NextSibling( const std::string& _value) { return NextSibling (_value.c_str ()); } ///< STL std::string form. + #endif + + /// Navigate to a sibling node. + const TiXmlNode* NextSibling() const { return next; } + TiXmlNode* NextSibling() { return next; } + + /// Navigate to a sibling node with the given 'value'. + const TiXmlNode* NextSibling( const char * ) const; + TiXmlNode* NextSibling( const char* _next ) { + return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->NextSibling( _next ) ); + } + + /** Convenience function to get through elements. + Calls NextSibling and ToElement. Will skip all non-Element + nodes. Returns 0 if there is not another element. + */ + const TiXmlElement* NextSiblingElement() const; + TiXmlElement* NextSiblingElement() { + return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->NextSiblingElement() ); + } + + /** Convenience function to get through elements. + Calls NextSibling and ToElement. Will skip all non-Element + nodes. Returns 0 if there is not another element. + */ + const TiXmlElement* NextSiblingElement( const char * ) const; + TiXmlElement* NextSiblingElement( const char *_next ) { + return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->NextSiblingElement( _next ) ); + } + + #ifdef TIXML_USE_STL + const TiXmlElement* NextSiblingElement( const std::string& _value) const { return NextSiblingElement (_value.c_str ()); } ///< STL std::string form. + TiXmlElement* NextSiblingElement( const std::string& _value) { return NextSiblingElement (_value.c_str ()); } ///< STL std::string form. + #endif + + /// Convenience function to get through elements. + const TiXmlElement* FirstChildElement() const; + TiXmlElement* FirstChildElement() { + return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->FirstChildElement() ); + } + + /// Convenience function to get through elements. + const TiXmlElement* FirstChildElement( const char * _value ) const; + TiXmlElement* FirstChildElement( const char * _value ) { + return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->FirstChildElement( _value ) ); + } + + #ifdef TIXML_USE_STL + const TiXmlElement* FirstChildElement( const std::string& _value ) const { return FirstChildElement (_value.c_str ()); } ///< STL std::string form. + TiXmlElement* FirstChildElement( const std::string& _value ) { return FirstChildElement (_value.c_str ()); } ///< STL std::string form. + #endif + + /** Query the type (as an enumerated value, above) of this node. + The possible types are: TINYXML_DOCUMENT, TINYXML_ELEMENT, TINYXML_COMMENT, + TINYXML_UNKNOWN, TINYXML_TEXT, and TINYXML_DECLARATION. + */ + int Type() const { return type; } + + /** Return a pointer to the Document this node lives in. + Returns null if not in a document. + */ + const TiXmlDocument* GetDocument() const; + TiXmlDocument* GetDocument() { + return const_cast< TiXmlDocument* >( (const_cast< const TiXmlNode* >(this))->GetDocument() ); + } + + /// Returns true if this node has no children. + bool NoChildren() const { return !firstChild; } + + virtual const TiXmlDocument* ToDocument() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual const TiXmlElement* ToElement() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual const TiXmlComment* ToComment() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual const TiXmlUnknown* ToUnknown() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual const TiXmlText* ToText() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual const TiXmlDeclaration* ToDeclaration() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + + virtual TiXmlDocument* ToDocument() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual TiXmlElement* ToElement() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual TiXmlComment* ToComment() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual TiXmlUnknown* ToUnknown() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual TiXmlText* ToText() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual TiXmlDeclaration* ToDeclaration() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + + /** Create an exact duplicate of this node and return it. The memory must be deleted + by the caller. + */ + virtual TiXmlNode* Clone() const = 0; + + /** Accept a hierchical visit the nodes in the TinyXML DOM. Every node in the + XML tree will be conditionally visited and the host will be called back + via the TiXmlVisitor interface. + + This is essentially a SAX interface for TinyXML. (Note however it doesn't re-parse + the XML for the callbacks, so the performance of TinyXML is unchanged by using this + interface versus any other.) + + The interface has been based on ideas from: + + - http://www.saxproject.org/ + - http://c2.com/cgi/wiki?HierarchicalVisitorPattern + + Which are both good references for "visiting". + + An example of using Accept(): + @verbatim + TiXmlPrinter printer; + tinyxmlDoc.Accept( &printer ); + const char* xmlcstr = printer.CStr(); + @endverbatim + */ + virtual bool Accept( TiXmlVisitor* visitor ) const = 0; + +protected: + TiXmlNode( NodeType _type ); + + // Copy to the allocated object. Shared functionality between Clone, Copy constructor, + // and the assignment operator. + void CopyTo( TiXmlNode* target ) const; + + #ifdef TIXML_USE_STL + // The real work of the input operator. + virtual void StreamIn( std::istream* in, TIXML_STRING* tag ) = 0; + #endif + + // Figure out what is at *p, and parse it. Returns null if it is not an xml node. + TiXmlNode* Identify( const char* start, TiXmlEncoding encoding ); + + TiXmlNode* parent; + NodeType type; + + TiXmlNode* firstChild; + TiXmlNode* lastChild; + + TIXML_STRING value; + + TiXmlNode* prev; + TiXmlNode* next; + +private: + TiXmlNode( const TiXmlNode& ); // not implemented. + void operator=( const TiXmlNode& base ); // not allowed. +}; + + +/** An attribute is a name-value pair. Elements have an arbitrary + number of attributes, each with a unique name. + + @note The attributes are not TiXmlNodes, since they are not + part of the tinyXML document object model. There are other + suggested ways to look at this problem. +*/ +class TiXmlAttribute : public TiXmlBase +{ + friend class TiXmlAttributeSet; + +public: + /// Construct an empty attribute. + TiXmlAttribute() : TiXmlBase() + { + document = 0; + prev = next = 0; + } + + #ifdef TIXML_USE_STL + /// std::string constructor. + TiXmlAttribute( const std::string& _name, const std::string& _value ) + { + name = _name; + value = _value; + document = 0; + prev = next = 0; + } + #endif + + /// Construct an attribute with a name and value. + TiXmlAttribute( const char * _name, const char * _value ) + { + name = _name; + value = _value; + document = 0; + prev = next = 0; + } + + const char* Name() const { return name.c_str(); } ///< Return the name of this attribute. + const char* Value() const { return value.c_str(); } ///< Return the value of this attribute. + #ifdef TIXML_USE_STL + const std::string& ValueStr() const { return value; } ///< Return the value of this attribute. + #endif + int IntValue() const; ///< Return the value of this attribute, converted to an integer. + double DoubleValue() const; ///< Return the value of this attribute, converted to a double. + + // Get the tinyxml string representation + const TIXML_STRING& NameTStr() const { return name; } + + /** QueryIntValue examines the value string. It is an alternative to the + IntValue() method with richer error checking. + If the value is an integer, it is stored in 'value' and + the call returns TIXML_SUCCESS. If it is not + an integer, it returns TIXML_WRONG_TYPE. + + A specialized but useful call. Note that for success it returns 0, + which is the opposite of almost all other TinyXml calls. + */ + int QueryIntValue( int* _value ) const; + /// QueryDoubleValue examines the value string. See QueryIntValue(). + int QueryDoubleValue( double* _value ) const; + + void SetName( const char* _name ) { name = _name; } ///< Set the name of this attribute. + void SetValue( const char* _value ) { value = _value; } ///< Set the value. + + void SetIntValue( int _value ); ///< Set the value from an integer. + void SetDoubleValue( double _value ); ///< Set the value from a double. + + #ifdef TIXML_USE_STL + /// STL std::string form. + void SetName( const std::string& _name ) { name = _name; } + /// STL std::string form. + void SetValue( const std::string& _value ) { value = _value; } + #endif + + /// Get the next sibling attribute in the DOM. Returns null at end. + const TiXmlAttribute* Next() const; + TiXmlAttribute* Next() { + return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttribute* >(this))->Next() ); + } + + /// Get the previous sibling attribute in the DOM. Returns null at beginning. + const TiXmlAttribute* Previous() const; + TiXmlAttribute* Previous() { + return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttribute* >(this))->Previous() ); + } + + bool operator==( const TiXmlAttribute& rhs ) const { return rhs.name == name; } + bool operator<( const TiXmlAttribute& rhs ) const { return name < rhs.name; } + bool operator>( const TiXmlAttribute& rhs ) const { return name > rhs.name; } + + /* Attribute parsing starts: first letter of the name + returns: the next char after the value end quote + */ + virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); + + // Prints this Attribute to a FILE stream. + virtual void Print( FILE* cfile, int depth ) const { + Print( cfile, depth, 0 ); + } + void Print( FILE* cfile, int depth, TIXML_STRING* str ) const; + + // [internal use] + // Set the document pointer so the attribute can report errors. + void SetDocument( TiXmlDocument* doc ) { document = doc; } + +private: + TiXmlAttribute( const TiXmlAttribute& ); // not implemented. + void operator=( const TiXmlAttribute& base ); // not allowed. + + TiXmlDocument* document; // A pointer back to a document, for error reporting. + TIXML_STRING name; + TIXML_STRING value; + TiXmlAttribute* prev; + TiXmlAttribute* next; +}; + + +/* A class used to manage a group of attributes. + It is only used internally, both by the ELEMENT and the DECLARATION. + + The set can be changed transparent to the Element and Declaration + classes that use it, but NOT transparent to the Attribute + which has to implement a next() and previous() method. Which makes + it a bit problematic and prevents the use of STL. + + This version is implemented with circular lists because: + - I like circular lists + - it demonstrates some independence from the (typical) doubly linked list. +*/ +class TiXmlAttributeSet +{ +public: + TiXmlAttributeSet(); + ~TiXmlAttributeSet(); + + void Add( TiXmlAttribute* attribute ); + void Remove( TiXmlAttribute* attribute ); + + const TiXmlAttribute* First() const { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; } + TiXmlAttribute* First() { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; } + const TiXmlAttribute* Last() const { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; } + TiXmlAttribute* Last() { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; } + + TiXmlAttribute* Find( const char* _name ) const; + TiXmlAttribute* FindOrCreate( const char* _name ); + +# ifdef TIXML_USE_STL + TiXmlAttribute* Find( const std::string& _name ) const; + TiXmlAttribute* FindOrCreate( const std::string& _name ); +# endif + + +private: + //*ME: Because of hidden/disabled copy-construktor in TiXmlAttribute (sentinel-element), + //*ME: this class must be also use a hidden/disabled copy-constructor !!! + TiXmlAttributeSet( const TiXmlAttributeSet& ); // not allowed + void operator=( const TiXmlAttributeSet& ); // not allowed (as TiXmlAttribute) + + TiXmlAttribute sentinel; +}; + + +/** The element is a container class. It has a value, the element name, + and can contain other elements, text, comments, and unknowns. + Elements also contain an arbitrary number of attributes. +*/ +class TiXmlElement : public TiXmlNode +{ +public: + /// Construct an element. + TiXmlElement (const char * in_value); + + #ifdef TIXML_USE_STL + /// std::string constructor. + TiXmlElement( const std::string& _value ); + #endif + + TiXmlElement( const TiXmlElement& ); + + TiXmlElement& operator=( const TiXmlElement& base ); + + virtual ~TiXmlElement(); + + /** Given an attribute name, Attribute() returns the value + for the attribute of that name, or null if none exists. + */ + const char* Attribute( const char* name ) const; + + /** Given an attribute name, Attribute() returns the value + for the attribute of that name, or null if none exists. + If the attribute exists and can be converted to an integer, + the integer value will be put in the return 'i', if 'i' + is non-null. + */ + const char* Attribute( const char* name, int* i ) const; + + /** Given an attribute name, Attribute() returns the value + for the attribute of that name, or null if none exists. + If the attribute exists and can be converted to an double, + the double value will be put in the return 'd', if 'd' + is non-null. + */ + const char* Attribute( const char* name, double* d ) const; + + /** QueryIntAttribute examines the attribute - it is an alternative to the + Attribute() method with richer error checking. + If the attribute is an integer, it is stored in 'value' and + the call returns TIXML_SUCCESS. If it is not + an integer, it returns TIXML_WRONG_TYPE. If the attribute + does not exist, then TIXML_NO_ATTRIBUTE is returned. + */ + int QueryIntAttribute( const char* name, int* _value ) const; + /// QueryUnsignedAttribute examines the attribute - see QueryIntAttribute(). + int QueryUnsignedAttribute( const char* name, unsigned* _value ) const; + /** QueryBoolAttribute examines the attribute - see QueryIntAttribute(). + Note that '1', 'true', or 'yes' are considered true, while '0', 'false' + and 'no' are considered false. + */ + int QueryBoolAttribute( const char* name, bool* _value ) const; + /// QueryDoubleAttribute examines the attribute - see QueryIntAttribute(). + int QueryDoubleAttribute( const char* name, double* _value ) const; + /// QueryFloatAttribute examines the attribute - see QueryIntAttribute(). + int QueryFloatAttribute( const char* name, float* _value ) const { + double d; + int result = QueryDoubleAttribute( name, &d ); + if ( result == TIXML_SUCCESS ) { + *_value = (float)d; + } + return result; + } + + #ifdef TIXML_USE_STL + /// QueryStringAttribute examines the attribute - see QueryIntAttribute(). + int QueryStringAttribute( const char* name, std::string* _value ) const { + const char* cstr = Attribute( name ); + if ( cstr ) { + *_value = std::string( cstr ); + return TIXML_SUCCESS; + } + return TIXML_NO_ATTRIBUTE; + } + + /** Template form of the attribute query which will try to read the + attribute into the specified type. Very easy, very powerful, but + be careful to make sure to call this with the correct type. + + NOTE: This method doesn't work correctly for 'string' types that contain spaces. + + @return TIXML_SUCCESS, TIXML_WRONG_TYPE, or TIXML_NO_ATTRIBUTE + */ + template< typename T > int QueryValueAttribute( const std::string& name, T* outValue ) const + { + const TiXmlAttribute* node = attributeSet.Find( name ); + if ( !node ) + return TIXML_NO_ATTRIBUTE; + + std::stringstream sstream( node->ValueStr() ); + sstream >> *outValue; + if ( !sstream.fail() ) + return TIXML_SUCCESS; + return TIXML_WRONG_TYPE; + } + + int QueryValueAttribute( const std::string& name, std::string* outValue ) const + { + const TiXmlAttribute* node = attributeSet.Find( name ); + if ( !node ) + return TIXML_NO_ATTRIBUTE; + *outValue = node->ValueStr(); + return TIXML_SUCCESS; + } + #endif + + /** Sets an attribute of name to a given value. The attribute + will be created if it does not exist, or changed if it does. + */ + void SetAttribute( const char* name, const char * _value ); + + #ifdef TIXML_USE_STL + const std::string* Attribute( const std::string& name ) const; + const std::string* Attribute( const std::string& name, int* i ) const; + const std::string* Attribute( const std::string& name, double* d ) const; + int QueryIntAttribute( const std::string& name, int* _value ) const; + int QueryDoubleAttribute( const std::string& name, double* _value ) const; + + /// STL std::string form. + void SetAttribute( const std::string& name, const std::string& _value ); + ///< STL std::string form. + void SetAttribute( const std::string& name, int _value ); + ///< STL std::string form. + void SetDoubleAttribute( const std::string& name, double value ); + #endif + + /** Sets an attribute of name to a given value. The attribute + will be created if it does not exist, or changed if it does. + */ + void SetAttribute( const char * name, int value ); + + /** Sets an attribute of name to a given value. The attribute + will be created if it does not exist, or changed if it does. + */ + void SetDoubleAttribute( const char * name, double value ); + + /** Deletes an attribute with the given name. + */ + void RemoveAttribute( const char * name ); + #ifdef TIXML_USE_STL + void RemoveAttribute( const std::string& name ) { RemoveAttribute (name.c_str ()); } ///< STL std::string form. + #endif + + const TiXmlAttribute* FirstAttribute() const { return attributeSet.First(); } ///< Access the first attribute in this element. + TiXmlAttribute* FirstAttribute() { return attributeSet.First(); } + const TiXmlAttribute* LastAttribute() const { return attributeSet.Last(); } ///< Access the last attribute in this element. + TiXmlAttribute* LastAttribute() { return attributeSet.Last(); } + + /** Convenience function for easy access to the text inside an element. Although easy + and concise, GetText() is limited compared to getting the TiXmlText child + and accessing it directly. + + If the first child of 'this' is a TiXmlText, the GetText() + returns the character string of the Text node, else null is returned. + + This is a convenient method for getting the text of simple contained text: + @verbatim + This is text + const char* str = fooElement->GetText(); + @endverbatim + + 'str' will be a pointer to "This is text". + + Note that this function can be misleading. If the element foo was created from + this XML: + @verbatim + This is text + @endverbatim + + then the value of str would be null. The first child node isn't a text node, it is + another element. From this XML: + @verbatim + This is text + @endverbatim + GetText() will return "This is ". + + WARNING: GetText() accesses a child node - don't become confused with the + similarly named TiXmlHandle::Text() and TiXmlNode::ToText() which are + safe type casts on the referenced node. + */ + const char* GetText() const; + + /// Creates a new Element and returns it - the returned element is a copy. + virtual TiXmlNode* Clone() const; + // Print the Element to a FILE stream. + virtual void Print( FILE* cfile, int depth ) const; + + /* Attribtue parsing starts: next char past '<' + returns: next char past '>' + */ + virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); + + virtual const TiXmlElement* ToElement() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + virtual TiXmlElement* ToElement() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + + /** Walk the XML tree visiting this node and all of its children. + */ + virtual bool Accept( TiXmlVisitor* visitor ) const; + +protected: + + void CopyTo( TiXmlElement* target ) const; + void ClearThis(); // like clear, but initializes 'this' object as well + + // Used to be public [internal use] + #ifdef TIXML_USE_STL + virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); + #endif + /* [internal use] + Reads the "value" of the element -- another element, or text. + This should terminate with the current end tag. + */ + const char* ReadValue( const char* in, TiXmlParsingData* prevData, TiXmlEncoding encoding ); + +private: + TiXmlAttributeSet attributeSet; +}; + + +/** An XML comment. +*/ +class TiXmlComment : public TiXmlNode +{ +public: + /// Constructs an empty comment. + TiXmlComment() : TiXmlNode( TiXmlNode::TINYXML_COMMENT ) {} + /// Construct a comment from text. + TiXmlComment( const char* _value ) : TiXmlNode( TiXmlNode::TINYXML_COMMENT ) { + SetValue( _value ); + } + TiXmlComment( const TiXmlComment& ); + TiXmlComment& operator=( const TiXmlComment& base ); + + virtual ~TiXmlComment() {} + + /// Returns a copy of this Comment. + virtual TiXmlNode* Clone() const; + // Write this Comment to a FILE stream. + virtual void Print( FILE* cfile, int depth ) const; + + /* Attribtue parsing starts: at the ! of the !-- + returns: next char past '>' + */ + virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); + + virtual const TiXmlComment* ToComment() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + virtual TiXmlComment* ToComment() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + + /** Walk the XML tree visiting this node and all of its children. + */ + virtual bool Accept( TiXmlVisitor* visitor ) const; + +protected: + void CopyTo( TiXmlComment* target ) const; + + // used to be public + #ifdef TIXML_USE_STL + virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); + #endif +// virtual void StreamOut( TIXML_OSTREAM * out ) const; + +private: + +}; + + +/** XML text. A text node can have 2 ways to output the next. "normal" output + and CDATA. It will default to the mode it was parsed from the XML file and + you generally want to leave it alone, but you can change the output mode with + SetCDATA() and query it with CDATA(). +*/ +class TiXmlText : public TiXmlNode +{ + friend class TiXmlElement; +public: + /** Constructor for text element. By default, it is treated as + normal, encoded text. If you want it be output as a CDATA text + element, set the parameter _cdata to 'true' + */ + TiXmlText (const char * initValue ) : TiXmlNode (TiXmlNode::TINYXML_TEXT) + { + SetValue( initValue ); + cdata = false; + } + virtual ~TiXmlText() {} + + #ifdef TIXML_USE_STL + /// Constructor. + TiXmlText( const std::string& initValue ) : TiXmlNode (TiXmlNode::TINYXML_TEXT) + { + SetValue( initValue ); + cdata = false; + } + #endif + + TiXmlText( const TiXmlText& copy ) : TiXmlNode( TiXmlNode::TINYXML_TEXT ) { copy.CopyTo( this ); } + TiXmlText& operator=( const TiXmlText& base ) { base.CopyTo( this ); return *this; } + + // Write this text object to a FILE stream. + virtual void Print( FILE* cfile, int depth ) const; + + /// Queries whether this represents text using a CDATA section. + bool CDATA() const { return cdata; } + /// Turns on or off a CDATA representation of text. + void SetCDATA( bool _cdata ) { cdata = _cdata; } + + virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); + + virtual const TiXmlText* ToText() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + virtual TiXmlText* ToText() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + + /** Walk the XML tree visiting this node and all of its children. + */ + virtual bool Accept( TiXmlVisitor* content ) const; + +protected : + /// [internal use] Creates a new Element and returns it. + virtual TiXmlNode* Clone() const; + void CopyTo( TiXmlText* target ) const; + + bool Blank() const; // returns true if all white space and new lines + // [internal use] + #ifdef TIXML_USE_STL + virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); + #endif + +private: + bool cdata; // true if this should be input and output as a CDATA style text element +}; + + +/** In correct XML the declaration is the first entry in the file. + @verbatim + + @endverbatim + + TinyXml will happily read or write files without a declaration, + however. There are 3 possible attributes to the declaration: + version, encoding, and standalone. + + Note: In this version of the code, the attributes are + handled as special cases, not generic attributes, simply + because there can only be at most 3 and they are always the same. +*/ +class TiXmlDeclaration : public TiXmlNode +{ +public: + /// Construct an empty declaration. + TiXmlDeclaration() : TiXmlNode( TiXmlNode::TINYXML_DECLARATION ) {} + +#ifdef TIXML_USE_STL + /// Constructor. + TiXmlDeclaration( const std::string& _version, + const std::string& _encoding, + const std::string& _standalone ); +#endif + + /// Construct. + TiXmlDeclaration( const char* _version, + const char* _encoding, + const char* _standalone ); + + TiXmlDeclaration( const TiXmlDeclaration& copy ); + TiXmlDeclaration& operator=( const TiXmlDeclaration& copy ); + + virtual ~TiXmlDeclaration() {} + + /// Version. Will return an empty string if none was found. + const char *Version() const { return version.c_str (); } + /// Encoding. Will return an empty string if none was found. + const char *Encoding() const { return encoding.c_str (); } + /// Is this a standalone document? + const char *Standalone() const { return standalone.c_str (); } + + /// Creates a copy of this Declaration and returns it. + virtual TiXmlNode* Clone() const; + // Print this declaration to a FILE stream. + virtual void Print( FILE* cfile, int depth, TIXML_STRING* str ) const; + virtual void Print( FILE* cfile, int depth ) const { + Print( cfile, depth, 0 ); + } + + virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); + + virtual const TiXmlDeclaration* ToDeclaration() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + virtual TiXmlDeclaration* ToDeclaration() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + + /** Walk the XML tree visiting this node and all of its children. + */ + virtual bool Accept( TiXmlVisitor* visitor ) const; + +protected: + void CopyTo( TiXmlDeclaration* target ) const; + // used to be public + #ifdef TIXML_USE_STL + virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); + #endif + +private: + + TIXML_STRING version; + TIXML_STRING encoding; + TIXML_STRING standalone; +}; + + +/** Any tag that tinyXml doesn't recognize is saved as an + unknown. It is a tag of text, but should not be modified. + It will be written back to the XML, unchanged, when the file + is saved. + + DTD tags get thrown into TiXmlUnknowns. +*/ +class TiXmlUnknown : public TiXmlNode +{ +public: + TiXmlUnknown() : TiXmlNode( TiXmlNode::TINYXML_UNKNOWN ) {} + virtual ~TiXmlUnknown() {} + + TiXmlUnknown( const TiXmlUnknown& copy ) : TiXmlNode( TiXmlNode::TINYXML_UNKNOWN ) { copy.CopyTo( this ); } + TiXmlUnknown& operator=( const TiXmlUnknown& copy ) { copy.CopyTo( this ); return *this; } + + /// Creates a copy of this Unknown and returns it. + virtual TiXmlNode* Clone() const; + // Print this Unknown to a FILE stream. + virtual void Print( FILE* cfile, int depth ) const; + + virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); + + virtual const TiXmlUnknown* ToUnknown() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + virtual TiXmlUnknown* ToUnknown() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + + /** Walk the XML tree visiting this node and all of its children. + */ + virtual bool Accept( TiXmlVisitor* content ) const; + +protected: + void CopyTo( TiXmlUnknown* target ) const; + + #ifdef TIXML_USE_STL + virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); + #endif + +private: + +}; + + +/** Always the top level node. A document binds together all the + XML pieces. It can be saved, loaded, and printed to the screen. + The 'value' of a document node is the xml file name. +*/ +class TiXmlDocument : public TiXmlNode +{ +public: + /// Create an empty document, that has no name. + TiXmlDocument(); + /// Create a document with a name. The name of the document is also the filename of the xml. + TiXmlDocument( const char * documentName ); + + #ifdef TIXML_USE_STL + /// Constructor. + TiXmlDocument( const std::string& documentName ); + #endif + + TiXmlDocument( const TiXmlDocument& copy ); + TiXmlDocument& operator=( const TiXmlDocument& copy ); + + virtual ~TiXmlDocument() {} + + /** Load a file using the current document value. + Returns true if successful. Will delete any existing + document data before loading. + */ + bool LoadFile( TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); + /// Save a file using the current document value. Returns true if successful. + bool SaveFile() const; + /// Load a file using the given filename. Returns true if successful. + bool LoadFile( const char * filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); + /// Save a file using the given filename. Returns true if successful. + bool SaveFile( const char * filename ) const; + /** Load a file using the given FILE*. Returns true if successful. Note that this method + doesn't stream - the entire object pointed at by the FILE* + will be interpreted as an XML file. TinyXML doesn't stream in XML from the current + file location. Streaming may be added in the future. + */ + bool LoadFile( FILE*, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); + /// Save a file using the given FILE*. Returns true if successful. + bool SaveFile( FILE* ) const; + + #ifdef TIXML_USE_STL + bool LoadFile( const std::string& filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ) ///< STL std::string version. + { + return LoadFile( filename.c_str(), encoding ); + } + bool SaveFile( const std::string& filename ) const ///< STL std::string version. + { + return SaveFile( filename.c_str() ); + } + #endif + + /** Parse the given null terminated block of xml data. Passing in an encoding to this + method (either TIXML_ENCODING_LEGACY or TIXML_ENCODING_UTF8 will force TinyXml + to use that encoding, regardless of what TinyXml might otherwise try to detect. + */ + virtual const char* Parse( const char* p, TiXmlParsingData* data = 0, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); + + /** Get the root element -- the only top level element -- of the document. + In well formed XML, there should only be one. TinyXml is tolerant of + multiple elements at the document level. + */ + const TiXmlElement* RootElement() const { return FirstChildElement(); } + TiXmlElement* RootElement() { return FirstChildElement(); } + + /** If an error occurs, Error will be set to true. Also, + - The ErrorId() will contain the integer identifier of the error (not generally useful) + - The ErrorDesc() method will return the name of the error. (very useful) + - The ErrorRow() and ErrorCol() will return the location of the error (if known) + */ + bool Error() const { return error; } + + /// Contains a textual (english) description of the error if one occurs. + const char * ErrorDesc() const { return errorDesc.c_str (); } + + /** Generally, you probably want the error string ( ErrorDesc() ). But if you + prefer the ErrorId, this function will fetch it. + */ + int ErrorId() const { return errorId; } + + /** Returns the location (if known) of the error. The first column is column 1, + and the first row is row 1. A value of 0 means the row and column wasn't applicable + (memory errors, for example, have no row/column) or the parser lost the error. (An + error in the error reporting, in that case.) + + @sa SetTabSize, Row, Column + */ + int ErrorRow() const { return errorLocation.row+1; } + int ErrorCol() const { return errorLocation.col+1; } ///< The column where the error occured. See ErrorRow() + + /** SetTabSize() allows the error reporting functions (ErrorRow() and ErrorCol()) + to report the correct values for row and column. It does not change the output + or input in any way. + + By calling this method, with a tab size + greater than 0, the row and column of each node and attribute is stored + when the file is loaded. Very useful for tracking the DOM back in to + the source file. + + The tab size is required for calculating the location of nodes. If not + set, the default of 4 is used. The tabsize is set per document. Setting + the tabsize to 0 disables row/column tracking. + + Note that row and column tracking is not supported when using operator>>. + + The tab size needs to be enabled before the parse or load. Correct usage: + @verbatim + TiXmlDocument doc; + doc.SetTabSize( 8 ); + doc.Load( "myfile.xml" ); + @endverbatim + + @sa Row, Column + */ + void SetTabSize( int _tabsize ) { tabsize = _tabsize; } + + int TabSize() const { return tabsize; } + + /** If you have handled the error, it can be reset with this call. The error + state is automatically cleared if you Parse a new XML block. + */ + void ClearError() { error = false; + errorId = 0; + errorDesc = ""; + errorLocation.row = errorLocation.col = 0; + //errorLocation.last = 0; + } + + /** Write the document to standard out using formatted printing ("pretty print"). */ + void Print() const { Print( stdout, 0 ); } + + /* Write the document to a string using formatted printing ("pretty print"). This + will allocate a character array (new char[]) and return it as a pointer. The + calling code pust call delete[] on the return char* to avoid a memory leak. + */ + //char* PrintToMemory() const; + + /// Print this Document to a FILE stream. + virtual void Print( FILE* cfile, int depth = 0 ) const; + // [internal use] + void SetError( int err, const char* errorLocation, TiXmlParsingData* prevData, TiXmlEncoding encoding ); + + virtual const TiXmlDocument* ToDocument() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + virtual TiXmlDocument* ToDocument() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + + /** Walk the XML tree visiting this node and all of its children. + */ + virtual bool Accept( TiXmlVisitor* content ) const; + +protected : + // [internal use] + virtual TiXmlNode* Clone() const; + #ifdef TIXML_USE_STL + virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); + #endif + +private: + void CopyTo( TiXmlDocument* target ) const; + + bool error; + int errorId; + TIXML_STRING errorDesc; + int tabsize; + TiXmlCursor errorLocation; + bool useMicrosoftBOM; // the UTF-8 BOM were found when read. Note this, and try to write. +}; + + +/** + A TiXmlHandle is a class that wraps a node pointer with null checks; this is + an incredibly useful thing. Note that TiXmlHandle is not part of the TinyXml + DOM structure. It is a separate utility class. + + Take an example: + @verbatim + + + + + + + @endverbatim + + Assuming you want the value of "attributeB" in the 2nd "Child" element, it's very + easy to write a *lot* of code that looks like: + + @verbatim + TiXmlElement* root = document.FirstChildElement( "Document" ); + if ( root ) + { + TiXmlElement* element = root->FirstChildElement( "Element" ); + if ( element ) + { + TiXmlElement* child = element->FirstChildElement( "Child" ); + if ( child ) + { + TiXmlElement* child2 = child->NextSiblingElement( "Child" ); + if ( child2 ) + { + // Finally do something useful. + @endverbatim + + And that doesn't even cover "else" cases. TiXmlHandle addresses the verbosity + of such code. A TiXmlHandle checks for null pointers so it is perfectly safe + and correct to use: + + @verbatim + TiXmlHandle docHandle( &document ); + TiXmlElement* child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", 1 ).ToElement(); + if ( child2 ) + { + // do something useful + @endverbatim + + Which is MUCH more concise and useful. + + It is also safe to copy handles - internally they are nothing more than node pointers. + @verbatim + TiXmlHandle handleCopy = handle; + @endverbatim + + What they should not be used for is iteration: + + @verbatim + int i=0; + while ( true ) + { + TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", i ).ToElement(); + if ( !child ) + break; + // do something + ++i; + } + @endverbatim + + It seems reasonable, but it is in fact two embedded while loops. The Child method is + a linear walk to find the element, so this code would iterate much more than it needs + to. Instead, prefer: + + @verbatim + TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).FirstChild( "Child" ).ToElement(); + + for( child; child; child=child->NextSiblingElement() ) + { + // do something + } + @endverbatim +*/ +class TiXmlHandle +{ +public: + /// Create a handle from any node (at any depth of the tree.) This can be a null pointer. + TiXmlHandle( TiXmlNode* _node ) { this->node = _node; } + /// Copy constructor + TiXmlHandle( const TiXmlHandle& ref ) { this->node = ref.node; } + TiXmlHandle operator=( const TiXmlHandle& ref ) { if ( &ref != this ) this->node = ref.node; return *this; } + + /// Return a handle to the first child node. + TiXmlHandle FirstChild() const; + /// Return a handle to the first child node with the given name. + TiXmlHandle FirstChild( const char * value ) const; + /// Return a handle to the first child element. + TiXmlHandle FirstChildElement() const; + /// Return a handle to the first child element with the given name. + TiXmlHandle FirstChildElement( const char * value ) const; + + /** Return a handle to the "index" child with the given name. + The first child is 0, the second 1, etc. + */ + TiXmlHandle Child( const char* value, int index ) const; + /** Return a handle to the "index" child. + The first child is 0, the second 1, etc. + */ + TiXmlHandle Child( int index ) const; + /** Return a handle to the "index" child element with the given name. + The first child element is 0, the second 1, etc. Note that only TiXmlElements + are indexed: other types are not counted. + */ + TiXmlHandle ChildElement( const char* value, int index ) const; + /** Return a handle to the "index" child element. + The first child element is 0, the second 1, etc. Note that only TiXmlElements + are indexed: other types are not counted. + */ + TiXmlHandle ChildElement( int index ) const; + + #ifdef TIXML_USE_STL + TiXmlHandle FirstChild( const std::string& _value ) const { return FirstChild( _value.c_str() ); } + TiXmlHandle FirstChildElement( const std::string& _value ) const { return FirstChildElement( _value.c_str() ); } + + TiXmlHandle Child( const std::string& _value, int index ) const { return Child( _value.c_str(), index ); } + TiXmlHandle ChildElement( const std::string& _value, int index ) const { return ChildElement( _value.c_str(), index ); } + #endif + + /** Return the handle as a TiXmlNode. This may return null. + */ + TiXmlNode* ToNode() const { return node; } + /** Return the handle as a TiXmlElement. This may return null. + */ + TiXmlElement* ToElement() const { return ( ( node && node->ToElement() ) ? node->ToElement() : 0 ); } + /** Return the handle as a TiXmlText. This may return null. + */ + TiXmlText* ToText() const { return ( ( node && node->ToText() ) ? node->ToText() : 0 ); } + /** Return the handle as a TiXmlUnknown. This may return null. + */ + TiXmlUnknown* ToUnknown() const { return ( ( node && node->ToUnknown() ) ? node->ToUnknown() : 0 ); } + + /** @deprecated use ToNode. + Return the handle as a TiXmlNode. This may return null. + */ + TiXmlNode* Node() const { return ToNode(); } + /** @deprecated use ToElement. + Return the handle as a TiXmlElement. This may return null. + */ + TiXmlElement* Element() const { return ToElement(); } + /** @deprecated use ToText() + Return the handle as a TiXmlText. This may return null. + */ + TiXmlText* Text() const { return ToText(); } + /** @deprecated use ToUnknown() + Return the handle as a TiXmlUnknown. This may return null. + */ + TiXmlUnknown* Unknown() const { return ToUnknown(); } + +private: + TiXmlNode* node; +}; + + +/** Print to memory functionality. The TiXmlPrinter is useful when you need to: + + -# Print to memory (especially in non-STL mode) + -# Control formatting (line endings, etc.) + + When constructed, the TiXmlPrinter is in its default "pretty printing" mode. + Before calling Accept() you can call methods to control the printing + of the XML document. After TiXmlNode::Accept() is called, the printed document can + be accessed via the CStr(), Str(), and Size() methods. + + TiXmlPrinter uses the Visitor API. + @verbatim + TiXmlPrinter printer; + printer.SetIndent( "\t" ); + + doc.Accept( &printer ); + fprintf( stdout, "%s", printer.CStr() ); + @endverbatim +*/ +class TiXmlPrinter : public TiXmlVisitor +{ +public: + TiXmlPrinter() : depth( 0 ), simpleTextPrint( false ), + buffer(), indent( " " ), lineBreak( "\n" ) {} + + virtual bool VisitEnter( const TiXmlDocument& doc ); + virtual bool VisitExit( const TiXmlDocument& doc ); + + virtual bool VisitEnter( const TiXmlElement& element, const TiXmlAttribute* firstAttribute ); + virtual bool VisitExit( const TiXmlElement& element ); + + virtual bool Visit( const TiXmlDeclaration& declaration ); + virtual bool Visit( const TiXmlText& text ); + virtual bool Visit( const TiXmlComment& comment ); + virtual bool Visit( const TiXmlUnknown& unknown ); + + /** Set the indent characters for printing. By default 4 spaces + but tab (\t) is also useful, or null/empty string for no indentation. + */ + void SetIndent( const char* _indent ) { indent = _indent ? _indent : "" ; } + /// Query the indention string. + const char* Indent() { return indent.c_str(); } + /** Set the line breaking string. By default set to newline (\n). + Some operating systems prefer other characters, or can be + set to the null/empty string for no indenation. + */ + void SetLineBreak( const char* _lineBreak ) { lineBreak = _lineBreak ? _lineBreak : ""; } + /// Query the current line breaking string. + const char* LineBreak() { return lineBreak.c_str(); } + + /** Switch over to "stream printing" which is the most dense formatting without + linebreaks. Common when the XML is needed for network transmission. + */ + void SetStreamPrinting() { indent = ""; + lineBreak = ""; + } + /// Return the result. + const char* CStr() { return buffer.c_str(); } + /// Return the length of the result string. + size_t Size() { return buffer.size(); } + + #ifdef TIXML_USE_STL + /// Return the result. + const std::string& Str() { return buffer; } + #endif + +private: + void DoIndent() { + for( int i=0; i +#include + +#include "tinyxml.h" + +//#define DEBUG_PARSER +#if defined( DEBUG_PARSER ) +# if defined( DEBUG ) && defined( _MSC_VER ) +# include +# define TIXML_LOG OutputDebugString +# else +# define TIXML_LOG printf +# endif +#endif + +// Note tha "PutString" hardcodes the same list. This +// is less flexible than it appears. Changing the entries +// or order will break putstring. +TiXmlBase::Entity TiXmlBase::entity[ TiXmlBase::NUM_ENTITY ] = +{ + { "&", 5, '&' }, + { "<", 4, '<' }, + { ">", 4, '>' }, + { """, 6, '\"' }, + { "'", 6, '\'' } +}; + +// Bunch of unicode info at: +// http://www.unicode.org/faq/utf_bom.html +// Including the basic of this table, which determines the #bytes in the +// sequence from the lead byte. 1 placed for invalid sequences -- +// although the result will be junk, pass it through as much as possible. +// Beware of the non-characters in UTF-8: +// ef bb bf (Microsoft "lead bytes") +// ef bf be +// ef bf bf + +const unsigned char TIXML_UTF_LEAD_0 = 0xefU; +const unsigned char TIXML_UTF_LEAD_1 = 0xbbU; +const unsigned char TIXML_UTF_LEAD_2 = 0xbfU; + +const int TiXmlBase::utf8ByteTable[256] = +{ + // 0 1 2 3 4 5 6 7 8 9 a b c d e f + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x00 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x10 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x20 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x30 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x40 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x50 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x60 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x70 End of ASCII range + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x80 0x80 to 0xc1 invalid + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x90 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0xa0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0xb0 + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 0xc0 0xc2 to 0xdf 2 byte + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 0xd0 + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 0xe0 0xe0 to 0xef 3 byte + 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // 0xf0 0xf0 to 0xf4 4 byte, 0xf5 and higher invalid +}; + + +void TiXmlBase::ConvertUTF32ToUTF8( unsigned long input, char* output, int* length ) +{ + const unsigned long BYTE_MASK = 0xBF; + const unsigned long BYTE_MARK = 0x80; + const unsigned long FIRST_BYTE_MARK[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; + + if (input < 0x80) + *length = 1; + else if ( input < 0x800 ) + *length = 2; + else if ( input < 0x10000 ) + *length = 3; + else if ( input < 0x200000 ) + *length = 4; + else + { *length = 0; return; } // This code won't covert this correctly anyway. + + output += *length; + + // Scary scary fall throughs. + switch (*length) + { + case 4: + --output; + *output = (char)((input | BYTE_MARK) & BYTE_MASK); + input >>= 6; + case 3: + --output; + *output = (char)((input | BYTE_MARK) & BYTE_MASK); + input >>= 6; + case 2: + --output; + *output = (char)((input | BYTE_MARK) & BYTE_MASK); + input >>= 6; + case 1: + --output; + *output = (char)(input | FIRST_BYTE_MARK[*length]); + } +} + + +/*static*/ int TiXmlBase::IsAlpha( unsigned char anyByte, TiXmlEncoding /*encoding*/ ) +{ + // This will only work for low-ascii, everything else is assumed to be a valid + // letter. I'm not sure this is the best approach, but it is quite tricky trying + // to figure out alhabetical vs. not across encoding. So take a very + // conservative approach. + +// if ( encoding == TIXML_ENCODING_UTF8 ) +// { + if ( anyByte < 127 ) + return isalpha( anyByte ); + else + return 1; // What else to do? The unicode set is huge...get the english ones right. +// } +// else +// { +// return isalpha( anyByte ); +// } +} + + +/*static*/ int TiXmlBase::IsAlphaNum( unsigned char anyByte, TiXmlEncoding /*encoding*/ ) +{ + // This will only work for low-ascii, everything else is assumed to be a valid + // letter. I'm not sure this is the best approach, but it is quite tricky trying + // to figure out alhabetical vs. not across encoding. So take a very + // conservative approach. + +// if ( encoding == TIXML_ENCODING_UTF8 ) +// { + if ( anyByte < 127 ) + return isalnum( anyByte ); + else + return 1; // What else to do? The unicode set is huge...get the english ones right. +// } +// else +// { +// return isalnum( anyByte ); +// } +} + + +class TiXmlParsingData +{ + friend class TiXmlDocument; + public: + void Stamp( const char* now, TiXmlEncoding encoding ); + + const TiXmlCursor& Cursor() const { return cursor; } + + private: + // Only used by the document! + TiXmlParsingData( const char* start, int _tabsize, int row, int col ) + { + assert( start ); + stamp = start; + tabsize = _tabsize; + cursor.row = row; + cursor.col = col; + } + + TiXmlCursor cursor; + const char* stamp; + int tabsize; +}; + + +void TiXmlParsingData::Stamp( const char* now, TiXmlEncoding encoding ) +{ + assert( now ); + + // Do nothing if the tabsize is 0. + if ( tabsize < 1 ) + { + return; + } + + // Get the current row, column. + int row = cursor.row; + int col = cursor.col; + const char* p = stamp; + assert( p ); + + while ( p < now ) + { + // Treat p as unsigned, so we have a happy compiler. + const unsigned char* pU = (const unsigned char*)p; + + // Code contributed by Fletcher Dunn: (modified by lee) + switch (*pU) { + case 0: + // We *should* never get here, but in case we do, don't + // advance past the terminating null character, ever + return; + + case '\r': + // bump down to the next line + ++row; + col = 0; + // Eat the character + ++p; + + // Check for \r\n sequence, and treat this as a single character + if (*p == '\n') { + ++p; + } + break; + + case '\n': + // bump down to the next line + ++row; + col = 0; + + // Eat the character + ++p; + + // Check for \n\r sequence, and treat this as a single + // character. (Yes, this bizarre thing does occur still + // on some arcane platforms...) + if (*p == '\r') { + ++p; + } + break; + + case '\t': + // Eat the character + ++p; + + // Skip to next tab stop + col = (col / tabsize + 1) * tabsize; + break; + + case TIXML_UTF_LEAD_0: + if ( encoding == TIXML_ENCODING_UTF8 ) + { + if ( *(p+1) && *(p+2) ) + { + // In these cases, don't advance the column. These are + // 0-width spaces. + if ( *(pU+1)==TIXML_UTF_LEAD_1 && *(pU+2)==TIXML_UTF_LEAD_2 ) + p += 3; + else if ( *(pU+1)==0xbfU && *(pU+2)==0xbeU ) + p += 3; + else if ( *(pU+1)==0xbfU && *(pU+2)==0xbfU ) + p += 3; + else + { p +=3; ++col; } // A normal character. + } + } + else + { + ++p; + ++col; + } + break; + + default: + if ( encoding == TIXML_ENCODING_UTF8 ) + { + // Eat the 1 to 4 byte utf8 character. + int step = TiXmlBase::utf8ByteTable[*((const unsigned char*)p)]; + if ( step == 0 ) + step = 1; // Error case from bad encoding, but handle gracefully. + p += step; + + // Just advance one column, of course. + ++col; + } + else + { + ++p; + ++col; + } + break; + } + } + cursor.row = row; + cursor.col = col; + assert( cursor.row >= -1 ); + assert( cursor.col >= -1 ); + stamp = p; + assert( stamp ); +} + + +const char* TiXmlBase::SkipWhiteSpace( const char* p, TiXmlEncoding encoding ) +{ + if ( !p || !*p ) + { + return 0; + } + if ( encoding == TIXML_ENCODING_UTF8 ) + { + while ( *p ) + { + const unsigned char* pU = (const unsigned char*)p; + + // Skip the stupid Microsoft UTF-8 Byte order marks + if ( *(pU+0)==TIXML_UTF_LEAD_0 + && *(pU+1)==TIXML_UTF_LEAD_1 + && *(pU+2)==TIXML_UTF_LEAD_2 ) + { + p += 3; + continue; + } + else if(*(pU+0)==TIXML_UTF_LEAD_0 + && *(pU+1)==0xbfU + && *(pU+2)==0xbeU ) + { + p += 3; + continue; + } + else if(*(pU+0)==TIXML_UTF_LEAD_0 + && *(pU+1)==0xbfU + && *(pU+2)==0xbfU ) + { + p += 3; + continue; + } + + if ( IsWhiteSpace( *p ) ) // Still using old rules for white space. + ++p; + else + break; + } + } + else + { + while ( *p && IsWhiteSpace( *p ) ) + ++p; + } + + return p; +} + +#ifdef TIXML_USE_STL +/*static*/ bool TiXmlBase::StreamWhiteSpace( std::istream * in, TIXML_STRING * tag ) +{ + for( ;; ) + { + if ( !in->good() ) return false; + + int c = in->peek(); + // At this scope, we can't get to a document. So fail silently. + if ( !IsWhiteSpace( c ) || c <= 0 ) + return true; + + *tag += (char) in->get(); + } +} + +/*static*/ bool TiXmlBase::StreamTo( std::istream * in, int character, TIXML_STRING * tag ) +{ + //assert( character > 0 && character < 128 ); // else it won't work in utf-8 + while ( in->good() ) + { + int c = in->peek(); + if ( c == character ) + return true; + if ( c <= 0 ) // Silent failure: can't get document at this scope + return false; + + in->get(); + *tag += (char) c; + } + return false; +} +#endif + +// One of TinyXML's more performance demanding functions. Try to keep the memory overhead down. The +// "assign" optimization removes over 10% of the execution time. +// +const char* TiXmlBase::ReadName( const char* p, TIXML_STRING * name, TiXmlEncoding encoding ) +{ + // Oddly, not supported on some comilers, + //name->clear(); + // So use this: + *name = ""; + assert( p ); + + // Names start with letters or underscores. + // Of course, in unicode, tinyxml has no idea what a letter *is*. The + // algorithm is generous. + // + // After that, they can be letters, underscores, numbers, + // hyphens, or colons. (Colons are valid ony for namespaces, + // but tinyxml can't tell namespaces from names.) + if ( p && *p + && ( IsAlpha( (unsigned char) *p, encoding ) || *p == '_' ) ) + { + const char* start = p; + while( p && *p + && ( IsAlphaNum( (unsigned char ) *p, encoding ) + || *p == '_' + || *p == '-' + || *p == '.' + || *p == ':' ) ) + { + //(*name) += *p; // expensive + ++p; + } + if ( p-start > 0 ) { + name->assign( start, p-start ); + } + return p; + } + return 0; +} + +const char* TiXmlBase::GetEntity( const char* p, char* value, int* length, TiXmlEncoding encoding ) +{ + // Presume an entity, and pull it out. + TIXML_STRING ent; + int i; + *length = 0; + + if ( *(p+1) && *(p+1) == '#' && *(p+2) ) + { + unsigned long ucs = 0; + ptrdiff_t delta = 0; + unsigned mult = 1; + + if ( *(p+2) == 'x' ) + { + // Hexadecimal. + if ( !*(p+3) ) return 0; + + const char* q = p+3; + q = strchr( q, ';' ); + + if ( !q || !*q ) return 0; + + delta = q-p; + --q; + + while ( *q != 'x' ) + { + if ( *q >= '0' && *q <= '9' ) + ucs += mult * (*q - '0'); + else if ( *q >= 'a' && *q <= 'f' ) + ucs += mult * (*q - 'a' + 10); + else if ( *q >= 'A' && *q <= 'F' ) + ucs += mult * (*q - 'A' + 10 ); + else + return 0; + mult *= 16; + --q; + } + } + else + { + // Decimal. + if ( !*(p+2) ) return 0; + + const char* q = p+2; + q = strchr( q, ';' ); + + if ( !q || !*q ) return 0; + + delta = q-p; + --q; + + while ( *q != '#' ) + { + if ( *q >= '0' && *q <= '9' ) + ucs += mult * (*q - '0'); + else + return 0; + mult *= 10; + --q; + } + } + if ( encoding == TIXML_ENCODING_UTF8 ) + { + // convert the UCS to UTF-8 + ConvertUTF32ToUTF8( ucs, value, length ); + } + else + { + *value = (char)ucs; + *length = 1; + } + return p + delta + 1; + } + + // Now try to match it. + for( i=0; iappend( cArr, len ); + } + } + else + { + bool whitespace = false; + + // Remove leading white space: + p = SkipWhiteSpace( p, encoding ); + while ( p && *p + && !StringEqual( p, endTag, caseInsensitive, encoding ) ) + { + if ( *p == '\r' || *p == '\n' ) + { + whitespace = true; + ++p; + } + else if ( IsWhiteSpace( *p ) ) + { + whitespace = true; + ++p; + } + else + { + // If we've found whitespace, add it before the + // new character. Any whitespace just becomes a space. + if ( whitespace ) + { + (*text) += ' '; + whitespace = false; + } + int len; + char cArr[4] = { 0, 0, 0, 0 }; + p = GetChar( p, cArr, &len, encoding ); + if ( len == 1 ) + (*text) += cArr[0]; // more efficient + else + text->append( cArr, len ); + } + } + } + if ( p && *p ) + p += strlen( endTag ); + return ( p && *p ) ? p : 0; +} + +#ifdef TIXML_USE_STL + +void TiXmlDocument::StreamIn( std::istream * in, TIXML_STRING * tag ) +{ + // The basic issue with a document is that we don't know what we're + // streaming. Read something presumed to be a tag (and hope), then + // identify it, and call the appropriate stream method on the tag. + // + // This "pre-streaming" will never read the closing ">" so the + // sub-tag can orient itself. + + if ( !StreamTo( in, '<', tag ) ) + { + SetError( TIXML_ERROR_PARSING_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); + return; + } + + while ( in->good() ) + { + int tagIndex = (int) tag->length(); + while ( in->good() && in->peek() != '>' ) + { + int c = in->get(); + if ( c <= 0 ) + { + SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); + break; + } + (*tag) += (char) c; + } + + if ( in->good() ) + { + // We now have something we presume to be a node of + // some sort. Identify it, and call the node to + // continue streaming. + TiXmlNode* node = Identify( tag->c_str() + tagIndex, TIXML_DEFAULT_ENCODING ); + + if ( node ) + { + node->StreamIn( in, tag ); + bool isElement = node->ToElement() != 0; + delete node; + node = 0; + + // If this is the root element, we're done. Parsing will be + // done by the >> operator. + if ( isElement ) + { + return; + } + } + else + { + SetError( TIXML_ERROR, 0, 0, TIXML_ENCODING_UNKNOWN ); + return; + } + } + } + // We should have returned sooner. + SetError( TIXML_ERROR, 0, 0, TIXML_ENCODING_UNKNOWN ); +} + +#endif + +const char* TiXmlDocument::Parse( const char* p, TiXmlParsingData* prevData, TiXmlEncoding encoding ) +{ + ClearError(); + + // Parse away, at the document level. Since a document + // contains nothing but other tags, most of what happens + // here is skipping white space. + if ( !p || !*p ) + { + SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); + return 0; + } + + // Note that, for a document, this needs to come + // before the while space skip, so that parsing + // starts from the pointer we are given. + location.Clear(); + if ( prevData ) + { + location.row = prevData->cursor.row; + location.col = prevData->cursor.col; + } + else + { + location.row = 0; + location.col = 0; + } + TiXmlParsingData data( p, TabSize(), location.row, location.col ); + location = data.Cursor(); + + if ( encoding == TIXML_ENCODING_UNKNOWN ) + { + // Check for the Microsoft UTF-8 lead bytes. + const unsigned char* pU = (const unsigned char*)p; + if ( *(pU+0) && *(pU+0) == TIXML_UTF_LEAD_0 + && *(pU+1) && *(pU+1) == TIXML_UTF_LEAD_1 + && *(pU+2) && *(pU+2) == TIXML_UTF_LEAD_2 ) + { + encoding = TIXML_ENCODING_UTF8; + useMicrosoftBOM = true; + } + } + + p = SkipWhiteSpace( p, encoding ); + if ( !p ) + { + SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); + return 0; + } + + while ( p && *p ) + { + TiXmlNode* node = Identify( p, encoding ); + if ( node ) + { + p = node->Parse( p, &data, encoding ); + LinkEndChild( node ); + } + else + { + break; + } + + // Did we get encoding info? + if ( encoding == TIXML_ENCODING_UNKNOWN + && node->ToDeclaration() ) + { + TiXmlDeclaration* dec = node->ToDeclaration(); + const char* enc = dec->Encoding(); + assert( enc ); + + if ( *enc == 0 ) + encoding = TIXML_ENCODING_UTF8; + else if ( StringEqual( enc, "UTF-8", true, TIXML_ENCODING_UNKNOWN ) ) + encoding = TIXML_ENCODING_UTF8; + else if ( StringEqual( enc, "UTF8", true, TIXML_ENCODING_UNKNOWN ) ) + encoding = TIXML_ENCODING_UTF8; // incorrect, but be nice + else + encoding = TIXML_ENCODING_LEGACY; + } + + p = SkipWhiteSpace( p, encoding ); + } + + // Was this empty? + if ( !firstChild ) { + SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, encoding ); + return 0; + } + + // All is well. + return p; +} + +void TiXmlDocument::SetError( int err, const char* pError, TiXmlParsingData* data, TiXmlEncoding encoding ) +{ + // The first error in a chain is more accurate - don't set again! + if ( error ) + return; + + assert( err > 0 && err < TIXML_ERROR_STRING_COUNT ); + error = true; + errorId = err; + errorDesc = errorString[ errorId ]; + + errorLocation.Clear(); + if ( pError && data ) + { + data->Stamp( pError, encoding ); + errorLocation = data->Cursor(); + } +} + + +TiXmlNode* TiXmlNode::Identify( const char* p, TiXmlEncoding encoding ) +{ + TiXmlNode* returnNode = 0; + + p = SkipWhiteSpace( p, encoding ); + if( !p || !*p || *p != '<' ) + { + return 0; + } + + p = SkipWhiteSpace( p, encoding ); + + if ( !p || !*p ) + { + return 0; + } + + // What is this thing? + // - Elements start with a letter or underscore, but xml is reserved. + // - Comments: "; + + if ( !StringEqual( p, startTag, false, encoding ) ) + { + if ( document ) + document->SetError( TIXML_ERROR_PARSING_COMMENT, p, data, encoding ); + return 0; + } + p += strlen( startTag ); + + // [ 1475201 ] TinyXML parses entities in comments + // Oops - ReadText doesn't work, because we don't want to parse the entities. + // p = ReadText( p, &value, false, endTag, false, encoding ); + // + // from the XML spec: + /* + [Definition: Comments may appear anywhere in a document outside other markup; in addition, + they may appear within the document type declaration at places allowed by the grammar. + They are not part of the document's character data; an XML processor MAY, but need not, + make it possible for an application to retrieve the text of comments. For compatibility, + the string "--" (double-hyphen) MUST NOT occur within comments.] Parameter entity + references MUST NOT be recognized within comments. + + An example of a comment: + + + */ + + value = ""; + // Keep all the white space. + while ( p && *p && !StringEqual( p, endTag, false, encoding ) ) + { + value.append( p, 1 ); + ++p; + } + if ( p && *p ) + p += strlen( endTag ); + + return p; +} + + +const char* TiXmlAttribute::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ) +{ + p = SkipWhiteSpace( p, encoding ); + if ( !p || !*p ) return 0; + + if ( data ) + { + data->Stamp( p, encoding ); + location = data->Cursor(); + } + // Read the name, the '=' and the value. + const char* pErr = p; + p = ReadName( p, &name, encoding ); + if ( !p || !*p ) + { + if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, pErr, data, encoding ); + return 0; + } + p = SkipWhiteSpace( p, encoding ); + if ( !p || !*p || *p != '=' ) + { + if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding ); + return 0; + } + + ++p; // skip '=' + p = SkipWhiteSpace( p, encoding ); + if ( !p || !*p ) + { + if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding ); + return 0; + } + + const char* end; + const char SINGLE_QUOTE = '\''; + const char DOUBLE_QUOTE = '\"'; + + if ( *p == SINGLE_QUOTE ) + { + ++p; + end = "\'"; // single quote in string + p = ReadText( p, &value, false, end, false, encoding ); + } + else if ( *p == DOUBLE_QUOTE ) + { + ++p; + end = "\""; // double quote in string + p = ReadText( p, &value, false, end, false, encoding ); + } + else + { + // All attribute values should be in single or double quotes. + // But this is such a common error that the parser will try + // its best, even without them. + value = ""; + while ( p && *p // existence + && !IsWhiteSpace( *p ) // whitespace + && *p != '/' && *p != '>' ) // tag end + { + if ( *p == SINGLE_QUOTE || *p == DOUBLE_QUOTE ) { + // [ 1451649 ] Attribute values with trailing quotes not handled correctly + // We did not have an opening quote but seem to have a + // closing one. Give up and throw an error. + if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding ); + return 0; + } + value += *p; + ++p; + } + } + return p; +} + +#ifdef TIXML_USE_STL +void TiXmlText::StreamIn( std::istream * in, TIXML_STRING * tag ) +{ + while ( in->good() ) + { + int c = in->peek(); + if ( !cdata && (c == '<' ) ) + { + return; + } + if ( c <= 0 ) + { + TiXmlDocument* document = GetDocument(); + if ( document ) + document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); + return; + } + + (*tag) += (char) c; + in->get(); // "commits" the peek made above + + if ( cdata && c == '>' && tag->size() >= 3 ) { + size_t len = tag->size(); + if ( (*tag)[len-2] == ']' && (*tag)[len-3] == ']' ) { + // terminator of cdata. + return; + } + } + } +} +#endif + +const char* TiXmlText::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ) +{ + value = ""; + TiXmlDocument* document = GetDocument(); + + if ( data ) + { + data->Stamp( p, encoding ); + location = data->Cursor(); + } + + const char* const startTag = ""; + + if ( cdata || StringEqual( p, startTag, false, encoding ) ) + { + cdata = true; + + if ( !StringEqual( p, startTag, false, encoding ) ) + { + if ( document ) + document->SetError( TIXML_ERROR_PARSING_CDATA, p, data, encoding ); + return 0; + } + p += strlen( startTag ); + + // Keep all the white space, ignore the encoding, etc. + while ( p && *p + && !StringEqual( p, endTag, false, encoding ) + ) + { + value += *p; + ++p; + } + + TIXML_STRING dummy; + p = ReadText( p, &dummy, false, endTag, false, encoding ); + return p; + } + else + { + bool ignoreWhite = true; + + const char* end = "<"; + p = ReadText( p, &value, ignoreWhite, end, false, encoding ); + if ( p && *p ) + return p-1; // don't truncate the '<' + return 0; + } +} + +#ifdef TIXML_USE_STL +void TiXmlDeclaration::StreamIn( std::istream * in, TIXML_STRING * tag ) +{ + while ( in->good() ) + { + int c = in->get(); + if ( c <= 0 ) + { + TiXmlDocument* document = GetDocument(); + if ( document ) + document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); + return; + } + (*tag) += (char) c; + + if ( c == '>' ) + { + // All is well. + return; + } + } +} +#endif + +const char* TiXmlDeclaration::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding _encoding ) +{ + p = SkipWhiteSpace( p, _encoding ); + // Find the beginning, find the end, and look for + // the stuff in-between. + TiXmlDocument* document = GetDocument(); + if ( !p || !*p || !StringEqual( p, "SetError( TIXML_ERROR_PARSING_DECLARATION, 0, 0, _encoding ); + return 0; + } + if ( data ) + { + data->Stamp( p, _encoding ); + location = data->Cursor(); + } + p += 5; + + version = ""; + encoding = ""; + standalone = ""; + + while ( p && *p ) + { + if ( *p == '>' ) + { + ++p; + return p; + } + + p = SkipWhiteSpace( p, _encoding ); + if ( StringEqual( p, "version", true, _encoding ) ) + { + TiXmlAttribute attrib; + p = attrib.Parse( p, data, _encoding ); + version = attrib.Value(); + } + else if ( StringEqual( p, "encoding", true, _encoding ) ) + { + TiXmlAttribute attrib; + p = attrib.Parse( p, data, _encoding ); + encoding = attrib.Value(); + } + else if ( StringEqual( p, "standalone", true, _encoding ) ) + { + TiXmlAttribute attrib; + p = attrib.Parse( p, data, _encoding ); + standalone = attrib.Value(); + } + else + { + // Read over whatever it is. + while( p && *p && *p != '>' && !IsWhiteSpace( *p ) ) + ++p; + } + } + return 0; +} + +bool TiXmlText::Blank() const +{ + for ( unsigned i=0; i + +namespace boost +{ + + template T lexical_cast(const char* txt) + { + double result = atof(txt); + return result; + }; + + struct bad_lexical_cast + { + const char* what() + { + return ("bad lexical cast\n"); + } + + }; + +} //namespace boost + +#endif + diff --git a/btgui/urdf/boost_replacement/printf_console.cpp b/btgui/urdf/boost_replacement/printf_console.cpp new file mode 100644 index 000000000..9c9014ac6 --- /dev/null +++ b/btgui/urdf/boost_replacement/printf_console.cpp @@ -0,0 +1,28 @@ +#include "printf_console.h" +#include + + +void logError(const char* msg, const char* arg0, const char* arg1, const char* arg2) +{ + printf("%s %s %s %s\n", msg,arg0,arg1,arg2); + +} + +void logDebug(const char* msg, float v0, float v1) +{ + printf("%s %f %f\n", msg, v0, v1); +}; +void logDebug(const char* msg, const char* msg1, const char* arg1) +{ + printf("%s %s %s\n", msg, msg1, arg1); + +} + +void logInform(const char* msg, const char* arg0) +{ + printf("%s %s\n", msg, arg0); +} +void logWarn(const char* msg,int id, const char* arg0) +{ + printf("%s %d %s\n", msg,id,arg0); +} diff --git a/btgui/urdf/boost_replacement/printf_console.h b/btgui/urdf/boost_replacement/printf_console.h new file mode 100644 index 000000000..247aab2c5 --- /dev/null +++ b/btgui/urdf/boost_replacement/printf_console.h @@ -0,0 +1,13 @@ +#ifndef PRINTF_CONSOLE_H +#define PRINTF_CONSOLE_H + + +void logError(const char* msg="", const char* arg0="", const char* arg1="", const char* arg2=""); +void logDebug(const char* msg, float v0, float v1); +void logDebug(const char* msg, const char* msg1="", const char* arg1=""); +void logInform(const char* msg, const char* arg0=""); +void logWarn(const char* msg,int id, const char* arg0=""); + +#endif + + diff --git a/btgui/urdf/boost_replacement/shared_ptr.h b/btgui/urdf/boost_replacement/shared_ptr.h new file mode 100644 index 000000000..5d29732b6 --- /dev/null +++ b/btgui/urdf/boost_replacement/shared_ptr.h @@ -0,0 +1,210 @@ +/* +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 + +Modified by Francisco Gochez +Dec 2011 - Added deferencing operator +*/ + +//my_shared_ptr + +#ifndef DYN_SHARED_PTR_H +#define DYN_SHARED_PTR_H + +#define DYN_SHARED_PTR_THREAD_SAFE + + +#include + +#ifdef _WIN32 +#include + +class my_shared_count { +public: + my_shared_count(): m_count(1) { } + ~my_shared_count() { } + + long increment() + { +#ifdef DYN_SHARED_PTR_THREAD_SAFE + return InterlockedIncrement(&m_count); +#else + return ++m_count; +#endif + } + + long decrement() { +#ifdef DYN_SHARED_PTR_THREAD_SAFE + return InterlockedDecrement(&m_count); +#else + return ++m_count; +#endif + } + + long use_count() { return m_count; } + +private: + long m_count; +}; +#else //ifdef WIN32 + + +#include + +class my_shared_count { +public: + my_shared_count(): m_count(1) { +#ifdef DYN_SHARED_PTR_THREAD_SAFE + pthread_mutex_init(&m_mutex, 0); +#endif + } + ~my_shared_count() { +#ifdef DYN_SHARED_PTR_THREAD_SAFE + pthread_mutex_destroy(&m_mutex); +#endif + } + + long increment() + { +#ifdef DYN_SHARED_PTR_THREAD_SAFE + pthread_mutex_lock(&m_mutex); +#endif + long c = ++m_count; +#ifdef DYN_SHARED_PTR_THREAD_SAFE + pthread_mutex_unlock(&m_mutex); +#endif + return c; + } + + long decrement() { +#ifdef DYN_SHARED_PTR_THREAD_SAFE + pthread_mutex_lock(&m_mutex); +#endif + long c = --m_count; +#ifdef DYN_SHARED_PTR_THREAD_SAFE + pthread_mutex_unlock(&m_mutex); +#endif + return c; + } + + long use_count() { return m_count; } + +private: + long m_count; + mutable pthread_mutex_t m_mutex; +}; + +#endif + + +template +class my_shared_ptr +{ +public: + my_shared_ptr(): m_ptr(NULL), m_count(NULL) { } + my_shared_ptr(my_shared_ptr const& other): + m_ptr(other.m_ptr), + m_count(other.m_count) + { + if(other.m_count != NULL) other.m_count->increment(); + } + + template + my_shared_ptr(my_shared_ptr const& other): + m_ptr(other.m_ptr), + m_count(other.m_count) + { + if(other.m_count != NULL) other.m_count->increment(); + } + + my_shared_ptr(T const* other): m_ptr(const_cast(other)), m_count(NULL) + { + if(other != NULL) m_count = new my_shared_count; + } + + ~my_shared_ptr() + { + giveup_ownership(); + } + + void reset(T const* other) + { + if(m_ptr == other) return; + giveup_ownership(); + m_ptr = const_cast(other); + if(other != NULL) m_count = new my_shared_count; + else m_count = NULL; + } + + T* get() { return m_ptr; } + T const* get() const { return m_ptr; } + T* operator->() { return m_ptr; } + T const* operator->() const { return m_ptr; } + operator bool() const { return m_ptr != NULL; } + T& operator*() const + { + assert(m_ptr != 0); + return *m_ptr; + } + + bool operator<(my_shared_ptr const& rhs) const { return m_ptr < rhs.m_ptr; } + + my_shared_ptr& operator=(my_shared_ptr const& other) { + if(m_ptr == other.m_ptr) return *this; + giveup_ownership(); + m_ptr = other.m_ptr; + m_count = other.m_count; + if(other.m_count != NULL) m_count->increment(); + return *this; + } + + template + my_shared_ptr& operator=(my_shared_ptr& other) { + if(m_ptr == other.m_ptr) return *this; + giveup_ownership(); + m_ptr = other.m_ptr; + m_count = other.m_count; + if(other.m_count != NULL) m_count->increment(); + return *this; + } + +protected: + + template friend class my_shared_ptr; + void giveup_ownership() + { + if(m_count != NULL) { + if( m_count->decrement() == 0) { + delete m_ptr; + m_ptr = NULL; + delete m_count; + m_count = NULL; + } + } + } + +protected: + T *m_ptr; + my_shared_count *m_count; + +}; + + +#endif diff --git a/btgui/urdf/boost_replacement/string_split.cpp b/btgui/urdf/boost_replacement/string_split.cpp new file mode 100644 index 000000000..bbe8146f4 --- /dev/null +++ b/btgui/urdf/boost_replacement/string_split.cpp @@ -0,0 +1,253 @@ + + +#include +#include +#include +#include +#include + +#include "string_split.h" + +namespace boost +{ + void split( std::vector&pieces, const std::string& vector_str, std::vector separators) + { + assert(separators.size()==1); + if (separators.size()==1) + { + char** strArray = str_split(vector_str.c_str(),separators[0].c_str()); + int numSubStr = str_array_len(strArray); + for (int i=0;i is_any_of(const char* seps) + { + std::vector strArray; + + int numSeps = strlen(seps); + for (int i=0;i +#include +#include + +namespace boost +{ + void split( std::vector&pieces, const std::string& vector_str, std::vector separators); + std::vector is_any_of(const char* seps); +}; + +///The string split C code is by Lars Wirzenius +///See http://stackoverflow.com/questions/2531605/how-to-split-a-string-with-a-delimiter-larger-than-one-single-char + + +/* Split a string into substrings. Return dynamic array of dynamically + allocated substrings, or NULL if there was an error. Caller is + expected to free the memory, for example with str_array_free. */ +char** str_split(const char* input, const char* sep); + +/* Free a dynamic array of dynamic strings. */ +void str_array_free(char** array); + +/* Return length of a NULL-delimited array of strings. */ +size_t str_array_len(char** array); + +#endif //STRING_SPLIT_H + diff --git a/btgui/urdf/premake4.lua b/btgui/urdf/premake4.lua new file mode 100644 index 000000000..526c9114a --- /dev/null +++ b/btgui/urdf/premake4.lua @@ -0,0 +1,46 @@ + + + project "urdf_test" + + flags {"FloatStrict"} + + language "C++" + + kind "ConsoleApp" + targetdir "../../bin" + +-- links { +-- } + + includedirs { + ".", + "..", + + } + + + files { + "urdfdom/urdf_parser/src/check_urdf.cpp", + "urdfdom/urdf_parser/src/pose.cpp", + "urdfdom/urdf_parser/src/model.cpp", + "urdfdom/urdf_parser/src/link.cpp", + "urdfdom/urdf_parser/src/joint.cpp", + "urdfdom/urdf_parser/include/urdf_parser/urdf_parser.h", + "urdfdom_headers/urdf_exception/include/urdf_exception/exception.h", + "urdfdom_headers/urdf_model/include/urdf_model/pose.h", + "urdfdom_headers/urdf_model/include/urdf_model/model.h", + "urdfdom_headers/urdf_model/include/urdf_model/link.h", + "urdfdom_headers/urdf_model/include/urdf_model/joint.h", + "../tinyxml/tinystr.cpp", + "../tinyxml/tinyxml.cpp", + "../tinyxml/tinyxmlerror.cpp", + "../tinyxml/tinyxmlparser.cpp", + "boost_replacement/lexical_cast.h", + "boost_replacement/shared_ptr.h", + "boost_replacement/printf_console.cpp", + "boost_replacement/printf_console.h", + "boost_replacement/string_split.cpp", + "boost_replacement/string_split.h", + + + } diff --git a/btgui/urdf/urdfdom/LICENSE b/btgui/urdf/urdfdom/LICENSE new file mode 100644 index 000000000..e80920e25 --- /dev/null +++ b/btgui/urdf/urdfdom/LICENSE @@ -0,0 +1,15 @@ +Software License Agreement (Apache License) + +Copyright 2011 John Hsu + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/btgui/urdf/urdfdom/README.txt b/btgui/urdf/urdfdom/README.txt new file mode 100644 index 000000000..4e3bff6d8 --- /dev/null +++ b/btgui/urdf/urdfdom/README.txt @@ -0,0 +1,7 @@ +The URDF (U-Robot Description Format) library + provides core data structures and a simple XML parsers + for populating the class data structures from an URDF file. + +For now, the details of the URDF specifications reside on + http://ros.org/wiki/urdf + diff --git a/btgui/urdf/urdfdom/urdf_parser/include/urdf_parser/urdf_parser.h b/btgui/urdf/urdfdom/urdf_parser/include/urdf_parser/urdf_parser.h new file mode 100644 index 000000000..336af0fa3 --- /dev/null +++ b/btgui/urdf/urdfdom/urdf_parser/include/urdf_parser/urdf_parser.h @@ -0,0 +1,63 @@ +/********************************************************************* +* Software License Agreement (BSD License) +* +* Copyright (c) 2008, Willow Garage, 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 Willow Garage 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. +*********************************************************************/ + +/* Author: Wim Meeussen */ + +#ifndef URDF_PARSER_URDF_PARSER_H +#define URDF_PARSER_URDF_PARSER_H + +#include + +#include +#include "tinyxml/tinyxml.h" + +//#include + +#ifndef M_PI +#define M_PI 3.1415925438 +#endif //M_PI + + +#include + + + + +namespace urdf{ + + my_shared_ptr parseURDF(const std::string &xml_string); + +} + +#endif diff --git a/btgui/urdf/urdfdom/urdf_parser/src/check_urdf.cpp b/btgui/urdf/urdfdom/urdf_parser/src/check_urdf.cpp new file mode 100644 index 000000000..67e9eb165 --- /dev/null +++ b/btgui/urdf/urdfdom/urdf_parser/src/check_urdf.cpp @@ -0,0 +1,137 @@ +/********************************************************************* +* Software License Agreement (BSD License) +* +* Copyright (c) 2008, Willow Garage, 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 Willow Garage 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. +*********************************************************************/ + +/* Author: Wim Meeussen */ + +#include "urdf/urdfdom/urdf_parser/include/urdf_parser/urdf_parser.h" +#include +#include + +using namespace urdf; + +void printTree(my_shared_ptr link,int level = 0) +{ + level+=2; + int count = 0; + for (std::vector >::const_iterator child = link->child_links.begin(); child != link->child_links.end(); child++) + { + if (*child) + { + for(int j=0;jname << std::endl; + // first grandchild + printTree(*child,level); + } + else + { + for(int j=0;jname << " has a null child!" << *child << std::endl; + } + } + +} + + +#define MSTRINGIFY(A) #A + + +const char* urdf_char = MSTRINGIFY( + + + + + + + + + + + + + + + + + + + + +); + + +int main(int argc, char** argv) +{ + + std::string xml_string; + + if (argc < 2){ + std::cerr << "No URDF file name provided, using a dummy test URDF" << std::endl; + + xml_string = std::string(urdf_char); + + } else + { + + + std::fstream xml_file(argv[1], std::fstream::in); + while ( xml_file.good() ) + { + std::string line; + std::getline( xml_file, line); + xml_string += (line + "\n"); + } + xml_file.close(); + } + + my_shared_ptr robot = parseURDF(xml_string); + if (!robot){ + std::cerr << "ERROR: Model Parsing the xml failed" << std::endl; + return -1; + } + std::cout << "robot name is: " << robot->getName() << std::endl; + + // get info from parser + std::cout << "---------- Successfully Parsed XML ---------------" << std::endl; + // get root link + my_shared_ptr root_link=robot->getRoot(); + if (!root_link) return -1; + + std::cout << "root Link: " << root_link->name << " has " << root_link->child_links.size() << " child(ren)" << std::endl; + + + // print entire tree + printTree(root_link); + return 0; +} + diff --git a/btgui/urdf/urdfdom/urdf_parser/src/joint.cpp b/btgui/urdf/urdfdom/urdf_parser/src/joint.cpp new file mode 100644 index 000000000..bde0c5f73 --- /dev/null +++ b/btgui/urdf/urdfdom/urdf_parser/src/joint.cpp @@ -0,0 +1,579 @@ +/********************************************************************* +* Software Ligcense Agreement (BSD License) +* +* Copyright (c) 2008, Willow Garage, 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 Willow Garage 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. +*********************************************************************/ + +/* Author: John Hsu */ + +#include +#include +#ifdef URDF_USE_BOOST +#include +#else +#include +#endif +#include + +#ifdef URDF_USE_CONSOLE_BRIDGE + #include +#else + #include "urdf/boost_replacement/printf_console.h" +#endif + +#include +#include + +namespace urdf{ + +bool parsePose(Pose &pose, TiXmlElement* xml); + +bool parseJointDynamics(JointDynamics &jd, TiXmlElement* config) +{ + jd.clear(); + + // Get joint damping + const char* damping_str = config->Attribute("damping"); + if (damping_str == NULL){ + logDebug("urdfdom.joint_dynamics: no damping, defaults to 0"); + jd.damping = 0; + } + else + { + try + { + jd.damping = boost::lexical_cast(damping_str); + } + catch (boost::bad_lexical_cast &e) + { + logError("damping value (%s) is not a float: %s",damping_str, e.what()); + return false; + } + } + + // Get joint friction + const char* friction_str = config->Attribute("friction"); + if (friction_str == NULL){ + logDebug("urdfdom.joint_dynamics: no friction, defaults to 0"); + jd.friction = 0; + } + else + { + try + { + jd.friction = boost::lexical_cast(friction_str); + } + catch (boost::bad_lexical_cast &e) + { + logError("friction value (%s) is not a float: %s",friction_str, e.what()); + return false; + } + } + + if (damping_str == NULL && friction_str == NULL) + { + logError("joint dynamics element specified with no damping and no friction"); + return false; + } + else{ + logDebug("urdfdom.joint_dynamics: damping %f and friction %f", jd.damping, jd.friction); + return true; + } +} + +bool parseJointLimits(JointLimits &jl, TiXmlElement* config) +{ + jl.clear(); + + // Get lower joint limit + const char* lower_str = config->Attribute("lower"); + if (lower_str == NULL){ + logDebug("urdfdom.joint_limit: no lower, defaults to 0"); + jl.lower = 0; + } + else + { + try + { + jl.lower = boost::lexical_cast(lower_str); + } + catch (boost::bad_lexical_cast &e) + { + logError("lower value (%s) is not a float: %s", lower_str, e.what()); + return false; + } + } + + // Get upper joint limit + const char* upper_str = config->Attribute("upper"); + if (upper_str == NULL){ + logDebug("urdfdom.joint_limit: no upper, , defaults to 0"); + jl.upper = 0; + } + else + { + try + { + jl.upper = boost::lexical_cast(upper_str); + } + catch (boost::bad_lexical_cast &e) + { + logError("upper value (%s) is not a float: %s",upper_str, e.what()); + return false; + } + } + + // Get joint effort limit + const char* effort_str = config->Attribute("effort"); + if (effort_str == NULL){ + logError("joint limit: no effort"); + return false; + } + else + { + try + { + jl.effort = boost::lexical_cast(effort_str); + } + catch (boost::bad_lexical_cast &e) + { + logError("effort value (%s) is not a float: %s",effort_str, e.what()); + return false; + } + } + + // Get joint velocity limit + const char* velocity_str = config->Attribute("velocity"); + if (velocity_str == NULL){ + logError("joint limit: no velocity"); + return false; + } + else + { + try + { + jl.velocity = boost::lexical_cast(velocity_str); + } + catch (boost::bad_lexical_cast &e) + { + logError("velocity value (%s) is not a float: %s",velocity_str, e.what()); + return false; + } + } + + return true; +} + +bool parseJointSafety(JointSafety &js, TiXmlElement* config) +{ + js.clear(); + + // Get soft_lower_limit joint limit + const char* soft_lower_limit_str = config->Attribute("soft_lower_limit"); + if (soft_lower_limit_str == NULL) + { + logDebug("urdfdom.joint_safety: no soft_lower_limit, using default value"); + js.soft_lower_limit = 0; + } + else + { + try + { + js.soft_lower_limit = boost::lexical_cast(soft_lower_limit_str); + } + catch (boost::bad_lexical_cast &e) + { + logError("soft_lower_limit value (%s) is not a float: %s",soft_lower_limit_str, e.what()); + return false; + } + } + + // Get soft_upper_limit joint limit + const char* soft_upper_limit_str = config->Attribute("soft_upper_limit"); + if (soft_upper_limit_str == NULL) + { + logDebug("urdfdom.joint_safety: no soft_upper_limit, using default value"); + js.soft_upper_limit = 0; + } + else + { + try + { + js.soft_upper_limit = boost::lexical_cast(soft_upper_limit_str); + } + catch (boost::bad_lexical_cast &e) + { + logError("soft_upper_limit value (%s) is not a float: %s",soft_upper_limit_str, e.what()); + return false; + } + } + + // Get k_position_ safety "position" gain - not exactly position gain + const char* k_position_str = config->Attribute("k_position"); + if (k_position_str == NULL) + { + logDebug("urdfdom.joint_safety: no k_position, using default value"); + js.k_position = 0; + } + else + { + try + { + js.k_position = boost::lexical_cast(k_position_str); + } + catch (boost::bad_lexical_cast &e) + { + logError("k_position value (%s) is not a float: %s",k_position_str, e.what()); + return false; + } + } + // Get k_velocity_ safety velocity gain + const char* k_velocity_str = config->Attribute("k_velocity"); + if (k_velocity_str == NULL) + { + logError("joint safety: no k_velocity"); + return false; + } + else + { + try + { + js.k_velocity = boost::lexical_cast(k_velocity_str); + } + catch (boost::bad_lexical_cast &e) + { + logError("k_velocity value (%s) is not a float: %s",k_velocity_str, e.what()); + return false; + } + } + + return true; +} + +bool parseJointCalibration(JointCalibration &jc, TiXmlElement* config) +{ + jc.clear(); + + // Get rising edge position + const char* rising_position_str = config->Attribute("rising"); + if (rising_position_str == NULL) + { + logDebug("urdfdom.joint_calibration: no rising, using default value"); + jc.rising.reset(0); + } + else + { + try + { + jc.rising.reset(new double(boost::lexical_cast(rising_position_str))); + } + catch (boost::bad_lexical_cast &e) + { + logError("risingvalue (%s) is not a float: %s",rising_position_str, e.what()); + return false; + } + } + + // Get falling edge position + const char* falling_position_str = config->Attribute("falling"); + if (falling_position_str == NULL) + { + logDebug("urdfdom.joint_calibration: no falling, using default value"); + jc.falling.reset(0); + } + else + { + try + { + jc.falling.reset(new double(boost::lexical_cast(falling_position_str))); + } + catch (boost::bad_lexical_cast &e) + { + logError("fallingvalue (%s) is not a float: %s",falling_position_str, e.what()); + return false; + } + } + + return true; +} + +bool parseJointMimic(JointMimic &jm, TiXmlElement* config) +{ + jm.clear(); + + // Get name of joint to mimic + const char* joint_name_str = config->Attribute("joint"); + + if (joint_name_str == NULL) + { + logError("joint mimic: no mimic joint specified"); + return false; + } + else + jm.joint_name = joint_name_str; + + // Get mimic multiplier + const char* multiplier_str = config->Attribute("multiplier"); + + if (multiplier_str == NULL) + { + logDebug("urdfdom.joint_mimic: no multiplier, using default value of 1"); + jm.multiplier = 1; + } + else + { + try + { + jm.multiplier = boost::lexical_cast(multiplier_str); + } + catch (boost::bad_lexical_cast &e) + { + logError("multiplier value (%s) is not a float: %s",multiplier_str, e.what()); + return false; + } + } + + + // Get mimic offset + const char* offset_str = config->Attribute("offset"); + if (offset_str == NULL) + { + logDebug("urdfdom.joint_mimic: no offset, using default value of 0"); + jm.offset = 0; + } + else + { + try + { + jm.offset = boost::lexical_cast(offset_str); + } + catch (boost::bad_lexical_cast &e) + { + logError("offset value (%s) is not a float: %s",offset_str, e.what()); + return false; + } + } + + return true; +} + +bool parseJoint(Joint &joint, TiXmlElement* config) +{ + joint.clear(); + + // Get Joint Name + const char *name = config->Attribute("name"); + if (!name) + { + logError("unnamed joint found"); + return false; + } + joint.name = name; + + // Get transform from Parent Link to Joint Frame + TiXmlElement *origin_xml = config->FirstChildElement("origin"); + if (!origin_xml) + { + logDebug("urdfdom: Joint [%s] missing origin tag under parent describing transform from Parent Link to Joint Frame, (using Identity transform).", joint.name.c_str()); + joint.parent_to_joint_origin_transform.clear(); + } + else + { + if (!parsePose(joint.parent_to_joint_origin_transform, origin_xml)) + { + joint.parent_to_joint_origin_transform.clear(); + logError("Malformed parent origin element for joint [%s]", joint.name.c_str()); + return false; + } + } + + // Get Parent Link + TiXmlElement *parent_xml = config->FirstChildElement("parent"); + if (parent_xml) + { + const char *pname = parent_xml->Attribute("link"); + if (!pname) + { + logInform("no parent link name specified for Joint link [%s]. this might be the root?", joint.name.c_str()); + } + else + { + joint.parent_link_name = std::string(pname); + } + } + + // Get Child Link + TiXmlElement *child_xml = config->FirstChildElement("child"); + if (child_xml) + { + const char *pname = child_xml->Attribute("link"); + if (!pname) + { + logInform("no child link name specified for Joint link [%s].", joint.name.c_str()); + } + else + { + joint.child_link_name = std::string(pname); + } + } + + // Get Joint type + const char* type_char = config->Attribute("type"); + if (!type_char) + { + logError("joint [%s] has no type, check to see if it's a reference.", joint.name.c_str()); + return false; + } + + std::string type_str = type_char; + if (type_str == "planar") + joint.type = Joint::PLANAR; + else if (type_str == "floating") + joint.type = Joint::FLOATING; + else if (type_str == "revolute") + joint.type = Joint::REVOLUTE; + else if (type_str == "continuous") + joint.type = Joint::CONTINUOUS; + else if (type_str == "prismatic") + joint.type = Joint::PRISMATIC; + else if (type_str == "fixed") + joint.type = Joint::FIXED; + else + { + logError("Joint [%s] has no known type [%s]", joint.name.c_str(), type_str.c_str()); + return false; + } + + // Get Joint Axis + if (joint.type != Joint::FLOATING && joint.type != Joint::FIXED) + { + // axis + TiXmlElement *axis_xml = config->FirstChildElement("axis"); + if (!axis_xml){ + logDebug("urdfdom: no axis elemement for Joint link [%s], defaulting to (1,0,0) axis", joint.name.c_str()); + joint.axis = Vector3(1.0, 0.0, 0.0); + } + else{ + if (axis_xml->Attribute("xyz")){ + try { + joint.axis.init(axis_xml->Attribute("xyz")); + } + catch (ParseError &e) { + joint.axis.clear(); + logError("Malformed axis element for joint [%s]: %s", joint.name.c_str(), e.what()); + return false; + } + } + } + } + + // Get limit + TiXmlElement *limit_xml = config->FirstChildElement("limit"); + if (limit_xml) + { + joint.limits.reset(new JointLimits()); + if (!parseJointLimits(*joint.limits, limit_xml)) + { + logError("Could not parse limit element for joint [%s]", joint.name.c_str()); + joint.limits.reset(0); + return false; + } + } + else if (joint.type == Joint::REVOLUTE) + { + logError("Joint [%s] is of type REVOLUTE but it does not specify limits", joint.name.c_str()); + return false; + } + else if (joint.type == Joint::PRISMATIC) + { + logError("Joint [%s] is of type PRISMATIC without limits", joint.name.c_str()); + return false; + } + + // Get safety + TiXmlElement *safety_xml = config->FirstChildElement("safety_controller"); + if (safety_xml) + { + joint.safety.reset(new JointSafety()); + if (!parseJointSafety(*joint.safety, safety_xml)) + { + logError("Could not parse safety element for joint [%s]", joint.name.c_str()); + joint.safety.reset(0); + return false; + } + } + + // Get calibration + TiXmlElement *calibration_xml = config->FirstChildElement("calibration"); + if (calibration_xml) + { + joint.calibration.reset(new JointCalibration()); + if (!parseJointCalibration(*joint.calibration, calibration_xml)) + { + logError("Could not parse calibration element for joint [%s]", joint.name.c_str()); + joint.calibration.reset(0); + return false; + } + } + + // Get Joint Mimic + TiXmlElement *mimic_xml = config->FirstChildElement("mimic"); + if (mimic_xml) + { + joint.mimic.reset(new JointMimic()); + if (!parseJointMimic(*joint.mimic, mimic_xml)) + { + logError("Could not parse mimic element for joint [%s]", joint.name.c_str()); + joint.mimic.reset(0); + return false; + } + } + + // Get Dynamics + TiXmlElement *prop_xml = config->FirstChildElement("dynamics"); + if (prop_xml) + { + joint.dynamics.reset(new JointDynamics()); + if (!parseJointDynamics(*joint.dynamics, prop_xml)) + { + logError("Could not parse joint_dynamics element for joint [%s]", joint.name.c_str()); + joint.dynamics.reset(0); + return false; + } + } + + return true; +} + + + + +} diff --git a/btgui/urdf/urdfdom/urdf_parser/src/link.cpp b/btgui/urdf/urdfdom/urdf_parser/src/link.cpp new file mode 100644 index 000000000..a224146b3 --- /dev/null +++ b/btgui/urdf/urdfdom/urdf_parser/src/link.cpp @@ -0,0 +1,505 @@ +/********************************************************************* +* Software License Agreement (BSD License) +* +* Copyright (c) 2008, Willow Garage, 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 Willow Garage 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. +*********************************************************************/ + +/* Author: Wim Meeussen */ + + +#include +#include +//#include +//#include +#ifdef URDF_USE_BOOST +#include +#else +#include +#endif + +#include +#include +#ifdef URDF_USE_CONSOLE_BRIDGE +#include +#else +#include "urdf/boost_replacement/printf_console.h" +#endif + + + +namespace urdf{ + +bool parsePose(Pose &pose, TiXmlElement* xml); + +bool parseMaterial(Material &material, TiXmlElement *config, bool only_name_is_ok) +{ + bool has_rgb = false; + bool has_filename = false; + + material.clear(); + + if (!config->Attribute("name")) + { + logError("Material must contain a name attribute"); + return false; + } + + material.name = config->Attribute("name"); + + // texture + TiXmlElement *t = config->FirstChildElement("texture"); + if (t) + { + if (t->Attribute("filename")) + { + material.texture_filename = t->Attribute("filename"); + has_filename = true; + } + } + + // color + TiXmlElement *c = config->FirstChildElement("color"); + if (c) + { + if (c->Attribute("rgba")) { + + try { + material.color.init(c->Attribute("rgba")); + has_rgb = true; + } + catch (ParseError &e) { + material.color.clear(); + logError(std::string("Material [" + material.name + "] has malformed color rgba values: " + e.what()).c_str()); + } + } + } + + if (!has_rgb && !has_filename) { + if (!only_name_is_ok) // no need for an error if only name is ok + { + if (!has_rgb) logError(std::string("Material ["+material.name+"] color has no rgba").c_str()); + if (!has_filename) logError(std::string("Material ["+material.name+"] not defined in file").c_str()); + } + return false; + } + return true; +} + + +bool parseSphere(Sphere &s, TiXmlElement *c) +{ + s.clear(); + + s.type = Geometry::SPHERE; + if (!c->Attribute("radius")) + { + logError("Sphere shape must have a radius attribute"); + return false; + } + + try + { + s.radius = boost::lexical_cast(c->Attribute("radius")); + } + catch (boost::bad_lexical_cast &e) + { + // std::stringstream stm; + // stm << "radius [" << c->Attribute("radius") << "] is not a valid float: " << e.what(); + // logError(stm.str().c_str()); + logError("radius issue"); + return false; + } + + return true; +} + +bool parseBox(Box &b, TiXmlElement *c) +{ + b.clear(); + + b.type = Geometry::BOX; + if (!c->Attribute("size")) + { + logError("Box shape has no size attribute"); + return false; + } + try + { + b.dim.init(c->Attribute("size")); + } + catch (ParseError &e) + { + b.dim.clear(); + logError(e.what()); + return false; + } + return true; +} + +bool parseCylinder(Cylinder &y, TiXmlElement *c) +{ + y.clear(); + + y.type = Geometry::CYLINDER; + if (!c->Attribute("length") || + !c->Attribute("radius")) + { + logError("Cylinder shape must have both length and radius attributes"); + return false; + } + + try + { + y.length = boost::lexical_cast(c->Attribute("length")); + } + catch (boost::bad_lexical_cast &e) + { + // std::stringstream stm; + // stm << "length [" << c->Attribute("length") << "] is not a valid float"; + //logError(stm.str().c_str()); + logError("length"); + return false; + } + + try + { + y.radius = boost::lexical_cast(c->Attribute("radius")); + } + catch (boost::bad_lexical_cast &e) + { + // std::stringstream stm; + // stm << "radius [" << c->Attribute("radius") << "] is not a valid float"; + //logError(stm.str().c_str()); + logError("radius"); + return false; + } + return true; +} + + +bool parseMesh(Mesh &m, TiXmlElement *c) +{ + m.clear(); + + m.type = Geometry::MESH; + if (!c->Attribute("filename")) { + logError("Mesh must contain a filename attribute"); + return false; + } + + m.filename = c->Attribute("filename"); + + if (c->Attribute("scale")) { + try { + m.scale.init(c->Attribute("scale")); + } + catch (ParseError &e) { + m.scale.clear(); + logError("Mesh scale was specified, but could not be parsed: %s", e.what()); + return false; + } + } + else + { + m.scale.x = m.scale.y = m.scale.z = 1; + } + return true; +} + +my_shared_ptr parseGeometry(TiXmlElement *g) +{ + my_shared_ptr geom; + if (!g) return geom; + + TiXmlElement *shape = g->FirstChildElement(); + if (!shape) + { + logError("Geometry tag contains no child element."); + return geom; + } + + const std::string type_name = shape->ValueTStr().c_str(); + if (type_name == "sphere") + { + Sphere *s = new Sphere(); + geom.reset(s); + if (parseSphere(*s, shape)) + return geom; + } + else if (type_name == "box") + { + Box *b = new Box(); + geom.reset(b); + if (parseBox(*b, shape)) + return geom; + } + else if (type_name == "cylinder") + { + Cylinder *c = new Cylinder(); + geom.reset(c); + if (parseCylinder(*c, shape)) + return geom; + } + else if (type_name == "mesh") + { + Mesh *m = new Mesh(); + geom.reset(m); + if (parseMesh(*m, shape)) + return geom; + } + else + { + logError("Unknown geometry type '%s'", type_name.c_str()); + return geom; + } + + return my_shared_ptr(); +} + +bool parseInertial(Inertial &i, TiXmlElement *config) +{ + i.clear(); + + // Origin + TiXmlElement *o = config->FirstChildElement("origin"); + if (o) + { + if (!parsePose(i.origin, o)) + return false; + } + + TiXmlElement *mass_xml = config->FirstChildElement("mass"); + if (!mass_xml) + { + logError("Inertial element must have a mass element"); + return false; + } + if (!mass_xml->Attribute("value")) + { + logError("Inertial: mass element must have value attribute"); + return false; + } + + try + { + i.mass = boost::lexical_cast(mass_xml->Attribute("value")); + } + catch (boost::bad_lexical_cast &e) + { + // std::stringstream stm; + // stm << "Inertial: mass [" << mass_xml->Attribute("value") + // << "] is not a float"; + //logError(stm.str().c_str()); + logError("Inertial mass issue"); + return false; + } + + TiXmlElement *inertia_xml = config->FirstChildElement("inertia"); + if (!inertia_xml) + { + logError("Inertial element must have inertia element"); + return false; + } + if (!(inertia_xml->Attribute("ixx") && inertia_xml->Attribute("ixy") && inertia_xml->Attribute("ixz") && + inertia_xml->Attribute("iyy") && inertia_xml->Attribute("iyz") && + inertia_xml->Attribute("izz"))) + { + logError("Inertial: inertia element must have ixx,ixy,ixz,iyy,iyz,izz attributes"); + return false; + } + try + { + i.ixx = boost::lexical_cast(inertia_xml->Attribute("ixx")); + i.ixy = boost::lexical_cast(inertia_xml->Attribute("ixy")); + i.ixz = boost::lexical_cast(inertia_xml->Attribute("ixz")); + i.iyy = boost::lexical_cast(inertia_xml->Attribute("iyy")); + i.iyz = boost::lexical_cast(inertia_xml->Attribute("iyz")); + i.izz = boost::lexical_cast(inertia_xml->Attribute("izz")); + } + catch (boost::bad_lexical_cast &e) + { + /* std::stringstream stm; + stm << "Inertial: one of the inertia elements is not a valid double:" + << " ixx [" << inertia_xml->Attribute("ixx") << "]" + << " ixy [" << inertia_xml->Attribute("ixy") << "]" + << " ixz [" << inertia_xml->Attribute("ixz") << "]" + << " iyy [" << inertia_xml->Attribute("iyy") << "]" + << " iyz [" << inertia_xml->Attribute("iyz") << "]" + << " izz [" << inertia_xml->Attribute("izz") << "]"; + logError(stm.str().c_str()); + */ + logError("Inertia error"); + + return false; + } + return true; +} + +bool parseVisual(Visual &vis, TiXmlElement *config) +{ + vis.clear(); + + // Origin + TiXmlElement *o = config->FirstChildElement("origin"); + if (o) { + if (!parsePose(vis.origin, o)) + return false; + } + + // Geometry + TiXmlElement *geom = config->FirstChildElement("geometry"); + vis.geometry = parseGeometry(geom); + if (!vis.geometry) + return false; + + const char *name_char = config->Attribute("name"); + if (name_char) + vis.name = name_char; + + // Material + TiXmlElement *mat = config->FirstChildElement("material"); + if (mat) { + // get material name + if (!mat->Attribute("name")) { + logError("Visual material must contain a name attribute"); + return false; + } + vis.material_name = mat->Attribute("name"); + + // try to parse material element in place + vis.material.reset(new Material()); + if (!parseMaterial(*vis.material, mat, true)) + { + logDebug("urdfdom: material has only name, actual material definition may be in the model"); + } + } + + return true; +} + +bool parseCollision(Collision &col, TiXmlElement* config) +{ + col.clear(); + + // Origin + TiXmlElement *o = config->FirstChildElement("origin"); + if (o) { + if (!parsePose(col.origin, o)) + return false; + } + + // Geometry + TiXmlElement *geom = config->FirstChildElement("geometry"); + col.geometry = parseGeometry(geom); + if (!col.geometry) + return false; + + const char *name_char = config->Attribute("name"); + if (name_char) + col.name = name_char; + + return true; +} + +bool parseLink(Link &link, TiXmlElement* config) +{ + + link.clear(); + + const char *name_char = config->Attribute("name"); + if (!name_char) + { + logError("No name given for the link."); + return false; + } + link.name = std::string(name_char); + + // Inertial (optional) + TiXmlElement *i = config->FirstChildElement("inertial"); + if (i) + { + link.inertial.reset(new Inertial()); + if (!parseInertial(*link.inertial, i)) + { + logError("Could not parse inertial element for Link [%s]", link.name.c_str()); + return false; + } + } + + // Multiple Visuals (optional) + for (TiXmlElement* vis_xml = config->FirstChildElement("visual"); vis_xml; vis_xml = vis_xml->NextSiblingElement("visual")) + { + + my_shared_ptr vis; + vis.reset(new Visual()); + if (parseVisual(*vis, vis_xml)) + { + link.visual_array.push_back(vis); + } + else + { + vis.reset(0); + logError("Could not parse visual element for Link [%s]", link.name.c_str()); + return false; + } + } + + // Visual (optional) + // Assign the first visual to the .visual ptr, if it exists + if (!link.visual_array.empty()) + link.visual = link.visual_array[0]; + + // Multiple Collisions (optional) + for (TiXmlElement* col_xml = config->FirstChildElement("collision"); col_xml; col_xml = col_xml->NextSiblingElement("collision")) + { + my_shared_ptr col; + col.reset(new Collision()); + if (parseCollision(*col, col_xml)) + { + link.collision_array.push_back(col); + } + else + { + col.reset(0); + logError("Could not parse collision element for Link [%s]", link.name.c_str()); + return false; + } + } + + // Collision (optional) + // Assign the first collision to the .collision ptr, if it exists + if (!link.collision_array.empty()) + link.collision = link.collision_array[0]; + return true; + +} + +} diff --git a/btgui/urdf/urdfdom/urdf_parser/src/model.cpp b/btgui/urdf/urdfdom/urdf_parser/src/model.cpp new file mode 100644 index 000000000..7c9d7e9c7 --- /dev/null +++ b/btgui/urdf/urdfdom/urdf_parser/src/model.cpp @@ -0,0 +1,238 @@ +/********************************************************************* +* Software License Agreement (BSD License) +* +* Copyright (c) 2008, Willow Garage, 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 Willow Garage 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. +*********************************************************************/ + +/* Author: Wim Meeussen */ +//#include +#include +#include "urdf/urdfdom/urdf_parser/include/urdf_parser/urdf_parser.h" +#ifdef URDF_USE_CONSOLE_BRIDGE + #include +#else + #include "urdf/boost_replacement/printf_console.h" +#endif + +namespace urdf{ + +bool parseMaterial(Material &material, TiXmlElement *config, bool only_name_is_ok); +bool parseLink(Link &link, TiXmlElement *config); +bool parseJoint(Joint &joint, TiXmlElement *config); + + +my_shared_ptr parseURDF(const std::string &xml_string) +{ + my_shared_ptr model(new ModelInterface); + model->clear(); + + TiXmlDocument xml_doc; + xml_doc.Parse(xml_string.c_str()); + if (xml_doc.Error()) + { + logError(xml_doc.ErrorDesc()); + xml_doc.ClearError(); + model.reset(0); + return model; + } + + TiXmlElement *robot_xml = xml_doc.FirstChildElement("robot"); + if (!robot_xml) + { + logError("Could not find the 'robot' element in the xml file"); + model.reset(0); + return model; + } + + // Get robot name + const char *name = robot_xml->Attribute("name"); + if (!name) + { + logError("No name given for the robot."); + model.reset(0); + return model; + } + model->name_ = std::string(name); + + // Get all Material elements + for (TiXmlElement* material_xml = robot_xml->FirstChildElement("material"); material_xml; material_xml = material_xml->NextSiblingElement("material")) + { + my_shared_ptr material; + material.reset(new Material); + + try { + parseMaterial(*material, material_xml, false); // material needs to be fully defined here + if (model->getMaterial(material->name)) + { + logError("material '%s' is not unique.", material->name.c_str()); + material.reset(0); + model.reset(0); + return model; + } + else + { + model->materials_.insert(make_pair(material->name,material)); + logDebug("urdfdom: successfully added a new material '%s'", material->name.c_str()); + } + } + catch (ParseError &e) { + logError("material xml is not initialized correctly"); + material.reset(0); + model.reset(0); + return model; + } + } + + // Get all Link elements + for (TiXmlElement* link_xml = robot_xml->FirstChildElement("link"); link_xml; link_xml = link_xml->NextSiblingElement("link")) + { + my_shared_ptr link; + link.reset(new Link); + + try { + parseLink(*link, link_xml); + if (model->getLink(link->name)) + { + logError("link '%s' is not unique.", link->name.c_str()); + model.reset(0); + return model; + } + else + { + // set link visual material + logDebug("urdfdom: setting link '%s' material", link->name.c_str()); + if (link->visual) + { + if (!link->visual->material_name.empty()) + { + if (model->getMaterial(link->visual->material_name)) + { + logDebug("urdfdom: setting link '%s' material to '%s'", link->name.c_str(),link->visual->material_name.c_str()); + link->visual->material = model->getMaterial( link->visual->material_name.c_str() ); + } + else + { + if (link->visual->material) + { + logDebug("urdfdom: link '%s' material '%s' defined in Visual.", link->name.c_str(),link->visual->material_name.c_str()); + model->materials_.insert(make_pair(link->visual->material->name,link->visual->material)); + } + else + { + logError("link '%s' material '%s' undefined.", link->name.c_str(),link->visual->material_name.c_str()); + model.reset(0); + return model; + } + } + } + } + + model->links_.insert(make_pair(link->name,link)); + logDebug("urdfdom: successfully added a new link '%s'", link->name.c_str()); + } + } + catch (ParseError &e) { + logError("link xml is not initialized correctly"); + model.reset(0); + return model; + } + } + if (model->links_.empty()){ + logError("No link elements found in urdf file"); + model.reset(0); + return model; + } + + // Get all Joint elements + for (TiXmlElement* joint_xml = robot_xml->FirstChildElement("joint"); joint_xml; joint_xml = joint_xml->NextSiblingElement("joint")) + { + my_shared_ptr joint; + joint.reset(new Joint); + + if (parseJoint(*joint, joint_xml)) + { + if (model->getJoint(joint->name)) + { + logError("joint '%s' is not unique.", joint->name.c_str()); + model.reset(0); + return model; + } + else + { + model->joints_.insert(make_pair(joint->name,joint)); + logDebug("urdfdom: successfully added a new joint '%s'", joint->name.c_str()); + } + } + else + { + logError("joint xml is not initialized correctly"); + model.reset(0); + return model; + } + } + + + // every link has children links and joints, but no parents, so we create a + // local convenience data structure for keeping child->parent relations + std::map parent_link_tree; + parent_link_tree.clear(); + + // building tree: name mapping + try + { + model->initTree(parent_link_tree); + } + catch(ParseError &e) + { + logError("Failed to build tree: %s", e.what()); + model.reset(0); + return model; + } + + // find the root link + try + { + model->initRoot(parent_link_tree); + } + catch(ParseError &e) + { + logError("Failed to find root link: %s", e.what()); + model.reset(0); + return model; + } + + return model; +} + + + +} + diff --git a/btgui/urdf/urdfdom/urdf_parser/src/pose.cpp b/btgui/urdf/urdfdom/urdf_parser/src/pose.cpp new file mode 100644 index 000000000..e90247c0e --- /dev/null +++ b/btgui/urdf/urdfdom/urdf_parser/src/pose.cpp @@ -0,0 +1,91 @@ +/********************************************************************* +* Software License Agreement (BSD License) +* +* Copyright (c) 2008, Willow Garage, 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 Willow Garage 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. +*********************************************************************/ + +/* Author: Wim Meeussen, John Hsu */ + + +#include +#include +#include +//#include +#include + +#ifdef URDF_USE_CONSOLE_BRIDGE +#include +#else +#include "urdf/boost_replacement/printf_console.h" +#endif + +#include +#include + + +namespace urdf{ + +bool parsePose(Pose &pose, TiXmlElement* xml) +{ + pose.clear(); + if (xml) + { + const char* xyz_str = xml->Attribute("xyz"); + if (xyz_str != NULL) + { + try { + pose.position.init(xyz_str); + } + catch (ParseError &e) { + logError(e.what()); + return false; + } + } + + const char* rpy_str = xml->Attribute("rpy"); + if (rpy_str != NULL) + { + try { + pose.rotation.init(rpy_str); + } + catch (ParseError &e) { + logError(e.what()); + return false; + } + } + } + return true; +} + + +} + + diff --git a/btgui/urdf/urdfdom/urdf_parser/src/twist.cpp b/btgui/urdf/urdfdom/urdf_parser/src/twist.cpp new file mode 100644 index 000000000..4980e17de --- /dev/null +++ b/btgui/urdf/urdfdom/urdf_parser/src/twist.cpp @@ -0,0 +1,85 @@ +/********************************************************************* +* Software License Agreement (BSD License) +* +* Copyright (c) 2008, Willow Garage, 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 Willow Garage 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. +*********************************************************************/ + +/* Author: John Hsu */ + + +#include +#include +#include +#include +#include +#include +#include + +namespace urdf{ + +bool parseTwist(Twist &twist, TiXmlElement* xml) +{ + twist.clear(); + if (xml) + { + const char* linear_char = xml->Attribute("linear"); + if (linear_char != NULL) + { + try { + twist.linear.init(linear_char); + } + catch (ParseError &e) { + twist.linear.clear(); + logError("Malformed linear string [%s]: %s", linear_char, e.what()); + return false; + } + } + + const char* angular_char = xml->Attribute("angular"); + if (angular_char != NULL) + { + try { + twist.angular.init(angular_char); + } + catch (ParseError &e) { + twist.angular.clear(); + logError("Malformed angular [%s]: %s", angular_char, e.what()); + return false; + } + } + } + return true; +} + +} + + + diff --git a/btgui/urdf/urdfdom/urdf_parser/src/urdf_model_state.cpp b/btgui/urdf/urdfdom/urdf_parser/src/urdf_model_state.cpp new file mode 100644 index 000000000..f30b8456e --- /dev/null +++ b/btgui/urdf/urdfdom/urdf_parser/src/urdf_model_state.cpp @@ -0,0 +1,154 @@ +/********************************************************************* +* Software License Agreement (BSD License) +* +* Copyright (c) 2008, Willow Garage, 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 Willow Garage 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. +*********************************************************************/ + +/* Author: John Hsu */ + + +#include +#include +#include +#include +#include +#include +#include + +namespace urdf{ + +bool parseModelState(ModelState &ms, TiXmlElement* config) +{ + ms.clear(); + + const char *name_char = config->Attribute("name"); + if (!name_char) + { + logError("No name given for the model_state."); + return false; + } + ms.name = std::string(name_char); + + const char *time_stamp_char = config->Attribute("time_stamp"); + if (time_stamp_char) + { + try { + double sec = boost::lexical_cast(time_stamp_char); + ms.time_stamp.set(sec); + } + catch (boost::bad_lexical_cast &e) { + logError("Parsing time stamp [%s] failed: %s", time_stamp_char, e.what()); + return false; + } + } + + TiXmlElement *joint_state_elem = config->FirstChildElement("joint_state"); + if (joint_state_elem) + { + boost::shared_ptr joint_state; + joint_state.reset(new JointState()); + + const char *joint_char = joint_state_elem->Attribute("joint"); + if (joint_char) + joint_state->joint = std::string(joint_char); + else + { + logError("No joint name given for the model_state."); + return false; + } + + // parse position + const char *position_char = joint_state_elem->Attribute("position"); + if (position_char) + { + + std::vector pieces; + boost::split( pieces, position_char, boost::is_any_of(" ")); + for (unsigned int i = 0; i < pieces.size(); ++i){ + if (pieces[i] != ""){ + try { + joint_state->position.push_back(boost::lexical_cast(pieces[i].c_str())); + } + catch (boost::bad_lexical_cast &e) { + throw ParseError("position element ("+ pieces[i] +") is not a valid float"); + } + } + } + } + + // parse velocity + const char *velocity_char = joint_state_elem->Attribute("velocity"); + if (velocity_char) + { + + std::vector pieces; + boost::split( pieces, velocity_char, boost::is_any_of(" ")); + for (unsigned int i = 0; i < pieces.size(); ++i){ + if (pieces[i] != ""){ + try { + joint_state->velocity.push_back(boost::lexical_cast(pieces[i].c_str())); + } + catch (boost::bad_lexical_cast &e) { + throw ParseError("velocity element ("+ pieces[i] +") is not a valid float"); + } + } + } + } + + // parse effort + const char *effort_char = joint_state_elem->Attribute("effort"); + if (effort_char) + { + + std::vector pieces; + boost::split( pieces, effort_char, boost::is_any_of(" ")); + for (unsigned int i = 0; i < pieces.size(); ++i){ + if (pieces[i] != ""){ + try { + joint_state->effort.push_back(boost::lexical_cast(pieces[i].c_str())); + } + catch (boost::bad_lexical_cast &e) { + throw ParseError("effort element ("+ pieces[i] +") is not a valid float"); + } + } + } + } + + // add to vector + ms.joint_states.push_back(joint_state); + } +}; + + + +} + + diff --git a/btgui/urdf/urdfdom/urdf_parser/src/urdf_sensor.cpp b/btgui/urdf/urdfdom/urdf_parser/src/urdf_sensor.cpp new file mode 100644 index 000000000..85a886d3f --- /dev/null +++ b/btgui/urdf/urdfdom/urdf_parser/src/urdf_sensor.cpp @@ -0,0 +1,364 @@ +/********************************************************************* +* Software License Agreement (BSD License) +* +* Copyright (c) 2008, Willow Garage, 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 Willow Garage 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. +*********************************************************************/ + +/* Author: John Hsu */ + + +#include +#include +#include +#include +#include +#include +#include + +namespace urdf{ + +bool parsePose(Pose &pose, TiXmlElement* xml); + +bool parseCamera(Camera &camera, TiXmlElement* config) +{ + camera.clear(); + camera.type = VisualSensor::CAMERA; + + TiXmlElement *image = config->FirstChildElement("image"); + if (image) + { + const char* width_char = image->Attribute("width"); + if (width_char) + { + try + { + camera.width = boost::lexical_cast(width_char); + } + catch (boost::bad_lexical_cast &e) + { + logError("Camera image width [%s] is not a valid int: %s", width_char, e.what()); + return false; + } + } + else + { + logError("Camera sensor needs an image width attribute"); + return false; + } + + const char* height_char = image->Attribute("height"); + if (height_char) + { + try + { + camera.height = boost::lexical_cast(height_char); + } + catch (boost::bad_lexical_cast &e) + { + logError("Camera image height [%s] is not a valid int: %s", height_char, e.what()); + return false; + } + } + else + { + logError("Camera sensor needs an image height attribute"); + return false; + } + + const char* format_char = image->Attribute("format"); + if (format_char) + camera.format = std::string(format_char); + else + { + logError("Camera sensor needs an image format attribute"); + return false; + } + + const char* hfov_char = image->Attribute("hfov"); + if (hfov_char) + { + try + { + camera.hfov = boost::lexical_cast(hfov_char); + } + catch (boost::bad_lexical_cast &e) + { + logError("Camera image hfov [%s] is not a valid float: %s", hfov_char, e.what()); + return false; + } + } + else + { + logError("Camera sensor needs an image hfov attribute"); + return false; + } + + const char* near_char = image->Attribute("near"); + if (near_char) + { + try + { + camera.near = boost::lexical_cast(near_char); + } + catch (boost::bad_lexical_cast &e) + { + logError("Camera image near [%s] is not a valid float: %s", near_char, e.what()); + return false; + } + } + else + { + logError("Camera sensor needs an image near attribute"); + return false; + } + + const char* far_char = image->Attribute("far"); + if (far_char) + { + try + { + camera.far = boost::lexical_cast(far_char); + } + catch (boost::bad_lexical_cast &e) + { + logError("Camera image far [%s] is not a valid float: %s", far_char, e.what()); + return false; + } + } + else + { + logError("Camera sensor needs an image far attribute"); + return false; + } + + } + else + { + logError("Camera sensor has no element"); + return false; + } + return true; +} + +bool parseRay(Ray &ray, TiXmlElement* config) +{ + ray.clear(); + ray.type = VisualSensor::RAY; + + TiXmlElement *horizontal = config->FirstChildElement("horizontal"); + if (horizontal) + { + const char* samples_char = horizontal->Attribute("samples"); + if (samples_char) + { + try + { + ray.horizontal_samples = boost::lexical_cast(samples_char); + } + catch (boost::bad_lexical_cast &e) + { + logError("Ray horizontal samples [%s] is not a valid float: %s", samples_char, e.what()); + return false; + } + } + + const char* resolution_char = horizontal->Attribute("resolution"); + if (resolution_char) + { + try + { + ray.horizontal_resolution = boost::lexical_cast(resolution_char); + } + catch (boost::bad_lexical_cast &e) + { + logError("Ray horizontal resolution [%s] is not a valid float: %s", resolution_char, e.what()); + return false; + } + } + + const char* min_angle_char = horizontal->Attribute("min_angle"); + if (min_angle_char) + { + try + { + ray.horizontal_min_angle = boost::lexical_cast(min_angle_char); + } + catch (boost::bad_lexical_cast &e) + { + logError("Ray horizontal min_angle [%s] is not a valid float: %s", min_angle_char, e.what()); + return false; + } + } + + const char* max_angle_char = horizontal->Attribute("max_angle"); + if (max_angle_char) + { + try + { + ray.horizontal_max_angle = boost::lexical_cast(max_angle_char); + } + catch (boost::bad_lexical_cast &e) + { + logError("Ray horizontal max_angle [%s] is not a valid float: %s", max_angle_char, e.what()); + return false; + } + } + } + + TiXmlElement *vertical = config->FirstChildElement("vertical"); + if (vertical) + { + const char* samples_char = vertical->Attribute("samples"); + if (samples_char) + { + try + { + ray.vertical_samples = boost::lexical_cast(samples_char); + } + catch (boost::bad_lexical_cast &e) + { + logError("Ray vertical samples [%s] is not a valid float: %s", samples_char, e.what()); + return false; + } + } + + const char* resolution_char = vertical->Attribute("resolution"); + if (resolution_char) + { + try + { + ray.vertical_resolution = boost::lexical_cast(resolution_char); + } + catch (boost::bad_lexical_cast &e) + { + logError("Ray vertical resolution [%s] is not a valid float: %s", resolution_char, e.what()); + return false; + } + } + + const char* min_angle_char = vertical->Attribute("min_angle"); + if (min_angle_char) + { + try + { + ray.vertical_min_angle = boost::lexical_cast(min_angle_char); + } + catch (boost::bad_lexical_cast &e) + { + logError("Ray vertical min_angle [%s] is not a valid float: %s", min_angle_char, e.what()); + return false; + } + } + + const char* max_angle_char = vertical->Attribute("max_angle"); + if (max_angle_char) + { + try + { + ray.vertical_max_angle = boost::lexical_cast(max_angle_char); + } + catch (boost::bad_lexical_cast &e) + { + logError("Ray vertical max_angle [%s] is not a valid float: %s", max_angle_char, e.what()); + return false; + } + } + } +} + +boost::shared_ptr parseVisualSensor(TiXmlElement *g) +{ + boost::shared_ptr visual_sensor; + + // get sensor type + TiXmlElement *sensor_xml; + if (g->FirstChildElement("camera")) + { + Camera *camera = new Camera(); + visual_sensor.reset(camera); + sensor_xml = g->FirstChildElement("camera"); + if (!parseCamera(*camera, sensor_xml)) + visual_sensor.reset(); + } + else if (g->FirstChildElement("ray")) + { + Ray *ray = new Ray(); + visual_sensor.reset(ray); + sensor_xml = g->FirstChildElement("ray"); + if (!parseRay(*ray, sensor_xml)) + visual_sensor.reset(); + } + else + { + logError("No know sensor types [camera|ray] defined in block"); + } + return visual_sensor; +} + + +bool parseSensor(Sensor &sensor, TiXmlElement* config) +{ + sensor.clear(); + + const char *name_char = config->Attribute("name"); + if (!name_char) + { + logError("No name given for the sensor."); + return false; + } + sensor.name = std::string(name_char); + + // parse parent_link_name + const char *parent_link_name_char = config->Attribute("parent_link_name"); + if (!parent_link_name_char) + { + logError("No parent_link_name given for the sensor."); + return false; + } + sensor.parent_link_name = std::string(parent_link_name_char); + + // parse origin + TiXmlElement *o = config->FirstChildElement("origin"); + if (o) + { + if (!parsePose(sensor.origin, o)) + return false; + } + + // parse sensor + sensor.sensor = parseVisualSensor(config); + return true; +} + + +} + + diff --git a/btgui/urdf/urdfdom/urdf_parser/src/world.cpp b/btgui/urdf/urdfdom/urdf_parser/src/world.cpp new file mode 100644 index 000000000..ddc27c5f3 --- /dev/null +++ b/btgui/urdf/urdfdom/urdf_parser/src/world.cpp @@ -0,0 +1,71 @@ +/********************************************************************* +* Software License Agreement (BSD License) +* +* Copyright (c) 2008, Willow Garage, 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 Willow Garage 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. +*********************************************************************/ + +/* Author: Wim Meeussen */ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace urdf{ + +bool parseWorld(World &world, TiXmlElement* config) +{ + + // to be implemented + + return true; +} + +bool exportWorld(World &world, TiXmlElement* xml) +{ + TiXmlElement * world_xml = new TiXmlElement("world"); + world_xml->SetAttribute("name", world.name); + + // to be implemented + // exportModels(*world.models, world_xml); + + xml->LinkEndChild(world_xml); + + return true; +} + +} diff --git a/btgui/urdf/urdfdom/urdf_parser/test/memtest.cpp b/btgui/urdf/urdfdom/urdf_parser/test/memtest.cpp new file mode 100644 index 000000000..d835eb3db --- /dev/null +++ b/btgui/urdf/urdfdom/urdf_parser/test/memtest.cpp @@ -0,0 +1,20 @@ +#include "urdf_parser/urdf_parser.h" +#include +#include + +int main(int argc, char** argv){ + while (true){ + std::string xml_string; + std::fstream xml_file(argv[1], std::fstream::in); + while ( xml_file.good() ) + { + std::string line; + std::getline( xml_file, line); + xml_string += (line + "\n"); + } + xml_file.close(); + + + urdf::parseURDF(xml_string); + } +} diff --git a/btgui/urdf/urdfdom_headers/LICENSE b/btgui/urdf/urdfdom_headers/LICENSE new file mode 100644 index 000000000..e80920e25 --- /dev/null +++ b/btgui/urdf/urdfdom_headers/LICENSE @@ -0,0 +1,15 @@ +Software License Agreement (Apache License) + +Copyright 2011 John Hsu + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/btgui/urdf/urdfdom_headers/README.txt b/btgui/urdf/urdfdom_headers/README.txt new file mode 100644 index 000000000..6a841d52e --- /dev/null +++ b/btgui/urdf/urdfdom_headers/README.txt @@ -0,0 +1,6 @@ +The URDF (U-Robot Description Format) headers + provides core data structure headers for URDF. + +For now, the details of the URDF specifications reside on + http://ros.org/wiki/urdf + diff --git a/btgui/urdf/urdfdom_headers/urdf_exception/include/urdf_exception/exception.h b/btgui/urdf/urdfdom_headers/urdf_exception/include/urdf_exception/exception.h new file mode 100644 index 000000000..24222f1ff --- /dev/null +++ b/btgui/urdf/urdfdom_headers/urdf_exception/include/urdf_exception/exception.h @@ -0,0 +1,53 @@ +/********************************************************************* +* Software License Agreement (BSD License) +* +* Copyright (c) 2008, Willow Garage, 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 Willow Garage 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. +*********************************************************************/ + +// URDF exceptions +#ifndef URDF_INTERFACE_EXCEPTION_H_ +#define URDF_INTERFACE_EXCEPTION_H_ + +#include +#include + +namespace urdf +{ + +class ParseError: public std::runtime_error +{ +public: + ParseError(const std::string &error_msg) : std::runtime_error(error_msg) {}; +}; + +} + +#endif diff --git a/btgui/urdf/urdfdom_headers/urdf_model/include/urdf_model/color.h b/btgui/urdf/urdfdom_headers/urdf_model/include/urdf_model/color.h new file mode 100644 index 000000000..9c15dd77b --- /dev/null +++ b/btgui/urdf/urdfdom_headers/urdf_model/include/urdf_model/color.h @@ -0,0 +1,101 @@ +/********************************************************************* +* Software License Agreement (BSD License) +* +* Copyright (c) 2008, Willow Garage, 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 Willow Garage 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. +*********************************************************************/ + +/* Author: Josh Faust */ + +#ifndef URDF_INTERFACE_COLOR_H +#define URDF_INTERFACE_COLOR_H + +#include +#include +#include +//#include +//#include + +namespace urdf +{ + +class Color +{ +public: + Color() {this->clear();}; + float r; + float g; + float b; + float a; + + void clear() + { + r = g = b = 0.0f; + a = 1.0f; + } + bool init(const std::string &vector_str) + { + this->clear(); + std::vector pieces; + std::vector rgba; + + boost::split( pieces, vector_str, boost::is_any_of(" ")); + for (unsigned int i = 0; i < pieces.size(); ++i) + { + if (!pieces[i].empty()) + { + try + { + rgba.push_back(boost::lexical_cast(pieces[i].c_str())); + } + catch (boost::bad_lexical_cast &e) + { + return false; + } + } + } + + if (rgba.size() != 4) + { + return false; + } + this->r = rgba[0]; + this->g = rgba[1]; + this->b = rgba[2]; + this->a = rgba[3]; + + return true; + }; +}; + +} + +#endif + diff --git a/btgui/urdf/urdfdom_headers/urdf_model/include/urdf_model/joint.h b/btgui/urdf/urdfdom_headers/urdf_model/include/urdf_model/joint.h new file mode 100644 index 000000000..cd889dcec --- /dev/null +++ b/btgui/urdf/urdfdom_headers/urdf_model/include/urdf_model/joint.h @@ -0,0 +1,234 @@ +/********************************************************************* +* Software License Agreement (BSD License) +* +* Copyright (c) 2008, Willow Garage, 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 Willow Garage 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. +*********************************************************************/ + +/* Author: Wim Meeussen */ + +#ifndef URDF_INTERFACE_JOINT_H +#define URDF_INTERFACE_JOINT_H + +#include +#include +#ifdef URDF_USE_BOOST +#include +#define my_shared_ptr my_shared_ptr +#else +#include +#endif + +#include + + +namespace urdf{ + +class Link; + +class JointDynamics +{ +public: + JointDynamics() { this->clear(); }; + double damping; + double friction; + + void clear() + { + damping = 0; + friction = 0; + }; +}; + +class JointLimits +{ +public: + JointLimits() { this->clear(); }; + double lower; + double upper; + double effort; + double velocity; + + void clear() + { + lower = 0; + upper = 0; + effort = 0; + velocity = 0; + }; +}; + +/// \brief Parameters for Joint Safety Controllers +class JointSafety +{ +public: + /// clear variables on construction + JointSafety() { this->clear(); }; + + /// + /// IMPORTANT: The safety controller support is very much PR2 specific, not intended for generic usage. + /// + /// Basic safety controller operation is as follows + /// + /// current safety controllers will take effect on joints outside the position range below: + /// + /// position range: [JointSafety::soft_lower_limit + JointLimits::velocity / JointSafety::k_position, + /// JointSafety::soft_uppper_limit - JointLimits::velocity / JointSafety::k_position] + /// + /// if (joint_position is outside of the position range above) + /// velocity_limit_min = -JointLimits::velocity + JointSafety::k_position * (joint_position - JointSafety::soft_lower_limit) + /// velocity_limit_max = JointLimits::velocity + JointSafety::k_position * (joint_position - JointSafety::soft_upper_limit) + /// else + /// velocity_limit_min = -JointLimits::velocity + /// velocity_limit_max = JointLimits::velocity + /// + /// velocity range: [velocity_limit_min + JointLimits::effort / JointSafety::k_velocity, + /// velocity_limit_max - JointLimits::effort / JointSafety::k_velocity] + /// + /// if (joint_velocity is outside of the velocity range above) + /// effort_limit_min = -JointLimits::effort + JointSafety::k_velocity * (joint_velocity - velocity_limit_min) + /// effort_limit_max = JointLimits::effort + JointSafety::k_velocity * (joint_velocity - velocity_limit_max) + /// else + /// effort_limit_min = -JointLimits::effort + /// effort_limit_max = JointLimits::effort + /// + /// Final effort command sent to the joint is saturated by [effort_limit_min,effort_limit_max] + /// + /// Please see wiki for more details: http://www.ros.org/wiki/pr2_controller_manager/safety_limits + /// + double soft_upper_limit; + double soft_lower_limit; + double k_position; + double k_velocity; + + void clear() + { + soft_upper_limit = 0; + soft_lower_limit = 0; + k_position = 0; + k_velocity = 0; + }; +}; + + +class JointCalibration +{ +public: + JointCalibration() { this->clear(); }; + double reference_position; + my_shared_ptr rising, falling; + + void clear() + { + reference_position = 0; + }; +}; + +class JointMimic +{ +public: + JointMimic() { this->clear(); }; + double offset; + double multiplier; + std::string joint_name; + + void clear() + { + offset = 0.0; + multiplier = 0.0; + joint_name.clear(); + }; +}; + + +class Joint +{ +public: + + Joint() { this->clear(); }; + + std::string name; + enum + { + UNKNOWN, REVOLUTE, CONTINUOUS, PRISMATIC, FLOATING, PLANAR, FIXED + } type; + + /// \brief type_ meaning of axis_ + /// ------------------------------------------------------ + /// UNKNOWN unknown type + /// REVOLUTE rotation axis + /// PRISMATIC translation axis + /// FLOATING N/A + /// PLANAR plane normal axis + /// FIXED N/A + Vector3 axis; + + /// child Link element + /// child link frame is the same as the Joint frame + std::string child_link_name; + + /// parent Link element + /// origin specifies the transform from Parent Link to Joint Frame + std::string parent_link_name; + /// transform from Parent Link frame to Joint frame + Pose parent_to_joint_origin_transform; + + /// Joint Dynamics + my_shared_ptr dynamics; + + /// Joint Limits + my_shared_ptr limits; + + /// Unsupported Hidden Feature + my_shared_ptr safety; + + /// Unsupported Hidden Feature + my_shared_ptr calibration; + + /// Option to Mimic another Joint + my_shared_ptr mimic; + + void clear() + { + this->axis.clear(); + this->child_link_name.clear(); + this->parent_link_name.clear(); + this->parent_to_joint_origin_transform.clear(); + this->dynamics.reset(0); + this->limits.reset(0); + this->safety.reset(0); + this->calibration.reset(0); + this->type = UNKNOWN; + }; +}; + +} + +#endif diff --git a/btgui/urdf/urdfdom_headers/urdf_model/include/urdf_model/link.h b/btgui/urdf/urdfdom_headers/urdf_model/include/urdf_model/link.h new file mode 100644 index 000000000..67a1647ec --- /dev/null +++ b/btgui/urdf/urdfdom_headers/urdf_model/include/urdf_model/link.h @@ -0,0 +1,258 @@ +/********************************************************************* +* Software License Agreement (BSD License) +* +* Copyright (c) 2008, Willow Garage, 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 Willow Garage 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. +*********************************************************************/ + +/* Author: Wim Meeussen */ + +#ifndef URDF_INTERFACE_LINK_H +#define URDF_INTERFACE_LINK_H + +#include +#include +#include + + +#ifdef URDF_USE_BOOST + #include + #include +#else + #include +#endif + +#include "joint.h" +#include "color.h" +#include "pose.h" + +namespace urdf{ + +class Geometry +{ +public: + enum {SPHERE, BOX, CYLINDER, MESH} type; + + virtual ~Geometry(void) + { + } +}; + +class Sphere : public Geometry +{ +public: + Sphere() { this->clear(); type = SPHERE; }; + double radius; + + void clear() + { + radius = 0; + }; +}; + +class Box : public Geometry +{ +public: + Box() { this->clear(); type = BOX; } + Vector3 dim; + + void clear() + { + this->dim.clear(); + }; +}; + +class Cylinder : public Geometry +{ +public: + Cylinder() { this->clear(); type = CYLINDER; }; + double length; + double radius; + + void clear() + { + length = 0; + radius = 0; + }; +}; + +class Mesh : public Geometry +{ +public: + Mesh() { this->clear(); type = MESH; }; + std::string filename; + Vector3 scale; + + void clear() + { + filename.clear(); + // default scale + scale.x = 1; + scale.y = 1; + scale.z = 1; + }; +}; + +class Material +{ +public: + Material() { this->clear(); }; + std::string name; + std::string texture_filename; + Color color; + + void clear() + { + color.clear(); + texture_filename.clear(); + name.clear(); + }; +}; + +class Inertial +{ +public: + Inertial() { this->clear(); }; + Pose origin; + double mass; + double ixx,ixy,ixz,iyy,iyz,izz; + + void clear() + { + origin.clear(); + mass = 0; + ixx = ixy = ixz = iyy = iyz = izz = 0; + }; +}; + +class Visual +{ +public: + Visual() { this->clear(); }; + Pose origin; + my_shared_ptr geometry; + + std::string material_name; + my_shared_ptr material; + + void clear() + { + origin.clear(); + material_name.clear(); + material.reset(0); + geometry.reset(0); + name.clear(); + }; + + std::string name; +}; + +class Collision +{ +public: + Collision() { this->clear(); }; + Pose origin; + my_shared_ptr geometry; + + void clear() + { + origin.clear(); + geometry.reset(0); + name.clear(); + }; + + std::string name; + +}; + + +class Link +{ +public: + Link() { this->clear(); }; + + std::string name; + + /// inertial element + my_shared_ptr inertial; + + /// visual element + my_shared_ptr visual; + + /// collision element + my_shared_ptr collision; + + /// if more than one collision element is specified, all collision elements are placed in this array (the collision member points to the first element of the array) + std::vector > collision_array; + + /// if more than one visual element is specified, all visual elements are placed in this array (the visual member points to the first element of the array) + std::vector > visual_array; + + /// Parent Joint element + /// explicitly stating "parent" because we want directional-ness for tree structure + /// every link can have one parent + my_shared_ptr parent_joint; + + std::vector > child_joints; + std::vector > child_links; + + const Link* getParent() const + {return parent_link_;} + + void setParent(const my_shared_ptr &parent) + { + parent_link_ = parent.get(); + } + + void clear() + { + this->name.clear(); + this->inertial.reset(0); + this->visual.reset(0); + this->collision.reset(0); + this->parent_joint.reset(0); + this->child_joints.clear(); + this->child_links.clear(); + this->collision_array.clear(); + this->visual_array.clear(); + }; + +private: +// boost::weak_ptr parent_link_; + const Link* parent_link_; + +}; + + + + +} + +#endif diff --git a/btgui/urdf/urdfdom_headers/urdf_model/include/urdf_model/model.h b/btgui/urdf/urdfdom_headers/urdf_model/include/urdf_model/model.h new file mode 100644 index 000000000..5bd11a6d6 --- /dev/null +++ b/btgui/urdf/urdfdom_headers/urdf_model/include/urdf_model/model.h @@ -0,0 +1,215 @@ +/********************************************************************* +* Software License Agreement (BSD License) +* +* Copyright (c) 2008, Willow Garage, 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 Willow Garage 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. +*********************************************************************/ + +/* Author: Wim Meeussen */ + +#ifndef URDF_INTERFACE_MODEL_H +#define URDF_INTERFACE_MODEL_H + +#include +#include +//#include +#include + +#include + +namespace urdf { + +class ModelInterface +{ +public: + my_shared_ptr getRoot(void) const{return this->root_link_;}; + my_shared_ptr getLink(const std::string& name) const + { + my_shared_ptr ptr; + if (this->links_.find(name) == this->links_.end()) + ptr.reset(0); + else + ptr = this->links_.find(name)->second; + return ptr; + }; + + my_shared_ptr getJoint(const std::string& name) const + { + my_shared_ptr ptr; + if (this->joints_.find(name) == this->joints_.end()) + ptr.reset(0); + else + ptr = this->joints_.find(name)->second; + return ptr; + }; + + + const std::string& getName() const {return name_;}; + void getLinks(std::vector >& links) const + { + for (std::map >::const_iterator link = this->links_.begin();link != this->links_.end(); link++) + { + links.push_back(link->second); + } + }; + + void clear() + { + name_.clear(); + this->links_.clear(); + this->joints_.clear(); + this->materials_.clear(); + this->root_link_.reset(0); + }; + + /// non-const getLink() + void getLink(const std::string& name,my_shared_ptr &link) const + { + my_shared_ptr ptr; + if (this->links_.find(name) == this->links_.end()) + ptr.reset(0); + else + ptr = this->links_.find(name)->second; + link = ptr; + }; + + /// non-const getMaterial() + my_shared_ptr getMaterial(const std::string& name) const + { + my_shared_ptr ptr; + if (this->materials_.find(name) == this->materials_.end()) + ptr.reset(0); + else + ptr = this->materials_.find(name)->second; + return ptr; + }; + + void initTree(std::map &parent_link_tree) + { + // loop through all joints, for every link, assign children links and children joints + for (std::map >::iterator joint = this->joints_.begin();joint != this->joints_.end(); joint++) + { + std::string parent_link_name = joint->second->parent_link_name; + std::string child_link_name = joint->second->child_link_name; + + if (parent_link_name.empty() || child_link_name.empty()) + { + assert(0); + + // throw ParseError("Joint [" + joint->second->name + "] is missing a parent and/or child link specification."); + } + else + { + // find child and parent links + my_shared_ptr child_link, parent_link; + this->getLink(child_link_name, child_link); + if (!child_link) + { + assert(0); +// throw ParseError("child link [" + child_link_name + "] of joint [" + joint->first + "] not found"); + } + this->getLink(parent_link_name, parent_link); + if (!parent_link) + { + assert(0); + +/* throw ParseError("parent link [" + parent_link_name + "] of joint [" + joint->first + "] not found. This is not valid according to the URDF spec. Every link you refer to from a joint needs to be explicitly defined in the robot description. To fix this problem you can either remove this joint [" + joint->first + "] from your urdf file, or add \"\" to your urdf file."); + + */} + + //set parent link for child link + child_link->setParent(parent_link); + + //set parent joint for child link + child_link->parent_joint = joint->second; + + //set child joint for parent link + parent_link->child_joints.push_back(joint->second); + + //set child link for parent link + parent_link->child_links.push_back(child_link); + + // fill in child/parent string map + parent_link_tree[child_link->name] = parent_link_name; + } + } + } + + void initRoot(const std::map &parent_link_tree) + { + this->root_link_.reset(0); + + // find the links that have no parent in the tree + for (std::map >::const_iterator l=this->links_.begin(); l!=this->links_.end(); l++) + { + std::map::const_iterator parent = parent_link_tree.find(l->first); + if (parent == parent_link_tree.end()) + { + // store root link + if (!this->root_link_) + { + getLink(l->first, this->root_link_); + } + // we already found a root link + else + { + assert(0); + // throw ParseError("Two root links found: [" + this->root_link_->name + "] and [" + l->first + "]"); + } + } + } + if (!this->root_link_) + { + assert(0); + //throw ParseError("No root link found. The robot xml is not a valid tree."); + } + } + + + /// \brief complete list of Links + std::map > links_; + /// \brief complete list of Joints + std::map > joints_; + /// \brief complete list of Materials + std::map > materials_; + + /// \brief The name of the robot model + std::string name_; + + /// \brief The root is always a link (the parent of the tree describing the robot) + my_shared_ptr root_link_; + + + +}; + +} + +#endif diff --git a/btgui/urdf/urdfdom_headers/urdf_model/include/urdf_model/pose.h b/btgui/urdf/urdfdom_headers/urdf_model/include/urdf_model/pose.h new file mode 100644 index 000000000..93183c8f8 --- /dev/null +++ b/btgui/urdf/urdfdom_headers/urdf_model/include/urdf_model/pose.h @@ -0,0 +1,265 @@ +/********************************************************************* +* Software License Agreement (BSD License) +* +* Copyright (c) 2008, Willow Garage, 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 Willow Garage 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. +*********************************************************************/ + +/* Author: Wim Meeussen */ + +#ifndef URDF_INTERFACE_POSE_H +#define URDF_INTERFACE_POSE_H + +#include +//#include +#include +#include +#ifndef M_PI +#define M_PI 3.141592538 +#endif //M_PI + +#ifdef URDF_USE_BOOST + #include + #include +#else + #include + #include +#endif //URDF_USE_BOOST + +#include +#include + +namespace urdf{ + +class Vector3 +{ +public: + Vector3(double _x,double _y, double _z) {this->x=_x;this->y=_y;this->z=_z;}; + Vector3() {this->clear();}; + double x; + double y; + double z; + + void clear() {this->x=this->y=this->z=0.0;}; + void init(const std::string &vector_str) + { + this->clear(); + std::vector pieces; + std::vector xyz; + boost::split( pieces, vector_str, boost::is_any_of(" ")); + for (unsigned int i = 0; i < pieces.size(); ++i){ + if (pieces[i] != ""){ + try { + xyz.push_back(boost::lexical_cast(pieces[i].c_str())); + } + catch (boost::bad_lexical_cast &e) + { + assert(0); + // throw ParseError("Unable to parse component [" + pieces[i] + "] to a double (while parsing a vector value)"); + } + } + } + + + + if (xyz.size() != 3) + { + assert(0); + // throw ParseError("Parser found " + boost::lexical_cast(xyz.size()) + " elements but 3 expected while parsing vector [" + vector_str + "]"); + } + this->x = xyz[0]; + this->y = xyz[1]; + this->z = xyz[2]; + } + + Vector3 operator+(Vector3 vec) + { + return Vector3(this->x+vec.x,this->y+vec.y,this->z+vec.z); + }; +}; + +class Rotation +{ +public: + Rotation(double _x,double _y, double _z, double _w) {this->x=_x;this->y=_y;this->z=_z;this->w=_w;}; + Rotation() {this->clear();}; + void getQuaternion(double &quat_x,double &quat_y,double &quat_z, double &quat_w) const + { + quat_x = this->x; + quat_y = this->y; + quat_z = this->z; + quat_w = this->w; + }; + void getRPY(double &roll,double &pitch,double &yaw) const + { + double sqw; + double sqx; + double sqy; + double sqz; + + sqx = this->x * this->x; + sqy = this->y * this->y; + sqz = this->z * this->z; + sqw = this->w * this->w; + + roll = atan2(2 * (this->y*this->z + this->w*this->x), sqw - sqx - sqy + sqz); + double sarg = -2 * (this->x*this->z - this->w*this->y); + pitch = sarg <= -1.0 ? -0.5*M_PI : (sarg >= 1.0 ? 0.5*M_PI : asin(sarg)); + yaw = atan2(2 * (this->x*this->y + this->w*this->z), sqw + sqx - sqy - sqz); + + }; + void setFromQuaternion(double quat_x,double quat_y,double quat_z,double quat_w) + { + this->x = quat_x; + this->y = quat_y; + this->z = quat_z; + this->w = quat_w; + this->normalize(); + }; + void setFromRPY(double roll, double pitch, double yaw) + { + double phi, the, psi; + + phi = roll / 2.0; + the = pitch / 2.0; + psi = yaw / 2.0; + + this->x = sin(phi) * cos(the) * cos(psi) - cos(phi) * sin(the) * sin(psi); + this->y = cos(phi) * sin(the) * cos(psi) + sin(phi) * cos(the) * sin(psi); + this->z = cos(phi) * cos(the) * sin(psi) - sin(phi) * sin(the) * cos(psi); + this->w = cos(phi) * cos(the) * cos(psi) + sin(phi) * sin(the) * sin(psi); + + this->normalize(); + }; + + double x,y,z,w; + + void init(const std::string &rotation_str) + { + this->clear(); + Vector3 rpy; + rpy.init(rotation_str); + setFromRPY(rpy.x, rpy.y, rpy.z); + } + + void clear() { this->x=this->y=this->z=0.0;this->w=1.0; } + + void normalize() + { + double s = sqrt(this->x * this->x + + this->y * this->y + + this->z * this->z + + this->w * this->w); + if (s == 0.0) + { + this->x = 0.0; + this->y = 0.0; + this->z = 0.0; + this->w = 1.0; + } + else + { + this->x /= s; + this->y /= s; + this->z /= s; + this->w /= s; + } + }; + + // Multiplication operator (copied from gazebo) + Rotation operator*( const Rotation &qt ) const + { + Rotation c; + + c.x = this->w * qt.x + this->x * qt.w + this->y * qt.z - this->z * qt.y; + c.y = this->w * qt.y - this->x * qt.z + this->y * qt.w + this->z * qt.x; + c.z = this->w * qt.z + this->x * qt.y - this->y * qt.x + this->z * qt.w; + c.w = this->w * qt.w - this->x * qt.x - this->y * qt.y - this->z * qt.z; + + return c; + }; + /// Rotate a vector using the quaternion + Vector3 operator*(Vector3 vec) const + { + Rotation tmp; + Vector3 result; + + tmp.w = 0.0; + tmp.x = vec.x; + tmp.y = vec.y; + tmp.z = vec.z; + + tmp = (*this) * (tmp * this->GetInverse()); + + result.x = tmp.x; + result.y = tmp.y; + result.z = tmp.z; + + return result; + }; + // Get the inverse of this quaternion + Rotation GetInverse() const + { + Rotation q; + + double norm = this->w*this->w+this->x*this->x+this->y*this->y+this->z*this->z; + + if (norm > 0.0) + { + q.w = this->w / norm; + q.x = -this->x / norm; + q.y = -this->y / norm; + q.z = -this->z / norm; + } + + return q; + }; + + +}; + +class Pose +{ +public: + Pose() { this->clear(); }; + + Vector3 position; + Rotation rotation; + + void clear() + { + this->position.clear(); + this->rotation.clear(); + }; +}; + +} + +#endif diff --git a/btgui/urdf/urdfdom_headers/urdf_model/include/urdf_model/twist.h b/btgui/urdf/urdfdom_headers/urdf_model/include/urdf_model/twist.h new file mode 100644 index 000000000..5560de34a --- /dev/null +++ b/btgui/urdf/urdfdom_headers/urdf_model/include/urdf_model/twist.h @@ -0,0 +1,68 @@ +/********************************************************************* +* Software License Agreement (BSD License) +* +* Copyright (c) 2008, Willow Garage, 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 Willow Garage 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. +*********************************************************************/ + +/* Author: John Hsu */ + +#ifndef URDF_TWIST_H +#define URDF_TWIST_H + +#include +#include +#include +#include +#include + +namespace urdf{ + + +class Twist +{ +public: + Twist() { this->clear(); }; + + Vector3 linear; + // Angular velocity represented by Euler angles + Vector3 angular; + + void clear() + { + this->linear.clear(); + this->angular.clear(); + }; +}; + +} + +#endif + diff --git a/btgui/urdf/urdfdom_headers/urdf_model_state/include/urdf_model_state/model_state.h b/btgui/urdf/urdfdom_headers/urdf_model_state/include/urdf_model_state/model_state.h new file mode 100644 index 000000000..b1327191a --- /dev/null +++ b/btgui/urdf/urdfdom_headers/urdf_model_state/include/urdf_model_state/model_state.h @@ -0,0 +1,141 @@ +/********************************************************************* +* Software License Agreement (BSD License) +* +* Copyright (c) 2008, Willow Garage, 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 Willow Garage 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. +*********************************************************************/ + +/* Author: John Hsu */ + +#ifndef URDF_MODEL_STATE_H +#define URDF_MODEL_STATE_H + +#include +#include +#include +#include +#include + +#include "urdf_model/pose.h" +#include + + +namespace urdf{ + +class Time +{ +public: + Time() { this->clear(); }; + + void set(double _seconds) + { + this->sec = (int32_t)(floor(_seconds)); + this->nsec = (int32_t)(round((_seconds - this->sec) * 1e9)); + this->Correct(); + }; + + operator double () + { + return (static_cast(this->sec) + + static_cast(this->nsec)*1e-9); + }; + + int32_t sec; + int32_t nsec; + + void clear() + { + this->sec = 0; + this->nsec = 0; + }; +private: + void Correct() + { + // Make any corrections + if (this->nsec >= 1e9) + { + this->sec++; + this->nsec = (int32_t)(this->nsec - 1e9); + } + else if (this->nsec < 0) + { + this->sec--; + this->nsec = (int32_t)(this->nsec + 1e9); + } + }; +}; + + +class JointState +{ +public: + JointState() { this->clear(); }; + + /// joint name + std::string joint; + + std::vector position; + std::vector velocity; + std::vector effort; + + void clear() + { + this->joint.clear(); + this->position.clear(); + this->velocity.clear(); + this->effort.clear(); + } +}; + +class ModelState +{ +public: + ModelState() { this->clear(); }; + + /// state name must be unique + std::string name; + + Time time_stamp; + + void clear() + { + this->name.clear(); + this->time_stamp.set(0); + this->joint_states.clear(); + }; + + std::vector > joint_states; + +}; + +} + +#endif + diff --git a/btgui/urdf/urdfdom_headers/urdf_model_state/include/urdf_model_state/twist.h b/btgui/urdf/urdfdom_headers/urdf_model_state/include/urdf_model_state/twist.h new file mode 100644 index 000000000..05f1917b9 --- /dev/null +++ b/btgui/urdf/urdfdom_headers/urdf_model_state/include/urdf_model_state/twist.h @@ -0,0 +1,42 @@ +/********************************************************************* +* Software License Agreement (BSD License) +* +* Copyright (c) 2008, Willow Garage, 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 Willow Garage 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. +*********************************************************************/ + +#ifndef URDF_MODEL_STATE_TWIST_ +#define URDF_MODEL_STATE_TWIST_ + +#warning "Please Use #include " + +#include + +#endif diff --git a/btgui/urdf/urdfdom_headers/urdf_sensor/include/urdf_sensor/sensor.h b/btgui/urdf/urdfdom_headers/urdf_sensor/include/urdf_sensor/sensor.h new file mode 100644 index 000000000..3b996957b --- /dev/null +++ b/btgui/urdf/urdfdom_headers/urdf_sensor/include/urdf_sensor/sensor.h @@ -0,0 +1,176 @@ +/********************************************************************* +* Software License Agreement (BSD License) +* +* Copyright (c) 2008, Willow Garage, 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 Willow Garage 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. +*********************************************************************/ + +/* Author: John Hsu */ + +/* example + + + + + 1.5708 + + + + + + + + + + + + + + +*/ + + + +#ifndef URDF_SENSOR_H +#define URDF_SENSOR_H + +#include +#include +#include +#include +#include +#include "urdf_model/pose.h" +#include "urdf_model/joint.h" +#include "urdf_model/link.h" + +namespace urdf{ + +class VisualSensor +{ +public: + enum {CAMERA, RAY} type; + virtual ~VisualSensor(void) + { + } +}; + +class Camera : public VisualSensor +{ +public: + Camera() { this->clear(); }; + unsigned int width, height; + /// format is optional: defaults to R8G8B8), but can be + /// (L8|R8G8B8|B8G8R8|BAYER_RGGB8|BAYER_BGGR8|BAYER_GBRG8|BAYER_GRBG8) + std::string format; + double hfov; + double near; + double far; + + void clear() + { + hfov = 0; + width = 0; + height = 0; + format.clear(); + near = 0; + far = 0; + }; +}; + +class Ray : public VisualSensor +{ +public: + Ray() { this->clear(); }; + unsigned int horizontal_samples; + double horizontal_resolution; + double horizontal_min_angle; + double horizontal_max_angle; + unsigned int vertical_samples; + double vertical_resolution; + double vertical_min_angle; + double vertical_max_angle; + + void clear() + { + // set defaults + horizontal_samples = 1; + horizontal_resolution = 1; + horizontal_min_angle = 0; + horizontal_max_angle = 0; + vertical_samples = 1; + vertical_resolution = 1; + vertical_min_angle = 0; + vertical_max_angle = 0; + }; +}; + + +class Sensor +{ +public: + Sensor() { this->clear(); }; + + /// sensor name must be unique + std::string name; + + /// update rate in Hz + double update_rate; + + /// transform from parent frame to optical center + /// with z-forward and x-right, y-down + Pose origin; + + /// sensor + boost::shared_ptr sensor; + + + /// Parent link element name. A pointer is stored in parent_link_. + std::string parent_link_name; + + boost::shared_ptr getParent() const + {return parent_link_.lock();}; + + void setParent(boost::shared_ptr parent) + { this->parent_link_ = parent; } + + void clear() + { + this->name.clear(); + this->sensor.reset(); + this->parent_link_name.clear(); + this->parent_link_.reset(); + }; + +private: + boost::weak_ptr parent_link_; + +}; +} +#endif diff --git a/btgui/urdf/urdfdom_headers/urdf_world/include/urdf_world/world.h b/btgui/urdf/urdfdom_headers/urdf_world/include/urdf_world/world.h new file mode 100644 index 000000000..eb13fc4b1 --- /dev/null +++ b/btgui/urdf/urdfdom_headers/urdf_world/include/urdf_world/world.h @@ -0,0 +1,114 @@ +/********************************************************************* +* Software License Agreement (BSD License) +* +* Copyright (c) 2008, Willow Garage, 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 Willow Garage 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. +*********************************************************************/ + +/* Author: John Hsu */ + +/* encapsulates components in a world + see http://ros.org/wiki/usdf/XML/urdf_world and + for details +*/ +/* example world XML + + + + + ... + + + + + + + + + + + + + + + + + + + +*/ + +#ifndef USDF_STATE_H +#define USDF_STATE_H + +#include +#include +#include +#include +#include +#include + +#include "urdf_model/model.h" +#include "urdf_model/pose.h" +#include "urdf_model/twist.h" + +namespace urdf{ + +class Entity +{ +public: + boost::shared_ptr model; + Pose origin; + Twist twist; +}; + +class World +{ +public: + World() { this->clear(); }; + + /// world name must be unique + std::string name; + + std::vector models; + + void initXml(TiXmlElement* config); + + void clear() + { + this->name.clear(); + }; +}; +} + +#endif + diff --git a/build3/findOpenGLGlewGlut.lua b/build3/findOpenGLGlewGlut.lua index dd72ae923..d34884c48 100644 --- a/build3/findOpenGLGlewGlut.lua +++ b/build3/findOpenGLGlewGlut.lua @@ -1,3 +1,13 @@ + function findOpenGL() + configuration{} + if os.is("Linux") then + if os.isdir("/usr/include") and os.isfile("/usr/include/GL/gl.h") then return true + end + return false + end + --assume OpenGL is available on Mac OSX, Windows etc + return true + end function initOpenGL() configuration {} @@ -6,7 +16,7 @@ configuration {"MacOSX"} links { "OpenGL.framework"} configuration {"not Windows", "not MacOSX"} - links {"GL"} + links {"GL","GLU"} configuration{} end @@ -27,7 +37,7 @@ configuration {"MacOSX"} links { "Glut.framework" } configuration {"Linux"} - links {"glut","GLU"} + links {"glut"} configuration{} end @@ -42,7 +52,18 @@ files { projectRootDir .. "btgui/OpenGLWindow/GlewWindows/glew.c"} end if os.is("Linux") then - links{"GLEW"} + configuration{"Linux"} + if os.isdir("/usr/include") and os.isfile("/usr/include/GL/glew.h") then + links {"GLEW"} + else + defines { "GLEW_STATIC"} + --,"GLEW_NO_GLU"} + includedirs { + projectRootDir .. "btgui/OpenGLWindow/GlewWindows" + } + files { projectRootDir .. "btgui/OpenGLWindow/GlewWindows/glew.c"} + end + end configuration{} end diff --git a/build3/premake4.lua b/build3/premake4.lua index 00c770f62..bcc6ddeb4 100644 --- a/build3/premake4.lua +++ b/build3/premake4.lua @@ -4,10 +4,10 @@ -- Multithreaded compiling if _ACTION == "vs2010" or _ACTION=="vs2008" then buildoptions { "/MP" } - end - + end + act = "" - + if _ACTION then act = _ACTION end @@ -18,9 +18,9 @@ trigger = "midi", description = "Use Midi controller to control parameters" } - - --_OPTIONS["midi"] = "1"; - + +-- _OPTIONS["midi"] = "1"; + newoption { trigger = "bullet2gpu", @@ -32,14 +32,20 @@ trigger = "enet", description = "Enable enet NAT punchthrough test" } - + + newoption + { + trigger = "gtest", + description = "Enable unit tests using gtest" + } + configurations {"Release", "Debug"} configuration "Release" flags { "Optimize", "EnableSSE2","StaticRuntime", "NoMinimalRebuild", "FloatFast"} configuration "Debug" defines {"_DEBUG=1"} flags { "Symbols", "StaticRuntime" , "NoMinimalRebuild", "NoEditAndContinue" ,"FloatFast"} - + if os.is("Linux") then if os.is64bit() then platforms {"x64"} @@ -52,7 +58,7 @@ configuration {"x32"} targetsuffix ("_" .. act) - configuration "x64" + configuration "x64" targetsuffix ("_" .. act .. "_64" ) configuration {"x64", "debug"} targetsuffix ("_" .. act .. "_x64_debug") @@ -60,7 +66,7 @@ targetsuffix ("_" .. act .. "_x64_release" ) configuration {"x32", "debug"} targetsuffix ("_" .. act .. "_debug" ) - + configuration{} postfix="" @@ -73,99 +79,98 @@ } end - - flags { "NoRTTI", "NoExceptions"} - defines { "_HAS_EXCEPTIONS=0" } +-- comment-out for now, URDF reader needs exceptions +-- flags { "NoRTTI", "NoExceptions"} +-- defines { "_HAS_EXCEPTIONS=0" } targetdir "../bin" location("./" .. act .. postfix) - + projectRootDir = os.getcwd() .. "/../" - print("Project root directroy: " .. projectRootDir); + print("Project root directory: " .. projectRootDir); dofile ("findOpenCL.lua") dofile ("findDirectX11.lua") dofile ("findOpenGLGlewGlut.lua") - + language "C++" - - include "../test/gtest-1.7.0" --- include "../test/hello_gtest" - - include "../test/TestBullet3OpenCL" - - + + if _OPTIONS["gtest"] then + include "../test/gtest-1.7.0" +-- include "../test/hello_gtest" + include "../test/TestBullet3OpenCL" + end + +if findOpenGL() then include "../Demos3/AllBullet2Demos" include "../Demos3/GpuDemos" + include"../Demos3/BasicDemoConsole" + include"../Demos3/BasicDemoCustomOpenGL2" + + + -- include "../Demos3/CpuDemos" +-- include "../Demos3/Wavefront" +-- include "../btgui/MultiThreading" - include "../Demos3/Wavefront" - include "../btgui/MultiThreading" include "../btgui/OpenGLWindow" - -include "../Demos3/ImplicitCloth" -include "../Demos3/SimpleOpenGL3" - +-- include "../Demos3/ImplicitCloth" + include "../Demos3/SimpleOpenGL3" + include "../btgui/urdf" + include "../btgui/lua-5.2.3" include "../test/lua" - + include "../btgui/Gwen" + include "../btgui/GwenOpenGLTest" +end + -- include "../demo/gpudemo" - include "../btgui/MidiTest" +if _OPTIONS["midi"] then + include "../btgui/MidiTest" +end + -- include "../opencl/vector_add_simplified" -- include "../opencl/vector_add" - include "../btgui/Gwen" - include "../btgui/GwenOpenGLTest" - include "../test/clew" - include "../Demos3/GpuGuiInitialize" - - include "../test/OpenCL/BasicInitialize" - include "../test/OpenCL/KernelLaunch"-- +-- include "../test/clew" +-- include "../Demos3/GpuGuiInitialize" + +-- include "../test/OpenCL/BasicInitialize" + include "../test/OpenCL/KernelLaunch"-- -- include "../test/OpenCL/BroadphaseCollision" -- include "../test/OpenCL/NarrowphaseCollision" include "../test/OpenCL/ParallelPrimitives" include "../test/OpenCL/RadixSortBenchmark" - - include "../src/BulletSoftBody" + + include "../src/BulletSoftBody" include "../src/BulletDynamics" include "../src/BulletCollision" include "../src/LinearMath" - + include "../src/Bullet3Dynamics" include "../src/Bullet3Common" include "../src/Bullet3Geometry" include "../src/Bullet3Collision" include "../src/Bullet3Serialize/Bullet2FileLoader" - include "../src/Bullet3OpenCL" - - - + -- include "../demo/gpu_initialize" -- include "../opencl/lds_bank_conflict" -- include "../opencl/reduce" - include "../btgui/OpenGLTrueTypeFont" + include "../btgui/OpenGLTrueTypeFont" -- include "../btgui/OpenGLWindow" -- include "../demo/ObjLoader" - - -- include "../test/b3DynamicBvhBroadphase" - + if _OPTIONS["enet"] then include "../btgui/enet" include "../test/enet/server" include "../test/enet/client" end - + include "../Demos" + include "../Extras" if _OPTIONS["bullet2gpu"] then - include "../src/LinearMath" - include "../src/BulletCollision" - include "../src/BulletDynamics" - include "../src/BulletSoftBody" - include "../ObsoleteDemos/HelloWorld" - - include "../Demos3" end diff --git a/build3/premake4_osx b/build3/premake4_osx index 67e25d5b9..1979a5db2 100755 Binary files a/build3/premake4_osx and b/build3/premake4_osx differ diff --git a/build3/stringify.bat b/build3/stringify.bat index 7c65b8149..8876515c7 100644 --- a/build3/stringify.bat +++ b/build3/stringify.bat @@ -13,6 +13,7 @@ premake4 --file=stringifyKernel.lua --kernelfile="../src/Bullet3OpenCL/Broadphas premake4 --file=stringifyKernel.lua --kernelfile="../src/Bullet3OpenCL/BroadphaseCollision/kernels/sapFast.cl" --headerfile="../src/Bullet3OpenCL/BroadphaseCollision/kernels/sapFastKernels.h" --stringname="sapFastCL" stringify premake4 --file=stringifyKernel.lua --kernelfile="../src/Bullet3OpenCL/BroadphaseCollision/kernels/gridBroadphase.cl" --headerfile="../src/Bullet3OpenCL/BroadphaseCollision/kernels/gridBroadphaseKernels.h" --stringname="gridBroadphaseCL" stringify +premake4 --file=stringifyKernel.lua --kernelfile="../src/Bullet3OpenCL/BroadphaseCollision/kernels/parallelLinearBvh.cl" --headerfile="../src/Bullet3OpenCL/BroadphaseCollision/kernels/parallelLinearBvhKernels.h" --stringname="parallelLinearBvhCL" stringify diff --git a/build3/stringify_linux.sh b/build3/stringify_linux.sh index ed1627c27..751574af8 100755 --- a/build3/stringify_linux.sh +++ b/build3/stringify_linux.sh @@ -14,6 +14,7 @@ rem @echo off ./premake4_linux64 --file=stringifyKernel.lua --kernelfile="../src/Bullet3OpenCL/BroadphaseCollision/kernels/sapFast.cl" --headerfile="../src/Bullet3OpenCL/BroadphaseCollision/kernels/sapFastKernels.h" --stringname="sapFastCL" stringify ./premake4_linux64 --file=stringifyKernel.lua --kernelfile="../src/Bullet3OpenCL/BroadphaseCollision/kernels/gridBroadphase.cl" --headerfile="../src/Bullet3OpenCL/BroadphaseCollision/kernels/gridBroadphaseKernels.h" --stringname="gridBroadphaseCL" stringify +./premake4_linux64 --file=stringifyKernel.lua --kernelfile="../src/Bullet3OpenCL/BroadphaseCollision/kernels/parallelLinearBvh.cl" --headerfile="../src/Bullet3OpenCL/BroadphaseCollision/kernels/parallelLinearBvhKernels.h" --stringname="parallelLinearBvhCL" stringify diff --git a/data/testFile.bullet b/data/testFile.bullet deleted file mode 100644 index a444865a1..000000000 Binary files a/data/testFile.bullet and /dev/null differ diff --git a/data/testFileFracture.bullet b/data/testFileFracture.bullet index 1413f2d7c..ae161a54c 100644 Binary files a/data/testFileFracture.bullet and b/data/testFileFracture.bullet differ diff --git a/docs/b3GpuParallelLinearBvh.pdf b/docs/b3GpuParallelLinearBvh.pdf new file mode 100644 index 000000000..55327bff9 Binary files /dev/null and b/docs/b3GpuParallelLinearBvh.pdf differ diff --git a/src/Bullet3Collision/CMakeLists.txt b/src/Bullet3Collision/CMakeLists.txt index 39a7b348e..3ba4d9b9f 100644 --- a/src/Bullet3Collision/CMakeLists.txt +++ b/src/Bullet3Collision/CMakeLists.txt @@ -58,6 +58,9 @@ SET(Bullet3Collision_HDRS ) ADD_LIBRARY(Bullet3Collision ${Bullet3Collision_SRCS} ${Bullet3Collision_HDRS}) +if (BUILD_SHARED_LIBS) + target_link_libraries(Bullet3Collision Bullet3Geometry) +endif () SET_TARGET_PROPERTIES(Bullet3Collision PROPERTIES VERSION ${BULLET_VERSION}) SET_TARGET_PROPERTIES(Bullet3Collision PROPERTIES SOVERSION ${BULLET_VERSION}) diff --git a/src/Bullet3Collision/NarrowPhaseCollision/shared/b3ContactConvexConvexSAT.h b/src/Bullet3Collision/NarrowPhaseCollision/shared/b3ContactConvexConvexSAT.h index b3d0c8031..65b333902 100644 --- a/src/Bullet3Collision/NarrowPhaseCollision/shared/b3ContactConvexConvexSAT.h +++ b/src/Bullet3Collision/NarrowPhaseCollision/shared/b3ContactConvexConvexSAT.h @@ -370,7 +370,7 @@ inline int b3ClipHullHullSingle( B3_PROFILE("overlap"); b3Float4 normalOnSurfaceB = (b3Float4&)hostNormal; - b3Float4 centerOut; +// b3Float4 centerOut; b3Int4 contactIdx; contactIdx.x = 0; @@ -461,7 +461,7 @@ inline int b3ContactConvexConvexSAT( //printf("numvertsB = %d\n",hullB.m_numVertices); - b3Float4 contactsOut[B3_MAX_VERTS]; +// b3Float4 contactsOut[B3_MAX_VERTS]; int contactCapacity = B3_MAX_VERTS; int numContactsOut=0; diff --git a/src/Bullet3Collision/NarrowPhaseCollision/shared/b3FindSeparatingAxis.h b/src/Bullet3Collision/NarrowPhaseCollision/shared/b3FindSeparatingAxis.h index 039130016..d7fde0501 100644 --- a/src/Bullet3Collision/NarrowPhaseCollision/shared/b3FindSeparatingAxis.h +++ b/src/Bullet3Collision/NarrowPhaseCollision/shared/b3FindSeparatingAxis.h @@ -149,7 +149,7 @@ inline bool b3FindSeparatingAxis( const b3ConvexPolyhedronData& hullA, const b3C } } - b3Vector3 edgeAstart,edgeAend,edgeBstart,edgeBend; +// b3Vector3 edgeAstart,edgeAend,edgeBstart,edgeBend; int curEdgeEdge = 0; // Test edges diff --git a/src/Bullet3Common/b3Logging.cpp b/src/Bullet3Common/b3Logging.cpp index 2feded9de..fd5cd7d01 100644 --- a/src/Bullet3Common/b3Logging.cpp +++ b/src/Bullet3Common/b3Logging.cpp @@ -19,7 +19,7 @@ subject to the following restrictions: #include #ifdef _WIN32 -#include +#include #endif //_WIN32 diff --git a/src/Bullet3Common/b3Vector3.cpp b/src/Bullet3Common/b3Vector3.cpp index 5da6a18ca..e43f13897 100644 --- a/src/Bullet3Common/b3Vector3.cpp +++ b/src/Bullet3Common/b3Vector3.cpp @@ -42,7 +42,7 @@ long b3_maxdot_large( const float *vv, const float *vec, unsigned long count, fl long b3_maxdot_large( const float *vv, const float *vec, unsigned long count, float *dotResult ) { const float4 *vertices = (const float4*) vv; - static const unsigned char indexTable[16] = {-1, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 }; + static const unsigned char indexTable[16] = {(unsigned char)-1, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 }; float4 dotMax = b3Assign128( -B3_INFINITY, -B3_INFINITY, -B3_INFINITY, -B3_INFINITY ); float4 vvec = _mm_loadu_ps( vec ); float4 vHi = b3CastiTo128f(_mm_shuffle_epi32( b3CastfTo128i( vvec), 0xaa )); /// zzzz @@ -427,7 +427,8 @@ long b3_mindot_large( const float *vv, const float *vec, unsigned long count, fl long b3_mindot_large( const float *vv, const float *vec, unsigned long count, float *dotResult ) { const float4 *vertices = (const float4*) vv; - static const unsigned char indexTable[16] = {-1, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 }; + static const unsigned char indexTable[16] = {(unsigned char)-1, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 }; + float4 dotmin = b3Assign128( B3_INFINITY, B3_INFINITY, B3_INFINITY, B3_INFINITY ); float4 vvec = _mm_loadu_ps( vec ); float4 vHi = b3CastiTo128f(_mm_shuffle_epi32( b3CastfTo128i( vvec), 0xaa )); /// zzzz diff --git a/src/Bullet3Common/premake4.lua b/src/Bullet3Common/premake4.lua index e5fbb5280..0430cdc2a 100644 --- a/src/Bullet3Common/premake4.lua +++ b/src/Bullet3Common/premake4.lua @@ -4,11 +4,9 @@ kind "StaticLib" - targetdir "../../bin" - includedirs {".."} files { "**.cpp", "**.h" - } \ No newline at end of file + } diff --git a/src/Bullet3Dynamics/CMakeLists.txt b/src/Bullet3Dynamics/CMakeLists.txt index 1e48ee827..0b0deed98 100644 --- a/src/Bullet3Dynamics/CMakeLists.txt +++ b/src/Bullet3Dynamics/CMakeLists.txt @@ -30,6 +30,9 @@ SET(Bullet3Dynamics_HDRS ) ADD_LIBRARY(Bullet3Dynamics ${Bullet3Dynamics_SRCS} ${Bullet3Dynamics_HDRS}) +if (BUILD_SHARED_LIBS) + target_link_libraries(Bullet3Dynamics Bullet3Collision) +endif () SET_TARGET_PROPERTIES(Bullet3Dynamics PROPERTIES VERSION ${BULLET_VERSION}) SET_TARGET_PROPERTIES(Bullet3Dynamics PROPERTIES SOVERSION ${BULLET_VERSION}) diff --git a/src/Bullet3Geometry/CMakeLists.txt b/src/Bullet3Geometry/CMakeLists.txt index 8a8f8ab50..7e781278a 100644 --- a/src/Bullet3Geometry/CMakeLists.txt +++ b/src/Bullet3Geometry/CMakeLists.txt @@ -16,6 +16,9 @@ SET(Bullet3Geometry_HDRS ) ADD_LIBRARY(Bullet3Geometry ${Bullet3Geometry_SRCS} ${Bullet3Geometry_HDRS}) +if (BUILD_SHARED_LIBS) + target_link_libraries(Bullet3Geometry Bullet3Common) +endif() SET_TARGET_PROPERTIES(Bullet3Geometry PROPERTIES VERSION ${BULLET_VERSION}) SET_TARGET_PROPERTIES(Bullet3Geometry PROPERTIES SOVERSION ${BULLET_VERSION}) diff --git a/src/Bullet3OpenCL/BroadphaseCollision/b3GpuBroadphaseInterface.h b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuBroadphaseInterface.h index 3598ffb56..09e271e6b 100644 --- a/src/Bullet3OpenCL/BroadphaseCollision/b3GpuBroadphaseInterface.h +++ b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuBroadphaseInterface.h @@ -34,6 +34,10 @@ public: virtual b3OpenCLArray& getAllAabbsGPU()=0; virtual b3AlignedObjectArray& getAllAabbsCPU()=0; + + virtual b3OpenCLArray& getOverlappingPairsGPU() = 0; + virtual b3OpenCLArray& getSmallAabbIndicesGPU() = 0; + virtual b3OpenCLArray& getLargeAabbIndicesGPU() = 0; }; diff --git a/src/Bullet3OpenCL/BroadphaseCollision/b3GpuGridBroadphase.cpp b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuGridBroadphase.cpp index f5308ecf4..deb6d89d9 100644 --- a/src/Bullet3OpenCL/BroadphaseCollision/b3GpuGridBroadphase.cpp +++ b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuGridBroadphase.cpp @@ -366,4 +366,18 @@ b3OpenCLArray& b3GpuGridBroadphase::getAllAabbsGPU() b3AlignedObjectArray& b3GpuGridBroadphase::getAllAabbsCPU() { return m_allAabbsCPU1; -} \ No newline at end of file +} + +b3OpenCLArray& b3GpuGridBroadphase::getOverlappingPairsGPU() +{ + return m_gpuPairs; +} +b3OpenCLArray& b3GpuGridBroadphase::getSmallAabbIndicesGPU() +{ + return m_smallAabbsMappingGPU; +} +b3OpenCLArray& b3GpuGridBroadphase::getLargeAabbIndicesGPU() +{ + return m_largeAabbsMappingGPU; +} + diff --git a/src/Bullet3OpenCL/BroadphaseCollision/b3GpuGridBroadphase.h b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuGridBroadphase.h index 4dd5c3a3c..9694a362b 100644 --- a/src/Bullet3OpenCL/BroadphaseCollision/b3GpuGridBroadphase.h +++ b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuGridBroadphase.h @@ -78,6 +78,10 @@ public: virtual b3OpenCLArray& getAllAabbsGPU(); virtual b3AlignedObjectArray& getAllAabbsCPU(); + + virtual b3OpenCLArray& getOverlappingPairsGPU(); + virtual b3OpenCLArray& getSmallAabbIndicesGPU(); + virtual b3OpenCLArray& getLargeAabbIndicesGPU(); }; diff --git a/src/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvh.cpp b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvh.cpp new file mode 100644 index 000000000..641df9eb1 --- /dev/null +++ b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvh.cpp @@ -0,0 +1,577 @@ +/* +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +//Initial Author Jackson Lee, 2014 + +#include "Bullet3OpenCL/Initialize/b3OpenCLUtils.h" +#include "Bullet3OpenCL/ParallelPrimitives/b3LauncherCL.h" + +#include "b3GpuParallelLinearBvh.h" + +b3GpuParallelLinearBvh::b3GpuParallelLinearBvh(cl_context context, cl_device_id device, cl_command_queue queue) : + m_queue(queue), + m_radixSorter(context, device, queue), + + m_rootNodeIndex(context, queue), + m_maxDistanceFromRoot(context, queue), + m_temp(context, queue), + + m_internalNodeAabbs(context, queue), + m_internalNodeLeafIndexRanges(context, queue), + m_internalNodeChildNodes(context, queue), + m_internalNodeParentNodes(context, queue), + + m_commonPrefixes(context, queue), + m_commonPrefixLengths(context, queue), + m_distanceFromRoot(context, queue), + + m_leafNodeParentNodes(context, queue), + m_mortonCodesAndAabbIndicies(context, queue), + m_mergedAabb(context, queue), + m_leafNodeAabbs(context, queue), + + m_largeAabbs(context, queue) +{ + m_rootNodeIndex.resize(1); + m_maxDistanceFromRoot.resize(1); + m_temp.resize(1); + + // + const char CL_PROGRAM_PATH[] = "src/Bullet3OpenCL/BroadphaseCollision/kernels/parallelLinearBvh.cl"; + + const char* kernelSource = parallelLinearBvhCL; //parallelLinearBvhCL.h + cl_int error; + char* additionalMacros = 0; + m_parallelLinearBvhProgram = b3OpenCLUtils::compileCLProgramFromString(context, device, kernelSource, &error, additionalMacros, CL_PROGRAM_PATH); + b3Assert(m_parallelLinearBvhProgram); + + m_separateAabbsKernel = b3OpenCLUtils::compileCLKernelFromString( context, device, kernelSource, "separateAabbs", &error, m_parallelLinearBvhProgram, additionalMacros ); + b3Assert(m_separateAabbsKernel); + m_findAllNodesMergedAabbKernel = b3OpenCLUtils::compileCLKernelFromString( context, device, kernelSource, "findAllNodesMergedAabb", &error, m_parallelLinearBvhProgram, additionalMacros ); + b3Assert(m_findAllNodesMergedAabbKernel); + m_assignMortonCodesAndAabbIndiciesKernel = b3OpenCLUtils::compileCLKernelFromString( context, device, kernelSource, "assignMortonCodesAndAabbIndicies", &error, m_parallelLinearBvhProgram, additionalMacros ); + b3Assert(m_assignMortonCodesAndAabbIndiciesKernel); + + m_computeAdjacentPairCommonPrefixKernel = b3OpenCLUtils::compileCLKernelFromString( context, device, kernelSource, "computeAdjacentPairCommonPrefix", &error, m_parallelLinearBvhProgram, additionalMacros ); + b3Assert(m_computeAdjacentPairCommonPrefixKernel); + m_buildBinaryRadixTreeLeafNodesKernel = b3OpenCLUtils::compileCLKernelFromString( context, device, kernelSource, "buildBinaryRadixTreeLeafNodes", &error, m_parallelLinearBvhProgram, additionalMacros ); + b3Assert(m_buildBinaryRadixTreeLeafNodesKernel); + m_buildBinaryRadixTreeInternalNodesKernel = b3OpenCLUtils::compileCLKernelFromString( context, device, kernelSource, "buildBinaryRadixTreeInternalNodes", &error, m_parallelLinearBvhProgram, additionalMacros ); + b3Assert(m_buildBinaryRadixTreeInternalNodesKernel); + m_findDistanceFromRootKernel = b3OpenCLUtils::compileCLKernelFromString( context, device, kernelSource, "findDistanceFromRoot", &error, m_parallelLinearBvhProgram, additionalMacros ); + b3Assert(m_findDistanceFromRootKernel); + m_buildBinaryRadixTreeAabbsRecursiveKernel = b3OpenCLUtils::compileCLKernelFromString( context, device, kernelSource, "buildBinaryRadixTreeAabbsRecursive", &error, m_parallelLinearBvhProgram, additionalMacros ); + b3Assert(m_buildBinaryRadixTreeAabbsRecursiveKernel); + + m_findLeafIndexRangesKernel = b3OpenCLUtils::compileCLKernelFromString( context, device, kernelSource, "findLeafIndexRanges", &error, m_parallelLinearBvhProgram, additionalMacros ); + b3Assert(m_findLeafIndexRangesKernel); + + m_plbvhCalculateOverlappingPairsKernel = b3OpenCLUtils::compileCLKernelFromString( context, device, kernelSource, "plbvhCalculateOverlappingPairs", &error, m_parallelLinearBvhProgram, additionalMacros ); + b3Assert(m_plbvhCalculateOverlappingPairsKernel); + m_plbvhRayTraverseKernel = b3OpenCLUtils::compileCLKernelFromString( context, device, kernelSource, "plbvhRayTraverse", &error, m_parallelLinearBvhProgram, additionalMacros ); + b3Assert(m_plbvhRayTraverseKernel); + m_plbvhLargeAabbAabbTestKernel = b3OpenCLUtils::compileCLKernelFromString( context, device, kernelSource, "plbvhLargeAabbAabbTest", &error, m_parallelLinearBvhProgram, additionalMacros ); + b3Assert(m_plbvhLargeAabbAabbTestKernel); + m_plbvhLargeAabbRayTestKernel = b3OpenCLUtils::compileCLKernelFromString( context, device, kernelSource, "plbvhLargeAabbRayTest", &error, m_parallelLinearBvhProgram, additionalMacros ); + b3Assert(m_plbvhLargeAabbRayTestKernel); +} + +b3GpuParallelLinearBvh::~b3GpuParallelLinearBvh() +{ + clReleaseKernel(m_separateAabbsKernel); + clReleaseKernel(m_findAllNodesMergedAabbKernel); + clReleaseKernel(m_assignMortonCodesAndAabbIndiciesKernel); + + clReleaseKernel(m_computeAdjacentPairCommonPrefixKernel); + clReleaseKernel(m_buildBinaryRadixTreeLeafNodesKernel); + clReleaseKernel(m_buildBinaryRadixTreeInternalNodesKernel); + clReleaseKernel(m_findDistanceFromRootKernel); + clReleaseKernel(m_buildBinaryRadixTreeAabbsRecursiveKernel); + + clReleaseKernel(m_findLeafIndexRangesKernel); + + clReleaseKernel(m_plbvhCalculateOverlappingPairsKernel); + clReleaseKernel(m_plbvhRayTraverseKernel); + clReleaseKernel(m_plbvhLargeAabbAabbTestKernel); + clReleaseKernel(m_plbvhLargeAabbRayTestKernel); + + clReleaseProgram(m_parallelLinearBvhProgram); +} + +void b3GpuParallelLinearBvh::build(const b3OpenCLArray& worldSpaceAabbs, const b3OpenCLArray& smallAabbIndices, + const b3OpenCLArray& largeAabbIndices) +{ + B3_PROFILE("b3ParallelLinearBvh::build()"); + + int numLargeAabbs = largeAabbIndices.size(); + int numSmallAabbs = smallAabbIndices.size(); + + //Since all AABBs(both large and small) are input as a contiguous array, + //with 2 additional arrays used to indicate the indices of large and small AABBs, + //it is necessary to separate the AABBs so that the large AABBs will not degrade the quality of the BVH. + { + B3_PROFILE("Separate large and small AABBs"); + + m_largeAabbs.resize(numLargeAabbs); + m_leafNodeAabbs.resize(numSmallAabbs); + + //Write large AABBs into m_largeAabbs + { + b3BufferInfoCL bufferInfo[] = + { + b3BufferInfoCL( worldSpaceAabbs.getBufferCL() ), + b3BufferInfoCL( largeAabbIndices.getBufferCL() ), + + b3BufferInfoCL( m_largeAabbs.getBufferCL() ) + }; + + b3LauncherCL launcher(m_queue, m_separateAabbsKernel, "m_separateAabbsKernel"); + launcher.setBuffers( bufferInfo, sizeof(bufferInfo)/sizeof(b3BufferInfoCL) ); + launcher.setConst(numLargeAabbs); + + launcher.launch1D(numLargeAabbs); + } + + //Write small AABBs into m_leafNodeAabbs + { + b3BufferInfoCL bufferInfo[] = + { + b3BufferInfoCL( worldSpaceAabbs.getBufferCL() ), + b3BufferInfoCL( smallAabbIndices.getBufferCL() ), + + b3BufferInfoCL( m_leafNodeAabbs.getBufferCL() ) + }; + + b3LauncherCL launcher(m_queue, m_separateAabbsKernel, "m_separateAabbsKernel"); + launcher.setBuffers( bufferInfo, sizeof(bufferInfo)/sizeof(b3BufferInfoCL) ); + launcher.setConst(numSmallAabbs); + + launcher.launch1D(numSmallAabbs); + } + + clFinish(m_queue); + } + + // + int numLeaves = numSmallAabbs; //Number of leaves in the BVH == Number of rigid bodies with small AABBs + int numInternalNodes = numLeaves - 1; + + if(numLeaves < 2) + { + //Number of leaf nodes is checked in calculateOverlappingPairs() and testRaysAgainstBvhAabbs(), + //so it does not matter if numLeaves == 0 and rootNodeIndex == -1 + int rootNodeIndex = numLeaves - 1; + m_rootNodeIndex.copyFromHostPointer(&rootNodeIndex, 1); + + //Since the AABBs need to be rearranged(sorted) for the BVH construction algorithm, + //m_mortonCodesAndAabbIndicies.m_value is used to map a sorted AABB index to the unsorted AABB index + //instead of directly moving the AABBs. It needs to be set for the ray cast traversal kernel to work. + //( m_mortonCodesAndAabbIndicies[].m_value == unsorted index == index of m_leafNodeAabbs ) + if(numLeaves == 1) + { + b3SortData leaf; + leaf.m_value = 0; //1 leaf so index is always 0; leaf.m_key does not need to be set + + m_mortonCodesAndAabbIndicies.resize(1); + m_mortonCodesAndAabbIndicies.copyFromHostPointer(&leaf, 1); + } + + return; + } + + // + { + m_internalNodeAabbs.resize(numInternalNodes); + m_internalNodeLeafIndexRanges.resize(numInternalNodes); + m_internalNodeChildNodes.resize(numInternalNodes); + m_internalNodeParentNodes.resize(numInternalNodes); + + m_commonPrefixes.resize(numInternalNodes); + m_commonPrefixLengths.resize(numInternalNodes); + m_distanceFromRoot.resize(numInternalNodes); + + m_leafNodeParentNodes.resize(numLeaves); + m_mortonCodesAndAabbIndicies.resize(numLeaves); + m_mergedAabb.resize(numLeaves); + } + + //Find the merged AABB of all small AABBs; this is used to define the size of + //each cell in the virtual grid for the next kernel(2^10 cells in each dimension). + { + B3_PROFILE("Find AABB of merged nodes"); + + m_mergedAabb.copyFromOpenCLArray(m_leafNodeAabbs); //Need to make a copy since the kernel modifies the array + + for(int numAabbsNeedingMerge = numLeaves; numAabbsNeedingMerge >= 2; + numAabbsNeedingMerge = numAabbsNeedingMerge / 2 + numAabbsNeedingMerge % 2) + { + b3BufferInfoCL bufferInfo[] = + { + b3BufferInfoCL( m_mergedAabb.getBufferCL() ) //Resulting AABB is stored in m_mergedAabb[0] + }; + + b3LauncherCL launcher(m_queue, m_findAllNodesMergedAabbKernel, "m_findAllNodesMergedAabbKernel"); + launcher.setBuffers( bufferInfo, sizeof(bufferInfo)/sizeof(b3BufferInfoCL) ); + launcher.setConst(numAabbsNeedingMerge); + + launcher.launch1D(numAabbsNeedingMerge); + } + + clFinish(m_queue); + } + + //Insert the center of the AABBs into a virtual grid, + //then convert the discrete grid coordinates into a morton code + //For each element in m_mortonCodesAndAabbIndicies, set + // m_key == morton code (value to sort by) + // m_value == small AABB index + { + B3_PROFILE("Assign morton codes"); + + b3BufferInfoCL bufferInfo[] = + { + b3BufferInfoCL( m_leafNodeAabbs.getBufferCL() ), + b3BufferInfoCL( m_mergedAabb.getBufferCL() ), + b3BufferInfoCL( m_mortonCodesAndAabbIndicies.getBufferCL() ) + }; + + b3LauncherCL launcher(m_queue, m_assignMortonCodesAndAabbIndiciesKernel, "m_assignMortonCodesAndAabbIndiciesKernel"); + launcher.setBuffers( bufferInfo, sizeof(bufferInfo)/sizeof(b3BufferInfoCL) ); + launcher.setConst(numLeaves); + + launcher.launch1D(numLeaves); + clFinish(m_queue); + } + + // + { + B3_PROFILE("Sort leaves by morton codes"); + + m_radixSorter.execute(m_mortonCodesAndAabbIndicies); + clFinish(m_queue); + } + + // + constructBinaryRadixTree(); + + + //Since it is a sorted binary radix tree, each internal node contains a contiguous subset of leaf node indices. + //The root node contains leaf node indices in the range [0, numLeafNodes - 1]. + //The child nodes of each node split their parent's index range into 2 contiguous halves. + // + //For example, if the root has indices [0, 31], its children might partition that range into [0, 11] and [12, 31]. + //The next level in the tree could then split those ranges into [0, 2], [3, 11], [12, 22], and [23, 31]. + // + //This property can be used for optimizing calculateOverlappingPairs(), to avoid testing each AABB pair twice + { + B3_PROFILE("m_findLeafIndexRangesKernel"); + + b3BufferInfoCL bufferInfo[] = + { + b3BufferInfoCL( m_internalNodeChildNodes.getBufferCL() ), + b3BufferInfoCL( m_internalNodeLeafIndexRanges.getBufferCL() ) + }; + + b3LauncherCL launcher(m_queue, m_findLeafIndexRangesKernel, "m_findLeafIndexRangesKernel"); + launcher.setBuffers( bufferInfo, sizeof(bufferInfo)/sizeof(b3BufferInfoCL) ); + launcher.setConst(numInternalNodes); + + launcher.launch1D(numInternalNodes); + clFinish(m_queue); + } +} + +void b3GpuParallelLinearBvh::calculateOverlappingPairs(b3OpenCLArray& out_overlappingPairs) +{ + int maxPairs = out_overlappingPairs.size(); + b3OpenCLArray& numPairsGpu = m_temp; + + int reset = 0; + numPairsGpu.copyFromHostPointer(&reset, 1); + + // + if( m_leafNodeAabbs.size() > 1 ) + { + B3_PROFILE("PLBVH small-small AABB test"); + + int numQueryAabbs = m_leafNodeAabbs.size(); + + b3BufferInfoCL bufferInfo[] = + { + b3BufferInfoCL( m_leafNodeAabbs.getBufferCL() ), + + b3BufferInfoCL( m_rootNodeIndex.getBufferCL() ), + b3BufferInfoCL( m_internalNodeChildNodes.getBufferCL() ), + b3BufferInfoCL( m_internalNodeAabbs.getBufferCL() ), + b3BufferInfoCL( m_internalNodeLeafIndexRanges.getBufferCL() ), + b3BufferInfoCL( m_mortonCodesAndAabbIndicies.getBufferCL() ), + + b3BufferInfoCL( numPairsGpu.getBufferCL() ), + b3BufferInfoCL( out_overlappingPairs.getBufferCL() ) + }; + + b3LauncherCL launcher(m_queue, m_plbvhCalculateOverlappingPairsKernel, "m_plbvhCalculateOverlappingPairsKernel"); + launcher.setBuffers( bufferInfo, sizeof(bufferInfo)/sizeof(b3BufferInfoCL) ); + launcher.setConst(maxPairs); + launcher.setConst(numQueryAabbs); + + launcher.launch1D(numQueryAabbs); + clFinish(m_queue); + } + + int numLargeAabbRigids = m_largeAabbs.size(); + if( numLargeAabbRigids > 0 && m_leafNodeAabbs.size() > 0 ) + { + B3_PROFILE("PLBVH large-small AABB test"); + + int numQueryAabbs = m_leafNodeAabbs.size(); + + b3BufferInfoCL bufferInfo[] = + { + b3BufferInfoCL( m_leafNodeAabbs.getBufferCL() ), + b3BufferInfoCL( m_largeAabbs.getBufferCL() ), + + b3BufferInfoCL( numPairsGpu.getBufferCL() ), + b3BufferInfoCL( out_overlappingPairs.getBufferCL() ) + }; + + b3LauncherCL launcher(m_queue, m_plbvhLargeAabbAabbTestKernel, "m_plbvhLargeAabbAabbTestKernel"); + launcher.setBuffers( bufferInfo, sizeof(bufferInfo)/sizeof(b3BufferInfoCL) ); + launcher.setConst(maxPairs); + launcher.setConst(numLargeAabbRigids); + launcher.setConst(numQueryAabbs); + + launcher.launch1D(numQueryAabbs); + clFinish(m_queue); + } + + + // + int numPairs = -1; + numPairsGpu.copyToHostPointer(&numPairs, 1); + if(numPairs > maxPairs) + { + b3Error("Error running out of pairs: numPairs = %d, maxPairs = %d.\n", numPairs, maxPairs); + numPairs = maxPairs; + numPairsGpu.copyFromHostPointer(&maxPairs, 1); + } + + out_overlappingPairs.resize(numPairs); +} + + +void b3GpuParallelLinearBvh::testRaysAgainstBvhAabbs(const b3OpenCLArray& rays, + b3OpenCLArray& out_numRayRigidPairs, b3OpenCLArray& out_rayRigidPairs) +{ + B3_PROFILE("PLBVH testRaysAgainstBvhAabbs()"); + + int numRays = rays.size(); + int maxRayRigidPairs = out_rayRigidPairs.size(); + + int reset = 0; + out_numRayRigidPairs.copyFromHostPointer(&reset, 1); + + // + if( m_leafNodeAabbs.size() > 0 ) + { + B3_PROFILE("PLBVH ray test small AABB"); + + b3BufferInfoCL bufferInfo[] = + { + b3BufferInfoCL( m_leafNodeAabbs.getBufferCL() ), + + b3BufferInfoCL( m_rootNodeIndex.getBufferCL() ), + b3BufferInfoCL( m_internalNodeChildNodes.getBufferCL() ), + b3BufferInfoCL( m_internalNodeAabbs.getBufferCL() ), + b3BufferInfoCL( m_internalNodeLeafIndexRanges.getBufferCL() ), + b3BufferInfoCL( m_mortonCodesAndAabbIndicies.getBufferCL() ), + + b3BufferInfoCL( rays.getBufferCL() ), + + b3BufferInfoCL( out_numRayRigidPairs.getBufferCL() ), + b3BufferInfoCL( out_rayRigidPairs.getBufferCL() ) + }; + + b3LauncherCL launcher(m_queue, m_plbvhRayTraverseKernel, "m_plbvhRayTraverseKernel"); + launcher.setBuffers( bufferInfo, sizeof(bufferInfo)/sizeof(b3BufferInfoCL) ); + launcher.setConst(maxRayRigidPairs); + launcher.setConst(numRays); + + launcher.launch1D(numRays); + clFinish(m_queue); + } + + int numLargeAabbRigids = m_largeAabbs.size(); + if(numLargeAabbRigids > 0) + { + B3_PROFILE("PLBVH ray test large AABB"); + + b3BufferInfoCL bufferInfo[] = + { + b3BufferInfoCL( m_largeAabbs.getBufferCL() ), + b3BufferInfoCL( rays.getBufferCL() ), + + b3BufferInfoCL( out_numRayRigidPairs.getBufferCL() ), + b3BufferInfoCL( out_rayRigidPairs.getBufferCL() ) + }; + + b3LauncherCL launcher(m_queue, m_plbvhLargeAabbRayTestKernel, "m_plbvhLargeAabbRayTestKernel"); + launcher.setBuffers( bufferInfo, sizeof(bufferInfo)/sizeof(b3BufferInfoCL) ); + launcher.setConst(numLargeAabbRigids); + launcher.setConst(maxRayRigidPairs); + launcher.setConst(numRays); + + launcher.launch1D(numRays); + clFinish(m_queue); + } + + // + int numRayRigidPairs = -1; + out_numRayRigidPairs.copyToHostPointer(&numRayRigidPairs, 1); + + if(numRayRigidPairs > maxRayRigidPairs) + b3Error("Error running out of rayRigid pairs: numRayRigidPairs = %d, maxRayRigidPairs = %d.\n", numRayRigidPairs, maxRayRigidPairs); + +} + +void b3GpuParallelLinearBvh::constructBinaryRadixTree() +{ + B3_PROFILE("b3GpuParallelLinearBvh::constructBinaryRadixTree()"); + + int numLeaves = m_leafNodeAabbs.size(); + int numInternalNodes = numLeaves - 1; + + //Each internal node is placed in between 2 leaf nodes. + //By using this arrangement and computing the common prefix between + //these 2 adjacent leaf nodes, it is possible to quickly construct a binary radix tree. + { + B3_PROFILE("m_computeAdjacentPairCommonPrefixKernel"); + + b3BufferInfoCL bufferInfo[] = + { + b3BufferInfoCL( m_mortonCodesAndAabbIndicies.getBufferCL() ), + b3BufferInfoCL( m_commonPrefixes.getBufferCL() ), + b3BufferInfoCL( m_commonPrefixLengths.getBufferCL() ) + }; + + b3LauncherCL launcher(m_queue, m_computeAdjacentPairCommonPrefixKernel, "m_computeAdjacentPairCommonPrefixKernel"); + launcher.setBuffers( bufferInfo, sizeof(bufferInfo)/sizeof(b3BufferInfoCL) ); + launcher.setConst(numInternalNodes); + + launcher.launch1D(numInternalNodes); + clFinish(m_queue); + } + + //For each leaf node, select its parent node by + //comparing the 2 nearest internal nodes and assign child node indices + { + B3_PROFILE("m_buildBinaryRadixTreeLeafNodesKernel"); + + b3BufferInfoCL bufferInfo[] = + { + b3BufferInfoCL( m_commonPrefixLengths.getBufferCL() ), + b3BufferInfoCL( m_leafNodeParentNodes.getBufferCL() ), + b3BufferInfoCL( m_internalNodeChildNodes.getBufferCL() ) + }; + + b3LauncherCL launcher(m_queue, m_buildBinaryRadixTreeLeafNodesKernel, "m_buildBinaryRadixTreeLeafNodesKernel"); + launcher.setBuffers( bufferInfo, sizeof(bufferInfo)/sizeof(b3BufferInfoCL) ); + launcher.setConst(numLeaves); + + launcher.launch1D(numLeaves); + clFinish(m_queue); + } + + //For each internal node, perform 2 binary searches among the other internal nodes + //to its left and right to find its potential parent nodes and assign child node indices + { + B3_PROFILE("m_buildBinaryRadixTreeInternalNodesKernel"); + + b3BufferInfoCL bufferInfo[] = + { + b3BufferInfoCL( m_commonPrefixes.getBufferCL() ), + b3BufferInfoCL( m_commonPrefixLengths.getBufferCL() ), + b3BufferInfoCL( m_internalNodeChildNodes.getBufferCL() ), + b3BufferInfoCL( m_internalNodeParentNodes.getBufferCL() ), + b3BufferInfoCL( m_rootNodeIndex.getBufferCL() ) + }; + + b3LauncherCL launcher(m_queue, m_buildBinaryRadixTreeInternalNodesKernel, "m_buildBinaryRadixTreeInternalNodesKernel"); + launcher.setBuffers( bufferInfo, sizeof(bufferInfo)/sizeof(b3BufferInfoCL) ); + launcher.setConst(numInternalNodes); + + launcher.launch1D(numInternalNodes); + clFinish(m_queue); + } + + //Find the number of nodes seperating each internal node and the root node + //so that the AABBs can be set using the next kernel. + //Also determine the maximum number of nodes separating an internal node and the root node. + { + B3_PROFILE("m_findDistanceFromRootKernel"); + + b3BufferInfoCL bufferInfo[] = + { + b3BufferInfoCL( m_rootNodeIndex.getBufferCL() ), + b3BufferInfoCL( m_internalNodeParentNodes.getBufferCL() ), + b3BufferInfoCL( m_maxDistanceFromRoot.getBufferCL() ), + b3BufferInfoCL( m_distanceFromRoot.getBufferCL() ) + }; + + b3LauncherCL launcher(m_queue, m_findDistanceFromRootKernel, "m_findDistanceFromRootKernel"); + launcher.setBuffers( bufferInfo, sizeof(bufferInfo)/sizeof(b3BufferInfoCL) ); + launcher.setConst(numInternalNodes); + + launcher.launch1D(numInternalNodes); + clFinish(m_queue); + } + + //Starting from the internal nodes nearest to the leaf nodes, recursively move up + //the tree towards the root to set the AABBs of each internal node; each internal node + //checks its children and merges their AABBs + { + B3_PROFILE("m_buildBinaryRadixTreeAabbsRecursiveKernel"); + + int maxDistanceFromRoot = -1; + { + B3_PROFILE("copy maxDistanceFromRoot to CPU"); + m_maxDistanceFromRoot.copyToHostPointer(&maxDistanceFromRoot, 1); + clFinish(m_queue); + } + + for(int distanceFromRoot = maxDistanceFromRoot; distanceFromRoot >= 0; --distanceFromRoot) + { + b3BufferInfoCL bufferInfo[] = + { + b3BufferInfoCL( m_distanceFromRoot.getBufferCL() ), + b3BufferInfoCL( m_mortonCodesAndAabbIndicies.getBufferCL() ), + b3BufferInfoCL( m_internalNodeChildNodes.getBufferCL() ), + b3BufferInfoCL( m_leafNodeAabbs.getBufferCL() ), + b3BufferInfoCL( m_internalNodeAabbs.getBufferCL() ) + }; + + b3LauncherCL launcher(m_queue, m_buildBinaryRadixTreeAabbsRecursiveKernel, "m_buildBinaryRadixTreeAabbsRecursiveKernel"); + launcher.setBuffers( bufferInfo, sizeof(bufferInfo)/sizeof(b3BufferInfoCL) ); + launcher.setConst(maxDistanceFromRoot); + launcher.setConst(distanceFromRoot); + launcher.setConst(numInternalNodes); + + //It may seem inefficent to launch a thread for each internal node when a + //much smaller number of nodes is actually processed, but this is actually + //faster than determining the exact nodes that are ready to merge their child AABBs. + launcher.launch1D(numInternalNodes); + } + + clFinish(m_queue); + } +} + + \ No newline at end of file diff --git a/src/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvh.h b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvh.h new file mode 100644 index 000000000..effe617b7 --- /dev/null +++ b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvh.h @@ -0,0 +1,125 @@ +/* +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +//Initial Author Jackson Lee, 2014 + +#ifndef B3_GPU_PARALLEL_LINEAR_BVH_H +#define B3_GPU_PARALLEL_LINEAR_BVH_H + +//#include "Bullet3Collision/BroadPhaseCollision/shared/b3Aabb.h" +#include "Bullet3OpenCL/BroadphaseCollision/b3SapAabb.h" +#include "Bullet3Common/shared/b3Int2.h" +#include "Bullet3Common/shared/b3Int4.h" +#include "Bullet3Collision/NarrowPhaseCollision/b3RaycastInfo.h" + +#include "Bullet3OpenCL/ParallelPrimitives/b3FillCL.h" +#include "Bullet3OpenCL/ParallelPrimitives/b3RadixSort32CL.h" +#include "Bullet3OpenCL/ParallelPrimitives/b3PrefixScanCL.h" + +#include "Bullet3OpenCL/BroadphaseCollision/kernels/parallelLinearBvhKernels.h" + +#define b3Int64 cl_long + +///@brief GPU Parallel Linearized Bounding Volume Heirarchy(LBVH) that is reconstructed every frame +///@remarks +///See presentation in docs/b3GpuParallelLinearBvh.pdf for algorithm details. +///@par +///Related papers: \n +///"Fast BVH Construction on GPUs" [Lauterbach et al. 2009] \n +///"Maximizing Parallelism in the Construction of BVHs, Octrees, and k-d trees" [Karras 2012] \n +///@par +///The basic algorithm for building the BVH as presented in [Lauterbach et al. 2009] consists of 4 stages: +/// - [fully parallel] Assign morton codes for each AABB using its center (after quantizing the AABB centers into a virtual grid) +/// - [fully parallel] Sort morton codes +/// - [somewhat parallel] Build binary radix tree (assign parent/child pointers for internal nodes of the BVH) +/// - [somewhat parallel] Set internal node AABBs +///@par +///[Karras 2012] improves on the algorithm by introducing fully parallel methods for the last 2 stages. +///The BVH implementation here shares many concepts with [Karras 2012], but a different method is used for constructing the tree. +///Instead of searching for the child nodes of each internal node, we search for the parent node of each node. +///Additionally, a non-atomic traversal that starts from the leaf nodes and moves towards the root node is used to set the AABBs. +class b3GpuParallelLinearBvh +{ + cl_command_queue m_queue; + + cl_program m_parallelLinearBvhProgram; + + cl_kernel m_separateAabbsKernel; + cl_kernel m_findAllNodesMergedAabbKernel; + cl_kernel m_assignMortonCodesAndAabbIndiciesKernel; + + //Binary radix tree construction kernels + cl_kernel m_computeAdjacentPairCommonPrefixKernel; + cl_kernel m_buildBinaryRadixTreeLeafNodesKernel; + cl_kernel m_buildBinaryRadixTreeInternalNodesKernel; + cl_kernel m_findDistanceFromRootKernel; + cl_kernel m_buildBinaryRadixTreeAabbsRecursiveKernel; + + cl_kernel m_findLeafIndexRangesKernel; + + //Traversal kernels + cl_kernel m_plbvhCalculateOverlappingPairsKernel; + cl_kernel m_plbvhRayTraverseKernel; + cl_kernel m_plbvhLargeAabbAabbTestKernel; + cl_kernel m_plbvhLargeAabbRayTestKernel; + + b3RadixSort32CL m_radixSorter; + + //1 element + b3OpenCLArray m_rootNodeIndex; //Most significant bit(0x80000000) is set to indicate internal node + b3OpenCLArray m_maxDistanceFromRoot; //Max number of internal nodes between an internal node and the root node + b3OpenCLArray m_temp; //Used to hold the number of pairs in calculateOverlappingPairs() + + //1 element per internal node (number_of_internal_nodes == number_of_leaves - 1) + b3OpenCLArray m_internalNodeAabbs; + b3OpenCLArray m_internalNodeLeafIndexRanges; //x == min leaf index, y == max leaf index + b3OpenCLArray m_internalNodeChildNodes; //x == left child, y == right child; msb(0x80000000) is set to indicate internal node + b3OpenCLArray m_internalNodeParentNodes; //For parent node index, msb(0x80000000) is not set since it is always internal + + //1 element per internal node; for binary radix tree construction + b3OpenCLArray m_commonPrefixes; + b3OpenCLArray m_commonPrefixLengths; + b3OpenCLArray m_distanceFromRoot; //Number of internal nodes between this node and the root + + //1 element per leaf node (leaf nodes only include small AABBs) + b3OpenCLArray m_leafNodeParentNodes; //For parent node index, msb(0x80000000) is not set since it is always internal + b3OpenCLArray m_mortonCodesAndAabbIndicies; //m_key == morton code, m_value == aabb index in m_leafNodeAabbs + b3OpenCLArray m_mergedAabb; //m_mergedAabb[0] contains the merged AABB of all leaf nodes + b3OpenCLArray m_leafNodeAabbs; //Contains only small AABBs + + //1 element per large AABB, which is not stored in the BVH + b3OpenCLArray m_largeAabbs; + +public: + b3GpuParallelLinearBvh(cl_context context, cl_device_id device, cl_command_queue queue); + virtual ~b3GpuParallelLinearBvh(); + + ///Must be called before any other function + void build(const b3OpenCLArray& worldSpaceAabbs, const b3OpenCLArray& smallAabbIndices, + const b3OpenCLArray& largeAabbIndices); + + ///calculateOverlappingPairs() uses the worldSpaceAabbs parameter of b3GpuParallelLinearBvh::build() as the query AABBs. + ///@param out_overlappingPairs The size() of this array is used to determine the max number of pairs. + ///If the number of overlapping pairs is < out_overlappingPairs.size(), out_overlappingPairs is resized. + void calculateOverlappingPairs(b3OpenCLArray& out_overlappingPairs); + + ///@param out_numRigidRayPairs Array of length 1; contains the number of detected ray-rigid AABB intersections; + ///this value may be greater than out_rayRigidPairs.size() if out_rayRigidPairs is not large enough. + ///@param out_rayRigidPairs Contains an array of rays intersecting rigid AABBs; x == ray index, y == rigid body index. + ///If the size of this array is insufficient to hold all ray-rigid AABB intersections, additional intersections are discarded. + void testRaysAgainstBvhAabbs(const b3OpenCLArray& rays, + b3OpenCLArray& out_numRayRigidPairs, b3OpenCLArray& out_rayRigidPairs); + +private: + void constructBinaryRadixTree(); +}; + +#endif diff --git a/src/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvhBroadphase.cpp b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvhBroadphase.cpp new file mode 100644 index 000000000..78b625631 --- /dev/null +++ b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvhBroadphase.cpp @@ -0,0 +1,80 @@ +/* +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +//Initial Author Jackson Lee, 2014 + +#include "b3GpuParallelLinearBvhBroadphase.h" + +b3GpuParallelLinearBvhBroadphase::b3GpuParallelLinearBvhBroadphase(cl_context context, cl_device_id device, cl_command_queue queue) : + m_plbvh(context, device, queue), + + m_overlappingPairsGpu(context, queue), + + m_aabbsGpu(context, queue), + m_smallAabbsMappingGpu(context, queue), + m_largeAabbsMappingGpu(context, queue) +{ +} + +void b3GpuParallelLinearBvhBroadphase::createProxy(const b3Vector3& aabbMin, const b3Vector3& aabbMax, int userPtr, short int collisionFilterGroup, short int collisionFilterMask) +{ + int newAabbIndex = m_aabbsCpu.size(); + + b3SapAabb aabb; + aabb.m_minVec = aabbMin; + aabb.m_maxVec = aabbMax; + + aabb.m_minIndices[3] = userPtr; + aabb.m_signedMaxIndices[3] = newAabbIndex; + + m_smallAabbsMappingCpu.push_back(newAabbIndex); + + m_aabbsCpu.push_back(aabb); +} +void b3GpuParallelLinearBvhBroadphase::createLargeProxy(const b3Vector3& aabbMin, const b3Vector3& aabbMax, int userPtr, short int collisionFilterGroup, short int collisionFilterMask) +{ + int newAabbIndex = m_aabbsCpu.size(); + + b3SapAabb aabb; + aabb.m_minVec = aabbMin; + aabb.m_maxVec = aabbMax; + + aabb.m_minIndices[3] = userPtr; + aabb.m_signedMaxIndices[3] = newAabbIndex; + + m_largeAabbsMappingCpu.push_back(newAabbIndex); + + m_aabbsCpu.push_back(aabb); +} + +void b3GpuParallelLinearBvhBroadphase::calculateOverlappingPairs(int maxPairs) +{ + //Reconstruct BVH + m_plbvh.build(m_aabbsGpu, m_smallAabbsMappingGpu, m_largeAabbsMappingGpu); + + // + m_overlappingPairsGpu.resize(maxPairs); + m_plbvh.calculateOverlappingPairs(m_overlappingPairsGpu); +} +void b3GpuParallelLinearBvhBroadphase::calculateOverlappingPairsHost(int maxPairs) +{ + b3Assert(0); //CPU version not implemented +} + +void b3GpuParallelLinearBvhBroadphase::writeAabbsToGpu() +{ + m_aabbsGpu.copyFromHost(m_aabbsCpu); + m_smallAabbsMappingGpu.copyFromHost(m_smallAabbsMappingCpu); + m_largeAabbsMappingGpu.copyFromHost(m_largeAabbsMappingCpu); +} + + + diff --git a/src/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvhBroadphase.h b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvhBroadphase.h new file mode 100644 index 000000000..284f6c780 --- /dev/null +++ b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvhBroadphase.h @@ -0,0 +1,66 @@ +/* +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +//Initial Author Jackson Lee, 2014 + +#ifndef B3_GPU_PARALLEL_LINEAR_BVH_BROADPHASE_H +#define B3_GPU_PARALLEL_LINEAR_BVH_BROADPHASE_H + +#include "Bullet3OpenCL/BroadphaseCollision/b3GpuBroadphaseInterface.h" + +#include "b3GpuParallelLinearBvh.h" + +class b3GpuParallelLinearBvhBroadphase : public b3GpuBroadphaseInterface +{ + b3GpuParallelLinearBvh m_plbvh; + + b3OpenCLArray m_overlappingPairsGpu; + + b3OpenCLArray m_aabbsGpu; + b3OpenCLArray m_smallAabbsMappingGpu; + b3OpenCLArray m_largeAabbsMappingGpu; + + b3AlignedObjectArray m_aabbsCpu; + b3AlignedObjectArray m_smallAabbsMappingCpu; + b3AlignedObjectArray m_largeAabbsMappingCpu; + +public: + b3GpuParallelLinearBvhBroadphase(cl_context context, cl_device_id device, cl_command_queue queue); + virtual ~b3GpuParallelLinearBvhBroadphase() {} + + virtual void createProxy(const b3Vector3& aabbMin, const b3Vector3& aabbMax, int userPtr, short int collisionFilterGroup, short int collisionFilterMask); + virtual void createLargeProxy(const b3Vector3& aabbMin, const b3Vector3& aabbMax, int userPtr, short int collisionFilterGroup, short int collisionFilterMask); + + virtual void calculateOverlappingPairs(int maxPairs); + virtual void calculateOverlappingPairsHost(int maxPairs); + + //call writeAabbsToGpu after done making all changes (createProxy etc) + virtual void writeAabbsToGpu(); + + virtual int getNumOverlap() { return m_overlappingPairsGpu.size(); } + virtual cl_mem getOverlappingPairBuffer() { return m_overlappingPairsGpu.getBufferCL(); } + + virtual cl_mem getAabbBufferWS() { return m_aabbsGpu.getBufferCL(); } + virtual b3OpenCLArray& getAllAabbsGPU() { return m_aabbsGpu; } + + virtual b3OpenCLArray& getOverlappingPairsGPU() { return m_overlappingPairsGpu; } + virtual b3OpenCLArray& getSmallAabbIndicesGPU() { return m_smallAabbsMappingGpu; } + virtual b3OpenCLArray& getLargeAabbIndicesGPU() { return m_largeAabbsMappingGpu; } + + virtual b3AlignedObjectArray& getAllAabbsCPU() { return m_aabbsCpu; } + + static b3GpuBroadphaseInterface* CreateFunc(cl_context context, cl_device_id device, cl_command_queue queue) + { + return new b3GpuParallelLinearBvhBroadphase(context, device, queue); + } +}; + +#endif diff --git a/src/Bullet3OpenCL/BroadphaseCollision/b3GpuSapBroadphase.cpp b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuSapBroadphase.cpp index 529951af0..280503b34 100644 --- a/src/Bullet3OpenCL/BroadphaseCollision/b3GpuSapBroadphase.cpp +++ b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuSapBroadphase.cpp @@ -1307,3 +1307,16 @@ cl_mem b3GpuSapBroadphase::getOverlappingPairBuffer() { return m_overlappingPairs.getBufferCL(); } + +b3OpenCLArray& b3GpuSapBroadphase::getOverlappingPairsGPU() +{ + return m_overlappingPairs; +} +b3OpenCLArray& b3GpuSapBroadphase::getSmallAabbIndicesGPU() +{ + return m_smallAabbsMappingGPU; +} +b3OpenCLArray& b3GpuSapBroadphase::getLargeAabbIndicesGPU() +{ + return m_largeAabbsMappingGPU; +} diff --git a/src/Bullet3OpenCL/BroadphaseCollision/b3GpuSapBroadphase.h b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuSapBroadphase.h index 2d3d39367..23e4d624d 100644 --- a/src/Bullet3OpenCL/BroadphaseCollision/b3GpuSapBroadphase.h +++ b/src/Bullet3OpenCL/BroadphaseCollision/b3GpuSapBroadphase.h @@ -143,6 +143,9 @@ public: virtual int getNumOverlap(); virtual cl_mem getOverlappingPairBuffer(); + virtual b3OpenCLArray& getOverlappingPairsGPU(); + virtual b3OpenCLArray& getSmallAabbIndicesGPU(); + virtual b3OpenCLArray& getLargeAabbIndicesGPU(); }; #endif //B3_GPU_SAP_BROADPHASE_H \ No newline at end of file diff --git a/src/Bullet3OpenCL/BroadphaseCollision/kernels/parallelLinearBvh.cl b/src/Bullet3OpenCL/BroadphaseCollision/kernels/parallelLinearBvh.cl new file mode 100644 index 000000000..586bb8abb --- /dev/null +++ b/src/Bullet3OpenCL/BroadphaseCollision/kernels/parallelLinearBvh.cl @@ -0,0 +1,767 @@ +/* +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +//Initial Author Jackson Lee, 2014 + +typedef float b3Scalar; +typedef float4 b3Vector3; +#define b3Max max +#define b3Min min +#define b3Sqrt sqrt + +typedef struct +{ + unsigned int m_key; + unsigned int m_value; +} SortDataCL; + +typedef struct +{ + union + { + float4 m_min; + float m_minElems[4]; + int m_minIndices[4]; + }; + union + { + float4 m_max; + float m_maxElems[4]; + int m_maxIndices[4]; + }; +} b3AabbCL; + + +unsigned int interleaveBits(unsigned int x) +{ + //........ ........ ......12 3456789A //x + //....1..2 ..3..4.. 5..6..7. .8..9..A //x after interleaving bits + + //......12 3456789A ......12 3456789A //x ^ (x << 16) + //11111111 ........ ........ 11111111 //0x FF 00 00 FF + //......12 ........ ........ 3456789A //x = (x ^ (x << 16)) & 0xFF0000FF; + + //......12 ........ 3456789A 3456789A //x ^ (x << 8) + //......11 ........ 1111.... ....1111 //0x 03 00 F0 0F + //......12 ........ 3456.... ....789A //x = (x ^ (x << 8)) & 0x0300F00F; + + //..12..12 ....3456 3456.... 789A789A //x ^ (x << 4) + //......11 ....11.. ..11.... 11....11 //0x 03 0C 30 C3 + //......12 ....34.. ..56.... 78....9A //x = (x ^ (x << 4)) & 0x030C30C3; + + //....1212 ..3434.. 5656..78 78..9A9A //x ^ (x << 2) + //....1..1 ..1..1.. 1..1..1. .1..1..1 //0x 09 24 92 49 + //....1..2 ..3..4.. 5..6..7. .8..9..A //x = (x ^ (x << 2)) & 0x09249249; + + //........ ........ ......11 11111111 //0x000003FF + x &= 0x000003FF; //Clear all bits above bit 10 + + x = (x ^ (x << 16)) & 0xFF0000FF; + x = (x ^ (x << 8)) & 0x0300F00F; + x = (x ^ (x << 4)) & 0x030C30C3; + x = (x ^ (x << 2)) & 0x09249249; + + return x; +} +unsigned int getMortonCode(unsigned int x, unsigned int y, unsigned int z) +{ + return interleaveBits(x) << 0 | interleaveBits(y) << 1 | interleaveBits(z) << 2; +} + +__kernel void separateAabbs(__global b3AabbCL* unseparatedAabbs, __global int* aabbIndices, __global b3AabbCL* out_aabbs, int numAabbsToSeparate) +{ + int separatedAabbIndex = get_global_id(0); + if(separatedAabbIndex >= numAabbsToSeparate) return; + + int unseparatedAabbIndex = aabbIndices[separatedAabbIndex]; + out_aabbs[separatedAabbIndex] = unseparatedAabbs[unseparatedAabbIndex]; +} + +//Should replace with an optimized parallel reduction +__kernel void findAllNodesMergedAabb(__global b3AabbCL* out_mergedAabb, int numAabbsNeedingMerge) +{ + //Each time this kernel is added to the command queue, + //the number of AABBs needing to be merged is halved + // + //Example with 159 AABBs: + // numRemainingAabbs == 159 / 2 + 159 % 2 == 80 + // numMergedAabbs == 159 - 80 == 79 + //So, indices [0, 78] are merged with [0 + 80, 78 + 80] + + int numRemainingAabbs = numAabbsNeedingMerge / 2 + numAabbsNeedingMerge % 2; + int numMergedAabbs = numAabbsNeedingMerge - numRemainingAabbs; + + int aabbIndex = get_global_id(0); + if(aabbIndex >= numMergedAabbs) return; + + int otherAabbIndex = aabbIndex + numRemainingAabbs; + + b3AabbCL aabb = out_mergedAabb[aabbIndex]; + b3AabbCL otherAabb = out_mergedAabb[otherAabbIndex]; + + b3AabbCL mergedAabb; + mergedAabb.m_min = b3Min(aabb.m_min, otherAabb.m_min); + mergedAabb.m_max = b3Max(aabb.m_max, otherAabb.m_max); + out_mergedAabb[aabbIndex] = mergedAabb; +} + +__kernel void assignMortonCodesAndAabbIndicies(__global b3AabbCL* worldSpaceAabbs, __global b3AabbCL* mergedAabbOfAllNodes, + __global SortDataCL* out_mortonCodesAndAabbIndices, int numAabbs) +{ + int leafNodeIndex = get_global_id(0); //Leaf node index == AABB index + if(leafNodeIndex >= numAabbs) return; + + b3AabbCL mergedAabb = mergedAabbOfAllNodes[0]; + b3Vector3 gridCenter = (mergedAabb.m_min + mergedAabb.m_max) * 0.5f; + b3Vector3 gridCellSize = (mergedAabb.m_max - mergedAabb.m_min) / (float)1024; + + b3AabbCL aabb = worldSpaceAabbs[leafNodeIndex]; + b3Vector3 aabbCenter = (aabb.m_min + aabb.m_max) * 0.5f; + b3Vector3 aabbCenterRelativeToGrid = aabbCenter - gridCenter; + + //Quantize into integer coordinates + //floor() is needed to prevent the center cell, at (0,0,0) from being twice the size + b3Vector3 gridPosition = aabbCenterRelativeToGrid / gridCellSize; + + int4 discretePosition; + discretePosition.x = (int)( (gridPosition.x >= 0.0f) ? gridPosition.x : floor(gridPosition.x) ); + discretePosition.y = (int)( (gridPosition.y >= 0.0f) ? gridPosition.y : floor(gridPosition.y) ); + discretePosition.z = (int)( (gridPosition.z >= 0.0f) ? gridPosition.z : floor(gridPosition.z) ); + + //Clamp coordinates into [-512, 511], then convert range from [-512, 511] to [0, 1023] + discretePosition = b3Max( -512, b3Min(discretePosition, 511) ); + discretePosition += 512; + + //Interleave bits(assign a morton code, also known as a z-curve) + unsigned int mortonCode = getMortonCode(discretePosition.x, discretePosition.y, discretePosition.z); + + // + SortDataCL mortonCodeIndexPair; + mortonCodeIndexPair.m_key = mortonCode; + mortonCodeIndexPair.m_value = leafNodeIndex; + + out_mortonCodesAndAabbIndices[leafNodeIndex] = mortonCodeIndexPair; +} + +#define B3_PLVBH_TRAVERSE_MAX_STACK_SIZE 128 + +//The most significant bit(0x80000000) of a int32 is used to distinguish between leaf and internal nodes. +//If it is set, then the index is for an internal node; otherwise, it is a leaf node. +//In both cases, the bit should be cleared to access the actual node index. +int isLeafNode(int index) { return (index >> 31 == 0); } +int getIndexWithInternalNodeMarkerRemoved(int index) { return index & (~0x80000000); } +int getIndexWithInternalNodeMarkerSet(int isLeaf, int index) { return (isLeaf) ? index : (index | 0x80000000); } + +//From sap.cl +#define NEW_PAIR_MARKER -1 + +bool TestAabbAgainstAabb2(const b3AabbCL* aabb1, const b3AabbCL* aabb2) +{ + bool overlap = true; + overlap = (aabb1->m_min.x > aabb2->m_max.x || aabb1->m_max.x < aabb2->m_min.x) ? false : overlap; + overlap = (aabb1->m_min.z > aabb2->m_max.z || aabb1->m_max.z < aabb2->m_min.z) ? false : overlap; + overlap = (aabb1->m_min.y > aabb2->m_max.y || aabb1->m_max.y < aabb2->m_min.y) ? false : overlap; + return overlap; +} +//From sap.cl + +__kernel void plbvhCalculateOverlappingPairs(__global b3AabbCL* rigidAabbs, + + __global int* rootNodeIndex, + __global int2* internalNodeChildIndices, + __global b3AabbCL* internalNodeAabbs, + __global int2* internalNodeLeafIndexRanges, + + __global SortDataCL* mortonCodesAndAabbIndices, + __global int* out_numPairs, __global int4* out_overlappingPairs, + int maxPairs, int numQueryAabbs) +{ + //Using get_group_id()/get_local_id() is Faster than get_global_id(0) since + //mortonCodesAndAabbIndices[] contains rigid body indices sorted along the z-curve (more spatially coherent) + int queryBvhNodeIndex = get_group_id(0) * get_local_size(0) + get_local_id(0); + if(queryBvhNodeIndex >= numQueryAabbs) return; + + int queryRigidIndex = mortonCodesAndAabbIndices[queryBvhNodeIndex].m_value; + b3AabbCL queryAabb = rigidAabbs[queryRigidIndex]; + + int stack[B3_PLVBH_TRAVERSE_MAX_STACK_SIZE]; + + int stackSize = 1; + stack[0] = *rootNodeIndex; + + while(stackSize) + { + int internalOrLeafNodeIndex = stack[ stackSize - 1 ]; + --stackSize; + + int isLeaf = isLeafNode(internalOrLeafNodeIndex); //Internal node if false + int bvhNodeIndex = getIndexWithInternalNodeMarkerRemoved(internalOrLeafNodeIndex); + + //Optimization - if the BVH is structured as a binary radix tree, then + //each internal node corresponds to a contiguous range of leaf nodes(internalNodeLeafIndexRanges[]). + //This can be used to avoid testing each AABB-AABB pair twice, including preventing each node from colliding with itself. + { + int highestLeafIndex = (isLeaf) ? bvhNodeIndex : internalNodeLeafIndexRanges[bvhNodeIndex].y; + if(highestLeafIndex <= queryBvhNodeIndex) continue; + } + + //bvhRigidIndex is not used if internal node + int bvhRigidIndex = (isLeaf) ? mortonCodesAndAabbIndices[bvhNodeIndex].m_value : -1; + + b3AabbCL bvhNodeAabb = (isLeaf) ? rigidAabbs[bvhRigidIndex] : internalNodeAabbs[bvhNodeIndex]; + if( TestAabbAgainstAabb2(&queryAabb, &bvhNodeAabb) ) + { + if(isLeaf) + { + int4 pair; + pair.x = rigidAabbs[queryRigidIndex].m_minIndices[3]; + pair.y = rigidAabbs[bvhRigidIndex].m_minIndices[3]; + pair.z = NEW_PAIR_MARKER; + pair.w = NEW_PAIR_MARKER; + + int pairIndex = atomic_inc(out_numPairs); + if(pairIndex < maxPairs) out_overlappingPairs[pairIndex] = pair; + } + + if(!isLeaf) //Internal node + { + if(stackSize + 2 > B3_PLVBH_TRAVERSE_MAX_STACK_SIZE) + { + //Error + } + else + { + stack[ stackSize++ ] = internalNodeChildIndices[bvhNodeIndex].x; + stack[ stackSize++ ] = internalNodeChildIndices[bvhNodeIndex].y; + } + } + } + + } +} + + +//From rayCastKernels.cl +typedef struct +{ + float4 m_from; + float4 m_to; +} b3RayInfo; +//From rayCastKernels.cl + +b3Vector3 b3Vector3_normalize(b3Vector3 v) +{ + b3Vector3 normal = (b3Vector3){v.x, v.y, v.z, 0.f}; + return normalize(normal); //OpenCL normalize == vector4 normalize +} +b3Scalar b3Vector3_length2(b3Vector3 v) { return v.x*v.x + v.y*v.y + v.z*v.z; } +b3Scalar b3Vector3_dot(b3Vector3 a, b3Vector3 b) { return a.x*b.x + a.y*b.y + a.z*b.z; } + +int rayIntersectsAabb(b3Vector3 rayOrigin, b3Scalar rayLength, b3Vector3 rayNormalizedDirection, b3AabbCL aabb) +{ + //AABB is considered as 3 pairs of 2 planes( {x_min, x_max}, {y_min, y_max}, {z_min, z_max} ). + //t_min is the point of intersection with the closer plane, t_max is the point of intersection with the farther plane. + // + //if (rayNormalizedDirection.x < 0.0f), then max.x will be the near plane + //and min.x will be the far plane; otherwise, it is reversed. + // + //In order for there to be a collision, the t_min and t_max of each pair must overlap. + //This can be tested for by selecting the highest t_min and lowest t_max and comparing them. + + int4 isNegative = isless( rayNormalizedDirection, (b3Vector3){0.0f, 0.0f, 0.0f, 0.0f} ); //isless(x,y) returns (x < y) + + //When using vector types, the select() function checks the most signficant bit, + //but isless() sets the least significant bit. + isNegative <<= 31; + + //select(b, a, condition) == condition ? a : b + //When using select() with vector types, (condition[i]) is true if its most significant bit is 1 + b3Vector3 t_min = ( select(aabb.m_min, aabb.m_max, isNegative) - rayOrigin ) / rayNormalizedDirection; + b3Vector3 t_max = ( select(aabb.m_max, aabb.m_min, isNegative) - rayOrigin ) / rayNormalizedDirection; + + b3Scalar t_min_final = 0.0f; + b3Scalar t_max_final = rayLength; + + //Must use fmin()/fmax(); if one of the parameters is NaN, then the parameter that is not NaN is returned. + //Behavior of min()/max() with NaNs is undefined. (See OpenCL Specification 1.2 [6.12.2] and [6.12.4]) + //Since the innermost fmin()/fmax() is always not NaN, this should never return NaN. + t_min_final = fmax( t_min.z, fmax(t_min.y, fmax(t_min.x, t_min_final)) ); + t_max_final = fmin( t_max.z, fmin(t_max.y, fmin(t_max.x, t_max_final)) ); + + return (t_min_final <= t_max_final); +} + +__kernel void plbvhRayTraverse(__global b3AabbCL* rigidAabbs, + + __global int* rootNodeIndex, + __global int2* internalNodeChildIndices, + __global b3AabbCL* internalNodeAabbs, + __global int2* internalNodeLeafIndexRanges, + __global SortDataCL* mortonCodesAndAabbIndices, + + __global b3RayInfo* rays, + + __global int* out_numRayRigidPairs, + __global int2* out_rayRigidPairs, + int maxRayRigidPairs, int numRays) +{ + int rayIndex = get_global_id(0); + if(rayIndex >= numRays) return; + + // + b3Vector3 rayFrom = rays[rayIndex].m_from; + b3Vector3 rayTo = rays[rayIndex].m_to; + b3Vector3 rayNormalizedDirection = b3Vector3_normalize(rayTo - rayFrom); + b3Scalar rayLength = b3Sqrt( b3Vector3_length2(rayTo - rayFrom) ); + + // + int stack[B3_PLVBH_TRAVERSE_MAX_STACK_SIZE]; + + int stackSize = 1; + stack[0] = *rootNodeIndex; + + while(stackSize) + { + int internalOrLeafNodeIndex = stack[ stackSize - 1 ]; + --stackSize; + + int isLeaf = isLeafNode(internalOrLeafNodeIndex); //Internal node if false + int bvhNodeIndex = getIndexWithInternalNodeMarkerRemoved(internalOrLeafNodeIndex); + + //bvhRigidIndex is not used if internal node + int bvhRigidIndex = (isLeaf) ? mortonCodesAndAabbIndices[bvhNodeIndex].m_value : -1; + + b3AabbCL bvhNodeAabb = (isLeaf) ? rigidAabbs[bvhRigidIndex] : internalNodeAabbs[bvhNodeIndex]; + if( rayIntersectsAabb(rayFrom, rayLength, rayNormalizedDirection, bvhNodeAabb) ) + { + if(isLeaf) + { + int2 rayRigidPair; + rayRigidPair.x = rayIndex; + rayRigidPair.y = rigidAabbs[bvhRigidIndex].m_minIndices[3]; + + int pairIndex = atomic_inc(out_numRayRigidPairs); + if(pairIndex < maxRayRigidPairs) out_rayRigidPairs[pairIndex] = rayRigidPair; + } + + if(!isLeaf) //Internal node + { + if(stackSize + 2 > B3_PLVBH_TRAVERSE_MAX_STACK_SIZE) + { + //Error + } + else + { + stack[ stackSize++ ] = internalNodeChildIndices[bvhNodeIndex].x; + stack[ stackSize++ ] = internalNodeChildIndices[bvhNodeIndex].y; + } + } + } + } +} + +__kernel void plbvhLargeAabbAabbTest(__global b3AabbCL* smallAabbs, __global b3AabbCL* largeAabbs, + __global int* out_numPairs, __global int4* out_overlappingPairs, + int maxPairs, int numLargeAabbRigids, int numSmallAabbRigids) +{ + int smallAabbIndex = get_global_id(0); + if(smallAabbIndex >= numSmallAabbRigids) return; + + b3AabbCL smallAabb = smallAabbs[smallAabbIndex]; + for(int i = 0; i < numLargeAabbRigids; ++i) + { + b3AabbCL largeAabb = largeAabbs[i]; + if( TestAabbAgainstAabb2(&smallAabb, &largeAabb) ) + { + int4 pair; + pair.x = largeAabb.m_minIndices[3]; + pair.y = smallAabb.m_minIndices[3]; + pair.z = NEW_PAIR_MARKER; + pair.w = NEW_PAIR_MARKER; + + int pairIndex = atomic_inc(out_numPairs); + if(pairIndex < maxPairs) out_overlappingPairs[pairIndex] = pair; + } + } +} +__kernel void plbvhLargeAabbRayTest(__global b3AabbCL* largeRigidAabbs, __global b3RayInfo* rays, + __global int* out_numRayRigidPairs, __global int2* out_rayRigidPairs, + int numLargeAabbRigids, int maxRayRigidPairs, int numRays) +{ + int rayIndex = get_global_id(0); + if(rayIndex >= numRays) return; + + b3Vector3 rayFrom = rays[rayIndex].m_from; + b3Vector3 rayTo = rays[rayIndex].m_to; + b3Vector3 rayNormalizedDirection = b3Vector3_normalize(rayTo - rayFrom); + b3Scalar rayLength = b3Sqrt( b3Vector3_length2(rayTo - rayFrom) ); + + for(int i = 0; i < numLargeAabbRigids; ++i) + { + b3AabbCL rigidAabb = largeRigidAabbs[i]; + if( rayIntersectsAabb(rayFrom, rayLength, rayNormalizedDirection, rigidAabb) ) + { + int2 rayRigidPair; + rayRigidPair.x = rayIndex; + rayRigidPair.y = rigidAabb.m_minIndices[3]; + + int pairIndex = atomic_inc(out_numRayRigidPairs); + if(pairIndex < maxRayRigidPairs) out_rayRigidPairs[pairIndex] = rayRigidPair; + } + } +} + + +//Set so that it is always greater than the actual common prefixes, and never selected as a parent node. +//If there are no duplicates, then the highest common prefix is 32 or 64, depending on the number of bits used for the z-curve. +//Duplicate common prefixes increase the highest common prefix at most by the number of bits used to index the leaf node. +//Since 32 bit ints are used to index leaf nodes, the max prefix is 64(32 + 32 bit z-curve) or 96(32 + 64 bit z-curve). +#define B3_PLBVH_INVALID_COMMON_PREFIX 128 + +#define B3_PLBVH_ROOT_NODE_MARKER -1 + +#define b3Int64 long + +int computeCommonPrefixLength(b3Int64 i, b3Int64 j) { return (int)clz(i ^ j); } +b3Int64 computeCommonPrefix(b3Int64 i, b3Int64 j) +{ + //This function only needs to return (i & j) in order for the algorithm to work, + //but it may help with debugging to mask out the lower bits. + + b3Int64 commonPrefixLength = (b3Int64)computeCommonPrefixLength(i, j); + + b3Int64 sharedBits = i & j; + b3Int64 bitmask = ((b3Int64)(~0)) << (64 - commonPrefixLength); //Set all bits after the common prefix to 0 + + return sharedBits & bitmask; +} + +//Same as computeCommonPrefixLength(), but allows for prefixes with different lengths +int getSharedPrefixLength(b3Int64 prefixA, int prefixLengthA, b3Int64 prefixB, int prefixLengthB) +{ + return b3Min( computeCommonPrefixLength(prefixA, prefixB), b3Min(prefixLengthA, prefixLengthB) ); +} + +__kernel void computeAdjacentPairCommonPrefix(__global SortDataCL* mortonCodesAndAabbIndices, + __global b3Int64* out_commonPrefixes, + __global int* out_commonPrefixLengths, + int numInternalNodes) +{ + int internalNodeIndex = get_global_id(0); + if (internalNodeIndex >= numInternalNodes) return; + + //Here, (internalNodeIndex + 1) is never out of bounds since it is a leaf node index, + //and the number of internal nodes is always numLeafNodes - 1 + int leftLeafIndex = internalNodeIndex; + int rightLeafIndex = internalNodeIndex + 1; + + int leftLeafMortonCode = mortonCodesAndAabbIndices[leftLeafIndex].m_key; + int rightLeafMortonCode = mortonCodesAndAabbIndices[rightLeafIndex].m_key; + + //Binary radix tree construction algorithm does not work if there are duplicate morton codes. + //Append the index of each leaf node to each morton code so that there are no duplicates. + //The algorithm also requires that the morton codes are sorted in ascending order; this requirement + //is also satisfied with this method, as (leftLeafIndex < rightLeafIndex) is always true. + // + //upsample(a, b) == ( ((b3Int64)a) << 32) | b + b3Int64 nonduplicateLeftMortonCode = upsample(leftLeafMortonCode, leftLeafIndex); + b3Int64 nonduplicateRightMortonCode = upsample(rightLeafMortonCode, rightLeafIndex); + + out_commonPrefixes[internalNodeIndex] = computeCommonPrefix(nonduplicateLeftMortonCode, nonduplicateRightMortonCode); + out_commonPrefixLengths[internalNodeIndex] = computeCommonPrefixLength(nonduplicateLeftMortonCode, nonduplicateRightMortonCode); +} + + +__kernel void buildBinaryRadixTreeLeafNodes(__global int* commonPrefixLengths, __global int* out_leafNodeParentNodes, + __global int2* out_childNodes, int numLeafNodes) +{ + int leafNodeIndex = get_global_id(0); + if (leafNodeIndex >= numLeafNodes) return; + + int numInternalNodes = numLeafNodes - 1; + + int leftSplitIndex = leafNodeIndex - 1; + int rightSplitIndex = leafNodeIndex; + + int leftCommonPrefix = (leftSplitIndex >= 0) ? commonPrefixLengths[leftSplitIndex] : B3_PLBVH_INVALID_COMMON_PREFIX; + int rightCommonPrefix = (rightSplitIndex < numInternalNodes) ? commonPrefixLengths[rightSplitIndex] : B3_PLBVH_INVALID_COMMON_PREFIX; + + //Parent node is the highest adjacent common prefix that is lower than the node's common prefix + //Leaf nodes are considered as having the highest common prefix + int isLeftHigherCommonPrefix = (leftCommonPrefix > rightCommonPrefix); + + //Handle cases for the edge nodes; the first and last node + //For leaf nodes, leftCommonPrefix and rightCommonPrefix should never both be B3_PLBVH_INVALID_COMMON_PREFIX + if(leftCommonPrefix == B3_PLBVH_INVALID_COMMON_PREFIX) isLeftHigherCommonPrefix = false; + if(rightCommonPrefix == B3_PLBVH_INVALID_COMMON_PREFIX) isLeftHigherCommonPrefix = true; + + int parentNodeIndex = (isLeftHigherCommonPrefix) ? leftSplitIndex : rightSplitIndex; + out_leafNodeParentNodes[leafNodeIndex] = parentNodeIndex; + + int isRightChild = (isLeftHigherCommonPrefix); //If the left node is the parent, then this node is its right child and vice versa + + //out_childNodesAsInt[0] == int2.x == left child + //out_childNodesAsInt[1] == int2.y == right child + int isLeaf = 1; + __global int* out_childNodesAsInt = (__global int*)(&out_childNodes[parentNodeIndex]); + out_childNodesAsInt[isRightChild] = getIndexWithInternalNodeMarkerSet(isLeaf, leafNodeIndex); +} + +__kernel void buildBinaryRadixTreeInternalNodes(__global b3Int64* commonPrefixes, __global int* commonPrefixLengths, + __global int2* out_childNodes, + __global int* out_internalNodeParentNodes, __global int* out_rootNodeIndex, + int numInternalNodes) +{ + int internalNodeIndex = get_group_id(0) * get_local_size(0) + get_local_id(0); + if(internalNodeIndex >= numInternalNodes) return; + + b3Int64 nodePrefix = commonPrefixes[internalNodeIndex]; + int nodePrefixLength = commonPrefixLengths[internalNodeIndex]; + +//#define USE_LINEAR_SEARCH +#ifdef USE_LINEAR_SEARCH + int leftIndex = -1; + int rightIndex = -1; + + //Find nearest element to left with a lower common prefix + for(int i = internalNodeIndex - 1; i >= 0; --i) + { + int nodeLeftSharedPrefixLength = getSharedPrefixLength(nodePrefix, nodePrefixLength, commonPrefixes[i], commonPrefixLengths[i]); + if(nodeLeftSharedPrefixLength < nodePrefixLength) + { + leftIndex = i; + break; + } + } + + //Find nearest element to right with a lower common prefix + for(int i = internalNodeIndex + 1; i < numInternalNodes; ++i) + { + int nodeRightSharedPrefixLength = getSharedPrefixLength(nodePrefix, nodePrefixLength, commonPrefixes[i], commonPrefixLengths[i]); + if(nodeRightSharedPrefixLength < nodePrefixLength) + { + rightIndex = i; + break; + } + } + +#else //Use binary search + + //Find nearest element to left with a lower common prefix + int leftIndex = -1; + { + int lower = 0; + int upper = internalNodeIndex - 1; + + while(lower <= upper) + { + int mid = (lower + upper) / 2; + b3Int64 midPrefix = commonPrefixes[mid]; + int midPrefixLength = commonPrefixLengths[mid]; + + int nodeMidSharedPrefixLength = getSharedPrefixLength(nodePrefix, nodePrefixLength, midPrefix, midPrefixLength); + if(nodeMidSharedPrefixLength < nodePrefixLength) + { + int right = mid + 1; + if(right < internalNodeIndex) + { + b3Int64 rightPrefix = commonPrefixes[right]; + int rightPrefixLength = commonPrefixLengths[right]; + + int nodeRightSharedPrefixLength = getSharedPrefixLength(nodePrefix, nodePrefixLength, rightPrefix, rightPrefixLength); + if(nodeRightSharedPrefixLength < nodePrefixLength) + { + lower = right; + leftIndex = right; + } + else + { + leftIndex = mid; + break; + } + } + else + { + leftIndex = mid; + break; + } + } + else upper = mid - 1; + } + } + + //Find nearest element to right with a lower common prefix + int rightIndex = -1; + { + int lower = internalNodeIndex + 1; + int upper = numInternalNodes - 1; + + while(lower <= upper) + { + int mid = (lower + upper) / 2; + b3Int64 midPrefix = commonPrefixes[mid]; + int midPrefixLength = commonPrefixLengths[mid]; + + int nodeMidSharedPrefixLength = getSharedPrefixLength(nodePrefix, nodePrefixLength, midPrefix, midPrefixLength); + if(nodeMidSharedPrefixLength < nodePrefixLength) + { + int left = mid - 1; + if(left > internalNodeIndex) + { + b3Int64 leftPrefix = commonPrefixes[left]; + int leftPrefixLength = commonPrefixLengths[left]; + + int nodeLeftSharedPrefixLength = getSharedPrefixLength(nodePrefix, nodePrefixLength, leftPrefix, leftPrefixLength); + if(nodeLeftSharedPrefixLength < nodePrefixLength) + { + upper = left; + rightIndex = left; + } + else + { + rightIndex = mid; + break; + } + } + else + { + rightIndex = mid; + break; + } + } + else lower = mid + 1; + } + } +#endif + + //Select parent + { + int leftPrefixLength = (leftIndex != -1) ? commonPrefixLengths[leftIndex] : B3_PLBVH_INVALID_COMMON_PREFIX; + int rightPrefixLength = (rightIndex != -1) ? commonPrefixLengths[rightIndex] : B3_PLBVH_INVALID_COMMON_PREFIX; + + int isLeftHigherPrefixLength = (leftPrefixLength > rightPrefixLength); + + if(leftPrefixLength == B3_PLBVH_INVALID_COMMON_PREFIX) isLeftHigherPrefixLength = false; + else if(rightPrefixLength == B3_PLBVH_INVALID_COMMON_PREFIX) isLeftHigherPrefixLength = true; + + int parentNodeIndex = (isLeftHigherPrefixLength) ? leftIndex : rightIndex; + + int isRootNode = (leftIndex == -1 && rightIndex == -1); + out_internalNodeParentNodes[internalNodeIndex] = (!isRootNode) ? parentNodeIndex : B3_PLBVH_ROOT_NODE_MARKER; + + int isLeaf = 0; + if(!isRootNode) + { + int isRightChild = (isLeftHigherPrefixLength); //If the left node is the parent, then this node is its right child and vice versa + + //out_childNodesAsInt[0] == int2.x == left child + //out_childNodesAsInt[1] == int2.y == right child + __global int* out_childNodesAsInt = (__global int*)(&out_childNodes[parentNodeIndex]); + out_childNodesAsInt[isRightChild] = getIndexWithInternalNodeMarkerSet(isLeaf, internalNodeIndex); + } + else *out_rootNodeIndex = getIndexWithInternalNodeMarkerSet(isLeaf, internalNodeIndex); + } +} + +__kernel void findDistanceFromRoot(__global int* rootNodeIndex, __global int* internalNodeParentNodes, + __global int* out_maxDistanceFromRoot, __global int* out_distanceFromRoot, int numInternalNodes) +{ + if( get_global_id(0) == 0 ) atomic_xchg(out_maxDistanceFromRoot, 0); + + int internalNodeIndex = get_global_id(0); + if(internalNodeIndex >= numInternalNodes) return; + + // + int distanceFromRoot = 0; + { + int parentIndex = internalNodeParentNodes[internalNodeIndex]; + while(parentIndex != B3_PLBVH_ROOT_NODE_MARKER) + { + parentIndex = internalNodeParentNodes[parentIndex]; + ++distanceFromRoot; + } + } + out_distanceFromRoot[internalNodeIndex] = distanceFromRoot; + + // + __local int localMaxDistanceFromRoot; + if( get_local_id(0) == 0 ) localMaxDistanceFromRoot = 0; + barrier(CLK_LOCAL_MEM_FENCE); + + atomic_max(&localMaxDistanceFromRoot, distanceFromRoot); + barrier(CLK_LOCAL_MEM_FENCE); + + if( get_local_id(0) == 0 ) atomic_max(out_maxDistanceFromRoot, localMaxDistanceFromRoot); +} + +__kernel void buildBinaryRadixTreeAabbsRecursive(__global int* distanceFromRoot, __global SortDataCL* mortonCodesAndAabbIndices, + __global int2* childNodes, + __global b3AabbCL* leafNodeAabbs, __global b3AabbCL* internalNodeAabbs, + int maxDistanceFromRoot, int processedDistance, int numInternalNodes) +{ + int internalNodeIndex = get_global_id(0); + if(internalNodeIndex >= numInternalNodes) return; + + int distance = distanceFromRoot[internalNodeIndex]; + + if(distance == processedDistance) + { + int leftChildIndex = childNodes[internalNodeIndex].x; + int rightChildIndex = childNodes[internalNodeIndex].y; + + int isLeftChildLeaf = isLeafNode(leftChildIndex); + int isRightChildLeaf = isLeafNode(rightChildIndex); + + leftChildIndex = getIndexWithInternalNodeMarkerRemoved(leftChildIndex); + rightChildIndex = getIndexWithInternalNodeMarkerRemoved(rightChildIndex); + + //leftRigidIndex/rightRigidIndex is not used if internal node + int leftRigidIndex = (isLeftChildLeaf) ? mortonCodesAndAabbIndices[leftChildIndex].m_value : -1; + int rightRigidIndex = (isRightChildLeaf) ? mortonCodesAndAabbIndices[rightChildIndex].m_value : -1; + + b3AabbCL leftChildAabb = (isLeftChildLeaf) ? leafNodeAabbs[leftRigidIndex] : internalNodeAabbs[leftChildIndex]; + b3AabbCL rightChildAabb = (isRightChildLeaf) ? leafNodeAabbs[rightRigidIndex] : internalNodeAabbs[rightChildIndex]; + + b3AabbCL mergedAabb; + mergedAabb.m_min = b3Min(leftChildAabb.m_min, rightChildAabb.m_min); + mergedAabb.m_max = b3Max(leftChildAabb.m_max, rightChildAabb.m_max); + internalNodeAabbs[internalNodeIndex] = mergedAabb; + } +} + +__kernel void findLeafIndexRanges(__global int2* internalNodeChildNodes, __global int2* out_leafIndexRanges, int numInternalNodes) +{ + int internalNodeIndex = get_global_id(0); + if(internalNodeIndex >= numInternalNodes) return; + + int numLeafNodes = numInternalNodes + 1; + + int2 childNodes = internalNodeChildNodes[internalNodeIndex]; + + int2 leafIndexRange; //x == min leaf index, y == max leaf index + + //Find lowest leaf index covered by this internal node + { + int lowestIndex = childNodes.x; //childNodes.x == Left child + while( !isLeafNode(lowestIndex) ) lowestIndex = internalNodeChildNodes[ getIndexWithInternalNodeMarkerRemoved(lowestIndex) ].x; + leafIndexRange.x = lowestIndex; + } + + //Find highest leaf index covered by this internal node + { + int highestIndex = childNodes.y; //childNodes.y == Right child + while( !isLeafNode(highestIndex) ) highestIndex = internalNodeChildNodes[ getIndexWithInternalNodeMarkerRemoved(highestIndex) ].y; + leafIndexRange.y = highestIndex; + } + + // + out_leafIndexRanges[internalNodeIndex] = leafIndexRange; +} diff --git a/src/Bullet3OpenCL/BroadphaseCollision/kernels/parallelLinearBvhKernels.h b/src/Bullet3OpenCL/BroadphaseCollision/kernels/parallelLinearBvhKernels.h new file mode 100644 index 000000000..1b72803d3 --- /dev/null +++ b/src/Bullet3OpenCL/BroadphaseCollision/kernels/parallelLinearBvhKernels.h @@ -0,0 +1,729 @@ +//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project +static const char* parallelLinearBvhCL= \ +"/*\n" +"This software is provided 'as-is', without any express or implied warranty.\n" +"In no event will the authors be held liable for any damages arising from the use of this software.\n" +"Permission is granted to anyone to use this software for any purpose,\n" +"including commercial applications, and to alter it and redistribute it freely,\n" +"subject to the following restrictions:\n" +"1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.\n" +"2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.\n" +"3. This notice may not be removed or altered from any source distribution.\n" +"*/\n" +"//Initial Author Jackson Lee, 2014\n" +"typedef float b3Scalar;\n" +"typedef float4 b3Vector3;\n" +"#define b3Max max\n" +"#define b3Min min\n" +"#define b3Sqrt sqrt\n" +"typedef struct\n" +"{\n" +" unsigned int m_key;\n" +" unsigned int m_value;\n" +"} SortDataCL;\n" +"typedef struct \n" +"{\n" +" union\n" +" {\n" +" float4 m_min;\n" +" float m_minElems[4];\n" +" int m_minIndices[4];\n" +" };\n" +" union\n" +" {\n" +" float4 m_max;\n" +" float m_maxElems[4];\n" +" int m_maxIndices[4];\n" +" };\n" +"} b3AabbCL;\n" +"unsigned int interleaveBits(unsigned int x)\n" +"{\n" +" //........ ........ ......12 3456789A //x\n" +" //....1..2 ..3..4.. 5..6..7. .8..9..A //x after interleaving bits\n" +" \n" +" //......12 3456789A ......12 3456789A //x ^ (x << 16)\n" +" //11111111 ........ ........ 11111111 //0x FF 00 00 FF\n" +" //......12 ........ ........ 3456789A //x = (x ^ (x << 16)) & 0xFF0000FF;\n" +" \n" +" //......12 ........ 3456789A 3456789A //x ^ (x << 8)\n" +" //......11 ........ 1111.... ....1111 //0x 03 00 F0 0F\n" +" //......12 ........ 3456.... ....789A //x = (x ^ (x << 8)) & 0x0300F00F;\n" +" \n" +" //..12..12 ....3456 3456.... 789A789A //x ^ (x << 4)\n" +" //......11 ....11.. ..11.... 11....11 //0x 03 0C 30 C3\n" +" //......12 ....34.. ..56.... 78....9A //x = (x ^ (x << 4)) & 0x030C30C3;\n" +" \n" +" //....1212 ..3434.. 5656..78 78..9A9A //x ^ (x << 2)\n" +" //....1..1 ..1..1.. 1..1..1. .1..1..1 //0x 09 24 92 49\n" +" //....1..2 ..3..4.. 5..6..7. .8..9..A //x = (x ^ (x << 2)) & 0x09249249;\n" +" \n" +" //........ ........ ......11 11111111 //0x000003FF\n" +" x &= 0x000003FF; //Clear all bits above bit 10\n" +" \n" +" x = (x ^ (x << 16)) & 0xFF0000FF;\n" +" x = (x ^ (x << 8)) & 0x0300F00F;\n" +" x = (x ^ (x << 4)) & 0x030C30C3;\n" +" x = (x ^ (x << 2)) & 0x09249249;\n" +" \n" +" return x;\n" +"}\n" +"unsigned int getMortonCode(unsigned int x, unsigned int y, unsigned int z)\n" +"{\n" +" return interleaveBits(x) << 0 | interleaveBits(y) << 1 | interleaveBits(z) << 2;\n" +"}\n" +"__kernel void separateAabbs(__global b3AabbCL* unseparatedAabbs, __global int* aabbIndices, __global b3AabbCL* out_aabbs, int numAabbsToSeparate)\n" +"{\n" +" int separatedAabbIndex = get_global_id(0);\n" +" if(separatedAabbIndex >= numAabbsToSeparate) return;\n" +" int unseparatedAabbIndex = aabbIndices[separatedAabbIndex];\n" +" out_aabbs[separatedAabbIndex] = unseparatedAabbs[unseparatedAabbIndex];\n" +"}\n" +"//Should replace with an optimized parallel reduction\n" +"__kernel void findAllNodesMergedAabb(__global b3AabbCL* out_mergedAabb, int numAabbsNeedingMerge)\n" +"{\n" +" //Each time this kernel is added to the command queue, \n" +" //the number of AABBs needing to be merged is halved\n" +" //\n" +" //Example with 159 AABBs:\n" +" // numRemainingAabbs == 159 / 2 + 159 % 2 == 80\n" +" // numMergedAabbs == 159 - 80 == 79\n" +" //So, indices [0, 78] are merged with [0 + 80, 78 + 80]\n" +" \n" +" int numRemainingAabbs = numAabbsNeedingMerge / 2 + numAabbsNeedingMerge % 2;\n" +" int numMergedAabbs = numAabbsNeedingMerge - numRemainingAabbs;\n" +" \n" +" int aabbIndex = get_global_id(0);\n" +" if(aabbIndex >= numMergedAabbs) return;\n" +" \n" +" int otherAabbIndex = aabbIndex + numRemainingAabbs;\n" +" \n" +" b3AabbCL aabb = out_mergedAabb[aabbIndex];\n" +" b3AabbCL otherAabb = out_mergedAabb[otherAabbIndex];\n" +" \n" +" b3AabbCL mergedAabb;\n" +" mergedAabb.m_min = b3Min(aabb.m_min, otherAabb.m_min);\n" +" mergedAabb.m_max = b3Max(aabb.m_max, otherAabb.m_max);\n" +" out_mergedAabb[aabbIndex] = mergedAabb;\n" +"}\n" +"__kernel void assignMortonCodesAndAabbIndicies(__global b3AabbCL* worldSpaceAabbs, __global b3AabbCL* mergedAabbOfAllNodes, \n" +" __global SortDataCL* out_mortonCodesAndAabbIndices, int numAabbs)\n" +"{\n" +" int leafNodeIndex = get_global_id(0); //Leaf node index == AABB index\n" +" if(leafNodeIndex >= numAabbs) return;\n" +" \n" +" b3AabbCL mergedAabb = mergedAabbOfAllNodes[0];\n" +" b3Vector3 gridCenter = (mergedAabb.m_min + mergedAabb.m_max) * 0.5f;\n" +" b3Vector3 gridCellSize = (mergedAabb.m_max - mergedAabb.m_min) / (float)1024;\n" +" \n" +" b3AabbCL aabb = worldSpaceAabbs[leafNodeIndex];\n" +" b3Vector3 aabbCenter = (aabb.m_min + aabb.m_max) * 0.5f;\n" +" b3Vector3 aabbCenterRelativeToGrid = aabbCenter - gridCenter;\n" +" \n" +" //Quantize into integer coordinates\n" +" //floor() is needed to prevent the center cell, at (0,0,0) from being twice the size\n" +" b3Vector3 gridPosition = aabbCenterRelativeToGrid / gridCellSize;\n" +" \n" +" int4 discretePosition;\n" +" discretePosition.x = (int)( (gridPosition.x >= 0.0f) ? gridPosition.x : floor(gridPosition.x) );\n" +" discretePosition.y = (int)( (gridPosition.y >= 0.0f) ? gridPosition.y : floor(gridPosition.y) );\n" +" discretePosition.z = (int)( (gridPosition.z >= 0.0f) ? gridPosition.z : floor(gridPosition.z) );\n" +" \n" +" //Clamp coordinates into [-512, 511], then convert range from [-512, 511] to [0, 1023]\n" +" discretePosition = b3Max( -512, b3Min(discretePosition, 511) );\n" +" discretePosition += 512;\n" +" \n" +" //Interleave bits(assign a morton code, also known as a z-curve)\n" +" unsigned int mortonCode = getMortonCode(discretePosition.x, discretePosition.y, discretePosition.z);\n" +" \n" +" //\n" +" SortDataCL mortonCodeIndexPair;\n" +" mortonCodeIndexPair.m_key = mortonCode;\n" +" mortonCodeIndexPair.m_value = leafNodeIndex;\n" +" \n" +" out_mortonCodesAndAabbIndices[leafNodeIndex] = mortonCodeIndexPair;\n" +"}\n" +"#define B3_PLVBH_TRAVERSE_MAX_STACK_SIZE 128\n" +"//The most significant bit(0x80000000) of a int32 is used to distinguish between leaf and internal nodes.\n" +"//If it is set, then the index is for an internal node; otherwise, it is a leaf node. \n" +"//In both cases, the bit should be cleared to access the actual node index.\n" +"int isLeafNode(int index) { return (index >> 31 == 0); }\n" +"int getIndexWithInternalNodeMarkerRemoved(int index) { return index & (~0x80000000); }\n" +"int getIndexWithInternalNodeMarkerSet(int isLeaf, int index) { return (isLeaf) ? index : (index | 0x80000000); }\n" +"//From sap.cl\n" +"#define NEW_PAIR_MARKER -1\n" +"bool TestAabbAgainstAabb2(const b3AabbCL* aabb1, const b3AabbCL* aabb2)\n" +"{\n" +" bool overlap = true;\n" +" overlap = (aabb1->m_min.x > aabb2->m_max.x || aabb1->m_max.x < aabb2->m_min.x) ? false : overlap;\n" +" overlap = (aabb1->m_min.z > aabb2->m_max.z || aabb1->m_max.z < aabb2->m_min.z) ? false : overlap;\n" +" overlap = (aabb1->m_min.y > aabb2->m_max.y || aabb1->m_max.y < aabb2->m_min.y) ? false : overlap;\n" +" return overlap;\n" +"}\n" +"//From sap.cl\n" +"__kernel void plbvhCalculateOverlappingPairs(__global b3AabbCL* rigidAabbs, \n" +" __global int* rootNodeIndex, \n" +" __global int2* internalNodeChildIndices, \n" +" __global b3AabbCL* internalNodeAabbs,\n" +" __global int2* internalNodeLeafIndexRanges,\n" +" \n" +" __global SortDataCL* mortonCodesAndAabbIndices,\n" +" __global int* out_numPairs, __global int4* out_overlappingPairs, \n" +" int maxPairs, int numQueryAabbs)\n" +"{\n" +" //Using get_group_id()/get_local_id() is Faster than get_global_id(0) since\n" +" //mortonCodesAndAabbIndices[] contains rigid body indices sorted along the z-curve (more spatially coherent)\n" +" int queryBvhNodeIndex = get_group_id(0) * get_local_size(0) + get_local_id(0);\n" +" if(queryBvhNodeIndex >= numQueryAabbs) return;\n" +" \n" +" int queryRigidIndex = mortonCodesAndAabbIndices[queryBvhNodeIndex].m_value;\n" +" b3AabbCL queryAabb = rigidAabbs[queryRigidIndex];\n" +" \n" +" int stack[B3_PLVBH_TRAVERSE_MAX_STACK_SIZE];\n" +" \n" +" int stackSize = 1;\n" +" stack[0] = *rootNodeIndex;\n" +" \n" +" while(stackSize)\n" +" {\n" +" int internalOrLeafNodeIndex = stack[ stackSize - 1 ];\n" +" --stackSize;\n" +" \n" +" int isLeaf = isLeafNode(internalOrLeafNodeIndex); //Internal node if false\n" +" int bvhNodeIndex = getIndexWithInternalNodeMarkerRemoved(internalOrLeafNodeIndex);\n" +" \n" +" //Optimization - if the BVH is structured as a binary radix tree, then\n" +" //each internal node corresponds to a contiguous range of leaf nodes(internalNodeLeafIndexRanges[]).\n" +" //This can be used to avoid testing each AABB-AABB pair twice, including preventing each node from colliding with itself.\n" +" {\n" +" int highestLeafIndex = (isLeaf) ? bvhNodeIndex : internalNodeLeafIndexRanges[bvhNodeIndex].y;\n" +" if(highestLeafIndex <= queryBvhNodeIndex) continue;\n" +" }\n" +" \n" +" //bvhRigidIndex is not used if internal node\n" +" int bvhRigidIndex = (isLeaf) ? mortonCodesAndAabbIndices[bvhNodeIndex].m_value : -1;\n" +" \n" +" b3AabbCL bvhNodeAabb = (isLeaf) ? rigidAabbs[bvhRigidIndex] : internalNodeAabbs[bvhNodeIndex];\n" +" if( TestAabbAgainstAabb2(&queryAabb, &bvhNodeAabb) )\n" +" {\n" +" if(isLeaf)\n" +" {\n" +" int4 pair;\n" +" pair.x = rigidAabbs[queryRigidIndex].m_minIndices[3];\n" +" pair.y = rigidAabbs[bvhRigidIndex].m_minIndices[3];\n" +" pair.z = NEW_PAIR_MARKER;\n" +" pair.w = NEW_PAIR_MARKER;\n" +" \n" +" int pairIndex = atomic_inc(out_numPairs);\n" +" if(pairIndex < maxPairs) out_overlappingPairs[pairIndex] = pair;\n" +" }\n" +" \n" +" if(!isLeaf) //Internal node\n" +" {\n" +" if(stackSize + 2 > B3_PLVBH_TRAVERSE_MAX_STACK_SIZE)\n" +" {\n" +" //Error\n" +" }\n" +" else\n" +" {\n" +" stack[ stackSize++ ] = internalNodeChildIndices[bvhNodeIndex].x;\n" +" stack[ stackSize++ ] = internalNodeChildIndices[bvhNodeIndex].y;\n" +" }\n" +" }\n" +" }\n" +" \n" +" }\n" +"}\n" +"//From rayCastKernels.cl\n" +"typedef struct\n" +"{\n" +" float4 m_from;\n" +" float4 m_to;\n" +"} b3RayInfo;\n" +"//From rayCastKernels.cl\n" +"b3Vector3 b3Vector3_normalize(b3Vector3 v)\n" +"{\n" +" b3Vector3 normal = (b3Vector3){v.x, v.y, v.z, 0.f};\n" +" return normalize(normal); //OpenCL normalize == vector4 normalize\n" +"}\n" +"b3Scalar b3Vector3_length2(b3Vector3 v) { return v.x*v.x + v.y*v.y + v.z*v.z; }\n" +"b3Scalar b3Vector3_dot(b3Vector3 a, b3Vector3 b) { return a.x*b.x + a.y*b.y + a.z*b.z; }\n" +"int rayIntersectsAabb(b3Vector3 rayOrigin, b3Scalar rayLength, b3Vector3 rayNormalizedDirection, b3AabbCL aabb)\n" +"{\n" +" //AABB is considered as 3 pairs of 2 planes( {x_min, x_max}, {y_min, y_max}, {z_min, z_max} ).\n" +" //t_min is the point of intersection with the closer plane, t_max is the point of intersection with the farther plane.\n" +" //\n" +" //if (rayNormalizedDirection.x < 0.0f), then max.x will be the near plane \n" +" //and min.x will be the far plane; otherwise, it is reversed.\n" +" //\n" +" //In order for there to be a collision, the t_min and t_max of each pair must overlap.\n" +" //This can be tested for by selecting the highest t_min and lowest t_max and comparing them.\n" +" \n" +" int4 isNegative = isless( rayNormalizedDirection, (b3Vector3){0.0f, 0.0f, 0.0f, 0.0f} ); //isless(x,y) returns (x < y)\n" +" \n" +" //When using vector types, the select() function checks the most signficant bit, \n" +" //but isless() sets the least significant bit.\n" +" isNegative <<= 31;\n" +" //select(b, a, condition) == condition ? a : b\n" +" //When using select() with vector types, (condition[i]) is true if its most significant bit is 1\n" +" b3Vector3 t_min = ( select(aabb.m_min, aabb.m_max, isNegative) - rayOrigin ) / rayNormalizedDirection;\n" +" b3Vector3 t_max = ( select(aabb.m_max, aabb.m_min, isNegative) - rayOrigin ) / rayNormalizedDirection;\n" +" \n" +" b3Scalar t_min_final = 0.0f;\n" +" b3Scalar t_max_final = rayLength;\n" +" \n" +" //Must use fmin()/fmax(); if one of the parameters is NaN, then the parameter that is not NaN is returned. \n" +" //Behavior of min()/max() with NaNs is undefined. (See OpenCL Specification 1.2 [6.12.2] and [6.12.4])\n" +" //Since the innermost fmin()/fmax() is always not NaN, this should never return NaN.\n" +" t_min_final = fmax( t_min.z, fmax(t_min.y, fmax(t_min.x, t_min_final)) );\n" +" t_max_final = fmin( t_max.z, fmin(t_max.y, fmin(t_max.x, t_max_final)) );\n" +" \n" +" return (t_min_final <= t_max_final);\n" +"}\n" +"__kernel void plbvhRayTraverse(__global b3AabbCL* rigidAabbs,\n" +" __global int* rootNodeIndex, \n" +" __global int2* internalNodeChildIndices, \n" +" __global b3AabbCL* internalNodeAabbs,\n" +" __global int2* internalNodeLeafIndexRanges,\n" +" __global SortDataCL* mortonCodesAndAabbIndices,\n" +" \n" +" __global b3RayInfo* rays,\n" +" \n" +" __global int* out_numRayRigidPairs, \n" +" __global int2* out_rayRigidPairs,\n" +" int maxRayRigidPairs, int numRays)\n" +"{\n" +" int rayIndex = get_global_id(0);\n" +" if(rayIndex >= numRays) return;\n" +" \n" +" //\n" +" b3Vector3 rayFrom = rays[rayIndex].m_from;\n" +" b3Vector3 rayTo = rays[rayIndex].m_to;\n" +" b3Vector3 rayNormalizedDirection = b3Vector3_normalize(rayTo - rayFrom);\n" +" b3Scalar rayLength = b3Sqrt( b3Vector3_length2(rayTo - rayFrom) );\n" +" \n" +" //\n" +" int stack[B3_PLVBH_TRAVERSE_MAX_STACK_SIZE];\n" +" \n" +" int stackSize = 1;\n" +" stack[0] = *rootNodeIndex;\n" +" \n" +" while(stackSize)\n" +" {\n" +" int internalOrLeafNodeIndex = stack[ stackSize - 1 ];\n" +" --stackSize;\n" +" \n" +" int isLeaf = isLeafNode(internalOrLeafNodeIndex); //Internal node if false\n" +" int bvhNodeIndex = getIndexWithInternalNodeMarkerRemoved(internalOrLeafNodeIndex);\n" +" \n" +" //bvhRigidIndex is not used if internal node\n" +" int bvhRigidIndex = (isLeaf) ? mortonCodesAndAabbIndices[bvhNodeIndex].m_value : -1;\n" +" \n" +" b3AabbCL bvhNodeAabb = (isLeaf) ? rigidAabbs[bvhRigidIndex] : internalNodeAabbs[bvhNodeIndex];\n" +" if( rayIntersectsAabb(rayFrom, rayLength, rayNormalizedDirection, bvhNodeAabb) )\n" +" {\n" +" if(isLeaf)\n" +" {\n" +" int2 rayRigidPair;\n" +" rayRigidPair.x = rayIndex;\n" +" rayRigidPair.y = rigidAabbs[bvhRigidIndex].m_minIndices[3];\n" +" \n" +" int pairIndex = atomic_inc(out_numRayRigidPairs);\n" +" if(pairIndex < maxRayRigidPairs) out_rayRigidPairs[pairIndex] = rayRigidPair;\n" +" }\n" +" \n" +" if(!isLeaf) //Internal node\n" +" {\n" +" if(stackSize + 2 > B3_PLVBH_TRAVERSE_MAX_STACK_SIZE)\n" +" {\n" +" //Error\n" +" }\n" +" else\n" +" {\n" +" stack[ stackSize++ ] = internalNodeChildIndices[bvhNodeIndex].x;\n" +" stack[ stackSize++ ] = internalNodeChildIndices[bvhNodeIndex].y;\n" +" }\n" +" }\n" +" }\n" +" }\n" +"}\n" +"__kernel void plbvhLargeAabbAabbTest(__global b3AabbCL* smallAabbs, __global b3AabbCL* largeAabbs, \n" +" __global int* out_numPairs, __global int4* out_overlappingPairs, \n" +" int maxPairs, int numLargeAabbRigids, int numSmallAabbRigids)\n" +"{\n" +" int smallAabbIndex = get_global_id(0);\n" +" if(smallAabbIndex >= numSmallAabbRigids) return;\n" +" \n" +" b3AabbCL smallAabb = smallAabbs[smallAabbIndex];\n" +" for(int i = 0; i < numLargeAabbRigids; ++i)\n" +" {\n" +" b3AabbCL largeAabb = largeAabbs[i];\n" +" if( TestAabbAgainstAabb2(&smallAabb, &largeAabb) )\n" +" {\n" +" int4 pair;\n" +" pair.x = largeAabb.m_minIndices[3];\n" +" pair.y = smallAabb.m_minIndices[3];\n" +" pair.z = NEW_PAIR_MARKER;\n" +" pair.w = NEW_PAIR_MARKER;\n" +" \n" +" int pairIndex = atomic_inc(out_numPairs);\n" +" if(pairIndex < maxPairs) out_overlappingPairs[pairIndex] = pair;\n" +" }\n" +" }\n" +"}\n" +"__kernel void plbvhLargeAabbRayTest(__global b3AabbCL* largeRigidAabbs, __global b3RayInfo* rays,\n" +" __global int* out_numRayRigidPairs, __global int2* out_rayRigidPairs,\n" +" int numLargeAabbRigids, int maxRayRigidPairs, int numRays)\n" +"{\n" +" int rayIndex = get_global_id(0);\n" +" if(rayIndex >= numRays) return;\n" +" \n" +" b3Vector3 rayFrom = rays[rayIndex].m_from;\n" +" b3Vector3 rayTo = rays[rayIndex].m_to;\n" +" b3Vector3 rayNormalizedDirection = b3Vector3_normalize(rayTo - rayFrom);\n" +" b3Scalar rayLength = b3Sqrt( b3Vector3_length2(rayTo - rayFrom) );\n" +" \n" +" for(int i = 0; i < numLargeAabbRigids; ++i)\n" +" {\n" +" b3AabbCL rigidAabb = largeRigidAabbs[i];\n" +" if( rayIntersectsAabb(rayFrom, rayLength, rayNormalizedDirection, rigidAabb) )\n" +" {\n" +" int2 rayRigidPair;\n" +" rayRigidPair.x = rayIndex;\n" +" rayRigidPair.y = rigidAabb.m_minIndices[3];\n" +" \n" +" int pairIndex = atomic_inc(out_numRayRigidPairs);\n" +" if(pairIndex < maxRayRigidPairs) out_rayRigidPairs[pairIndex] = rayRigidPair;\n" +" }\n" +" }\n" +"}\n" +"//Set so that it is always greater than the actual common prefixes, and never selected as a parent node.\n" +"//If there are no duplicates, then the highest common prefix is 32 or 64, depending on the number of bits used for the z-curve.\n" +"//Duplicate common prefixes increase the highest common prefix at most by the number of bits used to index the leaf node.\n" +"//Since 32 bit ints are used to index leaf nodes, the max prefix is 64(32 + 32 bit z-curve) or 96(32 + 64 bit z-curve).\n" +"#define B3_PLBVH_INVALID_COMMON_PREFIX 128\n" +"#define B3_PLBVH_ROOT_NODE_MARKER -1\n" +"#define b3Int64 long\n" +"int computeCommonPrefixLength(b3Int64 i, b3Int64 j) { return (int)clz(i ^ j); }\n" +"b3Int64 computeCommonPrefix(b3Int64 i, b3Int64 j) \n" +"{\n" +" //This function only needs to return (i & j) in order for the algorithm to work,\n" +" //but it may help with debugging to mask out the lower bits.\n" +" b3Int64 commonPrefixLength = (b3Int64)computeCommonPrefixLength(i, j);\n" +" b3Int64 sharedBits = i & j;\n" +" b3Int64 bitmask = ((b3Int64)(~0)) << (64 - commonPrefixLength); //Set all bits after the common prefix to 0\n" +" \n" +" return sharedBits & bitmask;\n" +"}\n" +"//Same as computeCommonPrefixLength(), but allows for prefixes with different lengths\n" +"int getSharedPrefixLength(b3Int64 prefixA, int prefixLengthA, b3Int64 prefixB, int prefixLengthB)\n" +"{\n" +" return b3Min( computeCommonPrefixLength(prefixA, prefixB), b3Min(prefixLengthA, prefixLengthB) );\n" +"}\n" +"__kernel void computeAdjacentPairCommonPrefix(__global SortDataCL* mortonCodesAndAabbIndices,\n" +" __global b3Int64* out_commonPrefixes,\n" +" __global int* out_commonPrefixLengths,\n" +" int numInternalNodes)\n" +"{\n" +" int internalNodeIndex = get_global_id(0);\n" +" if (internalNodeIndex >= numInternalNodes) return;\n" +" \n" +" //Here, (internalNodeIndex + 1) is never out of bounds since it is a leaf node index,\n" +" //and the number of internal nodes is always numLeafNodes - 1\n" +" int leftLeafIndex = internalNodeIndex;\n" +" int rightLeafIndex = internalNodeIndex + 1;\n" +" \n" +" int leftLeafMortonCode = mortonCodesAndAabbIndices[leftLeafIndex].m_key;\n" +" int rightLeafMortonCode = mortonCodesAndAabbIndices[rightLeafIndex].m_key;\n" +" \n" +" //Binary radix tree construction algorithm does not work if there are duplicate morton codes.\n" +" //Append the index of each leaf node to each morton code so that there are no duplicates.\n" +" //The algorithm also requires that the morton codes are sorted in ascending order; this requirement\n" +" //is also satisfied with this method, as (leftLeafIndex < rightLeafIndex) is always true.\n" +" //\n" +" //upsample(a, b) == ( ((b3Int64)a) << 32) | b\n" +" b3Int64 nonduplicateLeftMortonCode = upsample(leftLeafMortonCode, leftLeafIndex);\n" +" b3Int64 nonduplicateRightMortonCode = upsample(rightLeafMortonCode, rightLeafIndex);\n" +" \n" +" out_commonPrefixes[internalNodeIndex] = computeCommonPrefix(nonduplicateLeftMortonCode, nonduplicateRightMortonCode);\n" +" out_commonPrefixLengths[internalNodeIndex] = computeCommonPrefixLength(nonduplicateLeftMortonCode, nonduplicateRightMortonCode);\n" +"}\n" +"__kernel void buildBinaryRadixTreeLeafNodes(__global int* commonPrefixLengths, __global int* out_leafNodeParentNodes,\n" +" __global int2* out_childNodes, int numLeafNodes)\n" +"{\n" +" int leafNodeIndex = get_global_id(0);\n" +" if (leafNodeIndex >= numLeafNodes) return;\n" +" \n" +" int numInternalNodes = numLeafNodes - 1;\n" +" \n" +" int leftSplitIndex = leafNodeIndex - 1;\n" +" int rightSplitIndex = leafNodeIndex;\n" +" \n" +" int leftCommonPrefix = (leftSplitIndex >= 0) ? commonPrefixLengths[leftSplitIndex] : B3_PLBVH_INVALID_COMMON_PREFIX;\n" +" int rightCommonPrefix = (rightSplitIndex < numInternalNodes) ? commonPrefixLengths[rightSplitIndex] : B3_PLBVH_INVALID_COMMON_PREFIX;\n" +" \n" +" //Parent node is the highest adjacent common prefix that is lower than the node's common prefix\n" +" //Leaf nodes are considered as having the highest common prefix\n" +" int isLeftHigherCommonPrefix = (leftCommonPrefix > rightCommonPrefix);\n" +" \n" +" //Handle cases for the edge nodes; the first and last node\n" +" //For leaf nodes, leftCommonPrefix and rightCommonPrefix should never both be B3_PLBVH_INVALID_COMMON_PREFIX\n" +" if(leftCommonPrefix == B3_PLBVH_INVALID_COMMON_PREFIX) isLeftHigherCommonPrefix = false;\n" +" if(rightCommonPrefix == B3_PLBVH_INVALID_COMMON_PREFIX) isLeftHigherCommonPrefix = true;\n" +" \n" +" int parentNodeIndex = (isLeftHigherCommonPrefix) ? leftSplitIndex : rightSplitIndex;\n" +" out_leafNodeParentNodes[leafNodeIndex] = parentNodeIndex;\n" +" \n" +" int isRightChild = (isLeftHigherCommonPrefix); //If the left node is the parent, then this node is its right child and vice versa\n" +" \n" +" //out_childNodesAsInt[0] == int2.x == left child\n" +" //out_childNodesAsInt[1] == int2.y == right child\n" +" int isLeaf = 1;\n" +" __global int* out_childNodesAsInt = (__global int*)(&out_childNodes[parentNodeIndex]);\n" +" out_childNodesAsInt[isRightChild] = getIndexWithInternalNodeMarkerSet(isLeaf, leafNodeIndex);\n" +"}\n" +"__kernel void buildBinaryRadixTreeInternalNodes(__global b3Int64* commonPrefixes, __global int* commonPrefixLengths,\n" +" __global int2* out_childNodes,\n" +" __global int* out_internalNodeParentNodes, __global int* out_rootNodeIndex,\n" +" int numInternalNodes)\n" +"{\n" +" int internalNodeIndex = get_group_id(0) * get_local_size(0) + get_local_id(0);\n" +" if(internalNodeIndex >= numInternalNodes) return;\n" +" \n" +" b3Int64 nodePrefix = commonPrefixes[internalNodeIndex];\n" +" int nodePrefixLength = commonPrefixLengths[internalNodeIndex];\n" +" \n" +"//#define USE_LINEAR_SEARCH\n" +"#ifdef USE_LINEAR_SEARCH\n" +" int leftIndex = -1;\n" +" int rightIndex = -1;\n" +" \n" +" //Find nearest element to left with a lower common prefix\n" +" for(int i = internalNodeIndex - 1; i >= 0; --i)\n" +" {\n" +" int nodeLeftSharedPrefixLength = getSharedPrefixLength(nodePrefix, nodePrefixLength, commonPrefixes[i], commonPrefixLengths[i]);\n" +" if(nodeLeftSharedPrefixLength < nodePrefixLength)\n" +" {\n" +" leftIndex = i;\n" +" break;\n" +" }\n" +" }\n" +" \n" +" //Find nearest element to right with a lower common prefix\n" +" for(int i = internalNodeIndex + 1; i < numInternalNodes; ++i)\n" +" {\n" +" int nodeRightSharedPrefixLength = getSharedPrefixLength(nodePrefix, nodePrefixLength, commonPrefixes[i], commonPrefixLengths[i]);\n" +" if(nodeRightSharedPrefixLength < nodePrefixLength)\n" +" {\n" +" rightIndex = i;\n" +" break;\n" +" }\n" +" }\n" +" \n" +"#else //Use binary search\n" +" //Find nearest element to left with a lower common prefix\n" +" int leftIndex = -1;\n" +" {\n" +" int lower = 0;\n" +" int upper = internalNodeIndex - 1;\n" +" \n" +" while(lower <= upper)\n" +" {\n" +" int mid = (lower + upper) / 2;\n" +" b3Int64 midPrefix = commonPrefixes[mid];\n" +" int midPrefixLength = commonPrefixLengths[mid];\n" +" \n" +" int nodeMidSharedPrefixLength = getSharedPrefixLength(nodePrefix, nodePrefixLength, midPrefix, midPrefixLength);\n" +" if(nodeMidSharedPrefixLength < nodePrefixLength) \n" +" {\n" +" int right = mid + 1;\n" +" if(right < internalNodeIndex)\n" +" {\n" +" b3Int64 rightPrefix = commonPrefixes[right];\n" +" int rightPrefixLength = commonPrefixLengths[right];\n" +" \n" +" int nodeRightSharedPrefixLength = getSharedPrefixLength(nodePrefix, nodePrefixLength, rightPrefix, rightPrefixLength);\n" +" if(nodeRightSharedPrefixLength < nodePrefixLength) \n" +" {\n" +" lower = right;\n" +" leftIndex = right;\n" +" }\n" +" else \n" +" {\n" +" leftIndex = mid;\n" +" break;\n" +" }\n" +" }\n" +" else \n" +" {\n" +" leftIndex = mid;\n" +" break;\n" +" }\n" +" }\n" +" else upper = mid - 1;\n" +" }\n" +" }\n" +" \n" +" //Find nearest element to right with a lower common prefix\n" +" int rightIndex = -1;\n" +" {\n" +" int lower = internalNodeIndex + 1;\n" +" int upper = numInternalNodes - 1;\n" +" \n" +" while(lower <= upper)\n" +" {\n" +" int mid = (lower + upper) / 2;\n" +" b3Int64 midPrefix = commonPrefixes[mid];\n" +" int midPrefixLength = commonPrefixLengths[mid];\n" +" \n" +" int nodeMidSharedPrefixLength = getSharedPrefixLength(nodePrefix, nodePrefixLength, midPrefix, midPrefixLength);\n" +" if(nodeMidSharedPrefixLength < nodePrefixLength) \n" +" {\n" +" int left = mid - 1;\n" +" if(left > internalNodeIndex)\n" +" {\n" +" b3Int64 leftPrefix = commonPrefixes[left];\n" +" int leftPrefixLength = commonPrefixLengths[left];\n" +" \n" +" int nodeLeftSharedPrefixLength = getSharedPrefixLength(nodePrefix, nodePrefixLength, leftPrefix, leftPrefixLength);\n" +" if(nodeLeftSharedPrefixLength < nodePrefixLength) \n" +" {\n" +" upper = left;\n" +" rightIndex = left;\n" +" }\n" +" else \n" +" {\n" +" rightIndex = mid;\n" +" break;\n" +" }\n" +" }\n" +" else \n" +" {\n" +" rightIndex = mid;\n" +" break;\n" +" }\n" +" }\n" +" else lower = mid + 1;\n" +" }\n" +" }\n" +"#endif\n" +" \n" +" //Select parent\n" +" {\n" +" int leftPrefixLength = (leftIndex != -1) ? commonPrefixLengths[leftIndex] : B3_PLBVH_INVALID_COMMON_PREFIX;\n" +" int rightPrefixLength = (rightIndex != -1) ? commonPrefixLengths[rightIndex] : B3_PLBVH_INVALID_COMMON_PREFIX;\n" +" \n" +" int isLeftHigherPrefixLength = (leftPrefixLength > rightPrefixLength);\n" +" \n" +" if(leftPrefixLength == B3_PLBVH_INVALID_COMMON_PREFIX) isLeftHigherPrefixLength = false;\n" +" else if(rightPrefixLength == B3_PLBVH_INVALID_COMMON_PREFIX) isLeftHigherPrefixLength = true;\n" +" \n" +" int parentNodeIndex = (isLeftHigherPrefixLength) ? leftIndex : rightIndex;\n" +" \n" +" int isRootNode = (leftIndex == -1 && rightIndex == -1);\n" +" out_internalNodeParentNodes[internalNodeIndex] = (!isRootNode) ? parentNodeIndex : B3_PLBVH_ROOT_NODE_MARKER;\n" +" \n" +" int isLeaf = 0;\n" +" if(!isRootNode)\n" +" {\n" +" int isRightChild = (isLeftHigherPrefixLength); //If the left node is the parent, then this node is its right child and vice versa\n" +" \n" +" //out_childNodesAsInt[0] == int2.x == left child\n" +" //out_childNodesAsInt[1] == int2.y == right child\n" +" __global int* out_childNodesAsInt = (__global int*)(&out_childNodes[parentNodeIndex]);\n" +" out_childNodesAsInt[isRightChild] = getIndexWithInternalNodeMarkerSet(isLeaf, internalNodeIndex);\n" +" }\n" +" else *out_rootNodeIndex = getIndexWithInternalNodeMarkerSet(isLeaf, internalNodeIndex);\n" +" }\n" +"}\n" +"__kernel void findDistanceFromRoot(__global int* rootNodeIndex, __global int* internalNodeParentNodes,\n" +" __global int* out_maxDistanceFromRoot, __global int* out_distanceFromRoot, int numInternalNodes)\n" +"{\n" +" if( get_global_id(0) == 0 ) atomic_xchg(out_maxDistanceFromRoot, 0);\n" +" int internalNodeIndex = get_global_id(0);\n" +" if(internalNodeIndex >= numInternalNodes) return;\n" +" \n" +" //\n" +" int distanceFromRoot = 0;\n" +" {\n" +" int parentIndex = internalNodeParentNodes[internalNodeIndex];\n" +" while(parentIndex != B3_PLBVH_ROOT_NODE_MARKER)\n" +" {\n" +" parentIndex = internalNodeParentNodes[parentIndex];\n" +" ++distanceFromRoot;\n" +" }\n" +" }\n" +" out_distanceFromRoot[internalNodeIndex] = distanceFromRoot;\n" +" \n" +" //\n" +" __local int localMaxDistanceFromRoot;\n" +" if( get_local_id(0) == 0 ) localMaxDistanceFromRoot = 0;\n" +" barrier(CLK_LOCAL_MEM_FENCE);\n" +" \n" +" atomic_max(&localMaxDistanceFromRoot, distanceFromRoot);\n" +" barrier(CLK_LOCAL_MEM_FENCE);\n" +" \n" +" if( get_local_id(0) == 0 ) atomic_max(out_maxDistanceFromRoot, localMaxDistanceFromRoot);\n" +"}\n" +"__kernel void buildBinaryRadixTreeAabbsRecursive(__global int* distanceFromRoot, __global SortDataCL* mortonCodesAndAabbIndices,\n" +" __global int2* childNodes,\n" +" __global b3AabbCL* leafNodeAabbs, __global b3AabbCL* internalNodeAabbs,\n" +" int maxDistanceFromRoot, int processedDistance, int numInternalNodes)\n" +"{\n" +" int internalNodeIndex = get_global_id(0);\n" +" if(internalNodeIndex >= numInternalNodes) return;\n" +" \n" +" int distance = distanceFromRoot[internalNodeIndex];\n" +" \n" +" if(distance == processedDistance)\n" +" {\n" +" int leftChildIndex = childNodes[internalNodeIndex].x;\n" +" int rightChildIndex = childNodes[internalNodeIndex].y;\n" +" \n" +" int isLeftChildLeaf = isLeafNode(leftChildIndex);\n" +" int isRightChildLeaf = isLeafNode(rightChildIndex);\n" +" \n" +" leftChildIndex = getIndexWithInternalNodeMarkerRemoved(leftChildIndex);\n" +" rightChildIndex = getIndexWithInternalNodeMarkerRemoved(rightChildIndex);\n" +" \n" +" //leftRigidIndex/rightRigidIndex is not used if internal node\n" +" int leftRigidIndex = (isLeftChildLeaf) ? mortonCodesAndAabbIndices[leftChildIndex].m_value : -1;\n" +" int rightRigidIndex = (isRightChildLeaf) ? mortonCodesAndAabbIndices[rightChildIndex].m_value : -1;\n" +" \n" +" b3AabbCL leftChildAabb = (isLeftChildLeaf) ? leafNodeAabbs[leftRigidIndex] : internalNodeAabbs[leftChildIndex];\n" +" b3AabbCL rightChildAabb = (isRightChildLeaf) ? leafNodeAabbs[rightRigidIndex] : internalNodeAabbs[rightChildIndex];\n" +" \n" +" b3AabbCL mergedAabb;\n" +" mergedAabb.m_min = b3Min(leftChildAabb.m_min, rightChildAabb.m_min);\n" +" mergedAabb.m_max = b3Max(leftChildAabb.m_max, rightChildAabb.m_max);\n" +" internalNodeAabbs[internalNodeIndex] = mergedAabb;\n" +" }\n" +"}\n" +"__kernel void findLeafIndexRanges(__global int2* internalNodeChildNodes, __global int2* out_leafIndexRanges, int numInternalNodes)\n" +"{\n" +" int internalNodeIndex = get_global_id(0);\n" +" if(internalNodeIndex >= numInternalNodes) return;\n" +" \n" +" int numLeafNodes = numInternalNodes + 1;\n" +" \n" +" int2 childNodes = internalNodeChildNodes[internalNodeIndex];\n" +" \n" +" int2 leafIndexRange; //x == min leaf index, y == max leaf index\n" +" \n" +" //Find lowest leaf index covered by this internal node\n" +" {\n" +" int lowestIndex = childNodes.x; //childNodes.x == Left child\n" +" while( !isLeafNode(lowestIndex) ) lowestIndex = internalNodeChildNodes[ getIndexWithInternalNodeMarkerRemoved(lowestIndex) ].x;\n" +" leafIndexRange.x = lowestIndex;\n" +" }\n" +" \n" +" //Find highest leaf index covered by this internal node\n" +" {\n" +" int highestIndex = childNodes.y; //childNodes.y == Right child\n" +" while( !isLeafNode(highestIndex) ) highestIndex = internalNodeChildNodes[ getIndexWithInternalNodeMarkerRemoved(highestIndex) ].y;\n" +" leafIndexRange.y = highestIndex;\n" +" }\n" +" \n" +" //\n" +" out_leafIndexRanges[internalNodeIndex] = leafIndexRange;\n" +"}\n" +; diff --git a/src/Bullet3OpenCL/CMakeLists.txt b/src/Bullet3OpenCL/CMakeLists.txt index 56f4130e0..286822272 100644 --- a/src/Bullet3OpenCL/CMakeLists.txt +++ b/src/Bullet3OpenCL/CMakeLists.txt @@ -6,6 +6,8 @@ SET(Bullet3OpenCL_clew_SRCS ../clew/clew.c BroadphaseCollision/b3GpuGridBroadphase.cpp BroadphaseCollision/b3GpuSapBroadphase.cpp + BroadphaseCollision/b3GpuParallelLinearBvhBroadphase.cpp + BroadphaseCollision/b3GpuParallelLinearBvh.cpp Initialize/b3OpenCLUtils.cpp NarrowphaseCollision/b3ContactCache.cpp NarrowphaseCollision/b3ConvexHullContact.cpp @@ -43,7 +45,7 @@ ADD_LIBRARY(Bullet3OpenCL_clew ${Bullet3OpenCL_clew_SRCS} ${Bullet3OpenCL_clew_H SET_TARGET_PROPERTIES(Bullet3OpenCL_clew PROPERTIES VERSION ${BULLET_VERSION}) SET_TARGET_PROPERTIES(Bullet3OpenCL_clew PROPERTIES SOVERSION ${BULLET_VERSION}) IF (BUILD_SHARED_LIBS) - TARGET_LINK_LIBRARIES(Bullet3OpenCL_clew LinearMath) + TARGET_LINK_LIBRARIES(Bullet3OpenCL_clew LinearMath Bullet3Dynamics) ENDIF (BUILD_SHARED_LIBS) @@ -59,8 +61,8 @@ IF (INSTALL_LIBS) ARCHIVE DESTINATION lib${LIB_SUFFIX}) INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DESTINATION ${INCLUDE_INSTALL_DIR} FILES_MATCHING PATTERN "*.h" PATTERN ".svn" EXCLUDE PATTERN "CMakeFiles" EXCLUDE) - INSTALL(FILES ../btBullet3OpenCL_clewCommon.h -DESTINATION ${INCLUDE_INSTALL_DIR}/Bullet3OpenCL_clew) +# INSTALL(FILES ../btBullet3OpenCL_clewCommon.h +#DESTINATION ${INCLUDE_INSTALL_DIR}/Bullet3OpenCL_clew) ENDIF (APPLE AND BUILD_SHARED_LIBS AND FRAMEWORK) ENDIF (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} GREATER 2.5) diff --git a/src/Bullet3OpenCL/Initialize/b3OpenCLUtils.cpp b/src/Bullet3OpenCL/Initialize/b3OpenCLUtils.cpp index e409658ca..e5b3ef877 100644 --- a/src/Bullet3OpenCL/Initialize/b3OpenCLUtils.cpp +++ b/src/Bullet3OpenCL/Initialize/b3OpenCLUtils.cpp @@ -36,7 +36,7 @@ bool gDebugSkipLoadingBinary = false; #define B3_MAX_CL_DEVICES 16 //who needs 16 devices? #ifdef _WIN32 -#include +#include #endif #include diff --git a/src/Bullet3OpenCL/NarrowphaseCollision/b3ConvexHullContact.cpp b/src/Bullet3OpenCL/NarrowphaseCollision/b3ConvexHullContact.cpp index 4ca3a4dcb..a0cc00496 100644 --- a/src/Bullet3OpenCL/NarrowphaseCollision/b3ConvexHullContact.cpp +++ b/src/Bullet3OpenCL/NarrowphaseCollision/b3ConvexHullContact.cpp @@ -135,6 +135,9 @@ m_unitSphereDirections(m_context,m_queue) // sprintf(flags,"-g -s \"%s\"","C:/develop/bullet3_experiments2/opencl/gpu_narrowphase/kernels/sat.cl"); //#endif m_mprPenetrationKernel = 0; + m_findSeparatingAxisUnitSphereKernel = 0; + + if (useMprGpu) { cl_program mprProg = b3OpenCLUtils::compileCLProgramFromString(m_context,m_device,mprSrc,&errNum,flags,BT_NARROWPHASE_MPR_PATH); b3Assert(errNum==CL_SUCCESS); @@ -3231,7 +3234,7 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( b3OpenCLArray* } } - if (1) + if (useMprGpu) { B3_PROFILE("findSeparatingAxisUnitSphereKernel"); b3BufferInfoCL bInfo[] = { diff --git a/src/Bullet3OpenCL/Raycast/b3GpuRaycast.cpp b/src/Bullet3OpenCL/Raycast/b3GpuRaycast.cpp index cb57fbd5b..4ef38bd1d 100644 --- a/src/Bullet3OpenCL/Raycast/b3GpuRaycast.cpp +++ b/src/Bullet3OpenCL/Raycast/b3GpuRaycast.cpp @@ -8,6 +8,11 @@ #include "Bullet3OpenCL/Initialize/b3OpenCLUtils.h" #include "Bullet3OpenCL/ParallelPrimitives/b3OpenCLArray.h" #include "Bullet3OpenCL/ParallelPrimitives/b3LauncherCL.h" +#include "Bullet3OpenCL/ParallelPrimitives/b3FillCL.h" +#include "Bullet3OpenCL/ParallelPrimitives/b3RadixSort32CL.h" +#include "Bullet3OpenCL/BroadphaseCollision/b3GpuBroadphaseInterface.h" +#include "Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvh.h" + #include "Bullet3OpenCL/Raycast/kernels/rayCastKernels.h" @@ -20,7 +25,24 @@ struct b3GpuRaycastInternalData cl_context m_context; cl_device_id m_device; cl_command_queue m_q; - cl_kernel m_raytraceKernel; + cl_kernel m_raytraceKernel; + cl_kernel m_raytracePairsKernel; + cl_kernel m_findRayRigidPairIndexRanges; + + b3GpuParallelLinearBvh* m_plbvh; + b3RadixSort32CL* m_radixSorter; + b3FillCL* m_fill; + + //1 element per ray + b3OpenCLArray* m_gpuRays; + b3OpenCLArray* m_gpuHitResults; + b3OpenCLArray* m_firstRayRigidPairIndexPerRay; + b3OpenCLArray* m_numRayRigidPairsPerRay; + + //1 element per (ray index, rigid index) pair, where the ray intersects with the rigid's AABB + b3OpenCLArray* m_gpuNumRayRigidPairs; + b3OpenCLArray* m_gpuRayRigidPairs; //x == ray index, y == rigid index + int m_test; }; @@ -31,7 +53,19 @@ b3GpuRaycast::b3GpuRaycast(cl_context ctx,cl_device_id device, cl_command_queue m_data->m_device = device; m_data->m_q = q; m_data->m_raytraceKernel = 0; + m_data->m_raytracePairsKernel = 0; + m_data->m_findRayRigidPairIndexRanges = 0; + m_data->m_plbvh = new b3GpuParallelLinearBvh(ctx, device, q); + m_data->m_radixSorter = new b3RadixSort32CL(ctx, device, q); + m_data->m_fill = new b3FillCL(ctx, device, q); + + m_data->m_gpuRays = new b3OpenCLArray(ctx, q); + m_data->m_gpuHitResults = new b3OpenCLArray(ctx, q); + m_data->m_firstRayRigidPairIndexPerRay = new b3OpenCLArray(ctx, q); + m_data->m_numRayRigidPairsPerRay = new b3OpenCLArray(ctx, q); + m_data->m_gpuNumRayRigidPairs = new b3OpenCLArray(ctx, q); + m_data->m_gpuRayRigidPairs = new b3OpenCLArray(ctx, q); { cl_int errNum=0; @@ -39,6 +73,10 @@ b3GpuRaycast::b3GpuRaycast(cl_context ctx,cl_device_id device, cl_command_queue b3Assert(errNum==CL_SUCCESS); m_data->m_raytraceKernel = b3OpenCLUtils::compileCLKernelFromString(m_data->m_context, m_data->m_device,rayCastKernelCL, "rayCastKernel",&errNum,prog); b3Assert(errNum==CL_SUCCESS); + m_data->m_raytracePairsKernel = b3OpenCLUtils::compileCLKernelFromString(m_data->m_context, m_data->m_device,rayCastKernelCL, "rayCastPairsKernel",&errNum,prog); + b3Assert(errNum==CL_SUCCESS); + m_data->m_findRayRigidPairIndexRanges = b3OpenCLUtils::compileCLKernelFromString(m_data->m_context, m_data->m_device,rayCastKernelCL, "findRayRigidPairIndexRanges",&errNum,prog); + b3Assert(errNum==CL_SUCCESS); clReleaseProgram(prog); } @@ -48,6 +86,20 @@ b3GpuRaycast::b3GpuRaycast(cl_context ctx,cl_device_id device, cl_command_queue b3GpuRaycast::~b3GpuRaycast() { clReleaseKernel(m_data->m_raytraceKernel); + clReleaseKernel(m_data->m_raytracePairsKernel); + clReleaseKernel(m_data->m_findRayRigidPairIndexRanges); + + delete m_data->m_plbvh; + delete m_data->m_radixSorter; + delete m_data->m_fill; + + delete m_data->m_gpuRays; + delete m_data->m_gpuHitResults; + delete m_data->m_firstRayRigidPairIndexPerRay; + delete m_data->m_numRayRigidPairsPerRay; + delete m_data->m_gpuNumRayRigidPairs; + delete m_data->m_gpuRayRigidPairs; + delete m_data; } @@ -206,27 +258,32 @@ void b3GpuRaycast::castRaysHost(const b3AlignedObjectArray& rays, b3A } ///todo: add some acceleration structure (AABBs, tree etc) void b3GpuRaycast::castRays(const b3AlignedObjectArray& rays, b3AlignedObjectArray& hitResults, - int numBodies,const struct b3RigidBodyData* bodies, int numCollidables, const struct b3Collidable* collidables, const struct b3GpuNarrowPhaseInternalData* narrowphaseData) + int numBodies,const struct b3RigidBodyData* bodies, int numCollidables, const struct b3Collidable* collidables, + const struct b3GpuNarrowPhaseInternalData* narrowphaseData, class b3GpuBroadphaseInterface* broadphase) { - //castRaysHost(rays,hitResults,numBodies,bodies,numCollidables,collidables,narrowphaseData); B3_PROFILE("castRaysGPU"); - - b3OpenCLArray gpuRays(m_data->m_context,m_data->m_q); - b3OpenCLArray gpuHitResults(m_data->m_context,m_data->m_q); - + { B3_PROFILE("raycast copyFromHost"); - gpuRays.copyFromHost(rays); - - - gpuHitResults.resize(hitResults.size()); - gpuHitResults.copyFromHost(hitResults); + m_data->m_gpuRays->copyFromHost(rays); + m_data->m_gpuHitResults->copyFromHost(hitResults); + } - - + + int numRays = hitResults.size(); + { + m_data->m_firstRayRigidPairIndexPerRay->resize(numRays); + m_data->m_numRayRigidPairsPerRay->resize(numRays); + + m_data->m_gpuNumRayRigidPairs->resize(1); + m_data->m_gpuRayRigidPairs->resize(numRays * 16); + } + //run kernel + const bool USE_BRUTE_FORCE_RAYCAST = false; + if(USE_BRUTE_FORCE_RAYCAST) { B3_PROFILE("raycast launch1D"); @@ -234,8 +291,8 @@ void b3GpuRaycast::castRays(const b3AlignedObjectArray& rays, b3Align int numRays = rays.size(); launcher.setConst(numRays); - launcher.setBuffer(gpuRays.getBufferCL()); - launcher.setBuffer(gpuHitResults.getBufferCL()); + launcher.setBuffer(m_data->m_gpuRays->getBufferCL()); + launcher.setBuffer(m_data->m_gpuHitResults->getBufferCL()); launcher.setConst(numBodies); launcher.setBuffer(narrowphaseData->m_bodyBufferGPU->getBufferCL()); @@ -246,11 +303,89 @@ void b3GpuRaycast::castRays(const b3AlignedObjectArray& rays, b3Align launcher.launch1D(numRays); clFinish(m_data->m_q); } + else + { + m_data->m_plbvh->build( broadphase->getAllAabbsGPU(), broadphase->getSmallAabbIndicesGPU(), broadphase->getLargeAabbIndicesGPU() ); + + m_data->m_plbvh->testRaysAgainstBvhAabbs(*m_data->m_gpuRays, *m_data->m_gpuNumRayRigidPairs, *m_data->m_gpuRayRigidPairs); + + int numRayRigidPairs = -1; + m_data->m_gpuNumRayRigidPairs->copyToHostPointer(&numRayRigidPairs, 1); + if( numRayRigidPairs > m_data->m_gpuRayRigidPairs->size() ) + { + numRayRigidPairs = m_data->m_gpuRayRigidPairs->size(); + m_data->m_gpuNumRayRigidPairs->copyFromHostPointer(&numRayRigidPairs, 1); + } + + m_data->m_gpuRayRigidPairs->resize(numRayRigidPairs); //Radix sort needs b3OpenCLArray::size() to be correct + + //Sort ray-rigid pairs by ray index + { + B3_PROFILE("sort ray-rigid pairs"); + m_data->m_radixSorter->execute( *reinterpret_cast< b3OpenCLArray* >(m_data->m_gpuRayRigidPairs) ); + } + + //detect start,count of each ray pair + { + B3_PROFILE("detect ray-rigid pair index ranges"); + + { + B3_PROFILE("reset ray-rigid pair index ranges"); + + m_data->m_fill->execute(*m_data->m_firstRayRigidPairIndexPerRay, numRayRigidPairs, numRays); //atomic_min used to find first index + m_data->m_fill->execute(*m_data->m_numRayRigidPairsPerRay, 0, numRays); + clFinish(m_data->m_q); + } + + b3BufferInfoCL bufferInfo[] = + { + b3BufferInfoCL( m_data->m_gpuRayRigidPairs->getBufferCL() ), + + b3BufferInfoCL( m_data->m_firstRayRigidPairIndexPerRay->getBufferCL() ), + b3BufferInfoCL( m_data->m_numRayRigidPairsPerRay->getBufferCL() ) + }; + + b3LauncherCL launcher(m_data->m_q, m_data->m_findRayRigidPairIndexRanges, "m_findRayRigidPairIndexRanges"); + launcher.setBuffers( bufferInfo, sizeof(bufferInfo)/sizeof(b3BufferInfoCL) ); + launcher.setConst(numRayRigidPairs); + + launcher.launch1D(numRayRigidPairs); + clFinish(m_data->m_q); + } + + { + B3_PROFILE("ray-rigid intersection"); + + b3BufferInfoCL bufferInfo[] = + { + b3BufferInfoCL( m_data->m_gpuRays->getBufferCL() ), + b3BufferInfoCL( m_data->m_gpuHitResults->getBufferCL() ), + b3BufferInfoCL( m_data->m_firstRayRigidPairIndexPerRay->getBufferCL() ), + b3BufferInfoCL( m_data->m_numRayRigidPairsPerRay->getBufferCL() ), + + b3BufferInfoCL( narrowphaseData->m_bodyBufferGPU->getBufferCL() ), + b3BufferInfoCL( narrowphaseData->m_collidablesGPU->getBufferCL() ), + b3BufferInfoCL( narrowphaseData->m_convexFacesGPU->getBufferCL() ), + b3BufferInfoCL( narrowphaseData->m_convexPolyhedraGPU->getBufferCL() ), + + b3BufferInfoCL( m_data->m_gpuRayRigidPairs->getBufferCL() ) + }; + + b3LauncherCL launcher(m_data->m_q, m_data->m_raytracePairsKernel, "m_raytracePairsKernel"); + launcher.setBuffers( bufferInfo, sizeof(bufferInfo)/sizeof(b3BufferInfoCL) ); + launcher.setConst(numRays); + + launcher.launch1D(numRays); + clFinish(m_data->m_q); + } + } + + //copy results { B3_PROFILE("raycast copyToHost"); - gpuHitResults.copyToHost(hitResults); + m_data->m_gpuHitResults->copyToHost(hitResults); } } \ No newline at end of file diff --git a/src/Bullet3OpenCL/Raycast/b3GpuRaycast.h b/src/Bullet3OpenCL/Raycast/b3GpuRaycast.h index 8b0cbd0be..3a5cf44b7 100644 --- a/src/Bullet3OpenCL/Raycast/b3GpuRaycast.h +++ b/src/Bullet3OpenCL/Raycast/b3GpuRaycast.h @@ -23,8 +23,7 @@ public: void castRays(const b3AlignedObjectArray& rays, b3AlignedObjectArray& hitResults, int numBodies,const struct b3RigidBodyData* bodies, int numCollidables, const struct b3Collidable* collidables, - const struct b3GpuNarrowPhaseInternalData* narrowphaseData - ); + const struct b3GpuNarrowPhaseInternalData* narrowphaseData, class b3GpuBroadphaseInterface* broadphase); diff --git a/src/Bullet3OpenCL/Raycast/kernels/rayCastKernels.cl b/src/Bullet3OpenCL/Raycast/kernels/rayCastKernels.cl index acf0bdd32..e72d96876 100644 --- a/src/Bullet3OpenCL/Raycast/kernels/rayCastKernels.cl +++ b/src/Bullet3OpenCL/Raycast/kernels/rayCastKernels.cl @@ -337,3 +337,103 @@ __kernel void rayCastKernel( } } + + +__kernel void findRayRigidPairIndexRanges(__global int2* rayRigidPairs, + __global int* out_firstRayRigidPairIndexPerRay, + __global int* out_numRayRigidPairsPerRay, + int numRayRigidPairs) +{ + int rayRigidPairIndex = get_global_id(0); + if (rayRigidPairIndex >= numRayRigidPairs) return; + + int rayIndex = rayRigidPairs[rayRigidPairIndex].x; + + atomic_min(&out_firstRayRigidPairIndexPerRay[rayIndex], rayRigidPairIndex); + atomic_inc(&out_numRayRigidPairsPerRay[rayIndex]); +} + +__kernel void rayCastPairsKernel(const __global b3RayInfo* rays, + __global b3RayHit* hitResults, + __global int* firstRayRigidPairIndexPerRay, + __global int* numRayRigidPairsPerRay, + + __global Body* bodies, + __global Collidable* collidables, + __global const b3GpuFace* faces, + __global const ConvexPolyhedronCL* convexShapes, + + __global int2* rayRigidPairs, + int numRays) +{ + int i = get_global_id(0); + if (i >= numRays) return; + + float4 rayFrom = rays[i].m_from; + float4 rayTo = rays[i].m_to; + + hitResults[i].m_hitFraction = 1.f; + + float hitFraction = 1.f; + float4 hitPoint; + float4 hitNormal; + int hitBodyIndex = -1; + + // + for(int pair = 0; pair < numRayRigidPairsPerRay[i]; ++pair) + { + int rayRigidPairIndex = pair + firstRayRigidPairIndexPerRay[i]; + int b = rayRigidPairs[rayRigidPairIndex].y; + + if (hitResults[i].m_hitResult2 == b) continue; + + Body body = bodies[b]; + Collidable rigidCollidable = collidables[body.m_collidableIdx]; + + float4 pos = body.m_pos; + float4 orn = body.m_quat; + + if (rigidCollidable.m_shapeType == SHAPE_CONVEX_HULL) + { + float4 invPos = (float4)(0,0,0,0); + float4 invOrn = (float4)(0,0,0,0); + float4 rayFromLocal = (float4)(0,0,0,0); + float4 rayToLocal = (float4)(0,0,0,0); + invOrn = qtInvert(orn); + invPos = qtRotate(invOrn, -pos); + rayFromLocal = qtRotate( invOrn, rayFrom ) + invPos; + rayToLocal = qtRotate( invOrn, rayTo) + invPos; + rayFromLocal.w = 0.f; + rayToLocal.w = 0.f; + int numFaces = convexShapes[rigidCollidable.m_shapeIndex].m_numFaces; + int faceOffset = convexShapes[rigidCollidable.m_shapeIndex].m_faceOffset; + + if (numFaces && rayConvex(rayFromLocal, rayToLocal, numFaces, faceOffset,faces, &hitFraction, &hitNormal)) + { + hitBodyIndex = b; + hitPoint = setInterpolate3(rayFrom, rayTo, hitFraction); + } + } + + if (rigidCollidable.m_shapeType == SHAPE_SPHERE) + { + float radius = rigidCollidable.m_radius; + + if (sphere_intersect(pos, radius, rayFrom, rayTo, &hitFraction)) + { + hitBodyIndex = b; + hitPoint = setInterpolate3(rayFrom, rayTo, hitFraction); + hitNormal = (float4) (hitPoint - bodies[b].m_pos); + } + } + } + + if (hitBodyIndex >= 0) + { + hitResults[i].m_hitFraction = hitFraction; + hitResults[i].m_hitPoint = hitPoint; + hitResults[i].m_hitNormal = normalize(hitNormal); + hitResults[i].m_hitResult0 = hitBodyIndex; + } + +} diff --git a/src/Bullet3OpenCL/Raycast/kernels/rayCastKernels.h b/src/Bullet3OpenCL/Raycast/kernels/rayCastKernels.h index 159da7c17..6257909a4 100644 --- a/src/Bullet3OpenCL/Raycast/kernels/rayCastKernels.h +++ b/src/Bullet3OpenCL/Raycast/kernels/rayCastKernels.h @@ -281,4 +281,101 @@ static const char* rayCastKernelCL= \ " hitResults[i].m_hitResult0 = hitBodyIndex;\n" " }\n" "}\n" +"__kernel void findRayRigidPairIndexRanges(__global int2* rayRigidPairs, \n" +" __global int* out_firstRayRigidPairIndexPerRay,\n" +" __global int* out_numRayRigidPairsPerRay,\n" +" int numRayRigidPairs)\n" +"{\n" +" int rayRigidPairIndex = get_global_id(0);\n" +" if (rayRigidPairIndex >= numRayRigidPairs) return;\n" +" \n" +" int rayIndex = rayRigidPairs[rayRigidPairIndex].x;\n" +" \n" +" atomic_min(&out_firstRayRigidPairIndexPerRay[rayIndex], rayRigidPairIndex);\n" +" atomic_inc(&out_numRayRigidPairsPerRay[rayIndex]);\n" +"}\n" +"__kernel void rayCastPairsKernel(const __global b3RayInfo* rays, \n" +" __global b3RayHit* hitResults, \n" +" __global int* firstRayRigidPairIndexPerRay,\n" +" __global int* numRayRigidPairsPerRay,\n" +" \n" +" __global Body* bodies,\n" +" __global Collidable* collidables,\n" +" __global const b3GpuFace* faces,\n" +" __global const ConvexPolyhedronCL* convexShapes,\n" +" \n" +" __global int2* rayRigidPairs,\n" +" int numRays)\n" +"{\n" +" int i = get_global_id(0);\n" +" if (i >= numRays) return;\n" +" \n" +" float4 rayFrom = rays[i].m_from;\n" +" float4 rayTo = rays[i].m_to;\n" +" \n" +" hitResults[i].m_hitFraction = 1.f;\n" +" \n" +" float hitFraction = 1.f;\n" +" float4 hitPoint;\n" +" float4 hitNormal;\n" +" int hitBodyIndex = -1;\n" +" \n" +" //\n" +" for(int pair = 0; pair < numRayRigidPairsPerRay[i]; ++pair)\n" +" {\n" +" int rayRigidPairIndex = pair + firstRayRigidPairIndexPerRay[i];\n" +" int b = rayRigidPairs[rayRigidPairIndex].y;\n" +" \n" +" if (hitResults[i].m_hitResult2 == b) continue;\n" +" \n" +" Body body = bodies[b];\n" +" Collidable rigidCollidable = collidables[body.m_collidableIdx];\n" +" \n" +" float4 pos = body.m_pos;\n" +" float4 orn = body.m_quat;\n" +" \n" +" if (rigidCollidable.m_shapeType == SHAPE_CONVEX_HULL)\n" +" {\n" +" float4 invPos = (float4)(0,0,0,0);\n" +" float4 invOrn = (float4)(0,0,0,0);\n" +" float4 rayFromLocal = (float4)(0,0,0,0);\n" +" float4 rayToLocal = (float4)(0,0,0,0);\n" +" invOrn = qtInvert(orn);\n" +" invPos = qtRotate(invOrn, -pos);\n" +" rayFromLocal = qtRotate( invOrn, rayFrom ) + invPos;\n" +" rayToLocal = qtRotate( invOrn, rayTo) + invPos;\n" +" rayFromLocal.w = 0.f;\n" +" rayToLocal.w = 0.f;\n" +" int numFaces = convexShapes[rigidCollidable.m_shapeIndex].m_numFaces;\n" +" int faceOffset = convexShapes[rigidCollidable.m_shapeIndex].m_faceOffset;\n" +" \n" +" if (numFaces && rayConvex(rayFromLocal, rayToLocal, numFaces, faceOffset,faces, &hitFraction, &hitNormal))\n" +" {\n" +" hitBodyIndex = b;\n" +" hitPoint = setInterpolate3(rayFrom, rayTo, hitFraction);\n" +" }\n" +" }\n" +" \n" +" if (rigidCollidable.m_shapeType == SHAPE_SPHERE)\n" +" {\n" +" float radius = rigidCollidable.m_radius;\n" +" \n" +" if (sphere_intersect(pos, radius, rayFrom, rayTo, &hitFraction))\n" +" {\n" +" hitBodyIndex = b;\n" +" hitPoint = setInterpolate3(rayFrom, rayTo, hitFraction);\n" +" hitNormal = (float4) (hitPoint - bodies[b].m_pos);\n" +" }\n" +" }\n" +" }\n" +" \n" +" if (hitBodyIndex >= 0)\n" +" {\n" +" hitResults[i].m_hitFraction = hitFraction;\n" +" hitResults[i].m_hitPoint = hitPoint;\n" +" hitResults[i].m_hitNormal = normalize(hitNormal);\n" +" hitResults[i].m_hitResult0 = hitBodyIndex;\n" +" }\n" +" \n" +"}\n" ; diff --git a/src/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipeline.cpp b/src/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipeline.cpp index e1665f406..783e44306 100644 --- a/src/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipeline.cpp +++ b/src/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipeline.cpp @@ -703,6 +703,6 @@ void b3GpuRigidBodyPipeline::castRays(const b3AlignedObjectArray& ray { this->m_data->m_raycaster->castRays(rays,hitResults, getNumBodies(),this->m_data->m_narrowphase->getBodiesCpu(), - m_data->m_narrowphase->getNumCollidablesGpu(), m_data->m_narrowphase->getCollidablesCpu(), m_data->m_narrowphase->getInternalData() - ); + m_data->m_narrowphase->getNumCollidablesGpu(), m_data->m_narrowphase->getCollidablesCpu(), + m_data->m_narrowphase->getInternalData(), m_data->m_broadphaseSap); } diff --git a/src/Bullet3Serialize/Bullet2FileLoader/CMakeLists.txt b/src/Bullet3Serialize/Bullet2FileLoader/CMakeLists.txt index a73d3ccd8..169004557 100644 --- a/src/Bullet3Serialize/Bullet2FileLoader/CMakeLists.txt +++ b/src/Bullet3Serialize/Bullet2FileLoader/CMakeLists.txt @@ -24,6 +24,9 @@ SET(Bullet2FileLoader_HDRS ) ADD_LIBRARY(Bullet2FileLoader ${Bullet2FileLoader_SRCS} ${Bullet2FileLoader_HDRS}) +if (BUILD_SHARED_LIBS) + target_link_libraries(Bullet2FileLoader Bullet3Common) +endif () SET_TARGET_PROPERTIES(Bullet2FileLoader PROPERTIES VERSION ${BULLET_VERSION}) SET_TARGET_PROPERTIES(Bullet2FileLoader PROPERTIES SOVERSION ${BULLET_VERSION}) diff --git a/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.cpp b/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.cpp index 669d0b6b5..3b6913c0e 100644 --- a/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.cpp +++ b/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.cpp @@ -189,7 +189,7 @@ bool btCollisionDispatcher::needsCollision(const btCollisionObject* body0,const if ((!body0->isActive()) && (!body1->isActive())) needsCollision = false; - else if (!body0->checkCollideWith(body1)) + else if ((!body0->checkCollideWith(body1)) || (!body1->checkCollideWith(body0))) needsCollision = false; return needsCollision ; diff --git a/src/BulletCollision/CollisionDispatch/btCollisionObject.h b/src/BulletCollision/CollisionDispatch/btCollisionObject.h index 89cad1682..587786ce9 100644 --- a/src/BulletCollision/CollisionDispatch/btCollisionObject.h +++ b/src/BulletCollision/CollisionDispatch/btCollisionObject.h @@ -110,13 +110,11 @@ protected: /// If some object should have elaborate collision filtering by sub-classes int m_checkCollideWith; + btAlignedObjectArray m_objectsWithoutCollisionCheck; + ///internal update revision number. It will be increased when the object changes. This allows some subsystems to perform lazy evaluation. int m_updateRevision; - virtual bool checkCollideWithOverride(const btCollisionObject* /* co */) const - { - return true; - } public: @@ -225,7 +223,34 @@ public: return m_collisionShape; } - + void setIgnoreCollisionCheck(const btCollisionObject* co, bool ignoreCollisionCheck) + { + if (ignoreCollisionCheck) + { + //We don't check for duplicates. Is it ok to leave that up to the user of this API? + //int index = m_objectsWithoutCollisionCheck.findLinearSearch(co); + //if (index == m_objectsWithoutCollisionCheck.size()) + //{ + m_objectsWithoutCollisionCheck.push_back(co); + //} + } + else + { + m_objectsWithoutCollisionCheck.remove(co); + } + m_checkCollideWith = m_objectsWithoutCollisionCheck.size() > 0; + } + + virtual bool checkCollideWithOverride(const btCollisionObject* co) const + { + int index = m_objectsWithoutCollisionCheck.findLinearSearch(co); + if (index < m_objectsWithoutCollisionCheck.size()) + { + return false; + } + return true; + } + diff --git a/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp b/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp index 0010ee2a9..bdd60a541 100644 --- a/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp +++ b/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp @@ -294,10 +294,11 @@ void btCollisionWorld::rayTestSingleInternal(const btTransform& rayFromTrans,con //btContinuousConvexCollision convexCaster(castShape,convexShape,&simplexSolver,0); bool condition = true; btConvexCast* convexCasterPtr = 0; - if (resultCallback.m_flags & btTriangleRaycastCallback::kF_UseSubSimplexConvexCastRaytest) - convexCasterPtr = &subSimplexConvexCaster; - else + //use kF_UseSubSimplexConvexCastRaytest by default + if (resultCallback.m_flags & btTriangleRaycastCallback::kF_UseGjkConvexCastRaytest) convexCasterPtr = &gjkConvexCaster; + else + convexCasterPtr = &subSimplexConvexCaster; btConvexCast& convexCaster = *convexCasterPtr; diff --git a/src/BulletCollision/CollisionDispatch/btInternalEdgeUtility.cpp b/src/BulletCollision/CollisionDispatch/btInternalEdgeUtility.cpp index 73fa4e87e..f97d11db7 100644 --- a/src/BulletCollision/CollisionDispatch/btInternalEdgeUtility.cpp +++ b/src/BulletCollision/CollisionDispatch/btInternalEdgeUtility.cpp @@ -114,6 +114,7 @@ struct btConnectivityProcessor : public btTriangleCallback if(numshared >= 3) return; } + switch (numshared) { case 0: @@ -202,7 +203,6 @@ struct btConnectivityProcessor : public btTriangleCallback ang4 = 0.f; } else { - calculatedEdge.normalize(); btVector3 calculatedNormalA = calculatedEdge.cross(edgeCrossA); calculatedNormalA.normalize(); @@ -213,7 +213,7 @@ struct btConnectivityProcessor : public btTriangleCallback isConvex = (dotA<0.); correctedAngle = isConvex ? ang4 : -ang4; - btQuaternion orn2(calculatedEdge,-correctedAngle); + btQuaternion orn2 = btQuaternion(btVector3(calculatedEdge.x(), calculatedEdge.y(), calculatedEdge.z()),-correctedAngle); calculatedNormalB = btMatrix3x3(orn2)*normalA; @@ -301,11 +301,6 @@ struct btConnectivityProcessor : public btTriangleCallback break; } - default: - { - // printf("warning: duplicate triangle\n"); - } - } } }; diff --git a/src/BulletCollision/CollisionShapes/btCollisionShape.h b/src/BulletCollision/CollisionShapes/btCollisionShape.h index ff017a206..1d8a4dc30 100644 --- a/src/BulletCollision/CollisionShapes/btCollisionShape.h +++ b/src/BulletCollision/CollisionShapes/btCollisionShape.h @@ -28,8 +28,13 @@ ATTRIBUTE_ALIGNED16(class) btCollisionShape { protected: int m_shapeType; - void* m_userPointer; + union + { + void* m_userPointer; + int m_userIndex; + }; + public: BT_DECLARE_ALIGNED_ALLOCATOR(); @@ -131,6 +136,16 @@ public: return m_userPointer; } + void setUserIndex(int index) + { + m_userIndex = index; + } + + int getUserIndex() const + { + return m_userIndex; + } + virtual int calculateSerializeBufferSize() const; ///fills the dataBuffer and returns the struct name (and 0 on failure) diff --git a/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp b/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp index 26322791d..bf255dfc8 100644 --- a/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp +++ b/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp @@ -365,14 +365,15 @@ void btHeightfieldTerrainShape::processAllTriangles(btTriangleCallback* callback { //first triangle getVertex(x,j,vertices[0]); - getVertex(x+1,j,vertices[1]); - getVertex(x+1,j+1,vertices[2]); + getVertex(x, j + 1, vertices[1]); + getVertex(x + 1, j + 1, vertices[2]); callback->processTriangle(vertices,x,j); //second triangle // getVertex(x,j,vertices[0]);//already got this vertex before, thanks to Danny Chapman getVertex(x+1,j+1,vertices[1]); - getVertex(x,j+1,vertices[2]); - callback->processTriangle(vertices,x,j); + getVertex(x + 1, j, vertices[2]); + callback->processTriangle(vertices, x, j); + } else { //first triangle diff --git a/src/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.cpp b/src/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.cpp index 887757949..4c8ff2fab 100644 --- a/src/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.cpp +++ b/src/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.cpp @@ -26,7 +26,6 @@ subject to the following restrictions: #ifdef __SPU__ #include #define printf spu_printf -//#define DEBUG_SPU_COLLISION_DETECTION 1 #endif //__SPU__ #endif @@ -81,17 +80,18 @@ void btGjkPairDetector::getClosestPoints(const ClosestPointInput& input,Result& #ifdef __SPU__ void btGjkPairDetector::getClosestPointsNonVirtual(const ClosestPointInput& input,Result& output,class btIDebugDraw* debugDraw) #else -void btGjkPairDetector::getClosestPointsNonVirtual(const ClosestPointInput& input,Result& output,class btIDebugDraw* debugDraw) +void btGjkPairDetector::getClosestPointsNonVirtual(const ClosestPointInput& input, Result& output, class btIDebugDraw* debugDraw) #endif { m_cachedSeparatingDistance = 0.f; btScalar distance=btScalar(0.); btVector3 normalInB(btScalar(0.),btScalar(0.),btScalar(0.)); + btVector3 pointOnA,pointOnB; btTransform localTransA = input.m_transformA; btTransform localTransB = input.m_transformB; - btVector3 positionOffset = (localTransA.getOrigin() + localTransB.getOrigin()) * btScalar(0.5); + btVector3 positionOffset=(localTransA.getOrigin() + localTransB.getOrigin()) * btScalar(0.5); localTransA.getOrigin() -= positionOffset; localTransB.getOrigin() -= positionOffset; @@ -102,17 +102,11 @@ void btGjkPairDetector::getClosestPointsNonVirtual(const ClosestPointInput& inpu gNumGjkChecks++; -#ifdef DEBUG_SPU_COLLISION_DETECTION - spu_printf("inside gjk\n"); -#endif //for CCD we don't use margins if (m_ignoreMargin) { marginA = btScalar(0.); marginB = btScalar(0.); -#ifdef DEBUG_SPU_COLLISION_DETECTION - spu_printf("ignoring margin\n"); -#endif } m_curIter = 0; @@ -143,37 +137,13 @@ void btGjkPairDetector::getClosestPointsNonVirtual(const ClosestPointInput& inpu btVector3 seperatingAxisInA = (-m_cachedSeparatingAxis)* input.m_transformA.getBasis(); btVector3 seperatingAxisInB = m_cachedSeparatingAxis* input.m_transformB.getBasis(); -#if 1 btVector3 pInA = m_minkowskiA->localGetSupportVertexWithoutMarginNonVirtual(seperatingAxisInA); btVector3 qInB = m_minkowskiB->localGetSupportVertexWithoutMarginNonVirtual(seperatingAxisInB); -// btVector3 pInA = localGetSupportingVertexWithoutMargin(m_shapeTypeA, m_minkowskiA, seperatingAxisInA,input.m_convexVertexData[0]);//, &featureIndexA); -// btVector3 qInB = localGetSupportingVertexWithoutMargin(m_shapeTypeB, m_minkowskiB, seperatingAxisInB,input.m_convexVertexData[1]);//, &featureIndexB); - -#else -#ifdef __SPU__ - btVector3 pInA = m_minkowskiA->localGetSupportVertexWithoutMarginNonVirtual(seperatingAxisInA); - btVector3 qInB = m_minkowskiB->localGetSupportVertexWithoutMarginNonVirtual(seperatingAxisInB); -#else - btVector3 pInA = m_minkowskiA->localGetSupportingVertexWithoutMargin(seperatingAxisInA); - btVector3 qInB = m_minkowskiB->localGetSupportingVertexWithoutMargin(seperatingAxisInB); -#ifdef TEST_NON_VIRTUAL - btVector3 pInAv = m_minkowskiA->localGetSupportingVertexWithoutMargin(seperatingAxisInA); - btVector3 qInBv = m_minkowskiB->localGetSupportingVertexWithoutMargin(seperatingAxisInB); - btAssert((pInAv-pInA).length() < 0.0001); - btAssert((qInBv-qInB).length() < 0.0001); -#endif // -#endif //__SPU__ -#endif - - btVector3 pWorld = localTransA(pInA); btVector3 qWorld = localTransB(qInB); -#ifdef DEBUG_SPU_COLLISION_DETECTION - spu_printf("got local supporting vertices\n"); -#endif if (check2d) { @@ -217,14 +187,8 @@ void btGjkPairDetector::getClosestPointsNonVirtual(const ClosestPointInput& inpu break; } -#ifdef DEBUG_SPU_COLLISION_DETECTION - spu_printf("addVertex 1\n"); -#endif //add current vertex to simplex m_simplexSolver->addVertex(w, pWorld, qWorld); -#ifdef DEBUG_SPU_COLLISION_DETECTION - spu_printf("addVertex 2\n"); -#endif btVector3 newCachedSeparatingAxis; //calculate the closest point to the origin (update vector v) @@ -274,7 +238,7 @@ void btGjkPairDetector::getClosestPointsNonVirtual(const ClosestPointInput& inpu //degeneracy, this is typically due to invalid/uninitialized worldtransforms for a btCollisionObject if (m_curIter++ > gGjkMaxIter) { - #if defined(DEBUG) || defined (_DEBUG) || defined (DEBUG_SPU_COLLISION_DETECTION) + #if defined(DEBUG) || defined (_DEBUG) printf("btGjkPairDetector maxIter exceeded:%i\n",m_curIter); printf("sepAxis=(%f,%f,%f), squaredDistance = %f, shapeTypeA=%i,shapeTypeB=%i\n", @@ -307,6 +271,7 @@ void btGjkPairDetector::getClosestPointsNonVirtual(const ClosestPointInput& inpu { m_simplexSolver->compute_points(pointOnA, pointOnB); normalInB = m_cachedSeparatingAxis; + btScalar lenSqr =m_cachedSeparatingAxis.length2(); //valid normal @@ -318,6 +283,7 @@ void btGjkPairDetector::getClosestPointsNonVirtual(const ClosestPointInput& inpu { btScalar rlen = btScalar(1.) / btSqrt(lenSqr ); normalInB *= rlen; //normalize + btScalar s = btSqrt(squaredDistance); btAssert(s > btScalar(0.0)); @@ -380,6 +346,7 @@ void btGjkPairDetector::getClosestPointsNonVirtual(const ClosestPointInput& inpu pointOnA = tmpPointOnA; pointOnB = tmpPointOnB; normalInB = tmpNormalInB; + isValid = true; m_lastUsedMethod = 3; } else @@ -413,6 +380,7 @@ void btGjkPairDetector::getClosestPointsNonVirtual(const ClosestPointInput& inpu pointOnB += m_cachedSeparatingAxis * marginB ; normalInB = m_cachedSeparatingAxis; normalInB.normalize(); + isValid = true; m_lastUsedMethod = 6; } else @@ -431,36 +399,7 @@ void btGjkPairDetector::getClosestPointsNonVirtual(const ClosestPointInput& inpu if (isValid && ((distance < 0) || (distance*distance < input.m_maximumDistanceSquared))) { -#if 0 -///some debugging -// if (check2d) - { - printf("n = %2.3f,%2.3f,%2.3f. ",normalInB[0],normalInB[1],normalInB[2]); - printf("distance = %2.3f exit=%d deg=%d\n",distance,m_lastUsedMethod,m_degenerateSimplex); - } -#endif - if (m_fixContactNormalDirection) - { - ///@workaround for sticky convex collisions - //in some degenerate cases (usually when the use uses very small margins) - //the contact normal is pointing the wrong direction - //so fix it now (until we can deal with all degenerate cases in GJK and EPA) - //contact normals need to point from B to A in all cases, so we can simply check if the contact normal really points from B to A - //We like to use a dot product of the normal against the difference of the centroids, - //once the centroid is available in the API - //until then we use the center of the aabb to approximate the centroid - btVector3 aabbMin,aabbMax; - m_minkowskiA->getAabb(localTransA,aabbMin,aabbMax); - btVector3 posA = (aabbMax+aabbMin)*btScalar(0.5); - - m_minkowskiB->getAabb(localTransB,aabbMin,aabbMax); - btVector3 posB = (aabbMin+aabbMax)*btScalar(0.5); - - btVector3 diff = posA-posB; - if (diff.dot(normalInB) < 0.f) - normalInB *= -1.f; - } m_cachedSeparatingAxis = normalInB; m_cachedSeparatingDistance = distance; diff --git a/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.h b/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.h index 3999d4005..4aecffd64 100644 --- a/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.h +++ b/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.h @@ -21,6 +21,7 @@ subject to the following restrictions: struct btBroadphaseProxy; class btConvexShape; + class btTriangleRaycastCallback: public btTriangleCallback { public: @@ -32,10 +33,12 @@ public: //@BP Mod - allow backface filtering and unflipped normals enum EFlags { - kF_None = 0, + kF_None = 0, kF_FilterBackfaces = 1 << 0, kF_KeepUnflippedNormal = 1 << 1, // Prevents returned face normal getting flipped when a ray hits a back-facing triangle - kF_UseSubSimplexConvexCastRaytest = 1 << 2, // Uses an approximate but faster ray versus convex intersection algorithm + ///SubSimplexConvexCastRaytest is the default, even if kF_None is set. + kF_UseSubSimplexConvexCastRaytest = 1 << 2, // Uses an approximate but faster ray versus convex intersection algorithm + kF_UseGjkConvexCastRaytest = 1 << 3, kF_Terminator = 0xFFFFFFFF }; unsigned int m_flags; diff --git a/src/BulletDynamics/ConstraintSolver/btHingeConstraint.cpp b/src/BulletDynamics/ConstraintSolver/btHingeConstraint.cpp index c18974130..6e2cd66b8 100644 --- a/src/BulletDynamics/ConstraintSolver/btHingeConstraint.cpp +++ b/src/BulletDynamics/ConstraintSolver/btHingeConstraint.cpp @@ -285,8 +285,59 @@ void btHingeConstraint::buildJacobian() #endif //__SPU__ +static inline btScalar btNormalizeAnglePositive(btScalar angle) +{ + return btFmod(btFmod(angle, 2.0*SIMD_PI) + 2.0*SIMD_PI, 2.0*SIMD_PI); +} + + + +static btScalar btShortestAngularDistance(btScalar accAngle, btScalar curAngle) +{ + btScalar result = btNormalizeAngle(btNormalizeAnglePositive(btNormalizeAnglePositive(curAngle) - + btNormalizeAnglePositive(accAngle))); + return result; +} + +static btScalar btShortestAngleUpdate(btScalar accAngle, btScalar curAngle) +{ + btScalar tol(0.3); + btScalar result = btShortestAngularDistance(accAngle, curAngle); + + if (btFabs(result) > tol) + return curAngle; + else + return accAngle + result; + + return curAngle; +} + + +btScalar btHingeAccumulatedAngleConstraint::getAccumulatedHingeAngle() +{ + btScalar hingeAngle = getHingeAngle(); + m_accumulatedAngle = btShortestAngleUpdate(m_accumulatedAngle,hingeAngle); + return m_accumulatedAngle; +} +void btHingeAccumulatedAngleConstraint::setAccumulatedHingeAngle(btScalar accAngle) +{ + m_accumulatedAngle = accAngle; +} + +void btHingeAccumulatedAngleConstraint::getInfo1(btConstraintInfo1* info) +{ + //update m_accumulatedAngle + btScalar curHingeAngle = getHingeAngle(); + m_accumulatedAngle = btShortestAngleUpdate(m_accumulatedAngle,curHingeAngle); + + btHingeConstraint::getInfo1(info); +} + + void btHingeConstraint::getInfo1(btConstraintInfo1* info) { + + if (m_useSolveConstraintObsolete) { info->m_numConstraintRows = 0; @@ -606,6 +657,8 @@ void btHingeConstraint::updateRHS(btScalar timeStep) } + + btScalar btHingeConstraint::getHingeAngle() { return getHingeAngle(m_rbA.getCenterOfMassTransform(),m_rbB.getCenterOfMassTransform()); diff --git a/src/BulletDynamics/ConstraintSolver/btHingeConstraint.h b/src/BulletDynamics/ConstraintSolver/btHingeConstraint.h index 7c33ac24e..30d506c6e 100644 --- a/src/BulletDynamics/ConstraintSolver/btHingeConstraint.h +++ b/src/BulletDynamics/ConstraintSolver/btHingeConstraint.h @@ -236,6 +236,7 @@ public: } + ///The getHingeAngle gives the hinge angle in range [-PI,PI] btScalar getHingeAngle(); btScalar getHingeAngle(const btTransform& transA,const btTransform& transB); @@ -326,6 +327,43 @@ struct btHingeConstraintDoubleData }; #endif //BT_BACKWARDS_COMPATIBLE_SERIALIZATION +///The getAccumulatedHingeAngle returns the accumulated hinge angle, taking rotation across the -PI/PI boundary into account +ATTRIBUTE_ALIGNED16(class) btHingeAccumulatedAngleConstraint : public btHingeConstraint +{ +protected: + btScalar m_accumulatedAngle; +public: + + BT_DECLARE_ALIGNED_ALLOCATOR(); + + btHingeAccumulatedAngleConstraint(btRigidBody& rbA,btRigidBody& rbB, const btVector3& pivotInA,const btVector3& pivotInB, const btVector3& axisInA,const btVector3& axisInB, bool useReferenceFrameA = false) + :btHingeConstraint(rbA,rbB,pivotInA,pivotInB, axisInA,axisInB, useReferenceFrameA ) + { + m_accumulatedAngle=getHingeAngle(); + } + + btHingeAccumulatedAngleConstraint(btRigidBody& rbA,const btVector3& pivotInA,const btVector3& axisInA, bool useReferenceFrameA = false) + :btHingeConstraint(rbA,pivotInA,axisInA, useReferenceFrameA) + { + m_accumulatedAngle=getHingeAngle(); + } + + btHingeAccumulatedAngleConstraint(btRigidBody& rbA,btRigidBody& rbB, const btTransform& rbAFrame, const btTransform& rbBFrame, bool useReferenceFrameA = false) + :btHingeConstraint(rbA,rbB, rbAFrame, rbBFrame, useReferenceFrameA ) + { + m_accumulatedAngle=getHingeAngle(); + } + + btHingeAccumulatedAngleConstraint(btRigidBody& rbA,const btTransform& rbAFrame, bool useReferenceFrameA = false) + :btHingeConstraint(rbA,rbAFrame, useReferenceFrameA ) + { + m_accumulatedAngle=getHingeAngle(); + } + btScalar getAccumulatedHingeAngle(); + void setAccumulatedHingeAngle(btScalar accAngle); + virtual void getInfo1 (btConstraintInfo1* info); + +}; struct btHingeConstraintFloatData { diff --git a/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp b/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp index f855581c7..8385639a1 100644 --- a/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp +++ b/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp @@ -4,8 +4,8 @@ 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, +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. @@ -22,6 +22,8 @@ subject to the following restrictions: #include "BulletCollision/NarrowPhaseCollision/btPersistentManifold.h" #include "LinearMath/btIDebugDraw.h" +#include "LinearMath/btCpuFeatureUtility.h" + //#include "btJacobianEntry.h" #include "LinearMath/btMinMax.h" #include "BulletDynamics/ConstraintSolver/btTypedConstraint.h" @@ -37,57 +39,238 @@ int gNumSplitImpulseRecoveries = 0; #include "BulletDynamics/Dynamics/btRigidBody.h" -btSequentialImpulseConstraintSolver::btSequentialImpulseConstraintSolver() -:m_btSeed2(0) -{ +///This is the scalar reference implementation of solving a single constraint row, the innerloop of the Projected Gauss Seidel/Sequential Impulse constraint solver +///Below are optional SSE2 and SSE4/FMA3 versions. We assume most hardware has SSE2. For SSE4/FMA3 we perform a CPU feature check. +static btSimdScalar gResolveSingleConstraintRowGeneric_scalar_reference(btSolverBody& body1, btSolverBody& body2, const btSolverConstraint& c) +{ + btScalar deltaImpulse = c.m_rhs - btScalar(c.m_appliedImpulse)*c.m_cfm; + const btScalar deltaVel1Dotn = c.m_contactNormal1.dot(body1.internalGetDeltaLinearVelocity()) + c.m_relpos1CrossNormal.dot(body1.internalGetDeltaAngularVelocity()); + const btScalar deltaVel2Dotn = c.m_contactNormal2.dot(body2.internalGetDeltaLinearVelocity()) + c.m_relpos2CrossNormal.dot(body2.internalGetDeltaAngularVelocity()); + + // const btScalar delta_rel_vel = deltaVel1Dotn-deltaVel2Dotn; + deltaImpulse -= deltaVel1Dotn*c.m_jacDiagABInv; + deltaImpulse -= deltaVel2Dotn*c.m_jacDiagABInv; + + const btScalar sum = btScalar(c.m_appliedImpulse) + deltaImpulse; + if (sum < c.m_lowerLimit) + { + deltaImpulse = c.m_lowerLimit - c.m_appliedImpulse; + c.m_appliedImpulse = c.m_lowerLimit; + } + else if (sum > c.m_upperLimit) + { + deltaImpulse = c.m_upperLimit - c.m_appliedImpulse; + c.m_appliedImpulse = c.m_upperLimit; + } + else + { + c.m_appliedImpulse = sum; + } + + body1.internalApplyImpulse(c.m_contactNormal1*body1.internalGetInvMass(), c.m_angularComponentA, deltaImpulse); + body2.internalApplyImpulse(c.m_contactNormal2*body2.internalGetInvMass(), c.m_angularComponentB, deltaImpulse); + + return deltaImpulse; } -btSequentialImpulseConstraintSolver::~btSequentialImpulseConstraintSolver() + +static btSimdScalar gResolveSingleConstraintRowLowerLimit_scalar_reference(btSolverBody& body1, btSolverBody& body2, const btSolverConstraint& c) { + btScalar deltaImpulse = c.m_rhs - btScalar(c.m_appliedImpulse)*c.m_cfm; + const btScalar deltaVel1Dotn = c.m_contactNormal1.dot(body1.internalGetDeltaLinearVelocity()) + c.m_relpos1CrossNormal.dot(body1.internalGetDeltaAngularVelocity()); + const btScalar deltaVel2Dotn = c.m_contactNormal2.dot(body2.internalGetDeltaLinearVelocity()) + c.m_relpos2CrossNormal.dot(body2.internalGetDeltaAngularVelocity()); + + deltaImpulse -= deltaVel1Dotn*c.m_jacDiagABInv; + deltaImpulse -= deltaVel2Dotn*c.m_jacDiagABInv; + const btScalar sum = btScalar(c.m_appliedImpulse) + deltaImpulse; + if (sum < c.m_lowerLimit) + { + deltaImpulse = c.m_lowerLimit - c.m_appliedImpulse; + c.m_appliedImpulse = c.m_lowerLimit; + } + else + { + c.m_appliedImpulse = sum; + } + body1.internalApplyImpulse(c.m_contactNormal1*body1.internalGetInvMass(), c.m_angularComponentA, deltaImpulse); + body2.internalApplyImpulse(c.m_contactNormal2*body2.internalGetInvMass(), c.m_angularComponentB, deltaImpulse); + + return deltaImpulse; } + + #ifdef USE_SIMD #include + + #define btVecSplat(x, e) _mm_shuffle_ps(x, x, _MM_SHUFFLE(e,e,e,e)) static inline __m128 btSimdDot3( __m128 vec0, __m128 vec1 ) { __m128 result = _mm_mul_ps( vec0, vec1); return _mm_add_ps( btVecSplat( result, 0 ), _mm_add_ps( btVecSplat( result, 1 ), btVecSplat( result, 2 ) ) ); } -#endif//USE_SIMD + +#if defined (BT_ALLOW_SSE4) +#include + +#define USE_FMA 1 +#define USE_FMA3_INSTEAD_FMA4 1 +#define USE_SSE4_DOT 1 + +#define SSE4_DP(a, b) _mm_dp_ps(a, b, 0x7f) +#define SSE4_DP_FP(a, b) _mm_cvtss_f32(_mm_dp_ps(a, b, 0x7f)) + +#if USE_SSE4_DOT +#define DOT_PRODUCT(a, b) SSE4_DP(a, b) +#else +#define DOT_PRODUCT(a, b) btSimdDot3(a, b) +#endif + +#if USE_FMA +#if USE_FMA3_INSTEAD_FMA4 +// a*b + c +#define FMADD(a, b, c) _mm_fmadd_ps(a, b, c) +// -(a*b) + c +#define FMNADD(a, b, c) _mm_fnmadd_ps(a, b, c) +#else // USE_FMA3 +// a*b + c +#define FMADD(a, b, c) _mm_macc_ps(a, b, c) +// -(a*b) + c +#define FMNADD(a, b, c) _mm_nmacc_ps(a, b, c) +#endif +#else // USE_FMA +// c + a*b +#define FMADD(a, b, c) _mm_add_ps(c, _mm_mul_ps(a, b)) +// c - a*b +#define FMNADD(a, b, c) _mm_sub_ps(c, _mm_mul_ps(a, b)) +#endif +#endif // Project Gauss Seidel or the equivalent Sequential Impulse -btSimdScalar btSequentialImpulseConstraintSolver::resolveSingleConstraintRowGenericSIMD(btSolverBody& body1,btSolverBody& body2,const btSolverConstraint& c) +static btSimdScalar gResolveSingleConstraintRowGeneric_sse2(btSolverBody& body1, btSolverBody& body2, const btSolverConstraint& c) { -#ifdef USE_SIMD __m128 cpAppliedImp = _mm_set1_ps(c.m_appliedImpulse); __m128 lowerLimit1 = _mm_set1_ps(c.m_lowerLimit); __m128 upperLimit1 = _mm_set1_ps(c.m_upperLimit); - btSimdScalar deltaImpulse = _mm_sub_ps(_mm_set1_ps(c.m_rhs), _mm_mul_ps(_mm_set1_ps(c.m_appliedImpulse),_mm_set1_ps(c.m_cfm))); - __m128 deltaVel1Dotn = _mm_add_ps(btSimdDot3(c.m_contactNormal1.mVec128,body1.internalGetDeltaLinearVelocity().mVec128), btSimdDot3(c.m_relpos1CrossNormal.mVec128,body1.internalGetDeltaAngularVelocity().mVec128)); - __m128 deltaVel2Dotn = _mm_add_ps(btSimdDot3(c.m_contactNormal2.mVec128,body2.internalGetDeltaLinearVelocity().mVec128), btSimdDot3(c.m_relpos2CrossNormal.mVec128,body2.internalGetDeltaAngularVelocity().mVec128)); - deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel1Dotn,_mm_set1_ps(c.m_jacDiagABInv))); - deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel2Dotn,_mm_set1_ps(c.m_jacDiagABInv))); - btSimdScalar sum = _mm_add_ps(cpAppliedImp,deltaImpulse); - btSimdScalar resultLowerLess,resultUpperLess; - resultLowerLess = _mm_cmplt_ps(sum,lowerLimit1); - resultUpperLess = _mm_cmplt_ps(sum,upperLimit1); - __m128 lowMinApplied = _mm_sub_ps(lowerLimit1,cpAppliedImp); - deltaImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowMinApplied), _mm_andnot_ps(resultLowerLess, deltaImpulse) ); - c.m_appliedImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowerLimit1), _mm_andnot_ps(resultLowerLess, sum) ); - __m128 upperMinApplied = _mm_sub_ps(upperLimit1,cpAppliedImp); - deltaImpulse = _mm_or_ps( _mm_and_ps(resultUpperLess, deltaImpulse), _mm_andnot_ps(resultUpperLess, upperMinApplied) ); - c.m_appliedImpulse = _mm_or_ps( _mm_and_ps(resultUpperLess, c.m_appliedImpulse), _mm_andnot_ps(resultUpperLess, upperLimit1) ); - __m128 linearComponentA = _mm_mul_ps(c.m_contactNormal1.mVec128,body1.internalGetInvMass().mVec128); - __m128 linearComponentB = _mm_mul_ps((c.m_contactNormal2).mVec128,body2.internalGetInvMass().mVec128); + btSimdScalar deltaImpulse = _mm_sub_ps(_mm_set1_ps(c.m_rhs), _mm_mul_ps(_mm_set1_ps(c.m_appliedImpulse), _mm_set1_ps(c.m_cfm))); + __m128 deltaVel1Dotn = _mm_add_ps(btSimdDot3(c.m_contactNormal1.mVec128, body1.internalGetDeltaLinearVelocity().mVec128), btSimdDot3(c.m_relpos1CrossNormal.mVec128, body1.internalGetDeltaAngularVelocity().mVec128)); + __m128 deltaVel2Dotn = _mm_add_ps(btSimdDot3(c.m_contactNormal2.mVec128, body2.internalGetDeltaLinearVelocity().mVec128), btSimdDot3(c.m_relpos2CrossNormal.mVec128, body2.internalGetDeltaAngularVelocity().mVec128)); + deltaImpulse = _mm_sub_ps(deltaImpulse, _mm_mul_ps(deltaVel1Dotn, _mm_set1_ps(c.m_jacDiagABInv))); + deltaImpulse = _mm_sub_ps(deltaImpulse, _mm_mul_ps(deltaVel2Dotn, _mm_set1_ps(c.m_jacDiagABInv))); + btSimdScalar sum = _mm_add_ps(cpAppliedImp, deltaImpulse); + btSimdScalar resultLowerLess, resultUpperLess; + resultLowerLess = _mm_cmplt_ps(sum, lowerLimit1); + resultUpperLess = _mm_cmplt_ps(sum, upperLimit1); + __m128 lowMinApplied = _mm_sub_ps(lowerLimit1, cpAppliedImp); + deltaImpulse = _mm_or_ps(_mm_and_ps(resultLowerLess, lowMinApplied), _mm_andnot_ps(resultLowerLess, deltaImpulse)); + c.m_appliedImpulse = _mm_or_ps(_mm_and_ps(resultLowerLess, lowerLimit1), _mm_andnot_ps(resultLowerLess, sum)); + __m128 upperMinApplied = _mm_sub_ps(upperLimit1, cpAppliedImp); + deltaImpulse = _mm_or_ps(_mm_and_ps(resultUpperLess, deltaImpulse), _mm_andnot_ps(resultUpperLess, upperMinApplied)); + c.m_appliedImpulse = _mm_or_ps(_mm_and_ps(resultUpperLess, c.m_appliedImpulse), _mm_andnot_ps(resultUpperLess, upperLimit1)); + __m128 linearComponentA = _mm_mul_ps(c.m_contactNormal1.mVec128, body1.internalGetInvMass().mVec128); + __m128 linearComponentB = _mm_mul_ps((c.m_contactNormal2).mVec128, body2.internalGetInvMass().mVec128); __m128 impulseMagnitude = deltaImpulse; - body1.internalGetDeltaLinearVelocity().mVec128 = _mm_add_ps(body1.internalGetDeltaLinearVelocity().mVec128,_mm_mul_ps(linearComponentA,impulseMagnitude)); - body1.internalGetDeltaAngularVelocity().mVec128 = _mm_add_ps(body1.internalGetDeltaAngularVelocity().mVec128 ,_mm_mul_ps(c.m_angularComponentA.mVec128,impulseMagnitude)); - body2.internalGetDeltaLinearVelocity().mVec128 = _mm_add_ps(body2.internalGetDeltaLinearVelocity().mVec128,_mm_mul_ps(linearComponentB,impulseMagnitude)); - body2.internalGetDeltaAngularVelocity().mVec128 = _mm_add_ps(body2.internalGetDeltaAngularVelocity().mVec128 ,_mm_mul_ps(c.m_angularComponentB.mVec128,impulseMagnitude)); - + body1.internalGetDeltaLinearVelocity().mVec128 = _mm_add_ps(body1.internalGetDeltaLinearVelocity().mVec128, _mm_mul_ps(linearComponentA, impulseMagnitude)); + body1.internalGetDeltaAngularVelocity().mVec128 = _mm_add_ps(body1.internalGetDeltaAngularVelocity().mVec128, _mm_mul_ps(c.m_angularComponentA.mVec128, impulseMagnitude)); + body2.internalGetDeltaLinearVelocity().mVec128 = _mm_add_ps(body2.internalGetDeltaLinearVelocity().mVec128, _mm_mul_ps(linearComponentB, impulseMagnitude)); + body2.internalGetDeltaAngularVelocity().mVec128 = _mm_add_ps(body2.internalGetDeltaAngularVelocity().mVec128, _mm_mul_ps(c.m_angularComponentB.mVec128, impulseMagnitude)); return deltaImpulse; +} + + +// Enhanced version of gResolveSingleConstraintRowGeneric_sse2 with SSE4.1 and FMA3 +static btSimdScalar gResolveSingleConstraintRowGeneric_sse4_1_fma3(btSolverBody& body1, btSolverBody& body2, const btSolverConstraint& c) +{ +#if defined (BT_ALLOW_SSE4) + __m128 tmp = _mm_set_ps1(c.m_jacDiagABInv); + __m128 deltaImpulse = _mm_set_ps1(c.m_rhs - btScalar(c.m_appliedImpulse)*c.m_cfm); + const __m128 lowerLimit = _mm_set_ps1(c.m_lowerLimit); + const __m128 upperLimit = _mm_set_ps1(c.m_upperLimit); + const __m128 deltaVel1Dotn = _mm_add_ps(DOT_PRODUCT(c.m_contactNormal1.mVec128, body1.internalGetDeltaLinearVelocity().mVec128), DOT_PRODUCT(c.m_relpos1CrossNormal.mVec128, body1.internalGetDeltaAngularVelocity().mVec128)); + const __m128 deltaVel2Dotn = _mm_add_ps(DOT_PRODUCT(c.m_contactNormal2.mVec128, body2.internalGetDeltaLinearVelocity().mVec128), DOT_PRODUCT(c.m_relpos2CrossNormal.mVec128, body2.internalGetDeltaAngularVelocity().mVec128)); + deltaImpulse = FMNADD(deltaVel1Dotn, tmp, deltaImpulse); + deltaImpulse = FMNADD(deltaVel2Dotn, tmp, deltaImpulse); + tmp = _mm_add_ps(c.m_appliedImpulse, deltaImpulse); // sum + const __m128 maskLower = _mm_cmpgt_ps(tmp, lowerLimit); + const __m128 maskUpper = _mm_cmpgt_ps(upperLimit, tmp); + deltaImpulse = _mm_blendv_ps(_mm_sub_ps(lowerLimit, c.m_appliedImpulse), _mm_blendv_ps(_mm_sub_ps(upperLimit, c.m_appliedImpulse), deltaImpulse, maskUpper), maskLower); + c.m_appliedImpulse = _mm_blendv_ps(lowerLimit, _mm_blendv_ps(upperLimit, tmp, maskUpper), maskLower); + body1.internalGetDeltaLinearVelocity().mVec128 = FMADD(_mm_mul_ps(c.m_contactNormal1.mVec128, body1.internalGetInvMass().mVec128), deltaImpulse, body1.internalGetDeltaLinearVelocity().mVec128); + body1.internalGetDeltaAngularVelocity().mVec128 = FMADD(c.m_angularComponentA.mVec128, deltaImpulse, body1.internalGetDeltaAngularVelocity().mVec128); + body2.internalGetDeltaLinearVelocity().mVec128 = FMADD(_mm_mul_ps(c.m_contactNormal2.mVec128, body2.internalGetInvMass().mVec128), deltaImpulse, body2.internalGetDeltaLinearVelocity().mVec128); + body2.internalGetDeltaAngularVelocity().mVec128 = FMADD(c.m_angularComponentB.mVec128, deltaImpulse, body2.internalGetDeltaAngularVelocity().mVec128); + return deltaImpulse; +#else + return gResolveSingleConstraintRowGeneric_sse2(body1,body2,c); +#endif +} + + + +static btSimdScalar gResolveSingleConstraintRowLowerLimit_sse2(btSolverBody& body1, btSolverBody& body2, const btSolverConstraint& c) +{ + __m128 cpAppliedImp = _mm_set1_ps(c.m_appliedImpulse); + __m128 lowerLimit1 = _mm_set1_ps(c.m_lowerLimit); + __m128 upperLimit1 = _mm_set1_ps(c.m_upperLimit); + btSimdScalar deltaImpulse = _mm_sub_ps(_mm_set1_ps(c.m_rhs), _mm_mul_ps(_mm_set1_ps(c.m_appliedImpulse), _mm_set1_ps(c.m_cfm))); + __m128 deltaVel1Dotn = _mm_add_ps(btSimdDot3(c.m_contactNormal1.mVec128, body1.internalGetDeltaLinearVelocity().mVec128), btSimdDot3(c.m_relpos1CrossNormal.mVec128, body1.internalGetDeltaAngularVelocity().mVec128)); + __m128 deltaVel2Dotn = _mm_add_ps(btSimdDot3(c.m_contactNormal2.mVec128, body2.internalGetDeltaLinearVelocity().mVec128), btSimdDot3(c.m_relpos2CrossNormal.mVec128, body2.internalGetDeltaAngularVelocity().mVec128)); + deltaImpulse = _mm_sub_ps(deltaImpulse, _mm_mul_ps(deltaVel1Dotn, _mm_set1_ps(c.m_jacDiagABInv))); + deltaImpulse = _mm_sub_ps(deltaImpulse, _mm_mul_ps(deltaVel2Dotn, _mm_set1_ps(c.m_jacDiagABInv))); + btSimdScalar sum = _mm_add_ps(cpAppliedImp, deltaImpulse); + btSimdScalar resultLowerLess, resultUpperLess; + resultLowerLess = _mm_cmplt_ps(sum, lowerLimit1); + resultUpperLess = _mm_cmplt_ps(sum, upperLimit1); + __m128 lowMinApplied = _mm_sub_ps(lowerLimit1, cpAppliedImp); + deltaImpulse = _mm_or_ps(_mm_and_ps(resultLowerLess, lowMinApplied), _mm_andnot_ps(resultLowerLess, deltaImpulse)); + c.m_appliedImpulse = _mm_or_ps(_mm_and_ps(resultLowerLess, lowerLimit1), _mm_andnot_ps(resultLowerLess, sum)); + __m128 linearComponentA = _mm_mul_ps(c.m_contactNormal1.mVec128, body1.internalGetInvMass().mVec128); + __m128 linearComponentB = _mm_mul_ps(c.m_contactNormal2.mVec128, body2.internalGetInvMass().mVec128); + __m128 impulseMagnitude = deltaImpulse; + body1.internalGetDeltaLinearVelocity().mVec128 = _mm_add_ps(body1.internalGetDeltaLinearVelocity().mVec128, _mm_mul_ps(linearComponentA, impulseMagnitude)); + body1.internalGetDeltaAngularVelocity().mVec128 = _mm_add_ps(body1.internalGetDeltaAngularVelocity().mVec128, _mm_mul_ps(c.m_angularComponentA.mVec128, impulseMagnitude)); + body2.internalGetDeltaLinearVelocity().mVec128 = _mm_add_ps(body2.internalGetDeltaLinearVelocity().mVec128, _mm_mul_ps(linearComponentB, impulseMagnitude)); + body2.internalGetDeltaAngularVelocity().mVec128 = _mm_add_ps(body2.internalGetDeltaAngularVelocity().mVec128, _mm_mul_ps(c.m_angularComponentB.mVec128, impulseMagnitude)); + return deltaImpulse; +} + + +// Enhanced version of gResolveSingleConstraintRowGeneric_sse2 with SSE4.1 and FMA3 +static btSimdScalar gResolveSingleConstraintRowLowerLimit_sse4_1_fma3(btSolverBody& body1, btSolverBody& body2, const btSolverConstraint& c) +{ +#ifdef BT_ALLOW_SSE4 + __m128 tmp = _mm_set_ps1(c.m_jacDiagABInv); + __m128 deltaImpulse = _mm_set_ps1(c.m_rhs - btScalar(c.m_appliedImpulse)*c.m_cfm); + const __m128 lowerLimit = _mm_set_ps1(c.m_lowerLimit); + const __m128 deltaVel1Dotn = _mm_add_ps(DOT_PRODUCT(c.m_contactNormal1.mVec128, body1.internalGetDeltaLinearVelocity().mVec128), DOT_PRODUCT(c.m_relpos1CrossNormal.mVec128, body1.internalGetDeltaAngularVelocity().mVec128)); + const __m128 deltaVel2Dotn = _mm_add_ps(DOT_PRODUCT(c.m_contactNormal2.mVec128, body2.internalGetDeltaLinearVelocity().mVec128), DOT_PRODUCT(c.m_relpos2CrossNormal.mVec128, body2.internalGetDeltaAngularVelocity().mVec128)); + deltaImpulse = FMNADD(deltaVel1Dotn, tmp, deltaImpulse); + deltaImpulse = FMNADD(deltaVel2Dotn, tmp, deltaImpulse); + tmp = _mm_add_ps(c.m_appliedImpulse, deltaImpulse); + const __m128 mask = _mm_cmpgt_ps(tmp, lowerLimit); + deltaImpulse = _mm_blendv_ps(_mm_sub_ps(lowerLimit, c.m_appliedImpulse), deltaImpulse, mask); + c.m_appliedImpulse = _mm_blendv_ps(lowerLimit, tmp, mask); + body1.internalGetDeltaLinearVelocity().mVec128 = FMADD(_mm_mul_ps(c.m_contactNormal1.mVec128, body1.internalGetInvMass().mVec128), deltaImpulse, body1.internalGetDeltaLinearVelocity().mVec128); + body1.internalGetDeltaAngularVelocity().mVec128 = FMADD(c.m_angularComponentA.mVec128, deltaImpulse, body1.internalGetDeltaAngularVelocity().mVec128); + body2.internalGetDeltaLinearVelocity().mVec128 = FMADD(_mm_mul_ps(c.m_contactNormal2.mVec128, body2.internalGetInvMass().mVec128), deltaImpulse, body2.internalGetDeltaLinearVelocity().mVec128); + body2.internalGetDeltaAngularVelocity().mVec128 = FMADD(c.m_angularComponentB.mVec128, deltaImpulse, body2.internalGetDeltaAngularVelocity().mVec128); + return deltaImpulse; +#else + return gResolveSingleConstraintRowLowerLimit_sse2(body1,body2,c); +#endif //BT_ALLOW_SSE4 +} + + +#endif //USE_SIMD + + + +btSimdScalar btSequentialImpulseConstraintSolver::resolveSingleConstraintRowGenericSIMD(btSolverBody& body1,btSolverBody& body2,const btSolverConstraint& c) +{ +#ifdef USE_SIMD + return m_resolveSingleConstraintRowGeneric(body1, body2, c); #else return resolveSingleConstraintRowGeneric(body1,body2,c); #endif @@ -96,62 +279,13 @@ btSimdScalar btSequentialImpulseConstraintSolver::resolveSingleConstraintRowGene // Project Gauss Seidel or the equivalent Sequential Impulse btSimdScalar btSequentialImpulseConstraintSolver::resolveSingleConstraintRowGeneric(btSolverBody& body1,btSolverBody& body2,const btSolverConstraint& c) { - btScalar deltaImpulse = c.m_rhs-btScalar(c.m_appliedImpulse)*c.m_cfm; - const btScalar deltaVel1Dotn = c.m_contactNormal1.dot(body1.internalGetDeltaLinearVelocity()) + c.m_relpos1CrossNormal.dot(body1.internalGetDeltaAngularVelocity()); - const btScalar deltaVel2Dotn = c.m_contactNormal2.dot(body2.internalGetDeltaLinearVelocity()) + c.m_relpos2CrossNormal.dot(body2.internalGetDeltaAngularVelocity()); - -// const btScalar delta_rel_vel = deltaVel1Dotn-deltaVel2Dotn; - deltaImpulse -= deltaVel1Dotn*c.m_jacDiagABInv; - deltaImpulse -= deltaVel2Dotn*c.m_jacDiagABInv; - - const btScalar sum = btScalar(c.m_appliedImpulse) + deltaImpulse; - if (sum < c.m_lowerLimit) - { - deltaImpulse = c.m_lowerLimit-c.m_appliedImpulse; - c.m_appliedImpulse = c.m_lowerLimit; - } - else if (sum > c.m_upperLimit) - { - deltaImpulse = c.m_upperLimit-c.m_appliedImpulse; - c.m_appliedImpulse = c.m_upperLimit; - } - else - { - c.m_appliedImpulse = sum; - } - - body1.internalApplyImpulse(c.m_contactNormal1*body1.internalGetInvMass(),c.m_angularComponentA,deltaImpulse); - body2.internalApplyImpulse(c.m_contactNormal2*body2.internalGetInvMass(),c.m_angularComponentB,deltaImpulse); - - return deltaImpulse; + return gResolveSingleConstraintRowGeneric_scalar_reference(body1, body2, c); } btSimdScalar btSequentialImpulseConstraintSolver::resolveSingleConstraintRowLowerLimitSIMD(btSolverBody& body1,btSolverBody& body2,const btSolverConstraint& c) { #ifdef USE_SIMD - __m128 cpAppliedImp = _mm_set1_ps(c.m_appliedImpulse); - __m128 lowerLimit1 = _mm_set1_ps(c.m_lowerLimit); - __m128 upperLimit1 = _mm_set1_ps(c.m_upperLimit); - btSimdScalar deltaImpulse = _mm_sub_ps(_mm_set1_ps(c.m_rhs), _mm_mul_ps(_mm_set1_ps(c.m_appliedImpulse),_mm_set1_ps(c.m_cfm))); - __m128 deltaVel1Dotn = _mm_add_ps(btSimdDot3(c.m_contactNormal1.mVec128,body1.internalGetDeltaLinearVelocity().mVec128), btSimdDot3(c.m_relpos1CrossNormal.mVec128,body1.internalGetDeltaAngularVelocity().mVec128)); - __m128 deltaVel2Dotn = _mm_add_ps(btSimdDot3(c.m_contactNormal2.mVec128,body2.internalGetDeltaLinearVelocity().mVec128), btSimdDot3(c.m_relpos2CrossNormal.mVec128,body2.internalGetDeltaAngularVelocity().mVec128)); - deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel1Dotn,_mm_set1_ps(c.m_jacDiagABInv))); - deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel2Dotn,_mm_set1_ps(c.m_jacDiagABInv))); - btSimdScalar sum = _mm_add_ps(cpAppliedImp,deltaImpulse); - btSimdScalar resultLowerLess,resultUpperLess; - resultLowerLess = _mm_cmplt_ps(sum,lowerLimit1); - resultUpperLess = _mm_cmplt_ps(sum,upperLimit1); - __m128 lowMinApplied = _mm_sub_ps(lowerLimit1,cpAppliedImp); - deltaImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowMinApplied), _mm_andnot_ps(resultLowerLess, deltaImpulse) ); - c.m_appliedImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowerLimit1), _mm_andnot_ps(resultLowerLess, sum) ); - __m128 linearComponentA = _mm_mul_ps(c.m_contactNormal1.mVec128,body1.internalGetInvMass().mVec128); - __m128 linearComponentB = _mm_mul_ps(c.m_contactNormal2.mVec128,body2.internalGetInvMass().mVec128); - __m128 impulseMagnitude = deltaImpulse; - body1.internalGetDeltaLinearVelocity().mVec128 = _mm_add_ps(body1.internalGetDeltaLinearVelocity().mVec128,_mm_mul_ps(linearComponentA,impulseMagnitude)); - body1.internalGetDeltaAngularVelocity().mVec128 = _mm_add_ps(body1.internalGetDeltaAngularVelocity().mVec128 ,_mm_mul_ps(c.m_angularComponentA.mVec128,impulseMagnitude)); - body2.internalGetDeltaLinearVelocity().mVec128 = _mm_add_ps(body2.internalGetDeltaLinearVelocity().mVec128,_mm_mul_ps(linearComponentB,impulseMagnitude)); - body2.internalGetDeltaAngularVelocity().mVec128 = _mm_add_ps(body2.internalGetDeltaAngularVelocity().mVec128 ,_mm_mul_ps(c.m_angularComponentB.mVec128,impulseMagnitude)); - return deltaImpulse; + return m_resolveSingleConstraintRowLowerLimit(body1, body2, c); #else return resolveSingleConstraintRowLowerLimit(body1,body2,c); #endif @@ -160,26 +294,7 @@ btSimdScalar btSequentialImpulseConstraintSolver::resolveSingleConstraintRowLowe btSimdScalar btSequentialImpulseConstraintSolver::resolveSingleConstraintRowLowerLimit(btSolverBody& body1,btSolverBody& body2,const btSolverConstraint& c) { - btScalar deltaImpulse = c.m_rhs-btScalar(c.m_appliedImpulse)*c.m_cfm; - const btScalar deltaVel1Dotn = c.m_contactNormal1.dot(body1.internalGetDeltaLinearVelocity()) + c.m_relpos1CrossNormal.dot(body1.internalGetDeltaAngularVelocity()); - const btScalar deltaVel2Dotn = c.m_contactNormal2.dot(body2.internalGetDeltaLinearVelocity()) + c.m_relpos2CrossNormal.dot(body2.internalGetDeltaAngularVelocity()); - - deltaImpulse -= deltaVel1Dotn*c.m_jacDiagABInv; - deltaImpulse -= deltaVel2Dotn*c.m_jacDiagABInv; - const btScalar sum = btScalar(c.m_appliedImpulse) + deltaImpulse; - if (sum < c.m_lowerLimit) - { - deltaImpulse = c.m_lowerLimit-c.m_appliedImpulse; - c.m_appliedImpulse = c.m_lowerLimit; - } - else - { - c.m_appliedImpulse = sum; - } - body1.internalApplyImpulse(c.m_contactNormal1*body1.internalGetInvMass(),c.m_angularComponentA,deltaImpulse); - body2.internalApplyImpulse(c.m_contactNormal2*body2.internalGetInvMass(),c.m_angularComponentB,deltaImpulse); - - return deltaImpulse; + return gResolveSingleConstraintRowLowerLimit_scalar_reference(body1,body2,c); } @@ -248,6 +363,63 @@ void btSequentialImpulseConstraintSolver::resolveSplitPenetrationImpulseCacheFri } + btSequentialImpulseConstraintSolver::btSequentialImpulseConstraintSolver() + :m_btSeed2(0), + m_resolveSingleConstraintRowGeneric(gResolveSingleConstraintRowGeneric_scalar_reference), + m_resolveSingleConstraintRowLowerLimit(gResolveSingleConstraintRowLowerLimit_scalar_reference) + { + +#ifdef USE_SIMD + m_resolveSingleConstraintRowGeneric = gResolveSingleConstraintRowGeneric_sse2; + m_resolveSingleConstraintRowLowerLimit=gResolveSingleConstraintRowLowerLimit_sse2; +#endif //USE_SIMD + +#ifdef BT_ALLOW_SSE4 + int cpuFeatures = btCpuFeatureUtility::getCpuFeatures(); + if ((cpuFeatures & btCpuFeatureUtility::CPU_FEATURE_FMA3) && (cpuFeatures & btCpuFeatureUtility::CPU_FEATURE_SSE4_1)) + { + m_resolveSingleConstraintRowGeneric = gResolveSingleConstraintRowGeneric_sse4_1_fma3; + m_resolveSingleConstraintRowLowerLimit = gResolveSingleConstraintRowLowerLimit_sse4_1_fma3; + } +#endif//BT_ALLOW_SSE4 + + } + + btSequentialImpulseConstraintSolver::~btSequentialImpulseConstraintSolver() + { + } + + btSingleConstraintRowSolver btSequentialImpulseConstraintSolver::getScalarConstraintRowSolverGeneric() + { + return gResolveSingleConstraintRowGeneric_scalar_reference; + } + + btSingleConstraintRowSolver btSequentialImpulseConstraintSolver::getScalarConstraintRowSolverLowerLimit() + { + return gResolveSingleConstraintRowLowerLimit_scalar_reference; + } + + +#ifdef USE_SIMD + btSingleConstraintRowSolver btSequentialImpulseConstraintSolver::getSSE2ConstraintRowSolverGeneric() + { + return gResolveSingleConstraintRowGeneric_sse2; + } + btSingleConstraintRowSolver btSequentialImpulseConstraintSolver::getSSE2ConstraintRowSolverLowerLimit() + { + return gResolveSingleConstraintRowLowerLimit_sse2; + } +#ifdef BT_ALLOW_SSE4 + btSingleConstraintRowSolver btSequentialImpulseConstraintSolver::getSSE4_1ConstraintRowSolverGeneric() + { + return gResolveSingleConstraintRowGeneric_sse4_1_fma3; + } + btSingleConstraintRowSolver btSequentialImpulseConstraintSolver::getSSE4_1ConstraintRowSolverLowerLimit() + { + return gResolveSingleConstraintRowLowerLimit_sse4_1_fma3; + } +#endif //BT_ALLOW_SSE4 +#endif //USE_SIMD unsigned long btSequentialImpulseConstraintSolver::btRand2() { @@ -308,7 +480,7 @@ void btSequentialImpulseConstraintSolver::initSolverBody(btSolverBody* solverBod solverBody->m_angularVelocity = rb->getAngularVelocity(); solverBody->m_externalForceImpulse = rb->getTotalForce()*rb->getInvMass()*timeStep; solverBody->m_externalTorqueImpulse = rb->getTotalTorque()*rb->getInvInertiaTensorWorld()*timeStep ; - + } else { solverBody->m_worldTransform.setIdentity(); @@ -340,7 +512,7 @@ btScalar btSequentialImpulseConstraintSolver::restitutionCurve(btScalar rel_vel, void btSequentialImpulseConstraintSolver::applyAnisotropicFriction(btCollisionObject* colObj,btVector3& frictionDirection, int frictionMode) { - + if (colObj && colObj->hasAnisotropicFriction(frictionMode)) { @@ -361,7 +533,7 @@ void btSequentialImpulseConstraintSolver::applyAnisotropicFriction(btCollisionOb void btSequentialImpulseConstraintSolver::setupFrictionConstraint(btSolverConstraint& solverConstraint, const btVector3& normalAxis,int solverBodyIdA,int solverBodyIdB,btManifoldPoint& cp,const btVector3& rel_pos1,const btVector3& rel_pos2,btCollisionObject* colObj0,btCollisionObject* colObj1, btScalar relaxation, btScalar desiredVelocity, btScalar cfmSlip) { - + btSolverBody& solverBodyA = m_tmpSolverBodyPool[solverBodyIdA]; btSolverBody& solverBodyB = m_tmpSolverBodyPool[solverBodyIdB]; @@ -422,26 +594,26 @@ void btSequentialImpulseConstraintSolver::setupFrictionConstraint(btSolverConstr } { - + btScalar rel_vel; - btScalar vel1Dotn = solverConstraint.m_contactNormal1.dot(body0?solverBodyA.m_linearVelocity+solverBodyA.m_externalForceImpulse:btVector3(0,0,0)) + btScalar vel1Dotn = solverConstraint.m_contactNormal1.dot(body0?solverBodyA.m_linearVelocity+solverBodyA.m_externalForceImpulse:btVector3(0,0,0)) + solverConstraint.m_relpos1CrossNormal.dot(body0?solverBodyA.m_angularVelocity:btVector3(0,0,0)); - btScalar vel2Dotn = solverConstraint.m_contactNormal2.dot(body1?solverBodyB.m_linearVelocity+solverBodyB.m_externalForceImpulse:btVector3(0,0,0)) + btScalar vel2Dotn = solverConstraint.m_contactNormal2.dot(body1?solverBodyB.m_linearVelocity+solverBodyB.m_externalForceImpulse:btVector3(0,0,0)) + solverConstraint.m_relpos2CrossNormal.dot(body1?solverBodyB.m_angularVelocity:btVector3(0,0,0)); rel_vel = vel1Dotn+vel2Dotn; // btScalar positionalError = 0.f; - btSimdScalar velocityError = desiredVelocity - rel_vel; - btSimdScalar velocityImpulse = velocityError * btSimdScalar(solverConstraint.m_jacDiagABInv); + btScalar velocityError = desiredVelocity - rel_vel; + btScalar velocityImpulse = velocityError * solverConstraint.m_jacDiagABInv; solverConstraint.m_rhs = velocityImpulse; solverConstraint.m_rhsPenetration = 0.f; solverConstraint.m_cfm = cfmSlip; solverConstraint.m_lowerLimit = -solverConstraint.m_friction; solverConstraint.m_upperLimit = solverConstraint.m_friction; - + } } @@ -449,7 +621,7 @@ btSolverConstraint& btSequentialImpulseConstraintSolver::addFrictionConstraint(c { btSolverConstraint& solverConstraint = m_tmpSolverContactFrictionConstraintPool.expandNonInitializing(); solverConstraint.m_frictionIndex = frictionIndex; - setupFrictionConstraint(solverConstraint, normalAxis, solverBodyIdA, solverBodyIdB, cp, rel_pos1, rel_pos2, + setupFrictionConstraint(solverConstraint, normalAxis, solverBodyIdA, solverBodyIdB, cp, rel_pos1, rel_pos2, colObj0, colObj1, relaxation, desiredVelocity, cfmSlip); return solverConstraint; } @@ -457,7 +629,7 @@ btSolverConstraint& btSequentialImpulseConstraintSolver::addFrictionConstraint(c void btSequentialImpulseConstraintSolver::setupRollingFrictionConstraint( btSolverConstraint& solverConstraint, const btVector3& normalAxis1,int solverBodyIdA,int solverBodyIdB, btManifoldPoint& cp,const btVector3& rel_pos1,const btVector3& rel_pos2, - btCollisionObject* colObj0,btCollisionObject* colObj1, btScalar relaxation, + btCollisionObject* colObj0,btCollisionObject* colObj1, btScalar relaxation, btScalar desiredVelocity, btScalar cfmSlip) { @@ -503,12 +675,12 @@ void btSequentialImpulseConstraintSolver::setupRollingFrictionConstraint( btSolv } { - + btScalar rel_vel; - btScalar vel1Dotn = solverConstraint.m_contactNormal1.dot(body0?solverBodyA.m_linearVelocity+solverBodyA.m_externalForceImpulse:btVector3(0,0,0)) + btScalar vel1Dotn = solverConstraint.m_contactNormal1.dot(body0?solverBodyA.m_linearVelocity+solverBodyA.m_externalForceImpulse:btVector3(0,0,0)) + solverConstraint.m_relpos1CrossNormal.dot(body0?solverBodyA.m_angularVelocity:btVector3(0,0,0)); - btScalar vel2Dotn = solverConstraint.m_contactNormal2.dot(body1?solverBodyB.m_linearVelocity+solverBodyB.m_externalForceImpulse:btVector3(0,0,0)) + btScalar vel2Dotn = solverConstraint.m_contactNormal2.dot(body1?solverBodyB.m_linearVelocity+solverBodyB.m_externalForceImpulse:btVector3(0,0,0)) + solverConstraint.m_relpos2CrossNormal.dot(body1?solverBodyB.m_angularVelocity:btVector3(0,0,0)); rel_vel = vel1Dotn+vel2Dotn; @@ -521,7 +693,7 @@ void btSequentialImpulseConstraintSolver::setupRollingFrictionConstraint( btSolv solverConstraint.m_cfm = cfmSlip; solverConstraint.m_lowerLimit = -solverConstraint.m_friction; solverConstraint.m_upperLimit = solverConstraint.m_friction; - + } } @@ -536,7 +708,7 @@ btSolverConstraint& btSequentialImpulseConstraintSolver::addRollingFrictionConst { btSolverConstraint& solverConstraint = m_tmpSolverContactRollingFrictionConstraintPool.expandNonInitializing(); solverConstraint.m_frictionIndex = frictionIndex; - setupRollingFrictionConstraint(solverConstraint, normalAxis, solverBodyIdA, solverBodyIdB, cp, rel_pos1, rel_pos2, + setupRollingFrictionConstraint(solverConstraint, normalAxis, solverBodyIdA, solverBodyIdB, cp, rel_pos1, rel_pos2, colObj0, colObj1, relaxation, desiredVelocity, cfmSlip); return solverConstraint; } @@ -564,7 +736,7 @@ int btSequentialImpulseConstraintSolver::getOrInitSolverBody(btCollisionObject& body.setCompanionId(solverBodyIdA); } else { - + if (m_fixedBodyId<0) { m_fixedBodyId = m_tmpSolverBodyPool.size(); @@ -582,13 +754,13 @@ int btSequentialImpulseConstraintSolver::getOrInitSolverBody(btCollisionObject& #include -void btSequentialImpulseConstraintSolver::setupContactConstraint(btSolverConstraint& solverConstraint, +void btSequentialImpulseConstraintSolver::setupContactConstraint(btSolverConstraint& solverConstraint, int solverBodyIdA, int solverBodyIdB, btManifoldPoint& cp, const btContactSolverInfo& infoGlobal, btScalar& relaxation, const btVector3& rel_pos1, const btVector3& rel_pos2) { - + const btVector3& pos1 = cp.getPositionWorldOnA(); const btVector3& pos2 = cp.getPositionWorldOnB(); @@ -598,23 +770,23 @@ void btSequentialImpulseConstraintSolver::setupContactConstraint(btSolverConstra btRigidBody* rb0 = bodyA->m_originalBody; btRigidBody* rb1 = bodyB->m_originalBody; -// btVector3 rel_pos1 = pos1 - colObj0->getWorldTransform().getOrigin(); +// btVector3 rel_pos1 = pos1 - colObj0->getWorldTransform().getOrigin(); // btVector3 rel_pos2 = pos2 - colObj1->getWorldTransform().getOrigin(); - //rel_pos1 = pos1 - bodyA->getWorldTransform().getOrigin(); + //rel_pos1 = pos1 - bodyA->getWorldTransform().getOrigin(); //rel_pos2 = pos2 - bodyB->getWorldTransform().getOrigin(); relaxation = 1.f; btVector3 torqueAxis0 = rel_pos1.cross(cp.m_normalWorldOnB); solverConstraint.m_angularComponentA = rb0 ? rb0->getInvInertiaTensorWorld()*torqueAxis0*rb0->getAngularFactor() : btVector3(0,0,0); - btVector3 torqueAxis1 = rel_pos2.cross(cp.m_normalWorldOnB); + btVector3 torqueAxis1 = rel_pos2.cross(cp.m_normalWorldOnB); solverConstraint.m_angularComponentB = rb1 ? rb1->getInvInertiaTensorWorld()*-torqueAxis1*rb1->getAngularFactor() : btVector3(0,0,0); { #ifdef COMPUTE_IMPULSE_DENOM btScalar denom0 = rb0->computeImpulseDenominator(pos1,cp.m_normalWorldOnB); btScalar denom1 = rb1->computeImpulseDenominator(pos2,cp.m_normalWorldOnB); -#else +#else btVector3 vec; btScalar denom0 = 0.f; btScalar denom1 = 0.f; @@ -628,7 +800,7 @@ void btSequentialImpulseConstraintSolver::setupContactConstraint(btSolverConstra vec = ( -solverConstraint.m_angularComponentB).cross(rel_pos2); denom1 = rb1->getInvMass() + cp.m_normalWorldOnB.dot(vec); } -#endif //COMPUTE_IMPULSE_DENOM +#endif //COMPUTE_IMPULSE_DENOM btScalar denom = relaxation/(denom0+denom1); solverConstraint.m_jacDiagABInv = denom; @@ -666,11 +838,11 @@ void btSequentialImpulseConstraintSolver::setupContactConstraint(btSolverConstra btVector3 vel = vel1 - vel2; btScalar rel_vel = cp.m_normalWorldOnB.dot(vel); - + solverConstraint.m_friction = cp.m_combinedFriction; - + restitution = restitutionCurve(rel_vel, cp.m_combinedRestitution); if (restitution <= btScalar(0.)) { @@ -700,17 +872,17 @@ void btSequentialImpulseConstraintSolver::setupContactConstraint(btSolverConstra btVector3 externalTorqueImpulseA = bodyA->m_originalBody ? bodyA->m_externalTorqueImpulse: btVector3(0,0,0); btVector3 externalForceImpulseB = bodyB->m_originalBody ? bodyB->m_externalForceImpulse: btVector3(0,0,0); btVector3 externalTorqueImpulseB = bodyB->m_originalBody ?bodyB->m_externalTorqueImpulse : btVector3(0,0,0); - - btScalar vel1Dotn = solverConstraint.m_contactNormal1.dot(bodyA->m_linearVelocity+externalForceImpulseA) + + btScalar vel1Dotn = solverConstraint.m_contactNormal1.dot(bodyA->m_linearVelocity+externalForceImpulseA) + solverConstraint.m_relpos1CrossNormal.dot(bodyA->m_angularVelocity+externalTorqueImpulseA); - btScalar vel2Dotn = solverConstraint.m_contactNormal2.dot(bodyB->m_linearVelocity+externalForceImpulseB) + btScalar vel2Dotn = solverConstraint.m_contactNormal2.dot(bodyB->m_linearVelocity+externalForceImpulseB) + solverConstraint.m_relpos2CrossNormal.dot(bodyB->m_angularVelocity+externalTorqueImpulseB); btScalar rel_vel = vel1Dotn+vel2Dotn; btScalar positionalError = 0.f; btScalar velocityError = restitution - rel_vel;// * damping; - + btScalar erp = infoGlobal.m_erp2; if (!infoGlobal.m_splitImpulse || (penetration > infoGlobal.m_splitImpulsePenetrationThreshold)) @@ -755,7 +927,7 @@ void btSequentialImpulseConstraintSolver::setupContactConstraint(btSolverConstra -void btSequentialImpulseConstraintSolver::setFrictionConstraintImpulse( btSolverConstraint& solverConstraint, +void btSequentialImpulseConstraintSolver::setFrictionConstraintImpulse( btSolverConstraint& solverConstraint, int solverBodyIdA, int solverBodyIdB, btManifoldPoint& cp, const btContactSolverInfo& infoGlobal) { @@ -834,7 +1006,7 @@ void btSequentialImpulseConstraintSolver::convertContact(btPersistentManifold* m btVector3 rel_pos1; btVector3 rel_pos2; btScalar relaxation; - + int frictionIndex = m_tmpSolverContactConstraintPool.size(); btSolverConstraint& solverConstraint = m_tmpSolverContactConstraintPool.expandNonInitializing(); @@ -848,7 +1020,7 @@ void btSequentialImpulseConstraintSolver::convertContact(btPersistentManifold* m const btVector3& pos1 = cp.getPositionWorldOnA(); const btVector3& pos2 = cp.getPositionWorldOnB(); - rel_pos1 = pos1 - colObj0->getWorldTransform().getOrigin(); + rel_pos1 = pos1 - colObj0->getWorldTransform().getOrigin(); rel_pos2 = pos2 - colObj1->getWorldTransform().getOrigin(); btVector3 vel1;// = rb0 ? rb0->getVelocityInLocalPoint(rel_pos1) : btVector3(0,0,0); @@ -856,13 +1028,13 @@ void btSequentialImpulseConstraintSolver::convertContact(btPersistentManifold* m solverBodyA->getVelocityInLocalPointNoDelta(rel_pos1,vel1); solverBodyB->getVelocityInLocalPointNoDelta(rel_pos2,vel2 ); - + btVector3 vel = vel1 - vel2; btScalar rel_vel = cp.m_normalWorldOnB.dot(vel); setupContactConstraint(solverConstraint, solverBodyIdA, solverBodyIdB, cp, infoGlobal, relaxation, rel_pos1, rel_pos2); - + // const btVector3& pos1 = cp.getPositionWorldOnA(); // const btVector3& pos2 = cp.getPositionWorldOnB(); @@ -903,21 +1075,21 @@ void btSequentialImpulseConstraintSolver::convertContact(btPersistentManifold* m addRollingFrictionConstraint(axis0,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation); if (axis1.length()>0.001) addRollingFrictionConstraint(axis1,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation); - + } } ///Bullet has several options to set the friction directions - ///By default, each contact has only a single friction direction that is recomputed automatically very frame + ///By default, each contact has only a single friction direction that is recomputed automatically very frame ///based on the relative linear velocity. ///If the relative velocity it zero, it will automatically compute a friction direction. - + ///You can also enable two friction directions, using the SOLVER_USE_2_FRICTION_DIRECTIONS. ///In that case, the second friction direction will be orthogonal to both contact normal and first friction direction. /// ///If you choose SOLVER_DISABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION, then the friction will be independent from the relative projected velocity. /// - ///The user can manually override the friction directions for certain contacts using a contact callback, + ///The user can manually override the friction directions for certain contacts using a contact callback, ///and set the cp.m_lateralFrictionInitialized to true ///In that case, you can set the target relative motion in each friction direction (cp.m_contactMotion1 and cp.m_contactMotion2) ///this will give a conveyor belt effect @@ -973,9 +1145,9 @@ void btSequentialImpulseConstraintSolver::convertContact(btPersistentManifold* m } setFrictionConstraintImpulse( solverConstraint, solverBodyIdA, solverBodyIdB, cp, infoGlobal); - - + + } } @@ -1015,7 +1187,7 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol bool found=false; for (int b=0;bgetRigidBodyA()==bodies[b]) { found = true; @@ -1047,7 +1219,7 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol bool found=false; for (int b=0;bgetBody0()==bodies[b]) { found = true; @@ -1071,8 +1243,8 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol } } #endif //BT_ADDITIONAL_DEBUG - - + + for (int i = 0; i < numBodies; i++) { bodies[i]->setCompanionId(-1); @@ -1103,7 +1275,7 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol } } } - + if (1) { int j; @@ -1123,7 +1295,7 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol int totalNumRows = 0; int i; - + m_tmpConstraintSizesPool.resizeNoInitialize(numConstraints); //calculate the total number of contraint rows for (i=0;im_originalBody ? bodyAPtr->m_externalForceImpulse : btVector3(0,0,0); @@ -1276,11 +1448,11 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol btVector3 externalForceImpulseB = bodyBPtr->m_originalBody ? bodyBPtr->m_externalForceImpulse : btVector3(0,0,0); btVector3 externalTorqueImpulseB = bodyBPtr->m_originalBody ?bodyBPtr->m_externalTorqueImpulse : btVector3(0,0,0); - - btScalar vel1Dotn = solverConstraint.m_contactNormal1.dot(rbA.getLinearVelocity()+externalForceImpulseA) + + btScalar vel1Dotn = solverConstraint.m_contactNormal1.dot(rbA.getLinearVelocity()+externalForceImpulseA) + solverConstraint.m_relpos1CrossNormal.dot(rbA.getAngularVelocity()+externalTorqueImpulseA); - - btScalar vel2Dotn = solverConstraint.m_contactNormal2.dot(rbB.getLinearVelocity()+externalForceImpulseB) + + btScalar vel2Dotn = solverConstraint.m_contactNormal2.dot(rbB.getLinearVelocity()+externalForceImpulseB) + solverConstraint.m_relpos2CrossNormal.dot(rbB.getAngularVelocity()+externalTorqueImpulseB); rel_vel = vel1Dotn+vel2Dotn; @@ -1346,7 +1518,7 @@ btScalar btSequentialImpulseConstraintSolver::solveSingleIteration(int iteration int numNonContactPool = m_tmpSolverNonContactConstraintPool.size(); int numConstraintPool = m_tmpSolverContactConstraintPool.size(); int numFrictionPool = m_tmpSolverContactFrictionConstraintPool.size(); - + if (infoGlobal.m_solverMode & SOLVER_RANDMIZE_ORDER) { if (1) // uncomment this for a bit less random ((iteration & 7) == 0) @@ -1359,7 +1531,7 @@ btScalar btSequentialImpulseConstraintSolver::solveSingleIteration(int iteration m_orderNonContactConstraintPool[swapi] = tmp; } - //contact/friction constraints are not solved more than + //contact/friction constraints are not solved more than if (iteration< infoGlobal.m_numIterations) { for (int j=0; jbtScalar(0)) { solveManifold.m_lowerLimit = -(solveManifold.m_friction*totalImpulse); @@ -1463,8 +1635,8 @@ btScalar btSequentialImpulseConstraintSolver::solveSingleIteration(int iteration resolveSingleConstraintRowLowerLimitSIMD(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA],m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB],solveManifold); } - - + + ///solve all friction constraints, using SIMD, if available @@ -1483,7 +1655,7 @@ btScalar btSequentialImpulseConstraintSolver::solveSingleIteration(int iteration } } - + int numRollingFrictionPoolConstraints = m_tmpSolverContactRollingFrictionConstraintPool.size(); for (j=0;j= 0;iteration--) - { + { solveSingleIteration(iteration, bodies ,numBodies,manifoldPtr, numManifolds,constraints,numConstraints,infoGlobal,debugDrawer); } - + } return 0.f; } @@ -1673,7 +1845,7 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlyFinish(btCo fb->m_appliedForceBodyB += solverConstr.m_contactNormal2*solverConstr.m_appliedImpulse*constr->getRigidBodyB().getLinearFactor()/infoGlobal.m_timeStep; fb->m_appliedTorqueBodyA += solverConstr.m_relpos1CrossNormal* constr->getRigidBodyA().getAngularFactor()*solverConstr.m_appliedImpulse/infoGlobal.m_timeStep; fb->m_appliedTorqueBodyB += solverConstr.m_relpos2CrossNormal* constr->getRigidBodyB().getAngularFactor()*solverConstr.m_appliedImpulse/infoGlobal.m_timeStep; /*RGM ???? */ - + } constr->internalSetAppliedImpulse(solverConstr.m_appliedImpulse); @@ -1694,7 +1866,7 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlyFinish(btCo m_tmpSolverBodyPool[i].writebackVelocityAndTransform(infoGlobal.m_timeStep, infoGlobal.m_splitImpulseTurnErp); else m_tmpSolverBodyPool[i].writebackVelocity(); - + m_tmpSolverBodyPool[i].m_originalBody->setLinearVelocity( m_tmpSolverBodyPool[i].m_linearVelocity+ m_tmpSolverBodyPool[i].m_externalForceImpulse); @@ -1727,13 +1899,13 @@ btScalar btSequentialImpulseConstraintSolver::solveGroup(btCollisionObject** bod BT_PROFILE("solveGroup"); //you need to provide at least some bodies - + solveGroupCacheFriendlySetup( bodies, numBodies, manifoldPtr, numManifolds,constraints, numConstraints,infoGlobal,debugDrawer); solveGroupCacheFriendlyIterations(bodies, numBodies, manifoldPtr, numManifolds,constraints, numConstraints,infoGlobal,debugDrawer); solveGroupCacheFriendlyFinish(bodies, numBodies, infoGlobal); - + return 0.f; } @@ -1741,5 +1913,3 @@ void btSequentialImpulseConstraintSolver::reset() { m_btSeed2 = 0; } - - diff --git a/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h b/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h index 47dbbe339..a60291809 100644 --- a/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h +++ b/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h @@ -27,6 +27,8 @@ class btCollisionObject; #include "BulletCollision/NarrowPhaseCollision/btManifoldPoint.h" #include "BulletDynamics/ConstraintSolver/btConstraintSolver.h" +typedef btSimdScalar(*btSingleConstraintRowSolver)(btSolverBody&, btSolverBody&, const btSolverConstraint&); + ///The btSequentialImpulseConstraintSolver is a fast SIMD implementation of the Projected Gauss Seidel (iterative LCP) method. ATTRIBUTE_ALIGNED16(class) btSequentialImpulseConstraintSolver : public btConstraintSolver { @@ -43,6 +45,10 @@ protected: btAlignedObjectArray m_tmpConstraintSizesPool; int m_maxOverrideNumSolverIterations; int m_fixedBodyId; + + btSingleConstraintRowSolver m_resolveSingleConstraintRowGeneric; + btSingleConstraintRowSolver m_resolveSingleConstraintRowLowerLimit; + void setupFrictionConstraint( btSolverConstraint& solverConstraint, const btVector3& normalAxis,int solverBodyIdA,int solverBodyIdB, btManifoldPoint& cp,const btVector3& rel_pos1,const btVector3& rel_pos2, btCollisionObject* colObj0,btCollisionObject* colObj1, btScalar relaxation, @@ -112,9 +118,7 @@ public: virtual ~btSequentialImpulseConstraintSolver(); virtual btScalar solveGroup(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifold,int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& info, btIDebugDraw* debugDrawer,btDispatcher* dispatcher); - - - + ///clear internal cached data and reset random seed virtual void reset(); @@ -136,6 +140,33 @@ public: { return BT_SEQUENTIAL_IMPULSE_SOLVER; } + + btSingleConstraintRowSolver getActiveConstraintRowSolverGeneric() + { + return m_resolveSingleConstraintRowGeneric; + } + void setConstraintRowSolverGeneric(btSingleConstraintRowSolver rowSolver) + { + m_resolveSingleConstraintRowGeneric = rowSolver; + } + btSingleConstraintRowSolver getActiveConstraintRowSolverLowerLimit() + { + return m_resolveSingleConstraintRowLowerLimit; + } + void setConstraintRowSolverLowerLimit(btSingleConstraintRowSolver rowSolver) + { + m_resolveSingleConstraintRowLowerLimit = rowSolver; + } + + ///Various implementations of solving a single constraint row using a generic equality constraint, using scalar reference, SSE2 or SSE4 + btSingleConstraintRowSolver getScalarConstraintRowSolverGeneric(); + btSingleConstraintRowSolver getSSE2ConstraintRowSolverGeneric(); + btSingleConstraintRowSolver getSSE4_1ConstraintRowSolverGeneric(); + + ///Various implementations of solving a single constraint row using an inequality (lower limit) constraint, using scalar reference, SSE2 or SSE4 + btSingleConstraintRowSolver getScalarConstraintRowSolverLowerLimit(); + btSingleConstraintRowSolver getSSE2ConstraintRowSolverLowerLimit(); + btSingleConstraintRowSolver getSSE4_1ConstraintRowSolverLowerLimit(); }; diff --git a/src/BulletDynamics/ConstraintSolver/btTypedConstraint.h b/src/BulletDynamics/ConstraintSolver/btTypedConstraint.h index b58f984d0..ea44ae4b4 100644 --- a/src/BulletDynamics/ConstraintSolver/btTypedConstraint.h +++ b/src/BulletDynamics/ConstraintSolver/btTypedConstraint.h @@ -44,6 +44,7 @@ enum btTypedConstraintType D6_SPRING_CONSTRAINT_TYPE, GEAR_CONSTRAINT_TYPE, FIXED_CONSTRAINT_TYPE, + D6_SPRING_2_CONSTRAINT_TYPE, MAX_CONSTRAINT_TYPE }; diff --git a/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp b/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp index fb8a4068e..df57f893c 100644 --- a/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp +++ b/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp @@ -653,6 +653,9 @@ void btDiscreteDynamicsWorld::updateActivationState(btScalar timeStep) void btDiscreteDynamicsWorld::addConstraint(btTypedConstraint* constraint,bool disableCollisionsBetweenLinkedBodies) { m_constraints.push_back(constraint); + //Make sure the two bodies of a type constraint are different (possibly add this to the btTypedConstraint constructor?) + btAssert(&constraint->getRigidBodyA()!=&constraint->getRigidBodyB()); + if (disableCollisionsBetweenLinkedBodies) { constraint->getRigidBodyA().addConstraintRef(constraint); diff --git a/src/BulletDynamics/Dynamics/btRigidBody.cpp b/src/BulletDynamics/Dynamics/btRigidBody.cpp index 222f90066..732d75963 100644 --- a/src/BulletDynamics/Dynamics/btRigidBody.cpp +++ b/src/BulletDynamics/Dynamics/btRigidBody.cpp @@ -317,38 +317,50 @@ void btRigidBody::setCenterOfMassTransform(const btTransform& xform) } -bool btRigidBody::checkCollideWithOverride(const btCollisionObject* co) const -{ - const btRigidBody* otherRb = btRigidBody::upcast(co); - if (!otherRb) - return true; - - for (int i = 0; i < m_constraintRefs.size(); ++i) - { - const btTypedConstraint* c = m_constraintRefs[i]; - if (c->isEnabled()) - if (&c->getRigidBodyA() == otherRb || &c->getRigidBodyB() == otherRb) - return false; - } - - return true; -} void btRigidBody::addConstraintRef(btTypedConstraint* c) { - int index = m_constraintRefs.findLinearSearch(c); - if (index == m_constraintRefs.size()) - m_constraintRefs.push_back(c); + ///disable collision with the 'other' body - m_checkCollideWith = true; + int index = m_constraintRefs.findLinearSearch(c); + //don't add constraints that are already referenced + //btAssert(index == m_constraintRefs.size()); + if (index == m_constraintRefs.size()) + { + m_constraintRefs.push_back(c); + btCollisionObject* colObjA = &c->getRigidBodyA(); + btCollisionObject* colObjB = &c->getRigidBodyB(); + if (colObjA == this) + { + colObjA->setIgnoreCollisionCheck(colObjB, true); + } + else + { + colObjB->setIgnoreCollisionCheck(colObjA, true); + } + } } void btRigidBody::removeConstraintRef(btTypedConstraint* c) { - m_constraintRefs.remove(c); - m_checkCollideWith = m_constraintRefs.size() > 0; + int index = m_constraintRefs.findLinearSearch(c); + //don't remove constraints that are not referenced + if(index < m_constraintRefs.size()) + { + m_constraintRefs.remove(c); + btCollisionObject* colObjA = &c->getRigidBodyA(); + btCollisionObject* colObjB = &c->getRigidBodyB(); + if (colObjA == this) + { + colObjA->setIgnoreCollisionCheck(colObjB, false); + } + else + { + colObjB->setIgnoreCollisionCheck(colObjA, false); + } + } } int btRigidBody::calculateSerializeBufferSize() const diff --git a/src/BulletDynamics/Dynamics/btRigidBody.h b/src/BulletDynamics/Dynamics/btRigidBody.h index ed90fb441..7ba7b1f23 100644 --- a/src/BulletDynamics/Dynamics/btRigidBody.h +++ b/src/BulletDynamics/Dynamics/btRigidBody.h @@ -87,7 +87,7 @@ class btRigidBody : public btCollisionObject //m_optionalMotionState allows to automatic synchronize the world transform for active objects btMotionState* m_optionalMotionState; - //keep track of typed constraints referencing this rigid body + //keep track of typed constraints referencing this rigid body, to disable collision between linked bodies btAlignedObjectArray m_constraintRefs; int m_rigidbodyFlags; @@ -506,8 +506,6 @@ public: return (getBroadphaseProxy() != 0); } - virtual bool checkCollideWithOverride(const btCollisionObject* co) const; - void addConstraintRef(btTypedConstraint* c); void removeConstraintRef(btTypedConstraint* c); diff --git a/src/BulletDynamics/Featherstone/btMultiBody.cpp b/src/BulletDynamics/Featherstone/btMultiBody.cpp index c8812af44..fc12bfd6b 100644 --- a/src/BulletDynamics/Featherstone/btMultiBody.cpp +++ b/src/BulletDynamics/Featherstone/btMultiBody.cpp @@ -819,6 +819,9 @@ void btMultiBody::stepVelocitiesMultiDof(btScalar dt, break; } + default: + { + } } @@ -1329,6 +1332,10 @@ void btMultiBody::stepVelocitiesMultiDof(btScalar dt, break; } + default: + { + + } } //determine h*D^{-1} @@ -2589,6 +2596,10 @@ void btMultiBody::stepPositionsMultiDof(btScalar dt, btScalar *pq, btScalar *pqd break; } #endif + default: + { + } + } m_links[i].updateCacheMultiDof(pq); @@ -2709,6 +2720,9 @@ void btMultiBody::filConstraintJacobianMultiDof(int link, break; } #endif + default: + { + } } } diff --git a/src/BulletDynamics/Featherstone/btMultiBody.h b/src/BulletDynamics/Featherstone/btMultiBody.h index b14fc95b8..85d6a2f3f 100644 --- a/src/BulletDynamics/Featherstone/btMultiBody.h +++ b/src/BulletDynamics/Featherstone/btMultiBody.h @@ -45,14 +45,15 @@ public: // initialization // - btMultiBody(int n_links, // NOT including the base - btScalar mass, // mass of base - const btVector3 &inertia, // inertia of base, in base frame; assumed diagonal - bool fixedBase, // whether the base is fixed (true) or can move (false) - bool canSleep, - bool multiDof + btMultiBody(int n_links, // NOT including the base + btScalar mass, // mass of base + const btVector3 &inertia, // inertia of base, in base frame; assumed diagonal + bool fixedBase, // whether the base is fixed (true) or can move (false) + bool canSleep, + bool multiDof = false ); + ~btMultiBody(); void setupPrismatic(int i, // 0 to num_links-1 diff --git a/src/BulletDynamics/Featherstone/btMultiBodyJointMotor.cpp b/src/BulletDynamics/Featherstone/btMultiBodyJointMotor.cpp index 2f10118a0..18f49533b 100644 --- a/src/BulletDynamics/Featherstone/btMultiBodyJointMotor.cpp +++ b/src/BulletDynamics/Featherstone/btMultiBodyJointMotor.cpp @@ -21,6 +21,27 @@ subject to the following restrictions: #include "BulletCollision/CollisionDispatch/btCollisionObject.h" +btMultiBodyJointMotor::btMultiBodyJointMotor(btMultiBody* body, int link, btScalar desiredVelocity, btScalar maxMotorImpulse) + :btMultiBodyConstraint(body,body,link,link,1,true), + m_desiredVelocity(desiredVelocity) +{ + int linkDoF = 0; + + m_maxAppliedImpulse = maxMotorImpulse; + // the data.m_jacobians never change, so may as well + // initialize them here + + // note: we rely on the fact that data.m_jacobians are + // always initialized to zero by the Constraint ctor + + unsigned int offset = 6 + (body->isMultiDof() ? body->getLink(link).m_dofOffset + linkDoF : link); + + // row 0: the lower bound + // row 0: the lower bound + jacobianA(0)[offset] = 1; +} + + btMultiBodyJointMotor::btMultiBodyJointMotor(btMultiBody* body, int link, int linkDoF, btScalar desiredVelocity, btScalar maxMotorImpulse) //:btMultiBodyConstraint(body,0,link,-1,1,true), :btMultiBodyConstraint(body,body,link,link,1,true), diff --git a/src/BulletDynamics/Featherstone/btMultiBodyJointMotor.h b/src/BulletDynamics/Featherstone/btMultiBodyJointMotor.h index 551813807..e863c7cc0 100644 --- a/src/BulletDynamics/Featherstone/btMultiBodyJointMotor.h +++ b/src/BulletDynamics/Featherstone/btMultiBodyJointMotor.h @@ -30,6 +30,7 @@ protected: public: + btMultiBodyJointMotor(btMultiBody* body, int link, btScalar desiredVelocity, btScalar maxMotorImpulse); btMultiBodyJointMotor(btMultiBody* body, int link, int linkDoF, btScalar desiredVelocity, btScalar maxMotorImpulse); virtual ~btMultiBodyJointMotor(); diff --git a/src/BulletDynamics/Featherstone/btMultiBodyLink.h b/src/BulletDynamics/Featherstone/btMultiBodyLink.h index af926f57f..9e90c6f48 100644 --- a/src/BulletDynamics/Featherstone/btMultiBodyLink.h +++ b/src/BulletDynamics/Featherstone/btMultiBodyLink.h @@ -32,7 +32,7 @@ enum btMultiBodyLinkFlags // Various spatial helper functions // -namespace { +//namespace { #ifdef TEST_SPATIAL_ALGEBRA_LAYER @@ -343,7 +343,7 @@ namespace { } #endif -} +//} // // Link struct @@ -507,6 +507,11 @@ struct btMultibodyLink break; } #endif + default: + { + //invalid type + btAssert(0); + } } } }; diff --git a/src/BulletDynamics/Featherstone/btMultiBodyPoint2Point.cpp b/src/BulletDynamics/Featherstone/btMultiBodyPoint2Point.cpp index 84f6f39fe..d2ebf29ef 100644 --- a/src/BulletDynamics/Featherstone/btMultiBodyPoint2Point.cpp +++ b/src/BulletDynamics/Featherstone/btMultiBodyPoint2Point.cpp @@ -4,8 +4,8 @@ Copyright (c) 2013 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, +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. @@ -26,7 +26,7 @@ subject to the following restrictions: #endif btMultiBodyPoint2Point::btMultiBodyPoint2Point(btMultiBody* body, int link, btRigidBody* bodyB, const btVector3& pivotInA, const btVector3& pivotInB) - :btMultiBodyConstraint(body,0,link,-1,BTMBP2PCONSTRAINT_DIM,false), + :btMultiBodyConstraint(body,0,link,-1,BTMBP2PCONSTRAINT_DIM,false), m_rigidBodyA(0), m_rigidBodyB(bodyB), m_pivotInA(pivotInA), @@ -95,15 +95,23 @@ void btMultiBodyPoint2Point::createConstraintRows(btMultiBodyConstraintArray& co const btContactSolverInfo& infoGlobal) { -// int i=1; - for (int i=0;igetCompanionId(); pivotAworld = m_rigidBodyA->getCenterOfMassTransform()*m_pivotInA; } else @@ -134,20 +142,22 @@ void btMultiBodyPoint2Point::createConstraintRows(btMultiBodyConstraintArray& co { if (m_bodyB) pivotBworld = m_bodyB->localPosToWorld(m_linkB, m_pivotInB); - + } btScalar posError = i < 3 ? (pivotAworld-pivotBworld).dot(contactNormalOnB) : 0; -#ifndef BTMBP2PCONSTRAINT_BLOCK_ANGULAR_MOTION_TEST - +#ifndef BTMBP2PCONSTRAINT_BLOCK_ANGULAR_MOTION_TEST + fillMultiBodyConstraint(constraintRow, data, 0, 0, contactNormalOnB, pivotAworld, pivotBworld, //sucks but let it be this way "for the time being" posError, infoGlobal, -m_maxAppliedImpulse, m_maxAppliedImpulse - ); + ); + //@todo: support the case of btMultiBody versus btRigidBody, + //see btPoint2PointConstraint::getInfo2NonVirtual #else const btVector3 dummy(0, 0, 0); @@ -167,4 +177,4 @@ void btMultiBodyPoint2Point::createConstraintRows(btMultiBodyConstraintArray& co ); #endif } -} \ No newline at end of file +} diff --git a/src/BulletSoftBody/btSoftBodyHelpers.cpp b/src/BulletSoftBody/btSoftBodyHelpers.cpp index 36f675a6c..293a393e5 100644 --- a/src/BulletSoftBody/btSoftBodyHelpers.cpp +++ b/src/BulletSoftBody/btSoftBodyHelpers.cpp @@ -480,6 +480,168 @@ void btSoftBodyHelpers::DrawClusterTree( btSoftBody* psb, drawTree(idraw,psb->m_cdbvt.m_root,0,btVector3(0,1,1),btVector3(1,0,0),mindepth,maxdepth); } + +//The btSoftBody object from the BulletSDK includes an array of Nodes and Links. These links appear +// to be first set up to connect a node to between 5 and 6 of its neighbors [480 links], +//and then to the rest of the nodes after the execution of the Floyd-Warshall graph algorithm +//[another 930 links]. +//The way the links are stored by default, we have a number of cases where adjacent links share a node in common +// - this leads to the creation of a data dependency through memory. +//The PSolve_Links() function reads and writes nodes as it iterates over each link. +//So, we now have the possibility of a data dependency between iteration X +//that processes link L with iteration X+1 that processes link L+1 +//because L and L+1 have one node in common, and iteration X updates the positions of that node, +//and iteration X+1 reads in the position of that shared node. +// +//Such a memory dependency limits the ability of a modern CPU to speculate beyond +//a certain point because it has to respect a possible dependency +//- this prevents the CPU from making full use of its out-of-order resources. +//If we re-order the links such that we minimize the cases where a link L and L+1 share a common node, +//we create a temporal gap between when the node position is written, +//and when it is subsequently read. This in turn allows the CPU to continue execution without +//risking a dependency violation. Such a reordering would result in significant speedups on +//modern CPUs with lots of execution resources. +//In our testing, we see it have a tremendous impact not only on the A7, +//but also on all x86 cores that ship with modern Macs. +//The attached source file includes a single function (ReoptimizeLinkOrder) which can be called on a +//btSoftBody object in the solveConstraints() function before the actual solver is invoked, +//or right after generateBendingConstraints() once we have all 1410 links. + + +//=================================================================== +// +// +// This function takes in a list of interdependent Links and tries +// to maximize the distance between calculation +// of dependent links. This increases the amount of parallelism that can +// be exploited by out-of-order instruction processors with large but +// (inevitably) finite instruction windows. +// +//=================================================================== + +// A small structure to track lists of dependent link calculations +class LinkDeps_t { + public: + int value; // A link calculation that is dependent on this one + // Positive values = "input A" while negative values = "input B" + LinkDeps_t *next; // Next dependence in the list +}; +typedef LinkDeps_t *LinkDepsPtr_t; + +// Dependency list constants +#define REOP_NOT_DEPENDENT -1 +#define REOP_NODE_COMPLETE -2 // Must be less than REOP_NOT_DEPENDENT + + +void btSoftBodyHelpers::ReoptimizeLinkOrder(btSoftBody *psb /* This can be replaced by a btSoftBody pointer */) +{ + int i, nLinks=psb->m_links.size(), nNodes=psb->m_nodes.size(); + btSoftBody::Link *lr; + int ar, br; + btSoftBody::Node *node0 = &(psb->m_nodes[0]); + btSoftBody::Node *node1 = &(psb->m_nodes[1]); + LinkDepsPtr_t linkDep; + int readyListHead, readyListTail, linkNum, linkDepFrees, depLink; + + // Allocate temporary buffers + int *nodeWrittenAt = new int[nNodes+1]; // What link calculation produced this node's current values? + int *linkDepA = new int[nLinks]; // Link calculation input is dependent upon prior calculation #N + int *linkDepB = new int[nLinks]; + int *readyList = new int[nLinks]; // List of ready-to-process link calculations (# of links, maximum) + LinkDeps_t *linkDepFreeList = new LinkDeps_t[2*nLinks]; // Dependent-on-me list elements (2x# of links, maximum) + LinkDepsPtr_t *linkDepListStarts = new LinkDepsPtr_t[nLinks]; // Start nodes of dependent-on-me lists, one for each link + + // Copy the original, unsorted links to a side buffer + btSoftBody::Link *linkBuffer = new btSoftBody::Link[nLinks]; + memcpy(linkBuffer, &(psb->m_links[0]), sizeof(btSoftBody::Link)*nLinks); + + // Clear out the node setup and ready list + for (i=0; i < nNodes+1; i++) { + nodeWrittenAt[i] = REOP_NOT_DEPENDENT; + } + for (i=0; i < nLinks; i++) { + linkDepListStarts[i] = NULL; + } + readyListHead = readyListTail = linkDepFrees = 0; + + // Initial link analysis to set up data structures + for (i=0; i < nLinks; i++) { + + // Note which prior link calculations we are dependent upon & build up dependence lists + lr = &(psb->m_links[i]); + ar = (lr->m_n[0] - node0)/(node1 - node0); + br = (lr->m_n[1] - node0)/(node1 - node0); + if (nodeWrittenAt[ar] > REOP_NOT_DEPENDENT) { + linkDepA[i] = nodeWrittenAt[ar]; + linkDep = &linkDepFreeList[linkDepFrees++]; + linkDep->value = i; + linkDep->next = linkDepListStarts[nodeWrittenAt[ar]]; + linkDepListStarts[nodeWrittenAt[ar]] = linkDep; + } else { + linkDepA[i] = REOP_NOT_DEPENDENT; + } + if (nodeWrittenAt[br] > REOP_NOT_DEPENDENT) { + linkDepB[i] = nodeWrittenAt[br]; + linkDep = &linkDepFreeList[linkDepFrees++]; + linkDep->value = -(i+1); + linkDep->next = linkDepListStarts[nodeWrittenAt[br]]; + linkDepListStarts[nodeWrittenAt[br]] = linkDep; + } else { + linkDepB[i] = REOP_NOT_DEPENDENT; + } + + // Add this link to the initial ready list, if it is not dependent on any other links + if ((linkDepA[i] == REOP_NOT_DEPENDENT) && (linkDepB[i] == REOP_NOT_DEPENDENT)) { + readyList[readyListTail++] = i; + linkDepA[i] = linkDepB[i] = REOP_NODE_COMPLETE; // Probably not needed now + } + + // Update the nodes to mark which ones are calculated by this link + nodeWrittenAt[ar] = nodeWrittenAt[br] = i; + } + + // Process the ready list and create the sorted list of links + // -- By treating the ready list as a queue, we maximize the distance between any + // inter-dependent node calculations + // -- All other (non-related) nodes in the ready list will automatically be inserted + // in between each set of inter-dependent link calculations by this loop + i = 0; + while (readyListHead != readyListTail) { + // Use ready list to select the next link to process + linkNum = readyList[readyListHead++]; + // Copy the next-to-calculate link back into the original link array + psb->m_links[i++] = linkBuffer[linkNum]; + + // Free up any link inputs that are dependent on this one + linkDep = linkDepListStarts[linkNum]; + while (linkDep) { + depLink = linkDep->value; + if (depLink >= 0) { + linkDepA[depLink] = REOP_NOT_DEPENDENT; + } else { + depLink = -depLink - 1; + linkDepB[depLink] = REOP_NOT_DEPENDENT; + } + // Add this dependent link calculation to the ready list if *both* inputs are clear + if ((linkDepA[depLink] == REOP_NOT_DEPENDENT) && (linkDepB[depLink] == REOP_NOT_DEPENDENT)) { + readyList[readyListTail++] = depLink; + linkDepA[depLink] = linkDepB[depLink] = REOP_NODE_COMPLETE; // Probably not needed now + } + linkDep = linkDep->next; + } + } + + // Delete the temporary buffers + delete [] nodeWrittenAt; + delete [] linkDepA; + delete [] linkDepB; + delete [] readyList; + delete [] linkDepFreeList; + delete [] linkDepListStarts; + delete [] linkBuffer; +} + + // void btSoftBodyHelpers::DrawFrame( btSoftBody* psb, btIDebugDraw* idraw) diff --git a/src/BulletSoftBody/btSoftBodyHelpers.h b/src/BulletSoftBody/btSoftBodyHelpers.h index 620a52fe3..727153010 100644 --- a/src/BulletSoftBody/btSoftBodyHelpers.h +++ b/src/BulletSoftBody/btSoftBodyHelpers.h @@ -137,7 +137,12 @@ struct btSoftBodyHelpers bool bfacelinks, bool btetralinks, bool bfacesfromtetras); - + + /// Sort the list of links to move link calculations that are dependent upon earlier + /// ones as far as possible away from the calculation of those values + /// This tends to make adjacent loop iterations not dependent upon one another, + /// so out-of-order processors can execute instructions from multiple iterations at once + static void ReoptimizeLinkOrder(btSoftBody *psb ); }; #endif //BT_SOFT_BODY_HELPERS_H diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 820ac612f..f6755e520 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,8 +1,10 @@ -SUBDIRS( Bullet3OpenCL Bullet3Serialize/Bullet2FileLoader Bullet3Dynamics Bullet3Collision Bullet3Geometry Bullet3Common BulletSoftBody BulletCollision BulletDynamics LinearMath ) -IF(BUILD_MULTITHREADING) - SUBDIRS(MiniCL BulletMultiThreaded) -ENDIF() +IF(BUILD_BULLET3) + SUBDIRS( Bullet3OpenCL Bullet3Serialize/Bullet2FileLoader Bullet3Dynamics Bullet3Collision Bullet3Geometry Bullet3Common ) +ENDIF(BUILD_BULLET3) + +SUBDIRS( BulletSoftBody BulletCollision BulletDynamics LinearMath ) + IF(INSTALL_LIBS) #INSTALL of other files requires CMake 2.6 diff --git a/src/LinearMath/btCpuFeatureUtility.h b/src/LinearMath/btCpuFeatureUtility.h new file mode 100644 index 000000000..d2cab52d4 --- /dev/null +++ b/src/LinearMath/btCpuFeatureUtility.h @@ -0,0 +1,92 @@ + +#ifndef BT_CPU_UTILITY_H +#define BT_CPU_UTILITY_H + +#include "LinearMath/btScalar.h" + +#include //memset +#ifdef USE_SIMD +#include +#ifdef BT_ALLOW_SSE4 +#include +#endif //BT_ALLOW_SSE4 +#endif //USE_SIMD + +#if defined BT_USE_NEON +#define ARM_NEON_GCC_COMPATIBILITY 1 +#include +#include +#include //for sysctlbyname +#endif //BT_USE_NEON + +///Rudimentary btCpuFeatureUtility for CPU features: only report the features that Bullet actually uses (SSE4/FMA3, NEON_HPFP) +///We assume SSE2 in case BT_USE_SSE2 is defined in LinearMath/btScalar.h +class btCpuFeatureUtility +{ +public: + enum btCpuFeature + { + CPU_FEATURE_FMA3=1, + CPU_FEATURE_SSE4_1=2, + CPU_FEATURE_NEON_HPFP=4 + }; + + static int getCpuFeatures() + { + + static int capabilities = 0; + static bool testedCapabilities = false; + if (0 != testedCapabilities) + { + return capabilities; + } + +#ifdef BT_USE_NEON + { + uint32_t hasFeature = 0; + size_t featureSize = sizeof(hasFeature); + int err = sysctlbyname("hw.optional.neon_hpfp", &hasFeature, &featureSize, NULL, 0); + if (0 == err && hasFeature) + capabilities |= CPU_FEATURE_NEON_HPFP; + } +#endif //BT_USE_NEON + +#ifdef BT_ALLOW_SSE4 + { + int cpuInfo[4]; + memset(cpuInfo, 0, sizeof(cpuInfo)); + unsigned long long sseExt = 0; + __cpuid(cpuInfo, 1); + + bool osUsesXSAVE_XRSTORE = cpuInfo[2] & (1 << 27) || false; + bool cpuAVXSuport = cpuInfo[2] & (1 << 28) || false; + + if (osUsesXSAVE_XRSTORE && cpuAVXSuport) + { + sseExt = _xgetbv(0); + } + const int OSXSAVEFlag = (1UL << 27); + const int AVXFlag = ((1UL << 28) | OSXSAVEFlag); + const int FMAFlag = ((1UL << 12) | AVXFlag | OSXSAVEFlag); + if ((cpuInfo[2] & FMAFlag) == FMAFlag && (sseExt & 6) == 6) + { + capabilities |= btCpuFeatureUtility::CPU_FEATURE_FMA3; + } + + const int SSE41Flag = (1 << 19); + if (cpuInfo[2] & SSE41Flag) + { + capabilities |= btCpuFeatureUtility::CPU_FEATURE_SSE4_1; + } + } +#endif//BT_ALLOW_SSE4 + + testedCapabilities = true; + return capabilities; + } + + +}; + + +#endif //BT_CPU_UTILITY_H diff --git a/src/LinearMath/btQuickprof.cpp b/src/LinearMath/btQuickprof.cpp index 68c90c1cd..4a2e58aef 100644 --- a/src/LinearMath/btQuickprof.cpp +++ b/src/LinearMath/btQuickprof.cpp @@ -237,6 +237,14 @@ unsigned long int btClock::getTimeMicroseconds() +/// Returns the time in s since the last call to reset or since +/// the Clock was created. +btScalar btClock::getTimeSeconds() +{ + static const btScalar microseconds_to_seconds = btScalar(0.000001); + return btScalar(getTimeMicroseconds()) * microseconds_to_seconds; +} + inline void Profile_Get_Ticks(unsigned long int * ticks) @@ -293,8 +301,7 @@ void CProfileNode::CleanupMemory() CProfileNode::~CProfileNode( void ) { - delete ( Child); - delete ( Sibling); + CleanupMemory(); } diff --git a/src/LinearMath/btQuickprof.h b/src/LinearMath/btQuickprof.h index 93f3f4a60..362f62d6d 100644 --- a/src/LinearMath/btQuickprof.h +++ b/src/LinearMath/btQuickprof.h @@ -52,6 +52,11 @@ public: /// Returns the time in us since the last call to reset or since /// the Clock was created. unsigned long int getTimeMicroseconds(); + + /// Returns the time in s since the last call to reset or since + /// the Clock was created. + btScalar getTimeSeconds(); + private: struct btClockData* m_data; }; diff --git a/src/LinearMath/btScalar.h b/src/LinearMath/btScalar.h index 401e11eaa..bcf81ad58 100644 --- a/src/LinearMath/btScalar.h +++ b/src/LinearMath/btScalar.h @@ -28,7 +28,7 @@ subject to the following restrictions: #include /* SVN $Revision$ on $Date$ from http://bullet.googlecode.com*/ -#define BT_BULLET_VERSION 282 +#define BT_BULLET_VERSION 283 inline int btGetVersion() { @@ -74,6 +74,11 @@ inline int btGetVersion() #define BT_USE_SSE #ifdef BT_USE_SSE + +#if (_MSC_FULL_VER >= 170050727)//Visual Studio 2012 can compile SSE4/FMA3 (but SSE4/FMA3 is not enabled by default) + #define BT_ALLOW_SSE4 +#endif //(_MSC_FULL_VER >= 160040219) + //BT_USE_SSE_IN_API is disabled under Windows by default, because //it makes it harder to integrate Bullet into your application under Windows //(structured embedding Bullet structs/classes need to be 16-byte aligned) @@ -92,7 +97,7 @@ inline int btGetVersion() #ifdef BT_DEBUG #ifdef _MSC_VER #include - #define btAssert(x) { if(!(x)){printf("Assert "__FILE__ ":%u ("#x")\n", __LINE__);__debugbreak(); }} + #define btAssert(x) { if(!(x)){printf("Assert " __FILE__ ":%u ("#x")\n", __LINE__);__debugbreak(); }} #else//_MSC_VER #include #define btAssert assert @@ -120,7 +125,7 @@ inline int btGetVersion() #ifdef __SPU__ #include #define printf spu_printf - #define btAssert(x) {if(!(x)){printf("Assert "__FILE__ ":%u ("#x")\n", __LINE__);spu_hcmpeq(0,0);}} + #define btAssert(x) {if(!(x)){printf("Assert " __FILE__ ":%u ("#x")\n", __LINE__);spu_hcmpeq(0,0);}} #else #define btAssert assert #endif diff --git a/src/LinearMath/btSerializer.h b/src/LinearMath/btSerializer.h index ff1dc574c..c719b65ca 100644 --- a/src/LinearMath/btSerializer.h +++ b/src/LinearMath/btSerializer.h @@ -438,7 +438,7 @@ public: buffer[9] = '2'; buffer[10] = '8'; - buffer[11] = '2'; + buffer[11] = '3'; } diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt new file mode 100644 index 000000000..990d62ce4 --- /dev/null +++ b/test/CMakeLists.txt @@ -0,0 +1,3 @@ +#SUBDIRS( gtest-1.7.0 TestBullet3OpenCL) +SUBDIRS( gtest-1.7.0 ) + diff --git a/test/TestBullet3OpenCL/main.cpp b/test/TestBullet3OpenCL/main.cpp index 4a18ce702..aee2434c2 100644 --- a/test/TestBullet3OpenCL/main.cpp +++ b/test/TestBullet3OpenCL/main.cpp @@ -6,7 +6,7 @@ void myerrorprintf(const char* msg) { - printf(msg); + printf("%s",msg); } static bool sVerboseWarning = true; @@ -16,7 +16,7 @@ void mywarningprintf(const char* msg) if (sVerboseWarning) { //OutputDebugStringA(msg); - printf(msg); + printf("%s",msg); } } @@ -27,7 +27,7 @@ void myprintf(const char* msg) if (sVerbosePrintf) { //OutputDebugStringA(msg); - printf(msg); + printf("%s",msg); } } diff --git a/test/gtest-1.7.0/CMakeLists.txt b/test/gtest-1.7.0/CMakeLists.txt new file mode 100644 index 000000000..0091e25ec --- /dev/null +++ b/test/gtest-1.7.0/CMakeLists.txt @@ -0,0 +1,16 @@ + +INCLUDE_DIRECTORIES( + . + include +) + +SET(gtest-1.7.0_SRCS + src/gtest-all.cc +) + +#ADD_DEFINITIONS(-DGTEST_HAS_PTHREAD=1) +ADD_DEFINITIONS(-D_VARIADIC_MAX=10) + +FILE(GLOB_RECURSE gtest-1.7.0_HDRS "*.h") + +ADD_LIBRARY(gtest ${gtest-1.7.0_SRCS} ${gtest-1.7.0_HDRS})