From 4970e86100936a26f4ee95ed692e72a85609773f Mon Sep 17 00:00:00 2001 From: ejcoumans Date: Tue, 19 Sep 2006 17:10:30 +0000 Subject: [PATCH] latest 0.5 changes from Steven Baker, and fixed Windows MSVC compiling issues --- Extras/GPUphysics/CHANGES | 11 +- Extras/GPUphysics/CMakeLists.txt | 132 +++++++------- Extras/GPUphysics/DEBUGGING_README | 32 ++-- Extras/GPUphysics/GPU_physics.h | 101 +++++++++++ Extras/GPUphysics/GPU_physics_demo.cxx | 233 +++++++++++++++++++------ Extras/GPUphysics/Makefile | 2 +- Extras/GPUphysics/README | 3 +- Extras/GPUphysics/fboSupport.cxx | 67 +++++-- Extras/GPUphysics/fboSupport.h | 7 +- Extras/GPUphysics/shaderSupport.cxx | 47 ++--- Extras/GPUphysics/shaderSupport.h | 3 - glew32.dll | Bin 0 -> 192512 bytes 12 files changed, 445 insertions(+), 193 deletions(-) create mode 100644 Extras/GPUphysics/GPU_physics.h create mode 100644 glew32.dll diff --git a/Extras/GPUphysics/CHANGES b/Extras/GPUphysics/CHANGES index dbc22551a..935ec323d 100644 --- a/Extras/GPUphysics/CHANGES +++ b/Extras/GPUphysics/CHANGES @@ -24,6 +24,13 @@ GPUphysics-0.3 * Use signed initial velocities so everything doesn't slide off the screen! * The 'bounce' now slows down X/Z motion as well as Y so things actually do stop moving eventually. +* Caught up with some portability issues for more recent versions of + GLSL. + +GPUphysics-0.4 +============== + +* Test for availability of vertex shader textures. +* Fixed 'status: xxxx' message. +* Added support for running the demo in the absence of vertex shader textures. -* Added to the Bullet Subversion repository at Sourceforge.net - See http://sf.net/projects/bullet diff --git a/Extras/GPUphysics/CMakeLists.txt b/Extras/GPUphysics/CMakeLists.txt index 4c453381b..e0c76c26c 100644 --- a/Extras/GPUphysics/CMakeLists.txt +++ b/Extras/GPUphysics/CMakeLists.txt @@ -1,66 +1,66 @@ -PROJECT(GPUphysics) - -# This is basically the overall name of the project in Visual Studio this is the name of the Solution File - - -# For every executable you have with a main method you should have an add_executable line below. -# For every add executable line you should list every .cpp and .h file you have associated with that executable. - - -# This is the variable for Windows. I use this to define the root of my directory structure. -SET(GLUT_ROOT ${GPUphysics_SOURCE_DIR}/Glut) - -# You shouldn't have to modify anything below this line -######################################################## - - -# This is the shortcut to finding GLU, GLUT and OpenGL if they are properly installed on your system -# This should be the case. -INCLUDE (${CMAKE_ROOT}/Modules/FindGLU.cmake) -INCLUDE (${CMAKE_ROOT}/Modules/FindGLUT.cmake) -INCLUDE (${CMAKE_ROOT}/Modules/FindOpenGL.cmake) - - - -IF (WIN32) - # This is the Windows code for which Opengl, and Glut are not properly installed - # since I can't install them I must cheat and copy libraries around - INCLUDE_DIRECTORIES(${GLUT_ROOT}) - # LINK_DIRECTORIES(${GLUT_ROOT}\\lib) - IF (${GLUT_glut_LIBRARY} MATCHES "GLUT_glut_LIBRARY-NOTFOUND") - SET(GLUT_glut_LIBRARY ${GPUphysics_SOURCE_DIR}/Glut/glut32.lib) - # LINK_LIBRARIES(${GLUT_ROOT}\\lib\\glut32 ${OPENGL_gl_LIBRARY} ${OPENGL_glU_LIBRARY}) - # TARGET_LINK_LIBRARIES(table ${GLUT_ROOT}\\lib\\glut32) -# -# ADD_CUSTOM_COMMAND(TARGET table POST_BUILD COMMAND copy ${GLUT_ROOT}\\lib\\glut32.dll ${GLUT_ROOT}\\bin\\vs2005\\Debug -# COMMAND copy ${GLUT_ROOT}\\lib\\glut32.dll ${GLUT_ROOT}\\bin\\vs2003\\Debug -# COMMAND copy ${GLUT_ROOT}\\lib\\glut32.dll ${GLUT_ROOT}\\bin\\vs6\\Debug) - ELSE (${GLUT_glut_LIBRARY} MATCHES "GLUT_glut_LIBRARY-NOTFOUND") -# LINK_LIBRARIES(${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glU_LIBRARY}) -# TARGET_LINK_LIBRARIES(table ${GLUT_glut_LIBRARY}) - ENDIF(${GLUT_glut_LIBRARY} MATCHES "GLUT_glut_LIBRARY-NOTFOUND") -# TARGET_LINK_LIBRARIES(table ${OPENGL_gl_LIBRARY}) -# TARGET_LINK_LIBRARIES(table ${OPENGL_glu_LIBRARY}) -ELSE (WIN32) - # This is the lines for linux. This should always work if everything is installed and working fine. -# SET(CMAKE_BUILD_TYPE Debug) -# SET(CMAKE_CXX_FLAGS_DEBUG "-g") - INCLUDE_DIRECTORIES(/usr/include /usr/local/include ${GLUT_INCLUDE_DIR}) -# TARGET_LINK_LIBRARIES(table ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glU_LIBRARY}) -# TARGET_LINK_LIBRARIES(checker ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glU_LIBRARY}) -ENDIF (WIN32) - -INCLUDE_DIRECTORIES( -glew/include -) - -LINK_LIBRARIES( - glew/lib/glew32.lib ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glU_LIBRARY} -) - -ADD_EXECUTABLE(GPUphysics - fboSupport.cxx - GPU_physics_demo.cxx - shaderSupport.cxx -) - +PROJECT(GPUphysics) + +# This is basically the overall name of the project in Visual Studio this is the name of the Solution File + + +# For every executable you have with a main method you should have an add_executable line below. +# For every add executable line you should list every .cpp and .h file you have associated with that executable. + + +# This is the variable for Windows. I use this to define the root of my directory structure. +SET(GLUT_ROOT ${GPUphysics_SOURCE_DIR}/../../Glut) + +# You shouldn't have to modify anything below this line +######################################################## + + +# This is the shortcut to finding GLU, GLUT and OpenGL if they are properly installed on your system +# This should be the case. +INCLUDE (${CMAKE_ROOT}/Modules/FindGLU.cmake) +INCLUDE (${CMAKE_ROOT}/Modules/FindGLUT.cmake) +INCLUDE (${CMAKE_ROOT}/Modules/FindOpenGL.cmake) + + + +IF (WIN32) + # This is the Windows code for which Opengl, and Glut are not properly installed + # since I can't install them I must cheat and copy libraries around + INCLUDE_DIRECTORIES(${GLUT_ROOT}) + # LINK_DIRECTORIES(${GLUT_ROOT}\\lib) + IF (${GLUT_glut_LIBRARY} MATCHES "GLUT_glut_LIBRARY-NOTFOUND") + SET(GLUT_glut_LIBRARY ${GPUphysics_SOURCE_DIR}/Glut/glut32.lib) + # LINK_LIBRARIES(${GLUT_ROOT}\\lib\\glut32 ${OPENGL_gl_LIBRARY} ${OPENGL_glU_LIBRARY}) + # TARGET_LINK_LIBRARIES(table ${GLUT_ROOT}\\lib\\glut32) +# +# ADD_CUSTOM_COMMAND(TARGET table POST_BUILD COMMAND copy ${GLUT_ROOT}\\lib\\glut32.dll ${GLUT_ROOT}\\bin\\vs2005\\Debug +# COMMAND copy ${GLUT_ROOT}\\lib\\glut32.dll ${GLUT_ROOT}\\bin\\vs2003\\Debug +# COMMAND copy ${GLUT_ROOT}\\lib\\glut32.dll ${GLUT_ROOT}\\bin\\vs6\\Debug) + ELSE (${GLUT_glut_LIBRARY} MATCHES "GLUT_glut_LIBRARY-NOTFOUND") +# LINK_LIBRARIES(${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glU_LIBRARY}) +# TARGET_LINK_LIBRARIES(table ${GLUT_glut_LIBRARY}) + ENDIF(${GLUT_glut_LIBRARY} MATCHES "GLUT_glut_LIBRARY-NOTFOUND") +# TARGET_LINK_LIBRARIES(table ${OPENGL_gl_LIBRARY}) +# TARGET_LINK_LIBRARIES(table ${OPENGL_glu_LIBRARY}) +ELSE (WIN32) + # This is the lines for linux. This should always work if everything is installed and working fine. +# SET(CMAKE_BUILD_TYPE Debug) +# SET(CMAKE_CXX_FLAGS_DEBUG "-g") + INCLUDE_DIRECTORIES(/usr/include /usr/local/include ${GLUT_INCLUDE_DIR}) +# TARGET_LINK_LIBRARIES(table ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glU_LIBRARY}) +# TARGET_LINK_LIBRARIES(checker ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glU_LIBRARY}) +ENDIF (WIN32) + +INCLUDE_DIRECTORIES( +../../Glut/GL/include +) + +LINK_LIBRARIES( + ../../Glut/glew/lib/glew32.lib ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glU_LIBRARY} +) + +ADD_EXECUTABLE(GPUphysics + fboSupport.cxx + GPU_physics_demo.cxx + shaderSupport.cxx +) + diff --git a/Extras/GPUphysics/DEBUGGING_README b/Extras/GPUphysics/DEBUGGING_README index ca45b70a0..aaccf8b97 100644 --- a/Extras/GPUphysics/DEBUGGING_README +++ b/Extras/GPUphysics/DEBUGGING_README @@ -24,24 +24,10 @@ help with our debugging problems. something is amiss in shader-land. There are several possibilities - the nastiest of which might - be that either: - - a) Your graphics card/driver doesn't support floating point - textures. (This is pretty much 'Game Over' for you because - without that, doing physics in the GPU is going to be - virtually impossible). - - b) Your graphics card/driver doesn't support vertex shader - textures (or it supports them but sets the maximum number - to zero - which is the same thing). This means that we - can't move things around using GPU textures - but we can - still use the GPU to accellerate physics calculations. - In practical game scenarios, I think the CPU needs to know - where all the objects are - so this may not be the serious - issue it sounds like. What it mostly does is to clobber - the idea of running physics on particle system types of - effect where a vast number of objects are involved but - where individual objects have zero effect on game play. + be that your graphics card/driver doesn't support floating point + textures. (This is pretty much 'Game Over' for you because + without that, doing physics in the GPU is going to be + virtually impossible). 3) Run without forces being applied: @@ -63,5 +49,15 @@ help with our debugging problems. This is the most likely scenario. +4) Run without vertex texturing: + GPU_physics_demo -v + + On hardware that doesn't support vertex texturing, this flag + is turned on by default (and things run about 5x slower!) + + Use this flag to force the software to run without vertex + texturing on hardware that does actually support it. + + You can use this flag in conjunction with any of the others. diff --git a/Extras/GPUphysics/GPU_physics.h b/Extras/GPUphysics/GPU_physics.h new file mode 100644 index 000000000..5850cf5d3 --- /dev/null +++ b/Extras/GPUphysics/GPU_physics.h @@ -0,0 +1,101 @@ + +/**********************\ +* * +* Determine OS type * +* * +\**********************/ + +#if defined(__CYGWIN__) +#define GPUP_WIN32 1 +#define GPUP_CYGWIN 1 /* Windoze AND Cygwin. */ +#elif defined(_WIN32) || defined(__WIN32__) || defined(_MSC_VER) +#define GPUP_WIN32 1 +#define GPUP_MSVC 1 /* Windoze AND MSVC. */ +#elif defined(__BEOS__) +#define GPUP_BEOS 1 +#elif defined( macintosh ) +#define GPUP_MACINTOSH 1 +#elif defined(__APPLE__) +#define GPUP_MAC_OSX 1 +#elif defined(__linux__) +#define GPUP_LINUX 1 +#elif defined(__sgi) +#define GPUP_IRIX 1 +#elif defined(_AIX) +#define GPUP_AIX 1 +#elif defined(SOLARIS) || defined(sun) +#define GPUP_SOLARIS 1 +#elif defined(hpux) +#define GPUP_HPUX 1 +#elif (defined(__unix__) || defined(unix)) && !defined(USG) +#define GPUP_BSD 1 +#endif +#if defined(BORLANDBUILDER) +#define GPUP_BB 1 +#endif + +#include +#include +#include + +/* + Add specialised includes/defines... +*/ + +#ifdef GPUP_WIN32 +#include +#include +#include +#define GPUP_WGL 1 +#endif + +#ifdef GPUP_CYGWIN +#include +#define GPUP_WGL 1 +#endif + +#ifdef GPUP_BEOS +#include +#define GPUP_GLX 1 +#endif + +#ifdef GPUP_MACINTOSH +#include +#include +#define GPUP_AGL 1 +#endif + +#ifdef GPUP_MAC_OSX +#include +#define GPUP_CGL 1 +#endif + +#if defined(GPUP_LINUX) || defined(GPUP_BSD) || defined(GPUP_IRIX) || defined(GPUP_SOLARIS) || defined(GPUP_AIX) +#include +#include +#include +#define GPUP_GLX 1 +#endif + +#if defined(GPUP_BSD) +#include +#define GPUP_GLX 1 +#endif + +#include +#include +#include +#include +#include + +#include + +#if defined(GPUP_MAC_OSX) && !defined (VMDMESA) +#include +#include +#include +#else +#include +#include +#endif + diff --git a/Extras/GPUphysics/GPU_physics_demo.cxx b/Extras/GPUphysics/GPU_physics_demo.cxx index 4fe54bddb..12383852d 100644 --- a/Extras/GPUphysics/GPU_physics_demo.cxx +++ b/Extras/GPUphysics/GPU_physics_demo.cxx @@ -1,17 +1,4 @@ -#ifndef WIN32 -#include -#endif -#include -#include -//think different -#if defined(__APPLE__) && !defined (VMDMESA) -#include -#include -#include -#else -#include -#include -#endif +#include "GPU_physics.h" #include "fboSupport.h" #include "shaderSupport.h" @@ -25,7 +12,49 @@ enum DebugOptions } ; -DebugOptions debugOpt = DRAW_ALL ; +static float *positionData = NULL ; +static float *rotationData = NULL ; +static bool noVertexTextureSupport = false ; +static DebugOptions debugOpt = DRAW_ALL ; + +void checkVertexTextureSupport ( bool disableVertexTextureSupport ) +{ + GLint nVertTextures ; + GLint nFragTextures ; + GLint nCombTextures ; + + glGetIntegerv ( GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, & nVertTextures ) ; + glGetIntegerv ( GL_MAX_TEXTURE_IMAGE_UNITS, & nFragTextures ) ; + glGetIntegerv ( GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, & nCombTextures ) ; + + fprintf(stderr, "INFO: This hardware supports at most:\n" + " %2d vert texture samplers\n" + " %2d frag texture samplers\n" + " %2d total texture samplers\n", + nVertTextures, nFragTextures, nCombTextures ) ; + + noVertexTextureSupport = ( nVertTextures < 2 ) ; + + if ( noVertexTextureSupport && debugOpt != DRAW_WITHOUT_SHADERS ) + { + fprintf ( stderr, "\n" + "********************************************\n" + "* *\n" + "* WARNING: This graphics card doesn't have *\n" + "* vertex shader texture support - a work- *\n" + "* around will be used - but this demo will *\n" + "* be much less impressive as a result! *\n" + "* *\n" + "********************************************\n\n" ) ; + } + + if ( ! noVertexTextureSupport && disableVertexTextureSupport ) + { + fprintf ( stderr, "WARNING: Vertex Texture Support has" + "been disabled from the command line.\n" ) ; + noVertexTextureSupport = true ; + } +} float frand ( float max ) @@ -33,6 +62,7 @@ float frand ( float max ) return (float)(rand() % 32767) * max / 32767.0f ; } + static GLSL_ShaderPair *velocityGenerator ; static GLSL_ShaderPair *positionGenerator ; static GLSL_ShaderPair *collisionGenerator ; @@ -44,6 +74,7 @@ static FrameBufferObject *velocity ; static FrameBufferObject *rotvelocity ; static FrameBufferObject *force ; static FrameBufferObject *mass ; +static FrameBufferObject *old ; #define TEX_SIZE 128 #define NUM_CUBES ( TEX_SIZE * TEX_SIZE ) @@ -77,7 +108,9 @@ void reshape ( int wid, int ht ) } -void initGLcontext ( int argc, char **argv, void (*display)(void) ) +void initGLcontext ( int argc, char **argv, + void (*display)(void), + bool disableVertexTextureSupport ) { glutInit ( &argc, argv ) ; glutInitDisplayMode ( GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE ) ; @@ -88,6 +121,8 @@ void initGLcontext ( int argc, char **argv, void (*display)(void) ) glutReshapeFunc ( reshape ) ; glewInit () ; + + checkVertexTextureSupport ( disableVertexTextureSupport ) ; } @@ -97,6 +132,7 @@ void initMotionTextures () position = new FrameBufferObject ( TEX_SIZE, TEX_SIZE, 3, FBO_FLOAT ) ; rotation = new FrameBufferObject ( TEX_SIZE, TEX_SIZE, 3, FBO_FLOAT ) ; + old = new FrameBufferObject ( TEX_SIZE, TEX_SIZE, 3, FBO_FLOAT ) ; if ( debugOpt == DRAW_WITHOUT_PHYSICS ) { @@ -122,8 +158,9 @@ void initMotionTextures () } } - float *positionData = new float [ TEX_SIZE * TEX_SIZE * 3 ] ; - float *rotationData = new float [ TEX_SIZE * TEX_SIZE * 3 ] ; + positionData = new float [ TEX_SIZE * TEX_SIZE * 3 ] ; + rotationData = new float [ TEX_SIZE * TEX_SIZE * 3 ] ; + float *velocityData ; float *rotvelocityData ; float *forceData ; @@ -175,9 +212,9 @@ void initMotionTextures () if ( debugOpt != DRAW_WITHOUT_PHYSICS ) { /* Random (but predominantly upwards) velocities. */ - velocityData [ (i*TEX_SIZE + j) * 3 + 0 ] = frand ( 10.0f ) ; + velocityData [ (i*TEX_SIZE + j) * 3 + 0 ] = frand ( 10.0f ) - 5.0f; velocityData [ (i*TEX_SIZE + j) * 3 + 1 ] = frand ( 100.0f ) ; - velocityData [ (i*TEX_SIZE + j) * 3 + 2 ] = frand ( 10.0f ) ; + velocityData [ (i*TEX_SIZE + j) * 3 + 2 ] = frand ( 10.0f ) - 5.0f; /* Random rotational velocities */ rotvelocityData [ (i*TEX_SIZE + j) * 3 + 0 ] = frand ( 3.0f ) ; @@ -201,6 +238,7 @@ void initMotionTextures () position -> fillTexture ( positionData ) ; rotation -> fillTexture ( rotationData ) ; + old -> fillTexture ( positionData ) ; // Doesn't really need it... if ( debugOpt != DRAW_WITHOUT_PHYSICS ) { @@ -237,15 +275,14 @@ void initPhysicsShaders () velocityGenerator = new GLSL_ShaderPair ( "VelocityGenerator", NULL, NULL, - "uniform float delta_T ;" - "uniform vec3 g ;" + "uniform vec4 g_dt ;" "uniform sampler2D old_velocity ;" "uniform sampler2D force ;" "uniform sampler2D mass ;" "void main() {" " gl_FragColor = vec4 (" " texture2D ( old_velocity, gl_TexCoord[0].st ).xyz +" - " delta_T * ( g +" + " g_dt.w * ( g_dt.xyz +" " texture2D ( force , gl_TexCoord[0].st ).xyz /" " texture2D ( mass , gl_TexCoord[0].st ).x)," " 1.0 ) ; }", @@ -290,7 +327,7 @@ void initPhysicsShaders () "void main() {" " vec3 pos = texture2D ( position , gl_TexCoord[0].st ).xyz ;" " vec3 vel = texture2D ( old_velocity, gl_TexCoord[0].st ).xyz ;" - " if ( pos [ 1 ] < 0.0 ) vel [ 1 ] *= -0.90 ;" + " if ( pos [ 1 ] < 0.0 ) vel *= vec3(0.90,-0.90,0.90) ;" " gl_FragColor = vec4 ( vel, 1.0 ) ; }", "CollisionGenerator Frag Shader" ) ; assert ( collisionGenerator -> compiledOK () ) ; @@ -303,15 +340,17 @@ void initCubeVBO () float *p = vertices ; float *t = texcoords ; float *c = colours ; + int nverts = 0 ; - for ( int k = 0 ; k < NUM_CUBES * STRIPS_PER_CUBE ; k++ ) + for ( int k = 0 ; + k < (noVertexTextureSupport ? 1 : NUM_CUBES) * STRIPS_PER_CUBE ; k++ ) { starts [ k ] = k * VERTS_PER_STRIP ; lengths [ k ] = VERTS_PER_STRIP ; } - for ( int i = 0 ; i < TEX_SIZE ; i++ ) - for ( int j = 0 ; j < TEX_SIZE ; j++ ) + for ( int i = 0 ; i < (noVertexTextureSupport ? 1 : TEX_SIZE) ; i++ ) + for ( int j = 0 ; j < (noVertexTextureSupport ? 1 : TEX_SIZE) ; j++ ) { int n = i * TEX_SIZE + j ; @@ -363,21 +402,23 @@ void initCubeVBO () *p++ = +1 + dx ; *p++ = -1 + dy ; *p++ = +1 + dz ; *p++ = +1 + dx ; *p++ = +1 + dy ; *p++ = -1 + dz ; *p++ = +1 + dx ; *p++ = +1 + dy ; *p++ = +1 + dz ; + + nverts += STRIPS_PER_CUBE * VERTS_PER_STRIP ; } glGenBuffersARB ( 1, & vbo_vx ) ; glBindBufferARB ( GL_ARRAY_BUFFER_ARB, vbo_vx ) ; - glBufferDataARB ( GL_ARRAY_BUFFER_ARB, NUM_VERTS * 3 * sizeof(float), + glBufferDataARB ( GL_ARRAY_BUFFER_ARB, nverts * 3 * sizeof(float), vertices, GL_STATIC_DRAW_ARB ) ; glGenBuffersARB ( 1, & vbo_tx ) ; glBindBufferARB ( GL_ARRAY_BUFFER_ARB, vbo_tx ) ; - glBufferDataARB ( GL_ARRAY_BUFFER_ARB, NUM_VERTS * 2 * sizeof(float), + glBufferDataARB ( GL_ARRAY_BUFFER_ARB, nverts * 2 * sizeof(float), texcoords, GL_STATIC_DRAW_ARB ) ; glGenBuffersARB ( 1, & vbo_co ) ; glBindBufferARB ( GL_ARRAY_BUFFER_ARB, vbo_co ) ; - glBufferDataARB ( GL_ARRAY_BUFFER_ARB, NUM_VERTS * 4 * sizeof(float), + glBufferDataARB ( GL_ARRAY_BUFFER_ARB, nverts * 4 * sizeof(float), colours, GL_STATIC_DRAW_ARB ) ; glBindBufferARB ( GL_ARRAY_BUFFER_ARB, 0 ) ; @@ -386,15 +427,89 @@ void initCubeVBO () cubeShader = NULL ; else { - cubeShader = new GLSL_ShaderPair ( "CubeShader", "cubeShader.vert", - "cubeShader.frag" ) ; + if ( noVertexTextureSupport ) + cubeShader = new GLSL_ShaderPair ( "CubeShader", "cubeShaderNoTexture.vert", + "cubeShader.frag" ) ; + else + cubeShader = new GLSL_ShaderPair ( "CubeShader", "cubeShader.vert", + "cubeShader.frag" ) ; assert ( cubeShader -> compiledOK () ) ; } } +void drawCubesTheHardWay () +{ + /* + Without vertex texture support, we have to read the position/rotation + data back from the hardware every frame and render each cube individually. + */ + + float p0 = positionData [ 0 ] ; + float p1 = positionData [ 1 ] ; + float p2 = positionData [ 2 ] ; + + position -> fetchTexture ( positionData ) ; + rotation -> fetchTexture ( rotationData ) ; + + if ( positionData [ 0 ] == p0 && + positionData [ 1 ] == p1 && + positionData [ 2 ] == p2 ) + { + fprintf ( stderr, "WARNING: If nothing seems to be working, you may\n" + "have an old version of the nVidia driver.\n" + "Version 76.76 is known to be bad.\n" ) ; + } + + cubeShader -> use () ; /* Math = Cube shader */ + + glPushClientAttrib ( GL_CLIENT_VERTEX_ARRAY_BIT ) ; + + glDisableClientState ( GL_TEXTURE_COORD_ARRAY ) ; + + glEnableClientState ( GL_COLOR_ARRAY ) ; + glBindBufferARB ( GL_ARRAY_BUFFER_ARB, vbo_co ) ; + glColorPointer ( 4, GL_FLOAT, 0, vbo_co ? NULL : colours ) ; + + glEnableClientState ( GL_VERTEX_ARRAY ) ; + glBindBufferARB ( GL_ARRAY_BUFFER_ARB, vbo_vx ) ; + glVertexPointer ( 3, GL_FLOAT, 0, vbo_vx ? NULL : vertices ) ; + + for ( int i = 0 ; i < TEX_SIZE ; i++ ) + for ( int j = 0 ; j < TEX_SIZE ; j++ ) + { + float *pos = & positionData [ (i*TEX_SIZE + j) * 3 ] ; + float *rot = & rotationData [ (i*TEX_SIZE + j) * 3 ] ; + + glPushMatrix () ; + glTranslatef ( pos [ 0 ], pos [ 1 ], pos [ 2 ] ) ; + glRotatef ( rot [ 0 ] * 180.0f / 3.14159f, 0, 1, 0 ) ; + glRotatef ( rot [ 1 ] * 180.0f / 3.14159f, 1, 0, 0 ) ; + glRotatef ( rot [ 2 ] * 180.0f / 3.14159f, 0, 0, 1 ) ; + glMultiDrawArraysEXT ( GL_TRIANGLE_STRIP, (GLint*)starts, (GLint*)lengths, + STRIPS_PER_CUBE ) ; + glPopMatrix () ; + } + + glBindBufferARB ( GL_ARRAY_BUFFER_ARB, 0 ) ; + glPopClientAttrib () ; +} + + void drawCubeVBO () { + /* + With vertex texture support, we can leave the position/rotation + data on the hardware and render all of the cubes in one big VBO! + */ + + if ( debugOpt != DRAW_WITHOUT_SHADERS ) + { + cubeShader -> use () ; /* Math = Cube shader */ + cubeShader -> applyTexture ( "position", position, 0 ) ; + cubeShader -> applyTexture ( "rotation", rotation, 1 ) ; + } + glPushClientAttrib ( GL_CLIENT_VERTEX_ARRAY_BIT ) ; glEnableClientState ( GL_TEXTURE_COORD_ARRAY ) ; @@ -437,12 +552,17 @@ void drawCubes () glClearColor ( 0.7f, 0.7f, 0.7f, 1.0f ) ; glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ) ; - drawCubeVBO () ; + if ( noVertexTextureSupport ) + drawCubesTheHardWay () ; + else + drawCubeVBO () ; } void display ( void ) { + FrameBufferObject *tmp ; + if ( debugOpt != DRAW_WITHOUT_SHADERS && debugOpt != DRAW_WITHOUT_PHYSICS ) { @@ -450,31 +570,50 @@ void display ( void ) if ( debugOpt != DRAW_WITHOUT_FORCES ) { + /* Copy old velocity into old. */ + tmp = old ; + old = velocity ; + velocity = tmp ; + velocityGenerator -> use () ; - velocityGenerator -> applyTexture ( "old_velocity", velocity, 0 ) ; + velocityGenerator -> applyTexture ( "old_velocity", old , 0 ) ; velocityGenerator -> applyTexture ( "force" , force , 1 ) ; velocityGenerator -> applyTexture ( "mass" , mass , 2 ) ; - velocityGenerator -> setUniform1f ( "delta_T" , 0.016f ) ; - velocityGenerator -> setUniform3f ( "g", 0.0f, -9.8f, 0.0f ) ; + velocityGenerator -> setUniform4f ( "g_dt", 0.0f, -9.8f, 0.0f, 0.016f ) ; velocity -> paint () ; } + /* Copy old position into old. */ + tmp = old ; + old = position ; + position = tmp ; + positionGenerator -> use () ; - positionGenerator -> applyTexture ( "old_position", position, 0 ) ; + positionGenerator -> applyTexture ( "old_position", old , 0 ) ; positionGenerator -> applyTexture ( "velocity" , velocity, 1 ) ; positionGenerator -> setUniform1f ( "delta_T", 0.016f ) ; position -> paint () ; if ( debugOpt != DRAW_WITHOUT_COLLISIONS ) { + /* Copy old velocity into old. */ + tmp = old ; + old = velocity ; + velocity = tmp ; + collisionGenerator -> use () ; collisionGenerator -> applyTexture ( "position" , position, 0 ) ; - collisionGenerator -> applyTexture ( "old_velocity", velocity, 1 ) ; + collisionGenerator -> applyTexture ( "old_velocity", old , 1 ) ; velocity -> paint () ; } + /* Copy old rotation into old. */ + tmp = old ; + old = rotation ; + rotation = tmp ; + positionGenerator -> use () ; - positionGenerator -> applyTexture ( "old_position", rotation , 0 ) ; + positionGenerator -> applyTexture ( "old_position", old , 0 ) ; positionGenerator -> applyTexture ( "velocity" , rotvelocity, 1 ) ; positionGenerator -> setUniform1f ( "delta_T", 0.016f ) ; rotation -> paint () ; @@ -486,13 +625,6 @@ void display ( void ) glViewport ( 0, 0, win_width, win_height ) ; - if ( debugOpt != DRAW_WITHOUT_SHADERS ) - { - cubeShader -> use () ; /* Math = Cube shader */ - cubeShader -> applyTexture ( "position", position, 0 ) ; - cubeShader -> applyTexture ( "rotation", rotation, 1 ) ; - } - drawCubes () ; /* All done! */ @@ -505,19 +637,22 @@ void display ( void ) void help () { fprintf ( stderr, "GPUphysics: Usage -\n\n" ) ; - fprintf ( stderr, " GPUphysics_demo [-c][-p][-v][-a]\n\n" ) ; + fprintf ( stderr, " GPUphysics_demo [-c][-p][-v][-a][-v]\n\n" ) ; fprintf ( stderr, "Where:\n" ) ; fprintf ( stderr, " -s -- Draw with shaders at all\n" ) ; fprintf ( stderr, " -p -- Draw with shaders but no physics\n" ) ; fprintf ( stderr, " -c -- Draw with physics but no ground collisions\n" ) ; fprintf ( stderr, " -f -- Draw with physics but no forces\n" ) ; fprintf ( stderr, " -a -- Draw with all features enabled [default]\n" ) ; + fprintf ( stderr, " -v -- Disable vertex textures even if " + "they are supported in hardware\n" ) ; fprintf ( stderr, "\n" ) ; } int main ( int argc, char **argv ) { + bool disableVertexTextureSupport = false ; debugOpt = DRAW_ALL ; for ( int i = 1 ; i < argc ; i++ ) @@ -532,6 +667,7 @@ int main ( int argc, char **argv ) case 'f' : debugOpt = DRAW_WITHOUT_FORCES ; break ; case 'a' : debugOpt = DRAW_ALL ; break ; + case 'v' : disableVertexTextureSupport = true ; break ; default : help () ; exit ( 0 ) ; } else @@ -541,8 +677,7 @@ int main ( int argc, char **argv ) } } - initGLcontext ( argc, argv, display ) ; - + initGLcontext ( argc, argv, display, disableVertexTextureSupport ) ; initMotionTextures () ; initPhysicsShaders () ; initCubeVBO () ; diff --git a/Extras/GPUphysics/Makefile b/Extras/GPUphysics/Makefile index 8062dbd48..0745b2ddd 100644 --- a/Extras/GPUphysics/Makefile +++ b/Extras/GPUphysics/Makefile @@ -1,5 +1,5 @@ -HDRS = fboSupport.h shaderSupport.h +HDRS = fboSupport.h shaderSupport.h GPU_physics.h OBJS = GPU_physics_demo.o fboSupport.o shaderSupport.o all: ${OBJS} diff --git a/Extras/GPUphysics/README b/Extras/GPUphysics/README index 8ee76ae31..4a999c257 100644 --- a/Extras/GPUphysics/README +++ b/Extras/GPUphysics/README @@ -25,7 +25,8 @@ GPU_physics_demo.cxx -- The application code. GLSLShader Sources used in the Demo: cubeShader.vert -cubeShader.frag -- Used to render the cubes. +cubeShaderNoVertexTexture.vert +cubeShader.frag ---------------------------------------------------------- The objective of this library is to provide a basis for the diff --git a/Extras/GPUphysics/fboSupport.cxx b/Extras/GPUphysics/fboSupport.cxx index e87f2ec95..8da23de18 100644 --- a/Extras/GPUphysics/fboSupport.cxx +++ b/Extras/GPUphysics/fboSupport.cxx @@ -1,18 +1,6 @@ -#include -#include -#include +#include "GPU_physics.h" // #define FBO_USE_NVIDIA_FLOAT_TEXTURE_EXTENSION 1 -#include - -#if defined(__APPLE__) && !defined (VMDMESA) -#include -#include -#include -#else -#include -#include -#endif #include "fboSupport.h" #ifdef FBO_USE_NVIDIA_FLOAT_TEXTURE_EXTENSION @@ -53,12 +41,18 @@ static void checkFrameBufferStatus () { case GL_FRAMEBUFFER_COMPLETE_EXT : break ; + case GL_FRAMEBUFFER_UNSUPPORTED_EXT : - /* choose different formats */ + fprintf ( stderr, "ERROR: Unsupported FBO setup.\n" ) ; + exit ( 1 ) ; + + case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT : + fprintf ( stderr, "WARNING: Incomplete FBO setup.\n" ) ; break ; + default : - printf("status : %i\n",status); - assert ( 1 ) ; /* programming error; will fail on all hardware */ + fprintf ( stderr, "WARNING: Unexpected FBO status : 0x%04x\n", status ) ; + break ; } } @@ -174,13 +168,15 @@ FrameBufferObject::FrameBufferObject ( int _width , GL_RENDERBUFFER_EXT, depth_rb ) ; #ifdef NEED_STENCIL_BUFFER - statuc GLuint stencil_rb ; + static GLuint stencil_rb ; glGenRenderbuffersEXT ( 1, & stencil_rb ) ; // initialize stencil renderbuffer glBindRenderbufferEXT ( GL_RENDERBUFFER_EXT, stencil_rb ) ; glRenderbufferStorageEXT ( GL_RENDERBUFFER_EXT, GL_STENCIL_INDEX, width, height ) ; glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, stencil_rb ) ; +#else + glDisable ( GL_STENCIL_TEST ) ; #endif // Check framebuffer completeness at the end of initialization. @@ -191,6 +187,43 @@ FrameBufferObject::FrameBufferObject ( int _width , +void FrameBufferObject::fetchTexture ( void *data ) +{ + glBindTexture ( GL_TEXTURE_2D, textureHandle ) ; + glGetTexImage ( GL_TEXTURE_2D, 0, /* MIP level...zero */ + format, /* External format */ + type, /* Data type */ + data /* Image data */ ) ; +} + + + +void FrameBufferObject::fetchTexture ( unsigned char *data ) +{ + if ( type != FBO_UNSIGNED_BYTE ) + { + fprintf ( stderr, "FBO: Data format mismatch!" ) ; + return ; + } + + fetchTexture ( (void *)data ) ; +} + + + +void FrameBufferObject::fetchTexture ( float *data ) +{ + if ( type != FBO_FLOAT ) + { + fprintf ( stderr, "FBO: Data format mismatch!" ) ; + return ; + } + + fetchTexture ( (void *)data ) ; +} + + + void FrameBufferObject::fillTexture ( void *data ) { glBindTexture( GL_TEXTURE_2D, textureHandle ) ; diff --git a/Extras/GPUphysics/fboSupport.h b/Extras/GPUphysics/fboSupport.h index 62e870a1f..aeec27414 100644 --- a/Extras/GPUphysics/fboSupport.h +++ b/Extras/GPUphysics/fboSupport.h @@ -3,6 +3,8 @@ GLuint makeTextureTarget ( GLuint textureHandle ) ; void renderTo2DTexture ( GLuint fboHandle ) ; void renderToFrameBuffer () ; +//#define NEED_STENCIL_BUFFER 1 + enum fboDataType { #ifndef GL_BYTE @@ -44,11 +46,12 @@ class FrameBufferObject GLuint fboHandle ; GLuint depth_rb ; -#ifdef NEED_STENCIL +#ifdef NEED_STENCIL_BUFFER GLuint stencil_rb ; #endif - void fillTexture ( void *data ) ; + void fillTexture ( void *data ) ; + void fetchTexture ( void *data ) ; public: FrameBufferObject ( int _width, /* Must be a power of two! */ diff --git a/Extras/GPUphysics/shaderSupport.cxx b/Extras/GPUphysics/shaderSupport.cxx index 3e7b8b562..34c40fb96 100644 --- a/Extras/GPUphysics/shaderSupport.cxx +++ b/Extras/GPUphysics/shaderSupport.cxx @@ -1,21 +1,4 @@ -#include -#include -#include -#include -#include -#ifndef WIN32 -#include -#endif -#include -#include -#if defined(__APPLE__) && !defined (VMDMESA) -#include -#include -#include -#else -#include -#include -#endif +#include "GPU_physics.h" #include "shaderSupport.h" #include "fboSupport.h" @@ -71,26 +54,22 @@ public: -/************************************\ -* * -* Low level File I/O junk * -* * -\************************************/ - -static int fSize ( const char *fname ) -{ - struct stat st ; - return ( stat ( fname, &st ) != -1 ) ? st . st_size : -1 ; -} - - static char *readShaderText ( const char *fname ) { - int size = fSize ( fname ) ; + + - char *shader = new char [ size + 1 ] ; + FILE *fd = fopen ( fname, "r" ) ; - FILE *fd = fopen ( fname, "r" ) ; + int size = 0; + /* File operations denied? ok, just close and return failure */ + if (fseek(fd, 0, SEEK_END) || (size = ftell(fd)) == EOF || fseek(fd, 0, SEEK_SET)) + { + printf("Error: cannot get filesize from %s\n", fname); + exit (1); + } + + char *shader = new char [ size + 1 ] ; if ( fd == NULL ) { diff --git a/Extras/GPUphysics/shaderSupport.h b/Extras/GPUphysics/shaderSupport.h index a76fcc2a2..af4000ea3 100644 --- a/Extras/GPUphysics/shaderSupport.h +++ b/Extras/GPUphysics/shaderSupport.h @@ -1,7 +1,4 @@ -#include -#include - class GLSL_Shader ; class FrameBufferObject ; diff --git a/glew32.dll b/glew32.dll new file mode 100644 index 0000000000000000000000000000000000000000..aa55ae9907bf21a91fceb005fef7d42efb4780d3 GIT binary patch literal 192512 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 h&_F{24GlCj(9l3b0}Tx{G|