diff options
Diffstat (limited to 'progs/glsl')
55 files changed, 0 insertions, 9591 deletions
diff --git a/progs/glsl/.gitignore b/progs/glsl/.gitignore deleted file mode 100644 index 9d403ec6d6e..00000000000 --- a/progs/glsl/.gitignore +++ /dev/null @@ -1,35 +0,0 @@ -array -bitmap -brick -bump -convolutions -deriv -extfuncs.h -fragcoord -fsraytrace -identity -linktest -mandelbrot -multinoise -multitex -noise -noise2 -pointcoord -points -readtex.c -readtex.h -samplers -samplers_array -shaderutil.c -shaderutil.h -shadow_sampler -shtest -skinning -texaaline -texdemo1 -toyball -trirast -twoside -vert-or-frag-only -vert-tex -vsraytrace diff --git a/progs/glsl/CH06-brick.frag b/progs/glsl/CH06-brick.frag deleted file mode 100644 index 06ef04e3afb..00000000000 --- a/progs/glsl/CH06-brick.frag +++ /dev/null @@ -1,36 +0,0 @@ -// -// Fragment shader for procedural bricks -// -// Authors: Dave Baldwin, Steve Koren, Randi Rost -// based on a shader by Darwyn Peachey -// -// Copyright (c) 2002-2006 3Dlabs Inc. Ltd. -// -// See 3Dlabs-License.txt for license information -// - -uniform vec3 BrickColor, MortarColor; -uniform vec2 BrickSize; -uniform vec2 BrickPct; - -varying vec2 MCposition; -varying float LightIntensity; - -void main() -{ - vec3 color; - vec2 position, useBrick; - - position = MCposition / BrickSize; - - if (fract(position.y * 0.5) > 0.5) - position.x += 0.5; - - position = fract(position); - - useBrick = step(position, BrickPct); - - color = mix(MortarColor, BrickColor, useBrick.x * useBrick.y); - color *= LightIntensity; - gl_FragColor = vec4(color, 1.0); -} diff --git a/progs/glsl/CH06-brick.vert b/progs/glsl/CH06-brick.vert deleted file mode 100644 index e95e6f42f0b..00000000000 --- a/progs/glsl/CH06-brick.vert +++ /dev/null @@ -1,41 +0,0 @@ -// -// Vertex shader for procedural bricks -// -// Authors: Dave Baldwin, Steve Koren, Randi Rost -// based on a shader by Darwyn Peachey -// -// Copyright (c) 2002-2006 3Dlabs Inc. Ltd. -// -// See 3Dlabs-License.txt for license information -// - -uniform vec3 LightPosition; - -const float SpecularContribution = 0.3; -const float DiffuseContribution = 1.0 - SpecularContribution; - -varying float LightIntensity; -varying vec2 MCposition; - -void main() -{ - vec3 ecPosition = vec3(gl_ModelViewMatrix * gl_Vertex); - vec3 tnorm = normalize(gl_NormalMatrix * gl_Normal); - vec3 lightVec = normalize(LightPosition - ecPosition); - vec3 reflectVec = reflect(-lightVec, tnorm); - vec3 viewVec = normalize(-ecPosition); - float diffuse = max(dot(lightVec, tnorm), 0.0); - float spec = 0.0; - - if (diffuse > 0.0) - { - spec = max(dot(reflectVec, viewVec), 0.0); - spec = pow(spec, 16.0); - } - - LightIntensity = DiffuseContribution * diffuse + - SpecularContribution * spec; - - MCposition = gl_Vertex.xy; - gl_Position = ftransform(); -} diff --git a/progs/glsl/CH11-bumpmap.frag b/progs/glsl/CH11-bumpmap.frag deleted file mode 100644 index e12c5d374cd..00000000000 --- a/progs/glsl/CH11-bumpmap.frag +++ /dev/null @@ -1,41 +0,0 @@ -// -// Fragment shader for procedural bumps -// -// Authors: John Kessenich, Randi Rost -// -// Copyright (c) 2002-2006 3Dlabs Inc. Ltd. -// -// See 3Dlabs-License.txt for license information -// - -varying vec3 LightDir; -varying vec3 EyeDir; - -uniform vec3 SurfaceColor; // = (0.7, 0.6, 0.18) -uniform float BumpDensity; // = 16.0 -uniform float BumpSize; // = 0.15 -uniform float SpecularFactor; // = 0.5 - -void main() -{ - vec3 litColor; - vec2 c = BumpDensity * gl_TexCoord[0].st; - vec2 p = fract(c) - vec2(0.5); - - float d, f; - d = p.x * p.x + p.y * p.y; - f = inversesqrt(d + 1.0); - - if (d >= BumpSize) - { p = vec2(0.0); f = 1.0; } - - vec3 normDelta = vec3(p.x, p.y, 1.0) * f; - litColor = SurfaceColor * max(dot(normDelta, LightDir), 0.0); - vec3 reflectDir = reflect(LightDir, normDelta); - - float spec = max(dot(EyeDir, reflectDir), 0.0); - spec *= SpecularFactor; - litColor = min(litColor + spec, vec3(1.0)); - - gl_FragColor = vec4(litColor, 1.0); -} diff --git a/progs/glsl/CH11-bumpmap.vert b/progs/glsl/CH11-bumpmap.vert deleted file mode 100644 index d3d19f62ac3..00000000000 --- a/progs/glsl/CH11-bumpmap.vert +++ /dev/null @@ -1,38 +0,0 @@ -// -// Vertex shader for procedural bumps -// -// Authors: Randi Rost, John Kessenich -// -// Copyright (c) 2002-2006 3Dlabs Inc. Ltd. -// -// See 3Dlabs-License.txt for license information -// - -varying vec3 LightDir; -varying vec3 EyeDir; - -uniform vec3 LightPosition; - -attribute vec3 Tangent; - -void main() -{ - EyeDir = vec3(gl_ModelViewMatrix * gl_Vertex); - gl_Position = ftransform(); - gl_TexCoord[0] = gl_MultiTexCoord0; - - vec3 n = normalize(gl_NormalMatrix * gl_Normal); - vec3 t = normalize(gl_NormalMatrix * Tangent); - vec3 b = cross(n, t); - - vec3 v; - v.x = dot(LightPosition, t); - v.y = dot(LightPosition, b); - v.z = dot(LightPosition, n); - LightDir = normalize(v); - - v.x = dot(EyeDir, t); - v.y = dot(EyeDir, b); - v.z = dot(EyeDir, n); - EyeDir = normalize(v); -} diff --git a/progs/glsl/CH11-bumpmaptex.frag b/progs/glsl/CH11-bumpmaptex.frag deleted file mode 100644 index b5dabb4c8a8..00000000000 --- a/progs/glsl/CH11-bumpmaptex.frag +++ /dev/null @@ -1,47 +0,0 @@ -// -// Fragment shader for procedural bumps -// -// Authors: John Kessenich, Randi Rost -// -// Copyright (c) 2002-2006 3Dlabs Inc. Ltd. -// -// See 3Dlabs-License.txt for license information -// -// Texture mapping/modulation added by Brian Paul -// - -varying vec3 LightDir; -varying vec3 EyeDir; - -uniform float BumpDensity; // = 16.0 -uniform float BumpSize; // = 0.15 -uniform float SpecularFactor; // = 0.5 - -uniform sampler2D Tex; - -void main() -{ - vec3 ambient = vec3(0.25); - vec3 litColor; - vec2 c = BumpDensity * gl_TexCoord[0].st; - vec2 p = fract(c) - vec2(0.5); - - float d, f; - d = p.x * p.x + p.y * p.y; - f = inversesqrt(d + 1.0); - - if (d >= BumpSize) - { p = vec2(0.0); f = 1.0; } - - vec3 SurfaceColor = texture2D(Tex, gl_TexCoord[0].st).xyz; - - vec3 normDelta = vec3(p.x, p.y, 1.0) * f; - litColor = SurfaceColor * (ambient + max(dot(normDelta, LightDir), 0.0)); - vec3 reflectDir = reflect(LightDir, normDelta); - - float spec = max(dot(EyeDir, reflectDir), 0.0); - spec *= SpecularFactor; - litColor = min(litColor + spec, vec3(1.0)); - - gl_FragColor = vec4(litColor, 1.0); -} diff --git a/progs/glsl/CH11-toyball.frag b/progs/glsl/CH11-toyball.frag deleted file mode 100644 index 90ec1c27fc1..00000000000 --- a/progs/glsl/CH11-toyball.frag +++ /dev/null @@ -1,75 +0,0 @@ -// -// Fragment shader for procedurally generated toy ball -// -// Author: Bill Licea-Kane -// -// Copyright (c) 2002-2003 ATI Research -// -// See ATI-License.txt for license information -// - -varying vec4 ECposition; // surface position in eye coordinates -varying vec4 ECballCenter; // ball center in eye coordinates - -uniform vec4 LightDir; // light direction, should be normalized -uniform vec4 HVector; // reflection vector for infinite light source -uniform vec4 SpecularColor; -uniform vec4 Red, Yellow, Blue; - -uniform vec4 HalfSpace0; // half-spaces used to define star pattern -uniform vec4 HalfSpace1; -uniform vec4 HalfSpace2; -uniform vec4 HalfSpace3; -uniform vec4 HalfSpace4; - -uniform float InOrOutInit; // = -3 -uniform float StripeWidth; // = 0.3 -uniform float FWidth; // = 0.005 - -void main() -{ - vec4 normal; // Analytically computed normal - vec4 p; // Point in shader space - vec4 surfColor; // Computed color of the surface - float intensity; // Computed light intensity - vec4 distance; // Computed distance values - float inorout; // Counter for computing star pattern - - p.xyz = normalize(ECposition.xyz - ECballCenter.xyz); // Calculate p - p.w = 1.0; - - inorout = InOrOutInit; // initialize inorout to -3 - - distance[0] = dot(p, HalfSpace0); - distance[1] = dot(p, HalfSpace1); - distance[2] = dot(p, HalfSpace2); - distance[3] = dot(p, HalfSpace3); - - distance = smoothstep(-FWidth, FWidth, distance); - inorout += dot(distance, vec4(1.0)); - - distance.x = dot(p, HalfSpace4); - distance.y = StripeWidth - abs(p.z); - distance = smoothstep(-FWidth, FWidth, distance); - inorout += distance.x; - - inorout = clamp(inorout, 0.0, 1.0); - - surfColor = mix(Yellow, Red, inorout); - surfColor = mix(surfColor, Blue, distance.y); - - // normal = point on surface for sphere at (0,0,0) - normal = p; - - // Per fragment diffuse lighting - intensity = 0.2; // ambient - intensity += 0.8 * clamp(dot(LightDir, normal), 0.0, 1.0); - surfColor *= intensity; - - // Per fragment specular lighting - intensity = clamp(dot(HVector, normal), 0.0, 1.0); - intensity = pow(intensity, SpecularColor.a); - surfColor += SpecularColor * intensity; - - gl_FragColor = surfColor; -} diff --git a/progs/glsl/CH11-toyball.vert b/progs/glsl/CH11-toyball.vert deleted file mode 100644 index b7da3ac839e..00000000000 --- a/progs/glsl/CH11-toyball.vert +++ /dev/null @@ -1,24 +0,0 @@ -// -// Fragment shader for procedurally generated toy ball -// -// Author: Bill Licea-Kane -// -// Copyright (c) 2002-2003 ATI Research -// -// See ATI-License.txt for license information -// - -varying vec4 ECposition; // surface position in eye coordinates -varying vec4 ECballCenter; // ball center in eye coordinates -uniform vec4 BallCenter; // ball center in modelling coordinates - -void main() -{ -//orig: ECposition = gl_ModelViewMatrix * gl_Vertex; - - ECposition = gl_TextureMatrix[0] * gl_Vertex; - ECposition = gl_ModelViewMatrix * ECposition; - - ECballCenter = gl_ModelViewMatrix * BallCenter; - gl_Position = ftransform(); -} diff --git a/progs/glsl/CH18-mandel.frag b/progs/glsl/CH18-mandel.frag deleted file mode 100644 index a972d68bcfb..00000000000 --- a/progs/glsl/CH18-mandel.frag +++ /dev/null @@ -1,55 +0,0 @@ -// -// Fragment shader for drawing the Mandelbrot set -// -// Authors: Dave Baldwin, Steve Koren, Randi Rost -// based on a shader by Michael Rivero -// -// Copyright (c) 2002-2005: 3Dlabs, Inc. -// -// See 3Dlabs-License.txt for license information -// - -varying vec3 Position; -varying float LightIntensity; - -uniform float MaxIterations; -uniform float Zoom; -uniform float Xcenter; -uniform float Ycenter; -uniform vec3 InnerColor; -uniform vec3 OuterColor1; -uniform vec3 OuterColor2; - -void main() -{ - float real = Position.x * Zoom + Xcenter; - float imag = Position.y * Zoom + Ycenter; - float Creal = real; // Change this line... - float Cimag = imag; // ...and this one to get a Julia set - - float r2 = 0.0; - float iter; - -// for (iter = 0.0; iter < MaxIterations && r2 < 4.0; ++iter) - for (iter = 0.0; iter < 12.0 && r2 < 4.0; ++iter) - { - float tempreal = real; - - real = (tempreal * tempreal) - (imag * imag) + Creal; - imag = 2.0 * tempreal * imag + Cimag; - r2 = (real * real) + (imag * imag); - } - - // Base the color on the number of iterations - - vec3 color; - - if (r2 < 4.0) - color = InnerColor; - else - color = mix(OuterColor1, OuterColor2, fract(iter * 0.05)); - - color *= LightIntensity; - - gl_FragColor = vec4(color, 1.0); -} diff --git a/progs/glsl/CH18-mandel.vert b/progs/glsl/CH18-mandel.vert deleted file mode 100644 index c4ca66405d3..00000000000 --- a/progs/glsl/CH18-mandel.vert +++ /dev/null @@ -1,35 +0,0 @@ -// -// Vertex shader for drawing the Mandelbrot set -// -// Authors: Dave Baldwin, Steve Koren, Randi Rost -// based on a shader by Michael Rivero -// -// Copyright (c) 2002-2005: 3Dlabs, Inc. -// -// See 3Dlabs-License.txt for license information -// - -uniform vec3 LightPosition; -uniform float SpecularContribution; -uniform float DiffuseContribution; -uniform float Shininess; - -varying float LightIntensity; -varying vec3 Position; - -void main() -{ - vec3 ecPosition = vec3(gl_ModelViewMatrix * gl_Vertex); - vec3 tnorm = normalize(gl_NormalMatrix * gl_Normal); - vec3 lightVec = normalize(LightPosition - ecPosition); - vec3 reflectVec = reflect(-lightVec, tnorm); - vec3 viewVec = normalize(-ecPosition); - float spec = max(dot(reflectVec, viewVec), 0.0); - spec = pow(spec, Shininess); - LightIntensity = DiffuseContribution * - max(dot(lightVec, tnorm), 0.0) + - SpecularContribution * spec; - Position = vec3(gl_MultiTexCoord0 - 0.5) * 5.0; - gl_Position = ftransform(); - -}
\ No newline at end of file diff --git a/progs/glsl/Makefile b/progs/glsl/Makefile deleted file mode 100644 index 6030c8002f5..00000000000 --- a/progs/glsl/Makefile +++ /dev/null @@ -1,104 +0,0 @@ -# progs/demos/Makefile - -TOP = ../.. -include $(TOP)/configs/current - -INCDIR = $(TOP)/include - -LIB_DEP = \ - $(TOP)/$(LIB_DIR)/$(GL_LIB_NAME) \ - $(TOP)/$(LIB_DIR)/$(GLU_LIB_NAME) \ - $(TOP)/$(LIB_DIR)/$(GLUT_LIB_NAME) - -LIBS = -L$(TOP)/$(LIB_DIR) -l$(GLUT_LIB) -l$(GLEW_LIB) -l$(GLU_LIB) \ - -l$(GL_LIB) $(APP_LIB_DEPS) - -# using : to avoid APP_CC pointing to CC loop -CC := $(APP_CC) -CFLAGS := -I$(INCDIR) $(CFLAGS) -LDLIBS = $(LIBS) - -PROG_SOURCES = \ - array.c \ - bitmap.c \ - brick.c \ - bump.c \ - convolutions.c \ - deriv.c \ - fragcoord.c \ - fsraytrace.c \ - identity.c \ - linktest.c \ - mandelbrot.c \ - multinoise.c \ - multitex.c \ - noise.c \ - noise2.c \ - pointcoord.c \ - points.c \ - samplers.c \ - samplers_array.c \ - shadow_sampler.c \ - shtest.c \ - skinning.c \ - texaaline.c \ - texdemo1.c \ - toyball.c \ - trirast.c \ - twoside.c \ - vert-or-frag-only.c \ - vert-tex.c \ - vsraytrace.c - -UTIL_HEADERS = \ - extfuncs.h \ - shaderutil.h \ - readtex.h - -UTIL_SOURCES = \ - shaderutil.c \ - readtex.c - -UTIL_OBJS = $(UTIL_SOURCES:.c=.o) -PROG_OBJS = $(PROG_SOURCES:.c=.o) -PROGS = $(PROG_SOURCES:%.c=%) - -##### TARGETS ##### - -default: $(PROGS) - -$(PROG_OBJS): $(UTIL_HEADERS) - -$(PROGS): $(UTIL_OBJS) - -.o: - $(CC) $(CFLAGS) $(LDFLAGS) $^ $(LDLIBS) -o $@ - -clean: - -rm -f $(PROGS) - -rm -f *.o *~ - -rm -f extfuncs.h - -rm -f shaderutil.* - -rm -f readtex.* - - -##### Extra dependencies - -samplers_array.o: samplers.c - $(APP_CC) $(CFLAGS) -DSAMPLERS_ARRAY $< -c -o $@ - -extfuncs.h: $(TOP)/progs/util/extfuncs.h - cp $< . - -readtex.c: $(TOP)/progs/util/readtex.c - cp $< . - -readtex.h: $(TOP)/progs/util/readtex.h - cp $< . - -shaderutil.c: $(TOP)/progs/util/shaderutil.c - cp $< . - -shaderutil.h: $(TOP)/progs/util/shaderutil.h - cp $< . - diff --git a/progs/glsl/SConscript b/progs/glsl/SConscript deleted file mode 100644 index 02884e5a710..00000000000 --- a/progs/glsl/SConscript +++ /dev/null @@ -1,39 +0,0 @@ -Import('*') - -progs = [ - 'array', - 'bitmap', - 'brick', - 'bump', - 'convolutions', - 'deriv', - 'fragcoord', - 'fsraytrace', - 'identity', - 'linktest', - 'mandelbrot', - 'multinoise', - 'multitex', - 'noise', - 'noise2', - 'pointcoord', - 'points', - 'samplers', - 'shadow_sampler', - 'skinning', - 'texaaline', - 'texdemo1', - 'toyball', - 'trirast', - 'twoside', - 'vert-or-frag-only', - 'vert-tex', - 'vsraytrace', -] - -for prog in progs: - progs_env.Program( - target = prog, - source = prog + '.c', - ) - diff --git a/progs/glsl/array.c b/progs/glsl/array.c deleted file mode 100644 index 4ed18485ea9..00000000000 --- a/progs/glsl/array.c +++ /dev/null @@ -1,258 +0,0 @@ -/** - * Test variable array indexing in a vertex shader. - * Brian Paul - * 17 April 2009 - */ - -#include <assert.h> -#include <string.h> -#include <stdio.h> -#include <stdlib.h> -#include <math.h> -#include <GL/glew.h> -#include <GL/glut.h> -#include "shaderutil.h" - - -/** - * The vertex position.z is used as a (variable) index into an - * array which returns a new Z value. - */ -static const char *VertShaderText = - "uniform sampler2D tex1; \n" - "uniform float HeightArray[20]; \n" - "void main() \n" - "{ \n" - " vec4 pos = gl_Vertex; \n" - " int i = int(pos.z * 9.5); \n" - " pos.z = HeightArray[i]; \n" - " gl_Position = gl_ModelViewProjectionMatrix * pos; \n" - " gl_FrontColor = pos; \n" - "} \n"; - -static const char *FragShaderText = - "void main() \n" - "{ \n" - " gl_FragColor = gl_Color; \n" - "} \n"; - - -static GLuint fragShader; -static GLuint vertShader; -static GLuint program; - -static GLint win = 0; -static GLboolean Anim = GL_TRUE; -static GLboolean WireFrame = GL_TRUE; -static GLfloat xRot = -70.0f, yRot = 0.0f, zRot = 0.0f; - - -static void -Idle(void) -{ - zRot = 90 + glutGet(GLUT_ELAPSED_TIME) * 0.05; - glutPostRedisplay(); -} - - -/** z=f(x,y) */ -static float -fz(float x, float y) -{ - return fabs(cos(1.5*x) + cos(1.5*y)); -} - - -static void -DrawMesh(void) -{ - GLfloat xmin = -2.0, xmax = 2.0; - GLfloat ymin = -2.0, ymax = 2.0; - GLuint xdivs = 20, ydivs = 20; - GLfloat dx = (xmax - xmin) / xdivs; - GLfloat dy = (ymax - ymin) / ydivs; - GLfloat ds = 1.0 / xdivs, dt = 1.0 / ydivs; - GLfloat x, y, s, t; - GLuint i, j; - - y = ymin; - t = 0.0; - for (i = 0; i < ydivs; i++) { - x = xmin; - s = 0.0; - glBegin(GL_QUAD_STRIP); - for (j = 0; j < xdivs; j++) { - float z0 = fz(x, y), z1 = fz(x, y + dy); - - glTexCoord2f(s, t); - glVertex3f(x, y, z0); - - glTexCoord2f(s, t + dt); - glVertex3f(x, y + dy, z1); - x += dx; - s += ds; - } - glEnd(); - y += dy; - t += dt; - } -} - - -static void -Redisplay(void) -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - if (WireFrame) - glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); - else - glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - - glPushMatrix(); - glRotatef(xRot, 1.0f, 0.0f, 0.0f); - glRotatef(yRot, 0.0f, 1.0f, 0.0f); - glRotatef(zRot, 0.0f, 0.0f, 1.0f); - - glPushMatrix(); - DrawMesh(); - glPopMatrix(); - - glPopMatrix(); - - glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - - glutSwapBuffers(); -} - - -static void -Reshape(int width, int height) -{ - glViewport(0, 0, width, height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glTranslatef(0.0f, 0.0f, -15.0f); -} - - -static void -CleanUp(void) -{ - glDeleteShader(fragShader); - glDeleteShader(vertShader); - glDeleteProgram(program); - glutDestroyWindow(win); -} - - -static void -Key(unsigned char key, int x, int y) -{ - const GLfloat step = 2.0; - (void) x; - (void) y; - - switch(key) { - case 'a': - Anim = !Anim; - if (Anim) - glutIdleFunc(Idle); - else - glutIdleFunc(NULL); - break; - case 'w': - WireFrame = !WireFrame; - break; - case 'z': - zRot += step; - break; - case 'Z': - zRot -= step; - break; - case 27: - CleanUp(); - exit(0); - break; - } - glutPostRedisplay(); -} - - -static void -SpecialKey(int key, int x, int y) -{ - const GLfloat step = 2.0; - - (void) x; - (void) y; - - switch(key) { - case GLUT_KEY_UP: - xRot += step; - break; - case GLUT_KEY_DOWN: - xRot -= step; - break; - case GLUT_KEY_LEFT: - yRot -= step; - break; - case GLUT_KEY_RIGHT: - yRot += step; - break; - } - glutPostRedisplay(); -} - - -static void -Init(void) -{ - GLfloat HeightArray[20]; - GLint u, i; - - if (!ShadersSupported()) - exit(1); - - vertShader = CompileShaderText(GL_VERTEX_SHADER, VertShaderText); - fragShader = CompileShaderText(GL_FRAGMENT_SHADER, FragShaderText); - program = LinkShaders(vertShader, fragShader); - - glUseProgram(program); - - /* Setup the HeightArray[] uniform */ - for (i = 0; i < 20; i++) - HeightArray[i] = i / 20.0; - u = glGetUniformLocation(program, "HeightArray"); - glUniform1fv(u, 20, HeightArray); - - assert(glGetError() == 0); - - glClearColor(0.4f, 0.4f, 0.8f, 0.0f); - glEnable(GL_DEPTH_TEST); - glColor3f(1, 1, 1); -} - - -int -main(int argc, char *argv[]) -{ - glutInit(&argc, argv); - glutInitWindowSize(500, 500); - glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); - win = glutCreateWindow(argv[0]); - glewInit(); - glutReshapeFunc(Reshape); - glutKeyboardFunc(Key); - glutSpecialFunc(SpecialKey); - glutDisplayFunc(Redisplay); - Init(); - if (Anim) - glutIdleFunc(Idle); - glutMainLoop(); - return 0; -} - diff --git a/progs/glsl/bitmap.c b/progs/glsl/bitmap.c deleted file mode 100644 index 8b1853d9ab2..00000000000 --- a/progs/glsl/bitmap.c +++ /dev/null @@ -1,320 +0,0 @@ -/** - * Implement glRasterPos + glBitmap with textures + shaders. - * Brian Paul - * 14 May 2007 - */ - -#include <assert.h> -#include <string.h> -#include <stdio.h> -#include <stdlib.h> -#include <math.h> -#include <GL/glew.h> -#include <GL/glut.h> -#include "shaderutil.h" - - -static GLuint FragShader; -static GLuint VertShader; -static GLuint Program; - -static GLint Win = 0; -static GLint WinWidth = 500, WinHeight = 500; -static GLboolean Anim = GL_TRUE; -static GLboolean Bitmap = GL_FALSE; -static GLfloat Xrot = 20.0f, Yrot = 70.0f; -static GLint uTex, uScale; -static GLuint Textures[2]; - -#define TEX_WIDTH 16 -#define TEX_HEIGHT 8 - - -static void -BitmapText(const char *s) -{ - while (*s) { - glutBitmapCharacter(GLUT_BITMAP_8_BY_13, (int) *s); - s++; - } -} - - -static void -Redisplay(void) -{ - static const GLfloat px[3] = { 1.2, 0, 0}; - static const GLfloat nx[3] = {-1.2, 0, 0}; - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - glPushMatrix(); - glRotatef(Xrot, 1.0f, 0.0f, 0.0f); - glRotatef(Yrot, 0.0f, 1.0f, 0.0f); - - glEnable(GL_LIGHTING); - - glPushMatrix(); - glScalef(0.5, 0.5, 0.5); - glutSolidDodecahedron(); - glPopMatrix(); - - glDisable(GL_LIGHTING); - - glColor3f(0, 1, 0); - glBegin(GL_LINES); - glVertex3f(-1, 0, 0); - glVertex3f( 1, 0, 0); - glEnd(); - - glColor3f(1, 1, 0); - - if (Bitmap) { - glRasterPos3fv(px); - BitmapText("+X"); - glRasterPos3fv(nx); - BitmapText("-X"); - } - else { - glUseProgram(Program); - - /* vertex positions (deltas) depend on texture size and window size */ - if (uScale != -1) { - glUniform2f(uScale, - 2.0 * TEX_WIDTH / WinWidth, - 2.0 * TEX_HEIGHT / WinHeight); - } - - /* draw +X */ - glBindTexture(GL_TEXTURE_2D, Textures[0]); - glBegin(GL_QUADS); - glTexCoord2f(0, 0); glVertex3fv(px); - glTexCoord2f(1, 0); glVertex3fv(px); - glTexCoord2f(1, 1); glVertex3fv(px); - glTexCoord2f(0, 1); glVertex3fv(px); - glEnd(); - - /* draw -X */ - glBindTexture(GL_TEXTURE_2D, Textures[1]); - glBegin(GL_QUADS); - glTexCoord2f(0, 0); glVertex3fv(nx); - glTexCoord2f(1, 0); glVertex3fv(nx); - glTexCoord2f(1, 1); glVertex3fv(nx); - glTexCoord2f(0, 1); glVertex3fv(nx); - glEnd(); - - glUseProgram(0); - } - - glPopMatrix(); - - glutSwapBuffers(); -} - - -static void -Idle(void) -{ - Yrot = glutGet(GLUT_ELAPSED_TIME) * 0.01; - glutPostRedisplay(); -} - - -static void -Reshape(int width, int height) -{ - WinWidth = width; - WinHeight = height; - glViewport(0, 0, width, height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glTranslatef(0.0f, 0.0f, -10.0f); -} - - -static void -Key(unsigned char key, int x, int y) -{ - (void) x; - (void) y; - - switch(key) { - case ' ': - case 'a': - Anim = !Anim; - if (Anim) - glutIdleFunc(Idle); - else - glutIdleFunc(NULL); - break; - case 'b': - Bitmap = !Bitmap; - if (Bitmap) - printf("Using glBitmap\n"); - else - printf("Using billboard texture\n"); - break; - case 27: - glDeleteShader(FragShader); - glDeleteShader(VertShader); - glDeleteProgram(Program); - glutDestroyWindow(Win); - exit(0); - } - glutPostRedisplay(); -} - - -static void -SpecialKey(int key, int x, int y) -{ - const GLfloat step = 0.125f; - switch(key) { - case GLUT_KEY_UP: - Xrot -= step; - break; - case GLUT_KEY_DOWN: - Xrot += step; - break; - case GLUT_KEY_LEFT: - Yrot -= step; - break; - case GLUT_KEY_RIGHT: - Yrot += step; - break; - } - /*printf("Xrot: %f Yrot: %f\n", Xrot, Yrot);*/ - glutPostRedisplay(); -} - - -static void -MakeTexImage(const char *p, GLuint texobj) -{ - GLubyte image[TEX_HEIGHT][TEX_WIDTH]; - GLuint i, j, k; - - for (i = 0; i < TEX_HEIGHT; i++) { - for (j = 0; j < TEX_WIDTH; j++) { - k = i * TEX_WIDTH + j; - if (p[k] == ' ') { - image[i][j] = 0; - } - else { - image[i][j] = 255; - } - } - } - - glBindTexture(GL_TEXTURE_2D, texobj); - glTexImage2D(GL_TEXTURE_2D, 0, GL_INTENSITY, TEX_WIDTH, TEX_HEIGHT, 0, - GL_RED, GL_UNSIGNED_BYTE, image); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); -} - - -static void -MakeBitmapTextures(void) -{ - const char *px = - " X X " - " X X X " - " X X X " - " XXXXX X " - " X X X " - " X X X " - " X X " - " X X "; - const char *nx = - " X X " - " X X " - " X X " - " XXXXX X " - " X X " - " X X " - " X X " - " X X "; - glGenTextures(2, Textures); - MakeTexImage(px, Textures[0]); - MakeTexImage(nx, Textures[1]); -} - - -static void -Init(void) -{ - /* Fragment shader: modulate raster color by texture, discard fragments - * with alpha < 1.0 - */ - static const char *fragShaderText = - "uniform sampler2D tex2d; \n" - "void main() {\n" - " vec4 c = texture2D(tex2d, gl_TexCoord[0].xy); \n" - " if (c.w < 1.0) \n" - " discard; \n" - " gl_FragColor = c * gl_Color; \n" - "}\n"; - /* Vertex shader: compute new vertex position based on incoming vertex pos, - * texcoords and special scale factor. - */ - static const char *vertShaderText = - "uniform vec2 scale; \n" - "void main() {\n" - " vec4 p = gl_ModelViewProjectionMatrix * gl_Vertex;\n" - " gl_Position.xy = p.xy + gl_MultiTexCoord0.xy * scale * p.w; \n" - " gl_Position.zw = p.zw; \n" - " gl_TexCoord[0] = gl_MultiTexCoord0; \n" - " gl_FrontColor = gl_Color; \n" - "}\n"; - - if (!ShadersSupported()) - exit(1); - - VertShader = CompileShaderText(GL_VERTEX_SHADER, vertShaderText); - FragShader = CompileShaderText(GL_FRAGMENT_SHADER, fragShaderText); - Program = LinkShaders(VertShader, FragShader); - - glUseProgram(Program); - - uScale = glGetUniformLocation(Program, "scale"); - uTex = glGetUniformLocation(Program, "tex2d"); - if (uTex != -1) { - glUniform1i(uTex, 0); /* tex unit 0 */ - } - - glUseProgram(0); - - glClearColor(0.3f, 0.3f, 0.3f, 0.0f); - glEnable(GL_DEPTH_TEST); - glEnable(GL_NORMALIZE); - glEnable(GL_LIGHT0); - - MakeBitmapTextures(); -} - - -int -main(int argc, char *argv[]) -{ - glutInit(&argc, argv); - glutInitWindowSize(WinWidth, WinHeight); - glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); - Win = glutCreateWindow(argv[0]); - glewInit(); - glutReshapeFunc(Reshape); - glutKeyboardFunc(Key); - glutSpecialFunc(SpecialKey); - glutDisplayFunc(Redisplay); - if (Anim) - glutIdleFunc(Idle); - Init(); - glutMainLoop(); - return 0; -} - - diff --git a/progs/glsl/brick.c b/progs/glsl/brick.c deleted file mode 100644 index 20417aa4626..00000000000 --- a/progs/glsl/brick.c +++ /dev/null @@ -1,200 +0,0 @@ -/** - * "Brick" shader demo. Uses the example shaders from chapter 6 of - * the OpenGL Shading Language "orange" book. - * 10 Jan 2007 - */ - -#include <assert.h> -#include <string.h> -#include <stdio.h> -#include <stdlib.h> -#include <math.h> -#include <GL/glew.h> -#include <GL/glut.h> -#include "shaderutil.h" - - -static char *FragProgFile = "CH06-brick.frag"; -static char *VertProgFile = "CH06-brick.vert"; - -/* program/shader objects */ -static GLuint fragShader; -static GLuint vertShader; -static GLuint program; - -static struct uniform_info Uniforms[] = { - /* vert */ - { "LightPosition", 1, GL_FLOAT_VEC3, { 0.1, 0.1, 9.0, 0}, -1 }, - /* frag */ - { "BrickColor", 1, GL_FLOAT_VEC3, { 0.8, 0.2, 0.2, 0 }, -1 }, - { "MortarColor", 1, GL_FLOAT_VEC3, { 0.6, 0.6, 0.6, 0 }, -1 }, - { "BrickSize", 1, GL_FLOAT_VEC2, { 1.0, 0.3, 0, 0 }, -1 }, - { "BrickPct", 1, GL_FLOAT_VEC2, { 0.9, 0.8, 0, 0 }, -1 }, - END_OF_UNIFORMS -}; - -static GLint win = 0; - - -static GLfloat xRot = 0.0f, yRot = 0.0f, zRot = 0.0f; - - - - -static void -Redisplay(void) -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - glPushMatrix(); - glRotatef(xRot, 1.0f, 0.0f, 0.0f); - glRotatef(yRot, 0.0f, 1.0f, 0.0f); - glRotatef(zRot, 0.0f, 0.0f, 1.0f); - - glBegin(GL_POLYGON); - glTexCoord2f(0, 0); glVertex2f(-2, -2); - glTexCoord2f(1, 0); glVertex2f( 2, -2); - glTexCoord2f(1, 1); glVertex2f( 2, 2); - glTexCoord2f(0, 1); glVertex2f(-2, 2); - glEnd(); - - glPopMatrix(); - - glutSwapBuffers(); -} - - -static void -Reshape(int width, int height) -{ - glViewport(0, 0, width, height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glTranslatef(0.0f, 0.0f, -15.0f); -} - - -static void -CleanUp(void) -{ - glDeleteShader(fragShader); - glDeleteShader(vertShader); - glDeleteProgram(program); - glutDestroyWindow(win); -} - - -static void -Key(unsigned char key, int x, int y) -{ - (void) x; - (void) y; - - switch(key) { - case 'z': - zRot -= 1.0; - break; - case 'Z': - zRot += 1.0; - break; - case 27: - CleanUp(); - exit(0); - break; - } - glutPostRedisplay(); -} - - -static void -SpecialKey(int key, int x, int y) -{ - const GLfloat step = 3.0f; - - (void) x; - (void) y; - - switch(key) { - case GLUT_KEY_UP: - xRot -= step; - break; - case GLUT_KEY_DOWN: - xRot += step; - break; - case GLUT_KEY_LEFT: - yRot -= step; - break; - case GLUT_KEY_RIGHT: - yRot += step; - break; - } - glutPostRedisplay(); -} - - - -static void -Init(void) -{ - if (!ShadersSupported()) - exit(1); - - vertShader = CompileShaderFile(GL_VERTEX_SHADER, VertProgFile); - fragShader = CompileShaderFile(GL_FRAGMENT_SHADER, FragProgFile); - program = LinkShaders(vertShader, fragShader); - - glUseProgram(program); - - SetUniformValues(program, Uniforms); - PrintUniforms(Uniforms); - - assert(glGetError() == 0); - - glClearColor(0.4f, 0.4f, 0.8f, 0.0f); - - printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER)); - - assert(glIsProgram(program)); - assert(glIsShader(fragShader)); - assert(glIsShader(vertShader)); - - glColor3f(1, 0, 0); -} - - -static void -ParseOptions(int argc, char *argv[]) -{ - int i; - for (i = 1; i < argc; i++) { - if (strcmp(argv[i], "-fs") == 0) { - FragProgFile = argv[i+1]; - } - else if (strcmp(argv[i], "-vs") == 0) { - VertProgFile = argv[i+1]; - } - } -} - - -int -main(int argc, char *argv[]) -{ - glutInit(&argc, argv); - glutInitWindowSize(400, 400); - glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); - win = glutCreateWindow(argv[0]); - glewInit(); - glutReshapeFunc(Reshape); - glutKeyboardFunc(Key); - glutSpecialFunc(SpecialKey); - glutDisplayFunc(Redisplay); - ParseOptions(argc, argv); - Init(); - glutMainLoop(); - return 0; -} - diff --git a/progs/glsl/brick.shtest b/progs/glsl/brick.shtest deleted file mode 100644 index 8a2152692eb..00000000000 --- a/progs/glsl/brick.shtest +++ /dev/null @@ -1,8 +0,0 @@ -vs CH06-brick.vert -fs CH06-brick.frag -uniform LightPosition GL_FLOAT_VEC3 0.1 0.1 9.0 -uniform BrickColor GL_FLOAT_VEC3 0.8 0.2 0.2 -uniform MortarColor GL_FLOAT_VEC3 0.6 0.6 0.6 -uniform BrickSize GL_FLOAT_VEC2 1.0 0.3 -uniform BrickPct GL_FLOAT_VEC2 0.9 0.8 - diff --git a/progs/glsl/bump.c b/progs/glsl/bump.c deleted file mode 100644 index 784596448c5..00000000000 --- a/progs/glsl/bump.c +++ /dev/null @@ -1,347 +0,0 @@ -/** - * Procedural Bump Mapping demo. Uses the example shaders from - * chapter 11 of the OpenGL Shading Language "orange" book. - * 16 Jan 2007 - */ - -#include <assert.h> -#include <string.h> -#include <stdio.h> -#include <stdlib.h> -#include <math.h> -#include <GL/glew.h> -#include <GL/glut.h> -#include "shaderutil.h" -#include "readtex.h" - - -static char *FragProgFile = "CH11-bumpmap.frag"; -static char *FragTexProgFile = "CH11-bumpmaptex.frag"; -static char *VertProgFile = "CH11-bumpmap.vert"; -static char *TextureFile = "../images/tile.rgb"; - -/* program/shader objects */ -static GLuint fragShader; -static GLuint fragTexShader; -static GLuint vertShader; -static GLuint program; -static GLuint texProgram; - - -static struct uniform_info Uniforms[] = { - { "LightPosition", 1, GL_FLOAT_VEC3, { 0.57737, 0.57735, 0.57735, 0.0 }, -1 }, - { "SurfaceColor", 1, GL_FLOAT_VEC3, { 0.8, 0.8, 0.2, 0 }, -1 }, - { "BumpDensity", 1, GL_FLOAT, { 10.0, 0, 0, 0 }, -1 }, - { "BumpSize", 1, GL_FLOAT, { 0.125, 0, 0, 0 }, -1 }, - { "SpecularFactor", 1, GL_FLOAT, { 0.5, 0, 0, 0 }, -1 }, - END_OF_UNIFORMS -}; - -static struct uniform_info TexUniforms[] = { - { "LightPosition", 1, GL_FLOAT_VEC3, { 0.57737, 0.57735, 0.57735, 0.0 }, -1 }, - { "Tex", 1, GL_INT, { 0, 0, 0, 0 }, -1 }, - { "BumpDensity", 1, GL_FLOAT, { 10.0, 0, 0, 0 }, -1 }, - { "BumpSize", 1, GL_FLOAT, { 0.125, 0, 0, 0 }, -1 }, - { "SpecularFactor", 1, GL_FLOAT, { 0.5, 0, 0, 0 }, -1 }, - END_OF_UNIFORMS -}; - -static GLint win = 0; - -static GLfloat xRot = 20.0f, yRot = 0.0f, zRot = 0.0f; - -static GLint tangentAttrib; - -static GLuint Texture; - -static GLboolean Anim = GL_FALSE; -static GLboolean Textured = GL_FALSE; - - -static void -CheckError(int line) -{ - GLenum err = glGetError(); - if (err) { - printf("GL Error %s (0x%x) at line %d\n", - gluErrorString(err), (int) err, line); - } -} - -/* - * Draw a square, specifying normal and tangent vectors. - */ -static void -Square(GLfloat size) -{ - glNormal3f(0, 0, 1); - glVertexAttrib3f(tangentAttrib, 1, 0, 0); - glBegin(GL_POLYGON); - glTexCoord2f(0, 0); glVertex2f(-size, -size); - glTexCoord2f(1, 0); glVertex2f( size, -size); - glTexCoord2f(1, 1); glVertex2f( size, size); - glTexCoord2f(0, 1); glVertex2f(-size, size); - glEnd(); -} - - -static void -Cube(GLfloat size) -{ - /* +X */ - glPushMatrix(); - glRotatef(90, 0, 1, 0); - glTranslatef(0, 0, size); - Square(size); - glPopMatrix(); - - /* -X */ - glPushMatrix(); - glRotatef(-90, 0, 1, 0); - glTranslatef(0, 0, size); - Square(size); - glPopMatrix(); - - /* +Y */ - glPushMatrix(); - glRotatef(90, 1, 0, 0); - glTranslatef(0, 0, size); - Square(size); - glPopMatrix(); - - /* -Y */ - glPushMatrix(); - glRotatef(-90, 1, 0, 0); - glTranslatef(0, 0, size); - Square(size); - glPopMatrix(); - - - /* +Z */ - glPushMatrix(); - glTranslatef(0, 0, size); - Square(size); - glPopMatrix(); - - /* -Z */ - glPushMatrix(); - glRotatef(180, 0, 1, 0); - glTranslatef(0, 0, size); - Square(size); - glPopMatrix(); - -} - - -static void -Idle(void) -{ - GLint t = glutGet(GLUT_ELAPSED_TIME); - yRot = t * 0.05; - glutPostRedisplay(); -} - - -static void -Redisplay(void) -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - glPushMatrix(); - glRotatef(xRot, 1.0f, 0.0f, 0.0f); - glRotatef(yRot, 0.0f, 1.0f, 0.0f); - glRotatef(zRot, 0.0f, 0.0f, 1.0f); - - if (Textured) - glUseProgram(texProgram); - else - glUseProgram(program); - - Cube(1.5); - - glPopMatrix(); - - CheckError(__LINE__); - - glutSwapBuffers(); -} - - -static void -Reshape(int width, int height) -{ - float ar = (float) width / (float) height; - glViewport(0, 0, width, height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glFrustum(-ar, ar, -1.0, 1.0, 5.0, 25.0); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glTranslatef(0.0f, 0.0f, -15.0f); -} - - -static void -CleanUp(void) -{ - glDeleteShader(fragShader); - glDeleteShader(fragTexShader); - glDeleteShader(vertShader); - glDeleteProgram(program); - glDeleteProgram(texProgram); - glutDestroyWindow(win); -} - - -static void -Key(unsigned char key, int x, int y) -{ - const GLfloat step = 2.0; - (void) x; - (void) y; - - switch(key) { - case 'a': - Anim = !Anim; - glutIdleFunc(Anim ? Idle : NULL); - break; - case 't': - Textured = !Textured; - break; - case 'z': - zRot += step; - break; - case 'Z': - zRot -= step; - break; - case 27: - CleanUp(); - exit(0); - break; - } - glutPostRedisplay(); -} - - -static void -SpecialKey(int key, int x, int y) -{ - const GLfloat step = 2.0; - - (void) x; - (void) y; - - switch(key) { - case GLUT_KEY_UP: - xRot += step; - break; - case GLUT_KEY_DOWN: - xRot -= step; - break; - case GLUT_KEY_LEFT: - yRot -= step; - break; - case GLUT_KEY_RIGHT: - yRot += step; - break; - } - glutPostRedisplay(); -} - - -static void -Init(void) -{ - if (!ShadersSupported()) - exit(1); - - vertShader = CompileShaderFile(GL_VERTEX_SHADER, VertProgFile); - fragShader = CompileShaderFile(GL_FRAGMENT_SHADER, FragProgFile); - program = LinkShaders(vertShader, fragShader); - - glUseProgram(program); - - assert(glIsProgram(program)); - assert(glIsShader(fragShader)); - assert(glIsShader(vertShader)); - - assert(glGetError() == 0); - - CheckError(__LINE__); - - SetUniformValues(program, Uniforms); - PrintUniforms(Uniforms); - - CheckError(__LINE__); - - tangentAttrib = glGetAttribLocation(program, "Tangent"); - printf("Tangent Attrib: %d\n", tangentAttrib); - - assert(tangentAttrib >= 0); - - CheckError(__LINE__); - - - /* - * As above, but fragment shader also uses a texture map. - */ - fragTexShader = CompileShaderFile(GL_FRAGMENT_SHADER, FragTexProgFile); - texProgram = LinkShaders(vertShader, fragTexShader); - glUseProgram(texProgram); - assert(glIsProgram(texProgram)); - assert(glIsShader(fragTexShader)); - SetUniformValues(texProgram, TexUniforms); - PrintUniforms(TexUniforms); - - /* - * Load tex image. - */ - glGenTextures(1, &Texture); - glBindTexture(GL_TEXTURE_2D, Texture); - LoadRGBMipmaps(TextureFile, GL_RGB); - - - glClearColor(0.4f, 0.4f, 0.8f, 0.0f); - - glEnable(GL_DEPTH_TEST); - - glColor3f(1, 0, 0); -} - - -static void -ParseOptions(int argc, char *argv[]) -{ - int i; - for (i = 1; i < argc; i++) { - if (strcmp(argv[i], "-fs") == 0) { - FragProgFile = argv[++i]; - } - else if (strcmp(argv[i], "-vs") == 0) { - VertProgFile = argv[++i]; - } - else if (strcmp(argv[i], "-t") == 0) { - TextureFile = argv[++i]; - } - } -} - - -int -main(int argc, char *argv[]) -{ - glutInit(&argc, argv); - glutInitWindowSize(400, 400); - glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); - win = glutCreateWindow(argv[0]); - glewInit(); - glutReshapeFunc(Reshape); - glutKeyboardFunc(Key); - glutSpecialFunc(SpecialKey); - glutDisplayFunc(Redisplay); - ParseOptions(argc, argv); - Init(); - glutMainLoop(); - return 0; -} - diff --git a/progs/glsl/convolution.frag b/progs/glsl/convolution.frag deleted file mode 100644 index e49b8acf545..00000000000 --- a/progs/glsl/convolution.frag +++ /dev/null @@ -1,21 +0,0 @@ - -const int KernelSize = 9; - -//texture offsets -uniform vec2 Offset[KernelSize]; -//convolution kernel -uniform vec4 KernelValue[KernelSize]; -uniform sampler2D srcTex; -uniform vec4 ScaleFactor; -uniform vec4 BaseColor; - -void main(void) -{ - int i; - vec4 sum = vec4(0.0); - for (i = 0; i < KernelSize; ++i) { - vec4 tmp = texture2D(srcTex, gl_TexCoord[0].st + Offset[i]); - sum += tmp * KernelValue[i]; - } - gl_FragColor = sum * ScaleFactor + BaseColor; -} diff --git a/progs/glsl/convolution.vert b/progs/glsl/convolution.vert deleted file mode 100644 index 752c54671c3..00000000000 --- a/progs/glsl/convolution.vert +++ /dev/null @@ -1,5 +0,0 @@ -void main() { - gl_FrontColor = gl_Color; - gl_TexCoord[0] = gl_MultiTexCoord0; - gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; -} diff --git a/progs/glsl/convolutions.c b/progs/glsl/convolutions.c deleted file mode 100644 index fdfaf568a25..00000000000 --- a/progs/glsl/convolutions.c +++ /dev/null @@ -1,470 +0,0 @@ -/** - * Convolution with GLSL. - * Note: uses GL_ARB_shader_objects, GL_ARB_vertex_shader, GL_ARB_fragment_shader, - * not the OpenGL 2.0 shader API. - * Author: Zack Rusin - */ - -#include <GL/glew.h> - -#define GL_GLEXT_PROTOTYPES -#include "readtex.h" - -#include <GL/glut.h> -#include <stdio.h> -#include <stdlib.h> -#include <assert.h> -#include <math.h> - -enum Filter { - GAUSSIAN_BLUR, - SHARPEN, - MEAN_REMOVAL, - EMBOSS, - EDGE_DETECT, - NO_FILTER, - LAST -}; -#define QUIT LAST - -struct BoundingBox { - float minx, miny, minz; - float maxx, maxy, maxz; -}; -struct Texture { - GLuint id; - GLfloat x; - GLfloat y; - GLint width; - GLint height; - GLenum format; -}; - -static const char *textureLocation = "../images/girl2.rgb"; - -static GLfloat viewRotx = 0.0, viewRoty = 0.0, viewRotz = 0.0; -static struct BoundingBox box; -static struct Texture texture; -static GLuint program; -static GLint menuId; -static enum Filter filter = GAUSSIAN_BLUR; - - -static void checkError(int line) -{ - GLenum err = glGetError(); - if (err) { - printf("GL Error %s (0x%x) at line %d\n", - gluErrorString(err), (int) err, line); - } -} - -static void loadAndCompileShader(GLuint shader, const char *text) -{ - GLint stat; - - glShaderSource(shader, 1, (const GLchar **) &text, NULL); - - glCompileShader(shader); - - glGetShaderiv(shader, GL_COMPILE_STATUS, &stat); - if (!stat) { - GLchar log[1000]; - GLsizei len; - glGetShaderInfoLog(shader, 1000, &len, log); - fprintf(stderr, "Problem compiling shader: %s\n", log); - exit(1); - } - else { - printf("Shader compiled OK\n"); - } -} - -static void readShader(GLuint shader, const char *filename) -{ - const int max = 100*1000; - int n; - char *buffer = (char*) malloc(max); - FILE *f = fopen(filename, "r"); - if (!f) { - fprintf(stderr, "Unable to open shader file %s\n", filename); - exit(1); - } - - n = fread(buffer, 1, max, f); - printf("Read %d bytes from shader file %s\n", n, filename); - if (n > 0) { - buffer[n] = 0; - loadAndCompileShader(shader, buffer); - } - - fclose(f); - free(buffer); -} - - -static void -checkLink(GLuint prog) -{ - GLint stat; - glGetProgramiv(prog, GL_LINK_STATUS, &stat); - if (!stat) { - GLchar log[1000]; - GLsizei len; - glGetProgramInfoLog(prog, 1000, &len, log); - fprintf(stderr, "Linker error:\n%s\n", log); - } - else { - fprintf(stderr, "Link success!\n"); - } -} - -static void fillConvolution(GLint *k, - GLfloat *scale, - GLfloat *color) -{ - switch(filter) { - case GAUSSIAN_BLUR: - k[0] = 1; k[1] = 2; k[2] = 1; - k[3] = 2; k[4] = 4; k[5] = 2; - k[6] = 1; k[7] = 2; k[8] = 1; - - *scale = 1./16.; - break; - case SHARPEN: - k[0] = 0; k[1] = -2; k[2] = 0; - k[3] = -2; k[4] = 11; k[5] = -2; - k[6] = 0; k[7] = -2; k[8] = 0; - - *scale = 1./3.; - break; - case MEAN_REMOVAL: - k[0] = -1; k[1] = -1; k[2] = -1; - k[3] = -1; k[4] = 9; k[5] = -1; - k[6] = -1; k[7] = -1; k[8] = -1; - - *scale = 1./1.; - break; - case EMBOSS: - k[0] = -1; k[1] = 0; k[2] = -1; - k[3] = 0; k[4] = 4; k[5] = 0; - k[6] = -1; k[7] = 0; k[8] = -1; - - *scale = 1./1.; - color[0] = 0.5; - color[1] = 0.5; - color[2] = 0.5; - color[3] = 0.5; - break; - case EDGE_DETECT: - k[0] = 1; k[1] = 1; k[2] = 1; - k[3] = 0; k[4] = 0; k[5] = 0; - k[6] = -1; k[7] = -1; k[8] = -1; - - *scale = 1.; - color[0] = 0.5; - color[1] = 0.5; - color[2] = 0.5; - color[3] = 0.5; - break; - case NO_FILTER: - k[0] = 0; k[1] = 0; k[2] = 0; - k[3] = 0; k[4] = 1; k[5] = 0; - k[6] = 0; k[7] = 0; k[8] = 0; - - *scale = 1.; - break; - default: - assert(!"Unhandled switch value"); - } -} - -static void setupConvolution() -{ - GLint *kernel = (GLint*)malloc(sizeof(GLint) * 9); - GLfloat scale = 0.0; - GLfloat *vecKer = (GLfloat*)malloc(sizeof(GLfloat) * 9 * 4); - GLuint loc; - GLuint i; - GLfloat baseColor[4]; - baseColor[0] = 0; - baseColor[1] = 0; - baseColor[2] = 0; - baseColor[3] = 0; - - fillConvolution(kernel, &scale, baseColor); - /*vector of 4*/ - for (i = 0; i < 9; ++i) { - vecKer[i*4 + 0] = kernel[i]; - vecKer[i*4 + 1] = kernel[i]; - vecKer[i*4 + 2] = kernel[i]; - vecKer[i*4 + 3] = kernel[i]; - } - - loc = glGetUniformLocationARB(program, "KernelValue"); - glUniform4fv(loc, 9, vecKer); - loc = glGetUniformLocationARB(program, "ScaleFactor"); - glUniform4f(loc, scale, scale, scale, scale); - loc = glGetUniformLocationARB(program, "BaseColor"); - glUniform4f(loc, baseColor[0], baseColor[1], - baseColor[2], baseColor[3]); - - free(vecKer); - free(kernel); -} - -static void createProgram(const char *vertProgFile, - const char *fragProgFile) -{ - GLuint fragShader = 0, vertShader = 0; - - program = glCreateProgram(); - if (vertProgFile) { - vertShader = glCreateShader(GL_VERTEX_SHADER); - readShader(vertShader, vertProgFile); - glAttachShader(program, vertShader); - } - - if (fragProgFile) { - fragShader = glCreateShader(GL_FRAGMENT_SHADER); - readShader(fragShader, fragProgFile); - glAttachShader(program, fragShader); - } - - glLinkProgram(program); - checkLink(program); - - glUseProgram(program); - - /* - assert(glIsProgram(program)); - assert(glIsShader(fragShader)); - assert(glIsShader(vertShader)); - */ - - checkError(__LINE__); - {/*texture*/ - GLuint texLoc = glGetUniformLocationARB(program, "srcTex"); - glUniform1iARB(texLoc, 0); - } - {/*setup offsets */ - float offsets[] = { 1.0 / texture.width, 1.0 / texture.height, - 0.0 , 1.0 / texture.height, - -1.0 / texture.width, 1.0 / texture.height, - 1.0 / texture.width, 0.0, - 0.0 , 0.0, - -1.0 / texture.width, 0.0, - 1.0 / texture.width, -1.0 / texture.height, - 0.0 , -1.0 / texture.height, - -1.0 / texture.width, -1.0 / texture.height }; - GLuint offsetLoc = glGetUniformLocationARB(program, "Offset"); - glUniform2fv(offsetLoc, 9, offsets); - } - setupConvolution(); - - checkError(__LINE__); -} - - -static void readTexture(const char *filename) -{ - GLubyte *data; - - texture.x = 0; - texture.y = 0; - - glGenTextures(1, &texture.id); - glBindTexture(GL_TEXTURE_2D, texture.id); - glTexParameteri(GL_TEXTURE_2D, - GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, - GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); - data = LoadRGBImage(filename, &texture.width, &texture.height, - &texture.format); - if (!data) { - printf("Error: couldn't load texture image '%s'\n", filename); - exit(1); - } - printf("Texture %s (%d x %d)\n", - filename, texture.width, texture.height); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, - texture.width, texture.height, 0, texture.format, - GL_UNSIGNED_BYTE, data); -} - -static void menuSelected(int entry) -{ - switch (entry) { - case QUIT: - exit(0); - break; - default: - filter = (enum Filter)entry; - } - setupConvolution(); - - glutPostRedisplay(); -} - -static void menuInit() -{ - menuId = glutCreateMenu(menuSelected); - - glutAddMenuEntry("Gaussian blur", GAUSSIAN_BLUR); - glutAddMenuEntry("Sharpen", SHARPEN); - glutAddMenuEntry("Mean removal", MEAN_REMOVAL); - glutAddMenuEntry("Emboss", EMBOSS); - glutAddMenuEntry("Edge detect", EDGE_DETECT); - glutAddMenuEntry("None", NO_FILTER); - - glutAddMenuEntry("Quit", QUIT); - - glutAttachMenu(GLUT_RIGHT_BUTTON); -} - -static void init() -{ - if (!glutExtensionSupported("GL_ARB_shader_objects") || - !glutExtensionSupported("GL_ARB_vertex_shader") || - !glutExtensionSupported("GL_ARB_fragment_shader")) { - fprintf(stderr, "Sorry, this program requires GL_ARB_shader_objects, GL_ARB_vertex_shader, and GL_ARB_fragment_shader\n"); - exit(1); - } - - fprintf(stderr, "GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER)); - fprintf(stderr, "GL_VERSION = %s\n", (char *) glGetString(GL_VERSION)); - fprintf(stderr, "GL_VENDOR = %s\n", (char *) glGetString(GL_VENDOR)); - - menuInit(); - readTexture(textureLocation); - createProgram("convolution.vert", "convolution.frag"); - - glEnable(GL_TEXTURE_2D); - glClearColor(1.0, 1.0, 1.0, 1.0); - /*glShadeModel(GL_SMOOTH);*/ - glShadeModel(GL_FLAT); -} - -static void reshape(int width, int height) -{ - glViewport(0, 0, width, height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - box.minx = 0; - box.maxx = width; - box.miny = 0; - box.maxy = height; - box.minz = 0; - box.maxz = 1; - glOrtho(box.minx, box.maxx, box.miny, box.maxy, -999999, 999999); - glMatrixMode(GL_MODELVIEW); -} - -static void keyPress(unsigned char key, int x, int y) -{ - switch(key) { - case 27: - exit(0); - default: - break; - } - glutPostRedisplay(); -} - -static void -special(int k, int x, int y) -{ - switch (k) { - case GLUT_KEY_UP: - viewRotx += 2.0; - break; - case GLUT_KEY_DOWN: - viewRotx -= 2.0; - break; - case GLUT_KEY_LEFT: - viewRoty += 2.0; - break; - case GLUT_KEY_RIGHT: - viewRoty -= 2.0; - break; - default: - return; - } - glutPostRedisplay(); -} - - -static void draw() -{ - GLfloat center[2]; - GLfloat anchor[2]; - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - glLoadIdentity(); - glPushMatrix(); - - center[0] = box.maxx/2; - center[1] = box.maxy/2; - anchor[0] = center[0] - texture.width/2; - anchor[1] = center[1] - texture.height/2; - - glTranslatef(center[0], center[1], 0); - glRotatef(viewRotx, 1.0, 0.0, 0.0); - glRotatef(viewRoty, 0.0, 1.0, 0.0); - glRotatef(viewRotz, 0.0, 0.0, 1.0); - glTranslatef(-center[0], -center[1], 0); - - glTranslatef(anchor[0], anchor[1], 0); - glBegin(GL_TRIANGLE_STRIP); - { - glColor3f(1., 0., 0.); - glTexCoord2f(0, 0); - glVertex3f(0, 0, 0); - - glColor3f(0., 1., 0.); - glTexCoord2f(0, 1.0); - glVertex3f(0, texture.height, 0); - - glColor3f(1., 0., 0.); - glTexCoord2f(1.0, 0); - glVertex3f(texture.width, 0, 0); - - glColor3f(0., 1., 0.); - glTexCoord2f(1, 1); - glVertex3f(texture.width, texture.height, 0); - } - glEnd(); - - glPopMatrix(); - - glutSwapBuffers(); -} - -int main(int argc, char **argv) -{ - glutInit(&argc, argv); - - glutInitWindowSize(400, 400); - glutInitDisplayMode(GLUT_RGB | GLUT_ALPHA | GLUT_DOUBLE); - - if (!glutCreateWindow("Image Convolutions")) { - fprintf(stderr, "Couldn't create window!\n"); - exit(1); - } - - glewInit(); - init(); - - glutReshapeFunc(reshape); - glutKeyboardFunc(keyPress); - glutSpecialFunc(special); - glutDisplayFunc(draw); - - - glutMainLoop(); - return 0; -} diff --git a/progs/glsl/cubemap.frag b/progs/glsl/cubemap.frag deleted file mode 100644 index 9c27648aaf9..00000000000 --- a/progs/glsl/cubemap.frag +++ /dev/null @@ -1,18 +0,0 @@ -// Fragment shader for cube-texture reflection mapping -// Brian Paul - - -uniform samplerCube cubeTex; -varying vec3 normal; -uniform vec3 lightPos; - -void main() -{ - // simple diffuse, specular lighting: - vec3 lp = normalize(lightPos); - float dp = dot(lp, normalize(normal)); - float spec = pow(dp, 5.0); - - // final color: - gl_FragColor = dp * textureCube(cubeTex, gl_TexCoord[0].xyz, 0.0) + spec; -} diff --git a/progs/glsl/deriv.c b/progs/glsl/deriv.c deleted file mode 100644 index 588246b71ac..00000000000 --- a/progs/glsl/deriv.c +++ /dev/null @@ -1,249 +0,0 @@ -/** - * Test OpenGL 2.0 dx/dy functions for texcoords. - * Brian Paul - * 2 May 2007 - * - * NOTE: resize the window to observe how the partial derivatives of - * the texcoords change. - */ - - -#include <assert.h> -#include <string.h> -#include <stdio.h> -#include <stdlib.h> -#include <math.h> -#include <GL/glew.h> -#include <GL/glut.h> -#include "shaderutil.h" - - -static char *FragProgFile = NULL; -static char *VertProgFile = NULL; -static GLuint fragShader; -static GLuint vertShader; -static GLuint program; -static GLuint SphereList, RectList, CurList; -static GLint win = 0; -static GLboolean anim = GL_TRUE; -static GLfloat xRot = 0.0f, yRot = 0.0f; -static GLint WinSize[2]; -static GLint WinSizeUniform = -1; - - -static void -Redisplay(void) -{ - glUniform2iv(WinSizeUniform, 1, WinSize); - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - glPushMatrix(); - glRotatef(xRot, 1.0f, 0.0f, 0.0f); - glRotatef(yRot, 0.0f, 1.0f, 0.0f); - glCallList(CurList); - glPopMatrix(); - - glutSwapBuffers(); -} - - -static void -Idle(void) -{ - yRot = glutGet(GLUT_ELAPSED_TIME) * 0.1; - glutPostRedisplay(); -} - - -static void -Reshape(int width, int height) -{ - WinSize[0] = width; - WinSize[1] = height; - glViewport(0, 0, width, height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glTranslatef(0.0f, 0.0f, -15.0f); -} - - -static void -CleanUp(void) -{ - glDeleteShader(fragShader); - glDeleteShader(vertShader); - glDeleteProgram(program); - glutDestroyWindow(win); -} - - -static void -Key(unsigned char key, int x, int y) -{ - (void) x; - (void) y; - - switch(key) { - case ' ': - case 'a': - anim = !anim; - if (anim) - glutIdleFunc(Idle); - else - glutIdleFunc(NULL); - break; - case 'o': - if (CurList == SphereList) - CurList = RectList; - else - CurList = SphereList; - break; - case 27: - CleanUp(); - exit(0); - break; - } - glutPostRedisplay(); -} - - -static void -SpecialKey(int key, int x, int y) -{ - const GLfloat step = 3.0f; - - (void) x; - (void) y; - - switch(key) { - case GLUT_KEY_UP: - xRot -= step; - break; - case GLUT_KEY_DOWN: - xRot += step; - break; - case GLUT_KEY_LEFT: - yRot -= step; - break; - case GLUT_KEY_RIGHT: - yRot += step; - break; - } - glutPostRedisplay(); -} - - -static void -MakeSphere(void) -{ - GLUquadricObj *obj = gluNewQuadric(); - SphereList = glGenLists(1); - gluQuadricTexture(obj, GL_TRUE); - glNewList(SphereList, GL_COMPILE); - gluSphere(obj, 2.0f, 30, 15); - glEndList(); - gluDeleteQuadric(obj); -} - - -static void -MakeRect(void) -{ - RectList = glGenLists(1); - glNewList(RectList, GL_COMPILE); - glBegin(GL_POLYGON); - glTexCoord2f(0, 0); glVertex2f(-2, -2); - glTexCoord2f(1, 0); glVertex2f( 2, -2); - glTexCoord2f(1, 1); glVertex2f( 2, 2); - glTexCoord2f(0, 1); glVertex2f(-2, 2); - glEnd(); - glEndList(); -} - - -static void -Init(void) -{ - static const char *fragShaderText = - "uniform ivec2 WinSize; \n" - "void main() {\n" - " vec2 d = dFdy(gl_TexCoord[0].xy) * vec2(WinSize); \n" - " gl_FragColor = vec4(d.x, d.y, 0.0, 1.0);\n" - " // gl_FragColor = gl_TexCoord[0];\n" - "}\n"; - static const char *vertShaderText = - "void main() {\n" - " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n" - " gl_TexCoord[0] = gl_MultiTexCoord0;\n" - "}\n"; - - if (!ShadersSupported()) - exit(1); - - vertShader = CompileShaderText(GL_VERTEX_SHADER, vertShaderText); - fragShader = CompileShaderText(GL_FRAGMENT_SHADER, fragShaderText); - program = LinkShaders(vertShader, fragShader); - - glUseProgram(program); - WinSizeUniform = glGetUniformLocation(program, "WinSize"); - - /*assert(glGetError() == 0);*/ - - glClearColor(0.3f, 0.3f, 0.3f, 0.0f); - glEnable(GL_DEPTH_TEST); - - MakeSphere(); - MakeRect(); - - CurList = SphereList; - - printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER)); - - assert(glIsProgram(program)); - assert(glIsShader(fragShader)); - assert(glIsShader(vertShader)); - - glColor3f(1, 0, 0); -} - - -static void -ParseOptions(int argc, char *argv[]) -{ - int i; - for (i = 1; i < argc; i++) { - if (strcmp(argv[i], "-fs") == 0) { - FragProgFile = argv[i+1]; - } - else if (strcmp(argv[i], "-vs") == 0) { - VertProgFile = argv[i+1]; - } - } -} - - -int -main(int argc, char *argv[]) -{ - WinSize[0] = WinSize[1] = 200; - - glutInit(&argc, argv); - glutInitWindowSize(WinSize[0], WinSize[1]); - glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); - win = glutCreateWindow(argv[0]); - glewInit(); - glutReshapeFunc(Reshape); - glutKeyboardFunc(Key); - glutSpecialFunc(SpecialKey); - glutDisplayFunc(Redisplay); - if (anim) - glutIdleFunc(Idle); - ParseOptions(argc, argv); - Init(); - glutMainLoop(); - return 0; -} diff --git a/progs/glsl/fragcoord.c b/progs/glsl/fragcoord.c deleted file mode 100644 index 3dfcec87a56..00000000000 --- a/progs/glsl/fragcoord.c +++ /dev/null @@ -1,181 +0,0 @@ -/** - * Test GLSL gl_FragCoord fragment program attribute. - * Color the quad's fragments according to their window position. - * - * Brian Paul - * 20 Nov 2008 - */ - - -#include <assert.h> -#include <string.h> -#include <stdio.h> -#include <stdlib.h> -#include <math.h> -#include <GL/glew.h> -#include <GL/glut.h> -#include "shaderutil.h" - - -static GLint WinWidth = 200, WinHeight = 200; -static char *FragProgFile = NULL; -static char *VertProgFile = NULL; -static GLuint fragShader; -static GLuint vertShader; -static GLuint program; -static GLint win = 0; -static GLboolean Anim = GL_TRUE; -static GLfloat PosX = 0.0, PosY = 0.0; - - -static void -Idle(void) -{ - float r = (WinWidth < WinHeight) ? WinWidth : WinHeight; - float a = glutGet(GLUT_ELAPSED_TIME) * 0.001; - r *= 0.25; - PosX = WinWidth / 2 + r * cos(a); - PosY = WinHeight / 2 + r * sin(a); - - glutPostRedisplay(); -} - - -static void -Redisplay(void) -{ - glClear(GL_COLOR_BUFFER_BIT); - - glPushMatrix(); - glTranslatef(PosX, PosY, 0.0); -#if 0 - glBegin(GL_POLYGON); - glVertex2f(-50, -50); - glVertex2f( 50, -50); - glVertex2f( 50, 50); - glVertex2f(-50, 50); - glEnd(); -#else - glutSolidSphere(50, 20, 10); -#endif - glPopMatrix(); - - glutSwapBuffers(); -} - - -static void -Reshape(int width, int height) -{ - glViewport(0, 0, width, height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrtho(0, width, 0, height, -55, 55); - - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - - WinWidth = width; - WinHeight = height; -} - - -static void -CleanUp(void) -{ - glDeleteShader(fragShader); - glDeleteShader(vertShader); - glDeleteProgram(program); - glutDestroyWindow(win); -} - - -static void -Key(unsigned char key, int x, int y) -{ - (void) x; - (void) y; - - switch(key) { - case ' ': - case 'a': - Anim = !Anim; - glutIdleFunc(Anim ? Idle : NULL); - break; - case 27: - CleanUp(); - exit(0); - break; - } - glutPostRedisplay(); -} - - -static void -Init(void) -{ - static const char *fragShaderText = - "void main() { \n" - " vec4 scale = vec4(.005, 0.005, 0.5, 1.0);\n" - " gl_FragColor = gl_FragCoord * scale; \n" - "}\n"; - static const char *vertShaderText = - "void main() {\n" - " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n" - "}\n"; - - if (!ShadersSupported()) - exit(1); - - vertShader = CompileShaderText(GL_VERTEX_SHADER, vertShaderText); - fragShader = CompileShaderText(GL_FRAGMENT_SHADER, fragShaderText); - program = LinkShaders(vertShader, fragShader); - - glUseProgram(program); - - /*assert(glGetError() == 0);*/ - - glClearColor(0.3f, 0.3f, 0.3f, 0.0f); - - printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER)); - - assert(glIsProgram(program)); - assert(glIsShader(fragShader)); - assert(glIsShader(vertShader)); - - glColor3f(1, 0, 0); -} - - -static void -ParseOptions(int argc, char *argv[]) -{ - int i; - for (i = 1; i < argc; i++) { - if (strcmp(argv[i], "-fs") == 0) { - FragProgFile = argv[i+1]; - } - else if (strcmp(argv[i], "-vs") == 0) { - VertProgFile = argv[i+1]; - } - } -} - - -int -main(int argc, char *argv[]) -{ - glutInit(&argc, argv); - glutInitWindowSize(WinWidth, WinHeight); - glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); - win = glutCreateWindow(argv[0]); - glewInit(); - glutReshapeFunc(Reshape); - glutKeyboardFunc(Key); - glutDisplayFunc(Redisplay); - ParseOptions(argc, argv); - Init(); - glutIdleFunc(Anim ? Idle : NULL); - glutMainLoop(); - return 0; -} diff --git a/progs/glsl/fsraytrace.c b/progs/glsl/fsraytrace.c deleted file mode 100644 index af72a99099d..00000000000 --- a/progs/glsl/fsraytrace.c +++ /dev/null @@ -1,412 +0,0 @@ -/* -*- mode: c; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; coding: utf-8-unix -*- */ -/* - Copyright (c) 2010 Kristóf Ralovich - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - 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 Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. -*/ - - -#include <stdio.h> -#include <stdlib.h> -#include <GL/glew.h> -#include <GL/glut.h> -#include "shaderutil.h" -#include <math.h> - -static int Win; -static int WinWidth = 512, WinHeight = 512; -static int mouseGrabbed = 0; -static GLuint vertShader; -static GLuint fragShader; -static GLuint program; -static float rot[9] = {1,0,0, 0,1,0, 0,0,1}; - -static const char* vsSource = - "varying vec2 rayDir; \n" - " \n" - "void main() \n" - "{ \n" - " rayDir = gl_MultiTexCoord0.xy - vec2(0.5,0.5); \n" - " gl_Position = gl_ProjectionMatrix * gl_Vertex; \n" - "}\n"; - -static const char* fsSource = - "const float INF = 9999.9; \n" - "const float EPSILON = 0.00001; \n" - "const vec3 lightPos = vec3(0.0, 8.0, 1.0); \n" - "const vec4 backgroundColor = vec4(0.2,0.3,0.4,1); \n" - " \n" - "varying vec2 rayDir; \n" - " \n" - "uniform mat3 rot; \n" - " \n" - "struct Ray \n" - "{ \n" - "vec3 orig; \n" - "vec3 dir; \n" - "}; \n" - " \n" - "struct Sphere \n" - "{ \n" - " vec3 c; \n" - " float r; \n" - "}; \n" - " \n" - "struct Isec \n" - "{ \n" - " float t; \n" - " int idx; \n" - " vec3 hit; \n" - " vec3 n; \n" - "}; \n" - " \n" -#ifdef __APPLE__ - "Sphere spheres0 = Sphere( vec3(0.0,0.0,-1.0), 0.5 ); \n" - "Sphere spheres1 = Sphere( vec3(-3.0,0.0,-1.0), 1.5 ); \n" - "Sphere spheres2 = Sphere( vec3(0.0,3.0,-1.0), 0.5 ); \n" - "Sphere spheres3 = Sphere( vec3(2.0,0.0,-1.0), 1.0 ); \n" -#else - "const Sphere spheres0 = Sphere( vec3(0.0,0.0,-1.0), 0.5 ); \n" - "const Sphere spheres1 = Sphere( vec3(-3.0,0.0,-1.0), 1.5 ); \n" - "const Sphere spheres2 = Sphere( vec3(0.0,3.0,-1.0), 0.5 ); \n" - "const Sphere spheres3 = Sphere( vec3(2.0,0.0,-1.0), 1.0 ); \n" -#endif - " \n" - "// Mesa intel gen4 generates \"unsupported IR in fragment shader 13\" for\n" - "// sqrt, let's work around. \n" - "float \n" - "sqrt_hack(float f2) \n" - "{ \n" - " vec3 v = vec3(f2,0.0,0.0); \n" - " return length(v); \n" - "} \n" - " \n" - "void \n" - "intersect(const in Ray ray, \n" - " const in Sphere sph, \n" - " const in int idx, \n" - " inout Isec isec) \n" - "{ \n" - " // Project both o and the sphere to the plane perpendicular to d \n" - " // and containing c. Let x be the point where the ray intersects \n" - " // the plane. If |x-c| < r, the ray intersects the sphere. \n" - " vec3 o = ray.orig; \n" - " vec3 d = ray.dir; \n" - " vec3 n = -d; \n" - " vec3 c = sph.c; \n" - " float r = sph.r; \n" - " float t = dot(c-o,n)/dot(n,d); \n" - " vec3 x = o+d*t; \n" - " float e = length(x-c); \n" - " if(e > r) \n" - " { \n" - " // no intersection \n" - " return; \n" - " } \n" - " \n" - " // Apply Pythagorean theorem on the (intersection,x,c) triangle \n" - " // to get the distance between c and the intersection. \n" - "#ifndef BUGGY_INTEL_GEN4_GLSL \n" - " float f = sqrt(r*r - e*e); \n" - "#else \n" - " float f = sqrt_hack(r*r - e*e); \n" - "#endif \n" - " float dist = t - f; \n" - " if(dist < 0.0) \n" - " { \n" - " // inside the sphere \n" - " return; \n" - " } \n" - " \n" - " if(dist < EPSILON) \n" - " return; \n" - " \n" - " if(dist > isec.t) \n" - " return; \n" - " \n" - " isec.t = dist; \n" - " isec.idx = idx; \n" - " \n" - " isec.hit = ray.orig + ray.dir * isec.t; \n" - " isec.n = (isec.hit - c) / r; \n" - "} \n" - " \n" - "Isec \n" - "intersect(const in Ray ray, \n" - " const in float max_t /*= INF*/) \n" - "{ \n" - " Isec nearest; \n" - " nearest.t = max_t; \n" - " nearest.idx = -1; \n" - " \n" - " intersect(ray, spheres0, 0, nearest); \n" - " intersect(ray, spheres1, 1, nearest); \n" - " intersect(ray, spheres2, 2, nearest); \n" - " intersect(ray, spheres3, 3, nearest); \n" - " \n" - " return nearest; \n" - "} \n" - " \n" - "vec4 \n" - "idx2color(const in int idx) \n" - "{ \n" - " vec4 diff; \n" - " if(idx == 0) \n" - " diff = vec4(1.0, 0.0, 0.0, 0.0); \n" - " else if(idx == 1) \n" - " diff = vec4(0.0, 1.0, 0.0, 0.0); \n" - " else if(idx == 2) \n" - " diff = vec4(0.0, 0.0, 1.0, 0.0); \n" - " else if(idx == 3) \n" - " diff = vec4(1.0, 1.0, 0.0, 0.0); \n" - " return diff; \n" - "} \n" - " \n" - "vec4 \n" - "trace0(const in Ray ray) \n" - "{ \n" - " Isec isec = intersect(ray, INF); \n" - " \n" - " if(isec.idx == -1) \n" - " { \n" - " return backgroundColor; \n" - " } \n" - " \n" - " vec4 diff = idx2color(isec.idx); \n" - " \n" - " vec3 N = isec.n; \n" - " vec3 L = normalize(lightPos-isec.hit); \n" - " vec3 camera_dir = normalize(ray.orig - isec.hit); \n" - " return dot(N,L)*diff + pow( \n" - " clamp(dot(reflect(-L,N),camera_dir),0.0,1.0),16.0); \n" - "} \n" - " \n" - "vec4 \n" - "trace1(const in Ray ray) \n" - "{ \n" - " Isec isec = intersect(ray, INF); \n" - " \n" - " if(isec.idx == -1) \n" - " { \n" - " return backgroundColor; \n" - " } \n" - " \n" - " Ray reflRay = Ray(isec.hit, reflect(ray.dir, isec.n)); \n" - " \n" - " vec4 reflCol = trace0(reflRay); \n" - " \n" - " vec4 diff = idx2color(isec.idx) + reflCol; \n" - " \n" - " vec3 N = isec.n; \n" - " vec3 L = normalize(lightPos-isec.hit); \n" - " vec3 camera_dir = normalize(ray.orig - isec.hit); \n" - " return dot(N,L)*diff + pow( \n" - " clamp(dot(reflect(-L,N),camera_dir),0.0,1.0),16.0); \n" - "} \n" - " \n" - "void main() \n" - "{ \n" - " const float z = -0.5; \n" - " const vec3 cameraPos = vec3(0,0,3); \n" - " Ray r = Ray(cameraPos, normalize(vec3(rayDir, z) * rot)); \n" - " gl_FragColor = trace1(r); \n" - "}\n"; - -static -float -deg2rad(const float degree) -{ - return( degree * 0.017453292519943295769236907684886F); -} - -static void -rotate_xy(float* mat3, const float degreesAroundX, const float degreesAroundY) -{ - const float rad1 = deg2rad(degreesAroundX); - const float c1 = cosf(rad1); - const float s1 = sinf(rad1); - const float rad2 = deg2rad(degreesAroundY); - const float c2 = cosf(rad2); - const float s2 = sinf(rad2); - mat3[0] = c2; mat3[3] = 0.0F; mat3[6] = s2; - mat3[1] = s1*s2; mat3[4] = c1; mat3[7] = -s1*c2; - mat3[2] = -c1*s2;mat3[5] = s1; mat3[8] = c1*c2; -} - -static void -identity(float* mat3) -{ - mat3[0] = 1.0F; mat3[3] = 0.0F; mat3[6] = 0.0F; - mat3[1] = 0.0F; mat3[4] = 1.0F; mat3[7] = 0.0F; - mat3[2] = 0.0F; mat3[5] = 0.0F; mat3[8] = 1.0F; -} - -static void -Draw(void) -{ - GLint location = glGetUniformLocation(program, "rot"); - static const float m = -10.F; - static const float p = 10.F; - static const float d = -0.5F; - - glUseProgram(program); - glUniformMatrix3fv(location, 1, 0, rot); - - glBegin(GL_QUADS); - { - glTexCoord2f(0.0F, 0.0F); glVertex3f(m, m, d); - glTexCoord2f(1.0F, 0.0F); glVertex3f(p, m, d); - glTexCoord2f(1.0F, 1.0F); glVertex3f(p, p, d); - glTexCoord2f(0.0F, 1.0F); glVertex3f(m, p, d); - } - glEnd(); - glUseProgram(0); - - glutSwapBuffers(); - - { - static int frames = 0; - static int t0 = 0; - static int t1 = 0; - float dt; - frames++; - t1 = glutGet(GLUT_ELAPSED_TIME); - dt = (float)(t1-t0)/1000.0F; - if(dt >= 5.0F) - { - float fps = (float)frames / dt; - printf("%f FPS (%d frames in %f seconds)\n", fps, frames, dt); - frames = 0; - t0 = t1; - } - } -} - - -static void -Reshape(int width, int height) -{ - WinWidth = width; - WinHeight = height; - glViewport(0, 0, width, height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrtho(-10, 10, -10, 10, -1, 1); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); -} - - -static void -Key(unsigned char key, int x, int y) -{ - (void) x; - (void) y; - switch (key) { - case 27: - glutDestroyWindow(Win); - exit(0); - break; - } - glutPostRedisplay(); -} - - -static -void -drag(int x, int y) -{ - float scale = 1.5F; - if(mouseGrabbed) - { - static GLfloat xRot = 0, yRot = 0; - xRot = (float)(x - WinWidth/2) / scale; - yRot = (float)(y - WinHeight/2) / scale; - identity(rot); - rotate_xy(rot, yRot, xRot); - glutPostRedisplay(); - } -} - - -static -void -mouse(int button, int state, int x, int y) -{ - mouseGrabbed = (state == GLUT_DOWN); -} - - -static void -Init(void) -{ - glDisable(GL_DEPTH_TEST); - - if(!ShadersSupported()) - { - fprintf(stderr, "Shaders are not supported!\n"); - exit(-1); - } - - vertShader = CompileShaderText(GL_VERTEX_SHADER, vsSource); - fragShader = CompileShaderText(GL_FRAGMENT_SHADER, fsSource); - program = LinkShaders(vertShader, fragShader); - glUseProgram(0); - - if(glGetError() != 0) - { - fprintf(stderr, "Shaders were not loaded!\n"); - exit(-1); - } - - if(!glIsShader(vertShader)) - { - fprintf(stderr, "Vertex shader failed!\n"); - exit(-1); - } - - if(!glIsProgram(program)) - { - fprintf(stderr, "Shader program failed!\n"); - exit(-1); - } - - printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER)); -} - - -int -main(int argc, char *argv[]) -{ - glutInitWindowSize(WinWidth, WinHeight); - glutInit(&argc, argv); - glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); - Win = glutCreateWindow(argv[0]); - glewInit(); - glutReshapeFunc(Reshape); - glutKeyboardFunc(Key); - glutDisplayFunc(Draw); - glutMouseFunc(mouse); - glutMotionFunc(drag); - glutIdleFunc(Draw); - Init(); - glutMainLoop(); - return 0; -} - diff --git a/progs/glsl/identity.c b/progs/glsl/identity.c deleted file mode 100644 index 526e9b82c10..00000000000 --- a/progs/glsl/identity.c +++ /dev/null @@ -1,204 +0,0 @@ -/** - * Test very basic glsl functionality (identity vertex and fragment shaders). - * Brian Paul & Stephane Marchesin - */ - - -#include <assert.h> -#include <string.h> -#include <stdio.h> -#include <stdlib.h> -#include <math.h> -#include <GL/glew.h> -#include <GL/glut.h> -#include "shaderutil.h" - - -static char *FragProgFile = NULL; -static char *VertProgFile = NULL; -static GLuint fragShader; -static GLuint vertShader; -static GLuint program; -static GLint win = 0; -static GLboolean anim = GL_FALSE; -static GLfloat xRot = 0.0f, yRot = 0.0f; -static int w,h; - - -static void -Redisplay(void) -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - glBegin(GL_TRIANGLES); - glColor3f(.8,0,0); - glVertex3f(-0.9, -0.9, 0.0); - glColor3f(0,.9,0); - glVertex3f( 0.9, -0.9, 0.0); - glColor3f(0,0,.7); - glVertex3f( 0.0, 0.9, 0.0); - glEnd(); - - glutSwapBuffers(); -} - - -static void -Idle(void) -{ - yRot = glutGet(GLUT_ELAPSED_TIME) * 0.1; - glutPostRedisplay(); -} - - -static void -Reshape(int width, int height) -{ - glViewport(0, 0, width, height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - w = width; - h = height; -} - - -static void -CleanUp(void) -{ - glDeleteShader(fragShader); - glDeleteShader(vertShader); - glDeleteProgram(program); - glutDestroyWindow(win); -} - - -static void -Key(unsigned char key, int x, int y) -{ - (void) x; - (void) y; - - switch(key) { - case ' ': - case 'a': - anim = !anim; - if (anim) - glutIdleFunc(Idle); - else - glutIdleFunc(NULL); - break; - case 27: - CleanUp(); - exit(0); - break; - } - glutPostRedisplay(); -} - - -static void -SpecialKey(int key, int x, int y) -{ - const GLfloat step = 3.0f; - - (void) x; - (void) y; - - switch(key) { - case GLUT_KEY_UP: - xRot -= step; - break; - case GLUT_KEY_DOWN: - xRot += step; - break; - case GLUT_KEY_LEFT: - yRot -= step; - break; - case GLUT_KEY_RIGHT: - yRot += step; - break; - } - glutPostRedisplay(); -} - - -static void -Init(void) -{ - static const char *fragShaderText = - "void main() {\n" - " gl_FragColor = vec4(1.0,0.0,0.0,1.0);\n" - "}\n"; - static const char *vertShaderText = - "void main() {\n" - " gl_Position = gl_Vertex;\n" - "}\n"; - - if (!ShadersSupported()) - exit(1); - - if (FragProgFile) - fragShader = CompileShaderFile(GL_FRAGMENT_SHADER, FragProgFile); - else - fragShader = CompileShaderText(GL_FRAGMENT_SHADER, fragShaderText); - - if (VertProgFile) - vertShader = CompileShaderFile(GL_VERTEX_SHADER, VertProgFile); - else - vertShader = CompileShaderText(GL_VERTEX_SHADER, vertShaderText); - - program = LinkShaders(vertShader, fragShader); - - glUseProgram(program); - - /*assert(glGetError() == 0);*/ - - glClearColor(0.3f, 0.3f, 0.3f, 0.0f); - glEnable(GL_DEPTH_TEST); - - printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER)); - - assert(glIsProgram(program)); - assert(glIsShader(fragShader)); - assert(glIsShader(vertShader)); - - glColor3f(1, 0, 0); -} - - -static void -ParseOptions(int argc, char *argv[]) -{ - int i; - for (i = 1; i < argc; i++) { - if (strcmp(argv[i], "-fs") == 0) { - FragProgFile = argv[i+1]; - } - else if (strcmp(argv[i], "-vs") == 0) { - VertProgFile = argv[i+1]; - } - } -} - - -int -main(int argc, char *argv[]) -{ - glutInit(&argc, argv); - glutInitWindowSize(200, 200); - glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); - win = glutCreateWindow(argv[0]); - glewInit(); - glutReshapeFunc(Reshape); - glutKeyboardFunc(Key); - glutSpecialFunc(SpecialKey); - glutDisplayFunc(Redisplay); - if (anim) - glutIdleFunc(Idle); - ParseOptions(argc, argv); - Init(); - glutMainLoop(); - return 0; -} diff --git a/progs/glsl/linktest.c b/progs/glsl/linktest.c deleted file mode 100644 index ec3fffbf9ce..00000000000 --- a/progs/glsl/linktest.c +++ /dev/null @@ -1,255 +0,0 @@ -/** - * Test linking of multiple compilation units. - * Brian Paul - * 28 March 2009 - */ - -#include <assert.h> -#include <string.h> -#include <stdio.h> -#include <stdlib.h> -#include <math.h> -#include <GL/glew.h> -#include <GL/glut.h> -#include "shaderutil.h" - - -static GLfloat diffuse[4] = { 0.5f, 1.0f, 0.5f, 1.0f }; -static GLfloat specular[4] = { 0.8f, 0.8f, 0.8f, 1.0f }; -static GLfloat lightPos[4] = { 0.0f, 10.0f, 20.0f, 0.0f }; -static GLfloat delta = 1.0f; - -static GLuint VertShader1; -static GLuint VertShader2; -static GLuint FragShader1; -static GLuint FragShader2; -static GLuint Program; - -static GLint uDiffuse; -static GLint uSpecular; -static GLint uTexture; - -static GLint Win = 0; -static GLboolean anim = GL_TRUE; - - - -static const char *FragShaderSource1 = - "float compute_dotprod(const vec3 normal) \n" - "{ \n" - " float dotProd = max(dot(gl_LightSource[0].position.xyz, \n" - " normalize(normal)), 0.0); \n" - " return dotProd; \n" - "} \n"; - -static const char *FragShaderSource2 = - "uniform vec4 diffuse;\n" - "uniform vec4 specular;\n" - "varying vec3 normal;\n" - "\n" - "// external function \n" - "float compute_dotprod(const vec3 normal); \n" - "\n" - "void main() \n" - "{ \n" - " float dotProd = compute_dotprod(normal); \n" - " gl_FragColor = diffuse * dotProd + specular * pow(dotProd, 20.0); \n" - "} \n"; - - -static const char *VertShaderSource1 = - "vec3 compute_normal() \n" - "{ \n" - " return gl_NormalMatrix * gl_Normal; \n" - "} \n"; - -static const char *VertShaderSource2 = - "varying vec3 normal;\n" - "\n" - "// external function \n" - "vec3 compute_normal(); \n" - "\n" - "void main() \n" - "{ \n" - " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; \n" - " normal = compute_normal(); \n" - "} \n"; - - -static void -normalize(GLfloat *dst, const GLfloat *src) -{ - GLfloat len = sqrt(src[0] * src[0] + src[1] * src[1] + src[2] * src[2]); - dst[0] = src[0] / len; - dst[1] = src[1] / len; - dst[2] = src[2] / len; - dst[3] = src[3]; -} - - -static void -Redisplay(void) -{ - GLfloat vec[4]; - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - /* update light position */ - normalize(vec, lightPos); - glLightfv(GL_LIGHT0, GL_POSITION, vec); - - glutSolidSphere(2.0, 10, 5); - - glutSwapBuffers(); -} - - -static void -Idle(void) -{ - lightPos[0] += delta; - if (lightPos[0] > 25.0f || lightPos[0] < -25.0f) - delta = -delta; - glutPostRedisplay(); -} - - -static void -Reshape(int width, int height) -{ - glViewport(0, 0, width, height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glTranslatef(0.0f, 0.0f, -15.0f); -} - - -static void -CleanUp(void) -{ - glDeleteShader(VertShader1); - glDeleteShader(VertShader2); - glDeleteShader(FragShader1); - glDeleteShader(FragShader2); - glDeleteProgram(Program); - glutDestroyWindow(Win); -} - - -static void -Key(unsigned char key, int x, int y) -{ - (void) x; - (void) y; - - switch(key) { - case ' ': - case 'a': - anim = !anim; - if (anim) - glutIdleFunc(Idle); - else - glutIdleFunc(NULL); - break; - case 'x': - lightPos[0] -= 1.0f; - break; - case 'X': - lightPos[0] += 1.0f; - break; - case 27: - CleanUp(); - exit(0); - break; - } - glutPostRedisplay(); -} - - -static void -CheckLink(GLuint prog) -{ - GLint stat; - glGetProgramiv(prog, GL_LINK_STATUS, &stat); - if (!stat) { - GLchar log[1000]; - GLsizei len; - glGetProgramInfoLog(prog, 1000, &len, log); - fprintf(stderr, "Linker error:\n%s\n", log); - } -} - - -static void -Init(void) -{ - if (!ShadersSupported()) - exit(1); - - printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER)); - - VertShader1 = CompileShaderText(GL_VERTEX_SHADER, VertShaderSource1); - VertShader2 = CompileShaderText(GL_VERTEX_SHADER, VertShaderSource2); - FragShader1 = CompileShaderText(GL_FRAGMENT_SHADER, FragShaderSource1); - FragShader2 = CompileShaderText(GL_FRAGMENT_SHADER, FragShaderSource2); - - Program = glCreateProgram(); - glAttachShader(Program, VertShader1); - glAttachShader(Program, VertShader2); - glAttachShader(Program, FragShader1); - glAttachShader(Program, FragShader2); - - glLinkProgram(Program); - - CheckLink(Program); - - glUseProgram(Program); - - uDiffuse = glGetUniformLocation(Program, "diffuse"); - uSpecular = glGetUniformLocation(Program, "specular"); - uTexture = glGetUniformLocation(Program, "texture"); - printf("DiffusePos %d SpecularPos %d TexturePos %d\n", - uDiffuse, uSpecular, uTexture); - - glUniform4fv(uDiffuse, 1, diffuse); - glUniform4fv(uSpecular, 1, specular); - - glClearColor(0.3f, 0.3f, 0.3f, 0.0f); - glEnable(GL_DEPTH_TEST); - - glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diffuse); - glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular); - glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 10.0f); - - assert(glIsProgram(Program)); - assert(glIsShader(VertShader1)); - assert(glIsShader(VertShader2)); - assert(glIsShader(FragShader1)); - assert(glIsShader(FragShader2)); - - glColor3f(1, 0, 0); -} - - -int -main(int argc, char *argv[]) -{ - glutInit(&argc, argv); - glutInitWindowSize(300, 300); - glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); - Win = glutCreateWindow(argv[0]); - glewInit(); - glutReshapeFunc(Reshape); - glutKeyboardFunc(Key); - glutDisplayFunc(Redisplay); - if (anim) - glutIdleFunc(Idle); - Init(); - glutMainLoop(); - return 0; -} - - diff --git a/progs/glsl/mandelbrot.c b/progs/glsl/mandelbrot.c deleted file mode 100644 index b05ef37fae1..00000000000 --- a/progs/glsl/mandelbrot.c +++ /dev/null @@ -1,215 +0,0 @@ -/** - * "Mandelbrot" shader demo. Uses the example shaders from - * chapter 15 (or 18) of the OpenGL Shading Language "orange" book. - * 15 Jan 2007 - */ - -#include <assert.h> -#include <string.h> -#include <stdio.h> -#include <stdlib.h> -#include <math.h> -#include <GL/glew.h> -#include <GL/glut.h> -#include "shaderutil.h" - - -static char *FragProgFile = "CH18-mandel.frag"; -static char *VertProgFile = "CH18-mandel.vert"; - -/* program/shader objects */ -static GLuint fragShader; -static GLuint vertShader; -static GLuint program; - - -static struct uniform_info Uniforms[] = { - /* vert */ - { "LightPosition", 1, GL_FLOAT_VEC3, { 0.1, 0.1, 9.0, 0}, -1 }, - { "SpecularContribution", 1, GL_FLOAT, { 0.5, 0, 0, 0 }, -1 }, - { "DiffuseContribution", 1, GL_FLOAT, { 0.5, 0, 0, 0 }, -1 }, - { "Shininess", 1, GL_FLOAT, { 20.0, 0, 0, 0 }, -1 }, - /* frag */ - { "MaxIterations", 1, GL_FLOAT, { 12, 0, 0, 0 }, -1 }, - { "Zoom", 1, GL_FLOAT, { 0.125, 0, 0, 0 }, -1 }, - { "Xcenter", 1, GL_FLOAT, { -1.5, 0, 0, 0 }, -1 }, - { "Ycenter", 1, GL_FLOAT, { .005, 0, 0, 0 }, -1 }, - { "InnerColor", 1, GL_FLOAT_VEC3, { 1, 0, 0, 0 }, -1 }, - { "OuterColor1", 1, GL_FLOAT_VEC3, { 0, 1, 0, 0 }, -1 }, - { "OuterColor2", 1, GL_FLOAT_VEC3, { 0, 0, 1, 0 }, -1 }, - END_OF_UNIFORMS -}; - -static GLint win = 0; - -static GLfloat xRot = 0.0f, yRot = 0.0f, zRot = 0.0f; - -static GLint uZoom, uXcenter, uYcenter; -static GLfloat zoom = 1.0, xCenter = -1.5, yCenter = 0.0; - - -static void -Redisplay(void) -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - /* set interactive uniform parameters */ - glUniform1fv(uZoom, 1, &zoom); - glUniform1fv(uXcenter, 1, &xCenter); - glUniform1fv(uYcenter, 1, &yCenter); - - glPushMatrix(); - glRotatef(xRot, 1.0f, 0.0f, 0.0f); - glRotatef(yRot, 0.0f, 1.0f, 0.0f); - glRotatef(zRot, 0.0f, 0.0f, 1.0f); - - glBegin(GL_POLYGON); - glTexCoord2f(0, 0); glVertex2f(-1, -1); - glTexCoord2f(1, 0); glVertex2f( 1, -1); - glTexCoord2f(1, 1); glVertex2f( 1, 1); - glTexCoord2f(0, 1); glVertex2f(-1, 1); - glEnd(); - - glPopMatrix(); - - glutSwapBuffers(); -} - - -static void -Reshape(int width, int height) -{ - glViewport(0, 0, width, height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glTranslatef(0.0f, 0.0f, -6.0f); -} - - -static void -CleanUp(void) -{ - glDeleteShader(fragShader); - glDeleteShader(vertShader); - glDeleteProgram(program); - glutDestroyWindow(win); -} - - -static void -Key(unsigned char key, int x, int y) -{ - (void) x; - (void) y; - - switch(key) { - case 'z': - zoom *= 0.9; - break; - case 'Z': - zoom /= 0.9; - break; - case 27: - CleanUp(); - exit(0); - break; - } - glutPostRedisplay(); -} - - -static void -SpecialKey(int key, int x, int y) -{ - const GLfloat step = 0.1 * zoom; - - (void) x; - (void) y; - - switch(key) { - case GLUT_KEY_UP: - yCenter += step; - break; - case GLUT_KEY_DOWN: - yCenter -= step; - break; - case GLUT_KEY_LEFT: - xCenter -= step; - break; - case GLUT_KEY_RIGHT: - xCenter += step; - break; - } - glutPostRedisplay(); -} - - -static void -Init(void) -{ - if (!ShadersSupported()) - exit(1); - - vertShader = CompileShaderFile(GL_VERTEX_SHADER, VertProgFile); - fragShader = CompileShaderFile(GL_FRAGMENT_SHADER, FragProgFile); - program = LinkShaders(vertShader, fragShader); - - glUseProgram(program); - - SetUniformValues(program, Uniforms); - PrintUniforms(Uniforms); - - uZoom = glGetUniformLocation(program, "Zoom"); - uXcenter = glGetUniformLocation(program, "Xcenter"); - uYcenter = glGetUniformLocation(program, "Ycenter"); - - assert(glGetError() == 0); - - glClearColor(0.4f, 0.4f, 0.8f, 0.0f); - - printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER)); - - assert(glIsProgram(program)); - assert(glIsShader(fragShader)); - assert(glIsShader(vertShader)); - - glColor3f(1, 0, 0); -} - - -static void -ParseOptions(int argc, char *argv[]) -{ - int i; - for (i = 1; i < argc; i++) { - if (strcmp(argv[i], "-fs") == 0) { - FragProgFile = argv[i+1]; - } - else if (strcmp(argv[i], "-vs") == 0) { - VertProgFile = argv[i+1]; - } - } -} - - -int -main(int argc, char *argv[]) -{ - glutInit(&argc, argv); - glutInitWindowSize(400, 400); - glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); - win = glutCreateWindow(argv[0]); - glewInit(); - glutReshapeFunc(Reshape); - glutKeyboardFunc(Key); - glutSpecialFunc(SpecialKey); - glutDisplayFunc(Redisplay); - ParseOptions(argc, argv); - Init(); - glutMainLoop(); - return 0; -} - diff --git a/progs/glsl/mandelbrot.shtest b/progs/glsl/mandelbrot.shtest deleted file mode 100644 index 4f4e5c747ea..00000000000 --- a/progs/glsl/mandelbrot.shtest +++ /dev/null @@ -1,13 +0,0 @@ -vs CH18-mandel.vert -fs CH18-mandel.frag -uniform LightPosition GL_FLOAT_VEC3 0.1 0.1 9.0 -uniform SpecularContribution GL_FLOAT 0.5 -uniform DiffuseContribution GL_FLOAT 0.5 -uniform Shininess GL_FLOAT 20.0 -uniform Iterations GL_FLOAT 12 -uniform Zoom GL_FLOAT 0.125 -uniform Xcenter GL_FLOAT -1.5 -uniform Ycenter GL_FLOAT .005 -uniform InnerColor GL_FLOAT_VEC3 1 0 0 -uniform OuterColor1 GL_FLOAT_VEC3 0 1 0 -uniform OuterColor2 GL_FLOAT_VEC3 0 0 1 diff --git a/progs/glsl/multinoise.c b/progs/glsl/multinoise.c deleted file mode 100644 index d504ba1cc4e..00000000000 --- a/progs/glsl/multinoise.c +++ /dev/null @@ -1,278 +0,0 @@ -/** - * Another test for noise() functions (noise1 to noise4 tested independently). - * 13 Dec 2008 - */ - -#include <assert.h> -#include <string.h> -#include <stdio.h> -#include <stdlib.h> -#include <math.h> -#include <GL/glew.h> -#include <GL/glut.h> - -static const char *VertShaderText = - "void main() {\n" - " gl_TexCoord[0].xyz = gl_Vertex.xyz;\n" - " gl_TexCoord[0].w = gl_MultiTexCoord1.x;\n" - " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n" - "}\n"; - -static const char *FragShaderText[ 4 ] = { - "void main()\n" - "{\n" - " gl_FragColor.rgb = noise3( gl_TexCoord[ 0 ].w ) * 0.5 + 0.5;\n" - " gl_FragColor.a = 1.0;\n" - "}\n", - "void main()\n" - "{\n" - " gl_FragColor.rgb = noise3( gl_TexCoord[ 0 ].xw ) * 0.5 + 0.5;\n" - " gl_FragColor.a = 1.0;\n" - "}\n", - "void main()\n" - "{\n" - " gl_FragColor.rgb = noise3( gl_TexCoord[ 0 ].xyw ) * 0.5 + 0.5;\n" - " gl_FragColor.a = 1.0;\n" - "}\n", - "void main()\n" - "{\n" - " gl_FragColor.rgb = noise3( gl_TexCoord[ 0 ].xyzw ) * 0.5 + 0.5;\n" - " gl_FragColor.a = 1.0;\n" - "}\n" -}; - -struct uniform_info { - const char *name; - GLuint size; - GLint location; - GLfloat value[4]; -}; - -/* program/shader objects */ -static GLuint fragShader[ 4 ]; -static GLuint vertShader; -static GLuint program[ 4 ]; - -static GLint win = 0; -static GLfloat xRot = 0.0f, yRot = 0.0f, zRot = 0.0f; -static GLfloat Slice = 0.0; -static GLboolean Anim = GL_FALSE; - - -static void -Idle(void) -{ - Slice += 0.01; - glutPostRedisplay(); -} - - -static void -Redisplay(void) -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - glMultiTexCoord1f( GL_TEXTURE1, Slice ); - - glPushMatrix(); - glRotatef(xRot, 1.0f, 0.0f, 0.0f); - glRotatef(yRot, 0.0f, 1.0f, 0.0f); - glRotatef(zRot, 0.0f, 0.0f, 1.0f); - - glutSolidTeapot( 1.0 ); - - glPopMatrix(); - - glutSwapBuffers(); -} - - -static void -Reshape(int width, int height) -{ - glViewport(0, 0, width, height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glTranslatef(0.0f, 0.0f, -15.0f); -} - - -static void -CleanUp(void) -{ - GLint i; - - glDeleteShader(vertShader); - for( i = 0; i < 4; i++ ) { - glDeleteShader(fragShader[ i ]); - glDeleteProgram(program[ i ]); - } - glutDestroyWindow(win); -} - - -static void -Key(unsigned char key, int x, int y) -{ - const GLfloat step = 0.01; - (void) x; - (void) y; - - switch(key) { - case 'a': - Anim = !Anim; - glutIdleFunc(Anim ? Idle : NULL); - break; - case 's': - Slice -= step; - break; - case 'S': - Slice += step; - break; - case 'z': - zRot -= 1.0; - break; - case 'Z': - zRot += 1.0; - break; - case '1': - case '2': - case '3': - case '4': - glUseProgram(program[ key - '1' ]); - break; - case 27: - CleanUp(); - exit(0); - break; - } - glutPostRedisplay(); -} - - -static void -SpecialKey(int key, int x, int y) -{ - const GLfloat step = 3.0f; - - (void) x; - (void) y; - - switch(key) { - case GLUT_KEY_UP: - xRot -= step; - break; - case GLUT_KEY_DOWN: - xRot += step; - break; - case GLUT_KEY_LEFT: - yRot -= step; - break; - case GLUT_KEY_RIGHT: - yRot += step; - break; - } - glutPostRedisplay(); -} - - - -static void -LoadAndCompileShader(GLuint shader, const char *text) -{ - GLint stat; - - glShaderSource(shader, 1, (const GLchar **) &text, NULL); - - glCompileShader(shader); - - glGetShaderiv(shader, GL_COMPILE_STATUS, &stat); - if (!stat) { - GLchar log[1000]; - GLsizei len; - glGetShaderInfoLog(shader, 1000, &len, log); - fprintf(stderr, "multinoise: problem compiling shader: %s\n", log); - exit(1); - } - else { - printf("Shader compiled OK\n"); - } -} - - -static void -CheckLink(GLuint prog) -{ - GLint stat; - glGetProgramiv(prog, GL_LINK_STATUS, &stat); - if (!stat) { - GLchar log[1000]; - GLsizei len; - glGetProgramInfoLog(prog, 1000, &len, log); - fprintf(stderr, "Linker error:\n%s\n", log); - } - else { - fprintf(stderr, "Link success!\n"); - } -} - - -static void -Init(void) -{ - const char *version; - GLint i; - - version = (const char *) glGetString(GL_VERSION); - if (version[0] != '2' || version[1] != '.') { - printf("Warning: this program expects OpenGL 2.0\n"); - /*exit(1);*/ - } - - vertShader = glCreateShader(GL_VERTEX_SHADER); - LoadAndCompileShader(vertShader, VertShaderText); - - for( i = 0; i < 4; i++ ) { - fragShader[ i ] = glCreateShader(GL_FRAGMENT_SHADER); - LoadAndCompileShader(fragShader[ i ], FragShaderText[ i ]); - program[ i ] = glCreateProgram(); - glAttachShader(program[ i ], fragShader[ i ]); - glAttachShader(program[ i ], vertShader); - glLinkProgram(program[ i ]); - CheckLink(program[ i ]); - } - - glUseProgram(program[ 0 ]); - - assert(glGetError() == 0); - - glClearColor(0.4f, 0.4f, 0.8f, 0.0f); - - glColor3f(1, 0, 0); - - glFrontFace( GL_CW ); - glEnable( GL_CULL_FACE ); - glEnable( GL_DEPTH_TEST ); -} - - -int -main(int argc, char *argv[]) -{ - glutInit(&argc, argv); - glutInitWindowSize(400, 400); - glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); - win = glutCreateWindow(argv[0]); - glewInit(); - glutReshapeFunc(Reshape); - glutKeyboardFunc(Key); - glutSpecialFunc(SpecialKey); - glutDisplayFunc(Redisplay); - Init(); - glutMainLoop(); - return 0; -} - diff --git a/progs/glsl/multitex.c b/progs/glsl/multitex.c deleted file mode 100644 index 49b32253eed..00000000000 --- a/progs/glsl/multitex.c +++ /dev/null @@ -1,412 +0,0 @@ -/** - * Test multi-texturing with GL shading language. - * - * Copyright (C) 2008 Brian Paul All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is 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 Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN - * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - - - -#include <assert.h> -#include <math.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <GL/glew.h> -#include "GL/glut.h" -#include "readtex.h" -#include "shaderutil.h" - -static const char *Demo = "multitex"; - -static const char *VertFile = "multitex.vert"; -static const char *FragFile = "multitex.frag"; - -static const char *TexFiles[2] = - { - "../images/tile.rgb", - "../images/tree2.rgba" - }; - - -static GLuint Program; - -static GLfloat Xrot = 0.0, Yrot = .0, Zrot = 0.0; -static GLfloat EyeDist = 10; -static GLboolean Anim = GL_TRUE; -static GLboolean UseArrays = GL_TRUE; -static GLboolean UseVBO = GL_TRUE; -static GLuint VBO = 0; - -static GLint VertCoord_attr = -1, TexCoord0_attr = -1, TexCoord1_attr = -1; - - -/* value[0] = tex unit */ -static struct uniform_info Uniforms[] = { - { "tex1", 1, GL_SAMPLER_2D, { 0, 0, 0, 0 }, -1 }, - { "tex2", 1, GL_SAMPLER_2D, { 1, 0, 0, 0 }, -1 }, - END_OF_UNIFORMS -}; - - -static const GLfloat Tex0Coords[4][2] = { - { 0.0, 0.0 }, { 2.0, 0.0 }, { 2.0, 2.0 }, { 0.0, 2.0 } -}; - -static const GLfloat Tex1Coords[4][2] = { - { 0.0, 0.0 }, { 1.0, 0.0 }, { 1.0, 1.0 }, { 0.0, 1.0 } -}; - -static const GLfloat VertCoords[4][2] = { - { -3.0, -3.0 }, { 3.0, -3.0 }, { 3.0, 3.0 }, { -3.0, 3.0 } -}; - - - -static void -SetupVertexBuffer(void) -{ - glGenBuffersARB(1, &VBO); - glBindBufferARB(GL_ARRAY_BUFFER_ARB, VBO); - - glBufferDataARB(GL_ARRAY_BUFFER_ARB, - sizeof(VertCoords) + - sizeof(Tex0Coords) + - sizeof(Tex1Coords), - NULL, - GL_STATIC_DRAW_ARB); - - /* non-interleaved vertex arrays */ - - glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, - 0, /* offset */ - sizeof(VertCoords), /* size */ - VertCoords); /* data */ - - glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, - sizeof(VertCoords), /* offset */ - sizeof(Tex0Coords), /* size */ - Tex0Coords); /* data */ - - glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, - sizeof(VertCoords) + - sizeof(Tex0Coords), /* offset */ - sizeof(Tex1Coords), /* size */ - Tex1Coords); /* data */ - - glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); -} - - -static void -DrawPolygonArray(void) -{ - void *vertPtr, *tex0Ptr, *tex1Ptr; - - if (UseVBO) { - glBindBufferARB(GL_ARRAY_BUFFER_ARB, VBO); - vertPtr = (void *) 0; - tex0Ptr = (void *) sizeof(VertCoords); - tex1Ptr = (void *) (sizeof(VertCoords) + sizeof(Tex0Coords)); - } - else { - glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); - vertPtr = VertCoords; - tex0Ptr = Tex0Coords; - tex1Ptr = Tex1Coords; - } - - if (VertCoord_attr >= 0) { - glVertexAttribPointer(VertCoord_attr, 2, GL_FLOAT, GL_FALSE, - 0, vertPtr); - glEnableVertexAttribArray(VertCoord_attr); - } - else { - glVertexPointer(2, GL_FLOAT, 0, vertPtr); - glEnableClientState(GL_VERTEX_ARRAY); - } - - glVertexAttribPointer(TexCoord0_attr, 2, GL_FLOAT, GL_FALSE, - 0, tex0Ptr); - glEnableVertexAttribArray(TexCoord0_attr); - - glVertexAttribPointer(TexCoord1_attr, 2, GL_FLOAT, GL_FALSE, - 0, tex1Ptr); - glEnableVertexAttribArray(TexCoord1_attr); - - glDrawArrays(GL_TRIANGLE_FAN, 0, 4); - - glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); -} - - -static void -DrawPolygonVert(void) -{ - GLuint i; - - glBegin(GL_TRIANGLE_FAN); - - for (i = 0; i < 4; i++) { - glVertexAttrib2fv(TexCoord0_attr, Tex0Coords[i]); - glVertexAttrib2fv(TexCoord1_attr, Tex1Coords[i]); - - if (VertCoord_attr >= 0) - glVertexAttrib2fv(VertCoord_attr, VertCoords[i]); - else - glVertex2fv(VertCoords[i]); - } - - glEnd(); -} - - -static void -draw(void) -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - glPushMatrix(); /* modelview matrix */ - glTranslatef(0.0, 0.0, -EyeDist); - glRotatef(Zrot, 0, 0, 1); - glRotatef(Yrot, 0, 1, 0); - glRotatef(Xrot, 1, 0, 0); - - if (UseArrays) - DrawPolygonArray(); - else - DrawPolygonVert(); - - glPopMatrix(); - - glutSwapBuffers(); -} - - -static void -idle(void) -{ - GLfloat t = 0.05 * glutGet(GLUT_ELAPSED_TIME); - Yrot = t; - glutPostRedisplay(); -} - - -static void -key(unsigned char k, int x, int y) -{ - (void) x; - (void) y; - switch (k) { - case 'a': - UseArrays = !UseArrays; - printf("Arrays: %d\n", UseArrays); - break; - case 'v': - UseVBO = !UseVBO; - printf("Use VBO: %d\n", UseVBO); - break; - case ' ': - Anim = !Anim; - if (Anim) - glutIdleFunc(idle); - else - glutIdleFunc(NULL); - break; - case 'z': - EyeDist -= 0.5; - if (EyeDist < 3.0) - EyeDist = 3.0; - break; - case 'Z': - EyeDist += 0.5; - if (EyeDist > 90.0) - EyeDist = 90; - break; - case 27: - exit(0); - } - glutPostRedisplay(); -} - - -static void -specialkey(int key, int x, int y) -{ - GLfloat step = 2.0; - (void) x; - (void) y; - switch (key) { - case GLUT_KEY_UP: - Xrot += step; - break; - case GLUT_KEY_DOWN: - Xrot -= step; - break; - case GLUT_KEY_LEFT: - Yrot -= step; - break; - case GLUT_KEY_RIGHT: - Yrot += step; - break; - } - glutPostRedisplay(); -} - - -/* new window size or exposure */ -static void -Reshape(int width, int height) -{ - GLfloat ar = (float) width / (float) height; - glViewport(0, 0, (GLint)width, (GLint)height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glFrustum(-2.0*ar, 2.0*ar, -2.0, 2.0, 4.0, 100.0); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); -} - - -static void -InitTextures(void) -{ - GLenum filter = GL_LINEAR; - int i; - - for (i = 0; i < 2; i++) { - GLint imgWidth, imgHeight; - GLenum imgFormat; - GLubyte *image = NULL; - - image = LoadRGBImage(TexFiles[i], &imgWidth, &imgHeight, &imgFormat); - if (!image) { - printf("Couldn't read %s\n", TexFiles[i]); - exit(0); - } - - glActiveTexture(GL_TEXTURE0 + i); - glBindTexture(GL_TEXTURE_2D, 42 + i); - gluBuild2DMipmaps(GL_TEXTURE_2D, 4, imgWidth, imgHeight, - imgFormat, GL_UNSIGNED_BYTE, image); - free(image); - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter); - } -} - - -static GLuint -CreateProgram(const char *vertProgFile, const char *fragProgFile, - struct uniform_info *uniforms) -{ - GLuint fragShader, vertShader, program; - - vertShader = CompileShaderFile(GL_VERTEX_SHADER, vertProgFile); - fragShader = CompileShaderFile(GL_FRAGMENT_SHADER, fragProgFile); - assert(vertShader); - program = LinkShaders(vertShader, fragShader); - - glUseProgram(program); - - SetUniformValues(program, uniforms); - PrintUniforms(Uniforms); - - assert(ValidateShaderProgram(program)); - - VertCoord_attr = glGetAttribLocation(program, "VertCoord"); - if (VertCoord_attr > 0) { - /* We want the VertCoord attrib to have position zero so that - * the call to glVertexAttrib(0, xyz) triggers vertex processing. - * Otherwise, if TexCoord0 or TexCoord1 gets position 0 we'd have - * to set that attribute last (which is a PITA to manage). - */ - glBindAttribLocation(program, 0, "VertCoord"); - /* re-link */ - glLinkProgram(program); - /* VertCoord_attr should be zero now */ - VertCoord_attr = glGetAttribLocation(program, "VertCoord"); - assert(VertCoord_attr == 0); - } - - TexCoord0_attr = glGetAttribLocation(program, "TexCoord0"); - TexCoord1_attr = glGetAttribLocation(program, "TexCoord1"); - - printf("TexCoord0_attr = %d\n", TexCoord0_attr); - printf("TexCoord1_attr = %d\n", TexCoord1_attr); - printf("VertCoord_attr = %d\n", VertCoord_attr); - - return program; -} - - -static void -InitPrograms(void) -{ - Program = CreateProgram(VertFile, FragFile, Uniforms); -} - - -static void -InitGL(void) -{ - if (!ShadersSupported()) - exit(1); - - printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER)); - printf("Usage:\n"); - printf(" a - toggle arrays vs. immediate mode rendering\n"); - printf(" v - toggle VBO usage for array rendering\n"); - printf(" z/Z - change viewing distance\n"); - printf(" SPACE - toggle animation\n"); - printf(" Esc - exit\n"); - - InitTextures(); - InitPrograms(); - - SetupVertexBuffer(); - - glEnable(GL_DEPTH_TEST); - - glClearColor(.6, .6, .9, 0); - glColor3f(1.0, 1.0, 1.0); -} - - -int -main(int argc, char *argv[]) -{ - glutInit(&argc, argv); - glutInitWindowSize(500, 400); - glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE); - glutCreateWindow(Demo); - glewInit(); - glutReshapeFunc(Reshape); - glutKeyboardFunc(key); - glutSpecialFunc(specialkey); - glutDisplayFunc(draw); - if (Anim) - glutIdleFunc(idle); - InitGL(); - glutMainLoop(); - return 0; -} diff --git a/progs/glsl/multitex.frag b/progs/glsl/multitex.frag deleted file mode 100644 index a2633ceba75..00000000000 --- a/progs/glsl/multitex.frag +++ /dev/null @@ -1,15 +0,0 @@ -// Multi-texture fragment shader -// Brian Paul - -// Composite second texture over first. -// We're assuming the 2nd texture has a meaningful alpha channel. - -uniform sampler2D tex1; -uniform sampler2D tex2; - -void main() -{ - vec4 t1 = texture2D(tex1, gl_TexCoord[0].xy); - vec4 t2 = texture2D(tex2, gl_TexCoord[1].xy); - gl_FragColor = mix(t1, t2, t2.w); -} diff --git a/progs/glsl/multitex.shtest b/progs/glsl/multitex.shtest deleted file mode 100644 index 4b7c3fd4a5f..00000000000 --- a/progs/glsl/multitex.shtest +++ /dev/null @@ -1,6 +0,0 @@ -vs multitex.vert -fs multitex.frag -texture 0 2D ../images/tile.rgb -texture 1 2D ../images/tree2.rgba -uniform tex1 GL_SAMPLER_2D 0 -uniform tex2 GL_SAMPLER_2D 1 diff --git a/progs/glsl/multitex.vert b/progs/glsl/multitex.vert deleted file mode 100644 index 4fae3b73fb7..00000000000 --- a/progs/glsl/multitex.vert +++ /dev/null @@ -1,14 +0,0 @@ -// Multi-texture vertex shader -// Brian Paul - - -attribute vec4 TexCoord0, TexCoord1; -attribute vec4 VertCoord; - -void main() -{ - gl_TexCoord[0] = TexCoord0; - gl_TexCoord[1] = TexCoord1; - // note: may use gl_Vertex or VertCoord here for testing: - gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; -} diff --git a/progs/glsl/noise.c b/progs/glsl/noise.c deleted file mode 100644 index 1148580ff4d..00000000000 --- a/progs/glsl/noise.c +++ /dev/null @@ -1,216 +0,0 @@ -/** - * Test noise() functions. - * 28 Jan 2007 - */ - -#include <assert.h> -#include <string.h> -#include <stdio.h> -#include <stdlib.h> -#include <math.h> -#include <GL/glew.h> -#include <GL/glut.h> -#include "shaderutil.h" - - -static const char *VertShaderText = - "void main() {\n" - " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n" - " gl_TexCoord[0] = gl_MultiTexCoord0;\n" - "}\n"; - -static const char *FragShaderText = - "uniform vec4 Scale, Bias;\n" - "uniform float Slice;\n" - "void main()\n" - "{\n" - " vec4 scale = vec4(5.0);\n" - " vec4 p;\n" - " p.xy = gl_TexCoord[0].xy;\n" - " p.z = Slice;\n" - " p.w = 0.0;\n" - " vec4 n = noise4(p * scale);\n" - " gl_FragColor = n * Scale + Bias;\n" - "}\n"; - - -static struct uniform_info Uniforms[] = { - { "Scale", 1, GL_FLOAT_VEC4, { 0.5, 0.4, 0.0, 0}, -1 }, - { "Bias", 1, GL_FLOAT_VEC4, { 0.5, 0.3, 0.0, 0}, -1 }, - { "Slice", 1, GL_FLOAT, { 0.5, 0, 0, 0}, -1 }, - END_OF_UNIFORMS -}; - -/* program/shader objects */ -static GLuint fragShader; -static GLuint vertShader; -static GLuint program; - -static GLint win = 0; -static GLfloat xRot = 0.0f, yRot = 0.0f, zRot = 0.0f; -static GLfloat Slice = 0.0; -static GLboolean Anim = GL_FALSE; - - -static void -Idle(void) -{ - Slice += 0.01; - glutPostRedisplay(); -} - - -static void -Redisplay(void) -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - glUniform1fv(Uniforms[2].location, 1, &Slice); - - glPushMatrix(); - glRotatef(xRot, 1.0f, 0.0f, 0.0f); - glRotatef(yRot, 0.0f, 1.0f, 0.0f); - glRotatef(zRot, 0.0f, 0.0f, 1.0f); - - glBegin(GL_POLYGON); - glTexCoord2f(0, 0); glVertex2f(-2, -2); - glTexCoord2f(1, 0); glVertex2f( 2, -2); - glTexCoord2f(1, 1); glVertex2f( 2, 2); - glTexCoord2f(0, 1); glVertex2f(-2, 2); - glEnd(); - - glPopMatrix(); - - glutSwapBuffers(); -} - - -static void -Reshape(int width, int height) -{ - glViewport(0, 0, width, height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glTranslatef(0.0f, 0.0f, -15.0f); -} - - -static void -CleanUp(void) -{ - glDeleteShader(fragShader); - glDeleteShader(vertShader); - glDeleteProgram(program); - glutDestroyWindow(win); -} - - -static void -Key(unsigned char key, int x, int y) -{ - const GLfloat step = 0.01; - (void) x; - (void) y; - - switch(key) { - case 'a': - Anim = !Anim; - glutIdleFunc(Anim ? Idle : NULL); - break; - case 's': - Slice -= step; - break; - case 'S': - Slice += step; - break; - case 'z': - zRot -= 1.0; - break; - case 'Z': - zRot += 1.0; - break; - case 27: - CleanUp(); - exit(0); - break; - } - glutPostRedisplay(); -} - - -static void -SpecialKey(int key, int x, int y) -{ - const GLfloat step = 3.0f; - - (void) x; - (void) y; - - switch(key) { - case GLUT_KEY_UP: - xRot -= step; - break; - case GLUT_KEY_DOWN: - xRot += step; - break; - case GLUT_KEY_LEFT: - yRot -= step; - break; - case GLUT_KEY_RIGHT: - yRot += step; - break; - } - glutPostRedisplay(); -} - - - -static void -Init(void) -{ - if (!ShadersSupported()) - exit(1); - - vertShader = CompileShaderText(GL_VERTEX_SHADER, VertShaderText); - fragShader = CompileShaderText(GL_FRAGMENT_SHADER, FragShaderText); - program = LinkShaders(vertShader, fragShader); - - glUseProgram(program); - - SetUniformValues(program, Uniforms); - PrintUniforms(Uniforms); - - assert(glGetError() == 0); - - glClearColor(0.4f, 0.4f, 0.8f, 0.0f); - - printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER)); - - assert(glIsProgram(program)); - assert(glIsShader(fragShader)); - assert(glIsShader(vertShader)); - - glColor3f(1, 0, 0); -} - - -int -main(int argc, char *argv[]) -{ - glutInit(&argc, argv); - glutInitWindowSize(400, 400); - glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); - win = glutCreateWindow(argv[0]); - glewInit(); - glutReshapeFunc(Reshape); - glutKeyboardFunc(Key); - glutSpecialFunc(SpecialKey); - glutDisplayFunc(Redisplay); - Init(); - glutMainLoop(); - return 0; -} - diff --git a/progs/glsl/noise2.c b/progs/glsl/noise2.c deleted file mode 100644 index 7a28f09947c..00000000000 --- a/progs/glsl/noise2.c +++ /dev/null @@ -1,200 +0,0 @@ -/* - * GLSL noise demo. - * - * Michal Krol - * 20 February 2006 - * - * Based on the original demo by: - * Stefan Gustavson ([email protected]) 2004, 2005 - */ - -#ifdef WIN32 -#include <windows.h> -#endif - -#include <stdio.h> -#include <stdlib.h> -#include <GL/gl.h> -#include <GL/glut.h> -#include <GL/glext.h> - -#ifdef WIN32 -#define GETPROCADDRESS(F) wglGetProcAddress(F) -#else -#define GETPROCADDRESS(F) glutGetProcAddress(F) -#endif - -static GLhandleARB fragShader; -static GLhandleARB vertShader; -static GLhandleARB program; - -static GLint uTime; - -static GLint t0 = 0; -static GLint frames = 0; - -static GLfloat u_time = 0.0f; - -static PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB = NULL; -static PFNGLSHADERSOURCEARBPROC glShaderSourceARB = NULL; -static PFNGLCOMPILESHADERARBPROC glCompileShaderARB = NULL; -static PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB = NULL; -static PFNGLATTACHOBJECTARBPROC glAttachObjectARB = NULL; -static PFNGLLINKPROGRAMARBPROC glLinkProgramARB = NULL; -static PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB = NULL; -static PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB = NULL; -static PFNGLUNIFORM1FARBPROC glUniform1fARB = NULL; - -static void Redisplay (void) -{ - GLint t; - - glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - glUniform1fARB (uTime, 0.5f * u_time); - - glPushMatrix (); - glutSolidSphere (2.0, 20, 10); - glPopMatrix (); - - glutSwapBuffers(); - frames++; - - t = glutGet (GLUT_ELAPSED_TIME); - if (t - t0 >= 5000) { - GLfloat seconds = (GLfloat) (t - t0) / 1000.0f; - GLfloat fps = frames / seconds; - printf ("%d frames in %6.3f seconds = %6.3f FPS\n", frames, seconds, fps); - fflush(stdout); - t0 = t; - frames = 0; - } -} - -static void Idle (void) -{ - u_time += 0.1f; - glutPostRedisplay (); -} - -static void Reshape (int width, int height) -{ - glViewport (0, 0, width, height); - glMatrixMode (GL_PROJECTION); - glLoadIdentity (); - glFrustum (-1.0, 1.0, -1.0, 1.0, 5.0, 25.0); - glMatrixMode (GL_MODELVIEW); - glLoadIdentity (); - glTranslatef (0.0f, 0.0f, -15.0f); -} - -static void Key (unsigned char key, int x, int y) -{ - (void) x; - (void) y; - - switch (key) - { - case 27: - exit(0); - break; - } - glutPostRedisplay (); -} - -static void Init (void) -{ - static const char *fragShaderText = - "uniform float time;\n" - "varying vec3 position;\n" - "void main () {\n" - " gl_FragColor = vec4 (vec3 (0.5 + 0.5 * noise1 (vec4 (position, time))), 1.0);\n" - "}\n" - ; - static const char *vertShaderText = - "varying vec3 position;\n" - "void main () {\n" - " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n" - " position = 4.0 * gl_Vertex.xyz;\n" - "}\n" - ; - - if (!glutExtensionSupported ("GL_ARB_fragment_shader")) - { - printf ("Sorry, this demo requires GL_ARB_fragment_shader\n"); - exit(1); - } - if (!glutExtensionSupported ("GL_ARB_shader_objects")) - { - printf ("Sorry, this demo requires GL_ARB_shader_objects\n"); - exit(1); - } - if (!glutExtensionSupported ("GL_ARB_shading_language_100")) - { - printf ("Sorry, this demo requires GL_ARB_shading_language_100\n"); - exit(1); - } - if (!glutExtensionSupported ("GL_ARB_vertex_shader")) - { - printf ("Sorry, this demo requires GL_ARB_vertex_shader\n"); - exit(1); - } - - glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC) - GETPROCADDRESS("glCreateShaderObjectARB"); - glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC) - GETPROCADDRESS("glShaderSourceARB"); - glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC) - GETPROCADDRESS("glCompileShaderARB"); - glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC) - GETPROCADDRESS("glCreateProgramObjectARB"); - glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC) - GETPROCADDRESS("glAttachObjectARB"); - glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC) - GETPROCADDRESS ("glLinkProgramARB"); - glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC) - GETPROCADDRESS("glUseProgramObjectARB"); - - glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC) - GETPROCADDRESS("glGetUniformLocationARB"); - glUniform1fARB = (PFNGLUNIFORM1FARBPROC) - GETPROCADDRESS("glUniform1fARB"); - - fragShader = glCreateShaderObjectARB (GL_FRAGMENT_SHADER_ARB); - glShaderSourceARB (fragShader, 1, &fragShaderText, NULL); - glCompileShaderARB (fragShader); - - vertShader = glCreateShaderObjectARB (GL_VERTEX_SHADER_ARB); - glShaderSourceARB (vertShader, 1, &vertShaderText, NULL); - glCompileShaderARB (vertShader); - - program = glCreateProgramObjectARB (); - glAttachObjectARB (program, fragShader); - glAttachObjectARB (program, vertShader); - glLinkProgramARB (program); - glUseProgramObjectARB (program); - - uTime = glGetUniformLocationARB (program, "time"); - - glClearColor (0.0f, 0.1f, 0.3f, 1.0f); - glEnable (GL_CULL_FACE); - glEnable (GL_DEPTH_TEST); - - printf ("GL_RENDERER = %s\n", (const char *) glGetString (GL_RENDERER)); -} - -int main (int argc, char *argv[]) -{ - glutInit (&argc, argv); - glutInitWindowSize (200, 200); - glutInitDisplayMode (GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); - glutCreateWindow (argv[0]); - glutReshapeFunc (Reshape); - glutKeyboardFunc (Key); - glutDisplayFunc (Redisplay); - glutIdleFunc (Idle); - Init (); - glutMainLoop (); - return 0; -} - diff --git a/progs/glsl/pointcoord.c b/progs/glsl/pointcoord.c deleted file mode 100644 index 5dced6fac3a..00000000000 --- a/progs/glsl/pointcoord.c +++ /dev/null @@ -1,201 +0,0 @@ -/** - * Test GLSL 1.20 gl_PointCoord fragment program attribute. - * Brian Paul - * 11 Aug 2007 - */ - - -#include <assert.h> -#include <string.h> -#include <stdio.h> -#include <stdlib.h> -#include <math.h> -#include <GL/glew.h> -#include <GL/glut.h> -#include "shaderutil.h" - - -static GLint WinWidth = 300, WinHeight = 300; -static char *FragProgFile = NULL; -static char *VertProgFile = NULL; -static GLuint fragShader; -static GLuint vertShader; -static GLuint program; -static GLint win = 0; -static GLint tex0; -static GLenum Filter = GL_NEAREST; - - -static void -Redisplay(void) -{ - glClear(GL_COLOR_BUFFER_BIT); - - /* draw one point/sprite */ - glPushMatrix(); - glPointSize(60); - glBegin(GL_POINTS); - glVertex2f(WinWidth / 2.0f, WinHeight / 2.0f); - glEnd(); - glPopMatrix(); - - glutSwapBuffers(); -} - - -static void -Reshape(int width, int height) -{ - glViewport(0, 0, width, height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrtho(0, width, 0, height, -1, 1); - - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - - WinWidth = width; - WinHeight = height; -} - - -static void -CleanUp(void) -{ - glDeleteShader(fragShader); - glDeleteShader(vertShader); - glDeleteProgram(program); - glutDestroyWindow(win); -} - - -static void -Key(unsigned char key, int x, int y) -{ - (void) x; - (void) y; - - switch(key) { - case 27: - CleanUp(); - exit(0); - break; - } - glutPostRedisplay(); -} - - - -static void -MakeTexture(void) -{ -#define SZ 16 - GLubyte image[SZ][SZ][4]; - GLuint i, j; - - for (i = 0; i < SZ; i++) { - for (j = 0; j < SZ; j++) { - if ((i + j) & 1) { - image[i][j][0] = 0; - image[i][j][1] = 0; - image[i][j][2] = 0; - image[i][j][3] = 255; - } - else { - image[i][j][0] = j * 255 / (SZ-1); - image[i][j][1] = i * 255 / (SZ-1); - image[i][j][2] = 0; - image[i][j][3] = 255; - } - } - } - - glActiveTexture(GL_TEXTURE0); /* unit 0 */ - glBindTexture(GL_TEXTURE_2D, 42); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, SZ, SZ, 0, - GL_RGBA, GL_UNSIGNED_BYTE, image); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, Filter); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, Filter); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); -#undef SZ -} - - -static void -Init(void) -{ - static const char *fragShaderText = - "#version 120 \n" - "uniform sampler2D tex0; \n" - "void main() { \n" - " gl_FragColor = texture2D(tex0, gl_PointCoord.xy, 0.0); \n" - "}\n"; - static const char *vertShaderText = - "void main() {\n" - " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n" - "}\n"; - - if (!ShadersSupported()) - exit(1); - - vertShader = CompileShaderText(GL_VERTEX_SHADER, vertShaderText); - fragShader = CompileShaderText(GL_FRAGMENT_SHADER, fragShaderText); - program = LinkShaders(vertShader, fragShader); - - glUseProgram(program); - - tex0 = glGetUniformLocation(program, "tex0"); - printf("Uniforms: tex0: %d\n", tex0); - - glUniform1i(tex0, 0); /* tex unit 0 */ - - /*assert(glGetError() == 0);*/ - - glClearColor(0.3f, 0.3f, 0.3f, 0.0f); - - printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER)); - - assert(glIsProgram(program)); - assert(glIsShader(fragShader)); - assert(glIsShader(vertShader)); - - MakeTexture(); - - glEnable(GL_POINT_SPRITE); - - glColor3f(1, 0, 0); -} - - -static void -ParseOptions(int argc, char *argv[]) -{ - int i; - for (i = 1; i < argc; i++) { - if (strcmp(argv[i], "-fs") == 0) { - FragProgFile = argv[i+1]; - } - else if (strcmp(argv[i], "-vs") == 0) { - VertProgFile = argv[i+1]; - } - } -} - - -int -main(int argc, char *argv[]) -{ - glutInit(&argc, argv); - glutInitWindowSize(WinWidth, WinHeight); - glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); - win = glutCreateWindow(argv[0]); - glewInit(); - glutReshapeFunc(Reshape); - glutKeyboardFunc(Key); - glutDisplayFunc(Redisplay); - ParseOptions(argc, argv); - Init(); - glutMainLoop(); - return 0; -} diff --git a/progs/glsl/points.c b/progs/glsl/points.c deleted file mode 100644 index 98490f1819c..00000000000 --- a/progs/glsl/points.c +++ /dev/null @@ -1,257 +0,0 @@ -/** - * Implement smooth (AA) points with shaders. - * A simple variation could be used for sprite points. - * Brian Paul - * 29 July 2007 - */ - -#include <assert.h> -#include <string.h> -#include <stdio.h> -#include <stdlib.h> -#include <math.h> -#include <GL/glew.h> -#include <GL/glut.h> -#include "shaderutil.h" - - -static GLuint FragShader; -static GLuint VertShader; -static GLuint Program; - -static GLint Win = 0; -static GLint WinWidth = 500, WinHeight = 200; -static GLfloat Xpos = 0.0f, Ypos = 0.0f; -static GLint uViewportInv; -static GLboolean Smooth = GL_TRUE, Blend = GL_TRUE; - - -/** - * Issue vertices for a "shader point". - * The position is duplicated, only texcoords (or other vertex attrib) change. - * The vertex program will compute the "real" quad corners. - */ -static void -PointVertex3f(GLfloat x, GLfloat y, GLfloat z) -{ - glTexCoord2f(-1, -1); - glVertex3f(x, y, z); - - glTexCoord2f( 1, -1); - glVertex3f(x, y, z); - - glTexCoord2f( 1, 1); - glVertex3f(x, y, z); - - glTexCoord2f(-1, 1); - glVertex3f(x, y, z); -} - - -static void -DrawPoints(GLboolean shaderPoints) -{ - int i; - for (i = 0; i < 9; i++) { - GLfloat x = i - 4, y = 0, z = 0; - /* note: can't call glPointSize inside Begin/End :( */ - glPointSize( 2 + i * 5 ); - if (shaderPoints) { - glBegin(GL_QUADS); - PointVertex3f(x, y, z); - glEnd(); - } - else { - glBegin(GL_POINTS); - glVertex3f(x, y, z); - glEnd(); - } - } -} - - -/** - * Top row of points is rendered conventionally with GL_POINT_SMOOTH. - * Bottom row is rendered with special vertex/fragment shaders (see Init()). - */ -static void -Redisplay(void) -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - if (Smooth) - glEnable(GL_POINT_SMOOTH); - else - glDisable(GL_POINT_SMOOTH); - - if (Blend) - glEnable(GL_BLEND); - else - glDisable(GL_BLEND); - - glPushMatrix(); - glTranslatef(Xpos, Ypos, 0); - - /* - * regular points - */ - glPushMatrix(); - glTranslatef(0, 1.2, 0); - glUseProgram(0); - DrawPoints(GL_FALSE); - glPopMatrix(); - - /* - * shader points - */ - glPushMatrix(); - glTranslatef(0, -1.2, 0); - glUseProgram(Program); - if (uViewportInv != -1) { - glUniform2f(uViewportInv, 1.0 / WinWidth, 1.0 / WinHeight); - } - DrawPoints(GL_TRUE); - glPopMatrix(); - - glPopMatrix(); - - glutSwapBuffers(); -} - - -static void -Reshape(int width, int height) -{ - WinWidth = width; - WinHeight = height; - glViewport(0, 0, width, height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glFrustum(-1.0, 1.0, -1.0, 1.0, 4.0, 30.0); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glTranslatef(0.0f, 0.0f, -20.0f); -} - - -static void -Key(unsigned char key, int x, int y) -{ - (void) x; - (void) y; - - switch(key) { - case 'b': - Blend = !Blend; - break; - case 's': - Smooth = !Smooth; - break; - case 27: - glDeleteShader(FragShader); - glDeleteShader(VertShader); - glDeleteProgram(Program); - glutDestroyWindow(Win); - exit(0); - } - glutPostRedisplay(); -} - - -static void -SpecialKey(int key, int x, int y) -{ - const GLfloat step = 1/100.0; - switch(key) { - case GLUT_KEY_UP: - Ypos += step; - break; - case GLUT_KEY_DOWN: - Ypos -= step; - break; - case GLUT_KEY_LEFT: - Xpos -= step; - break; - case GLUT_KEY_RIGHT: - Xpos += step; - break; - } - glutPostRedisplay(); -} - - -static void -Init(void) -{ - /* Fragment shader: compute distance of fragment from center of point - * (we're using texcoords but another varying could be used). - * if dist > 1, discard (coverage==0) - * if dist < k, coverage = 1 - * else, coverage = func(dist) - * Note: length() uses sqrt() and may be expensive. The distance could - * be squared instead (with adjustments to the threshold (k) test) - */ - static const char *fragShaderText = - "void main() {\n" - " float cover; \n" - " float k = 2.0 / gl_Point.size; \n" - " float d = length(gl_TexCoord[0].xy); \n" - " if (d >= 1.0) \n" - " discard; \n" - " if (d < 1.0 - k) \n" - " cover = 1.0; \n" - " else \n" - " cover = (1.0 - d) * 0.5 * gl_Point.size; \n" - " gl_FragColor.rgb = gl_Color.rgb; \n" - " gl_FragColor.a = cover; \n" - "}\n"; - /* Vertex shader: compute new vertex position based on incoming vertex pos, - * texcoords, point size, and inverse viewport scale factor. - * Note: should compute point size attenuation here too. - */ - static const char *vertShaderText = - "uniform vec2 viewportInv; \n" - "void main() {\n" - " vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;\n" - " gl_Position.xy = pos.xy + gl_MultiTexCoord0.xy * viewportInv \n" - " * gl_Point.size * pos.w; \n" - " gl_Position.zw = pos.zw; \n" - " gl_TexCoord[0] = gl_MultiTexCoord0; \n" - " gl_FrontColor = gl_Color; \n" - "}\n"; - - if (!ShadersSupported()) - exit(1); - - VertShader = CompileShaderText(GL_VERTEX_SHADER, vertShaderText); - FragShader = CompileShaderText(GL_FRAGMENT_SHADER, fragShaderText); - Program = LinkShaders(VertShader, FragShader); - - glUseProgram(Program); - - uViewportInv = glGetUniformLocation(Program, "viewportInv"); - - glUseProgram(0); - - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); -} - - -int -main(int argc, char *argv[]) -{ - glutInit(&argc, argv); - glutInitWindowSize(WinWidth, WinHeight); - glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); - Win = glutCreateWindow(argv[0]); - glewInit(); - glutReshapeFunc(Reshape); - glutKeyboardFunc(Key); - glutSpecialFunc(SpecialKey); - glutDisplayFunc(Redisplay); - Init(); - glutMainLoop(); - return 0; -} - - diff --git a/progs/glsl/reflect.vert b/progs/glsl/reflect.vert deleted file mode 100644 index e1f22def339..00000000000 --- a/progs/glsl/reflect.vert +++ /dev/null @@ -1,20 +0,0 @@ -// Vertex shader for cube-texture reflection mapping -// Brian Paul - - -varying vec3 normal; - -void main() -{ - vec3 n = gl_NormalMatrix * gl_Normal; - vec3 u = normalize(vec3(gl_ModelViewMatrix * gl_Vertex)); - float two_n_dot_u = 2.0 * dot(n, u); - vec4 f; - f.xyz = u - n * two_n_dot_u; - f.w = 1.0; - - // outputs - normal = n; - gl_TexCoord[0] = gl_TextureMatrix[0] * f; - gl_Position = ftransform(); -} diff --git a/progs/glsl/samplers.c b/progs/glsl/samplers.c deleted file mode 100644 index 8f26a5e329d..00000000000 --- a/progs/glsl/samplers.c +++ /dev/null @@ -1,375 +0,0 @@ -/** - * Exercise all available GLSL texture samplers. - * - * Copyright (C) 2009 VMware, Inc. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is 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 Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN - * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -/** - * We generate a fragment shader which uses the maximum number of supported - * texture samplers. - * For each sampler we create a separate texture. Each texture has a - * single strip of color at a different intensity. The fragment shader - * samples all the textures at the same coordinate and sums the values. - * The result should be a quad with rows of colors of increasing intensity - * from bottom to top. - * - * Brian Paul - * 1 Jan 2009 - */ - -#include <assert.h> -#include <math.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <GL/glew.h> -#include "GL/glut.h" -#include "shaderutil.h" - - -#define MAX_SAMPLERS 128 - - -static const char *Demo = "samplers"; - -static GLuint Program; -static GLint NumSamplers; -static GLuint Textures[MAX_SAMPLERS]; -static GLfloat Xrot = 0.0, Yrot = .0, Zrot = 0.0; -static GLfloat EyeDist = 10; -static GLboolean Anim = GL_FALSE; - - -static void -DrawPolygon(GLfloat size) -{ - glPushMatrix(); - glNormal3f(0, 0, 1); - glBegin(GL_POLYGON); - - glMultiTexCoord2f(GL_TEXTURE0, 0, 0); - glVertex2f(-size, -size); - - glMultiTexCoord2f(GL_TEXTURE0, 1, 0); - glVertex2f( size, -size); - - glMultiTexCoord2f(GL_TEXTURE0, 1, 1); - glVertex2f( size, size); - - glMultiTexCoord2f(GL_TEXTURE0, 0, 1); - glVertex2f(-size, size); - - glEnd(); - glPopMatrix(); -} - - -static void -draw(void) -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - glPushMatrix(); - glTranslatef(0.0, 0.0, -EyeDist); - glRotatef(Zrot, 0, 0, 1); - glRotatef(Yrot, 0, 1, 0); - glRotatef(Xrot, 1, 0, 0); - - DrawPolygon(3.0); - - glPopMatrix(); - - glutSwapBuffers(); -} - - -static void -idle(void) -{ - GLfloat t = 0.05 * glutGet(GLUT_ELAPSED_TIME); - Yrot = t; - glutPostRedisplay(); -} - - -static void -key(unsigned char k, int x, int y) -{ - (void) x; - (void) y; - switch (k) { - case ' ': - case 'a': - Anim = !Anim; - if (Anim) - glutIdleFunc(idle); - else - glutIdleFunc(NULL); - break; - case 'z': - EyeDist -= 0.5; - if (EyeDist < 3.0) - EyeDist = 3.0; - break; - case 'Z': - EyeDist += 0.5; - if (EyeDist > 90.0) - EyeDist = 90; - break; - case 27: - exit(0); - } - glutPostRedisplay(); -} - - -static void -specialkey(int key, int x, int y) -{ - GLfloat step = 2.0; - (void) x; - (void) y; - switch (key) { - case GLUT_KEY_UP: - Xrot += step; - break; - case GLUT_KEY_DOWN: - Xrot -= step; - break; - case GLUT_KEY_LEFT: - Yrot -= step; - break; - case GLUT_KEY_RIGHT: - Yrot += step; - break; - } - glutPostRedisplay(); -} - - -/* new window size or exposure */ -static void -Reshape(int width, int height) -{ - GLfloat ar = (float) width / (float) height; - glViewport(0, 0, (GLint)width, (GLint)height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glFrustum(-2.0*ar, 2.0*ar, -2.0, 2.0, 4.0, 100.0); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); -} - - -static void -InitTextures(void) -{ - const GLint size = MAX_SAMPLERS; - GLubyte *texImage; - GLenum filter = GL_NEAREST; - GLint stripeSize; - GLint s; - - texImage = (GLubyte *) malloc(size * size * 4); - - glGenTextures(NumSamplers, Textures); - - /* size of texels stripe */ - stripeSize = size / NumSamplers; - - /* create a texture for each sampler */ - for (s = 0; s < NumSamplers; s++) { - GLint x, y, ypos; - GLubyte intensity = 31 + s * (256-32) / (NumSamplers - 1); - - printf("Texture %d: color = %d, %d, %d\n", s, - (int) intensity, 0, (int) intensity ); - - /* initialize the texture to black */ - memset(texImage, 0, size * size * 4); - - /* set a stripe of texels to the intensity value */ - ypos = s * stripeSize; - for (y = 0; y < stripeSize; y++) { - for (x = 0; x < size; x++) { - GLint k = 4 * ((ypos + y) * size + x); - if (x < size / 2) { - texImage[k + 0] = intensity; - texImage[k + 1] = intensity; - texImage[k + 2] = 0; - texImage[k + 3] = 255; - } - else { - texImage[k + 0] = 255 - intensity; - texImage[k + 1] = 0; - texImage[k + 2] = 0; - texImage[k + 3] = 255; - } - } - } - - glActiveTexture(GL_TEXTURE0 + s); - glBindTexture(GL_TEXTURE_2D, Textures[s]); - gluBuild2DMipmaps(GL_TEXTURE_2D, 4, size, size, - GL_RGBA, GL_UNSIGNED_BYTE, texImage); - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter); - } - - free(texImage); -} - - -/** - * Generate a fragment shader that uses the given number of samplers. - */ -static char * -GenFragmentShader(GLint numSamplers) -{ - const int maxLen = 10 * 1000; - char *prog = (char *) malloc(maxLen); - char *p = prog; - int s; - - p += sprintf(p, "// Generated fragment shader:\n"); -#ifndef SAMPLERS_ARRAY - for (s = 0; s < numSamplers; s++) { - p += sprintf(p, "uniform sampler2D tex%d;\n", s); - } -#else - p += sprintf(p, "uniform sampler2D tex[%d];\n", numSamplers); -#endif - p += sprintf(p, "void main()\n"); - p += sprintf(p, "{\n"); - p += sprintf(p, " vec4 color = vec4(0.0);\n"); - for (s = 0; s < numSamplers; s++) { -#ifndef SAMPLERS_ARRAY - p += sprintf(p, " color += texture2D(tex%d, gl_TexCoord[0].xy);\n", s); -#else - p += sprintf(p, " color += texture2D(tex[%d], gl_TexCoord[0].xy);\n", s); -#endif - } - p += sprintf(p, " gl_FragColor = color;\n"); - p += sprintf(p, "}\n"); - - assert(p - prog < maxLen); - return prog; -} - - -/** Create & bind shader program */ -static GLuint -CreateProgram(void) -{ - GLuint fragShader, vertShader, program; - const char *vertShaderText = - "void main() \n" - "{ \n" - " gl_TexCoord[0] = gl_MultiTexCoord0; \n" - " gl_Position = ftransform(); \n" - "} \n"; - char *fragShaderText = GenFragmentShader(NumSamplers); - - printf("%s", fragShaderText); - - vertShader = CompileShaderText(GL_VERTEX_SHADER, vertShaderText); - fragShader = CompileShaderText(GL_FRAGMENT_SHADER, fragShaderText); - assert(vertShader); - program = LinkShaders(vertShader, fragShader); - - glUseProgram(program); - - free(fragShaderText); - - return program; -} - - -static void -InitProgram(void) -{ - GLint s; - - Program = CreateProgram(); - - /* init sampler uniforms */ - for (s = 0; s < NumSamplers; s++) { - char uname[10]; - GLint loc; - -#ifndef SAMPLERS_ARRAY - sprintf(uname, "tex%d", s); -#else - sprintf(uname, "tex[%d]", s); -#endif - loc = glGetUniformLocation(Program, uname); - assert(loc >= 0); - - glUniform1i(loc, s); - } -} - - -static void -InitGL(void) -{ - if (!ShadersSupported()) { - printf("GLSL not supported!\n"); - exit(1); - } - - printf("GL_RENDERER = %s\n", (const char *) glGetString(GL_RENDERER)); - - glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &NumSamplers); - if (NumSamplers > MAX_SAMPLERS) - NumSamplers = MAX_SAMPLERS; - printf("Testing %d samplers\n", NumSamplers); - - InitTextures(); - InitProgram(); - - glClearColor(.6, .6, .9, 0); - glColor3f(1.0, 1.0, 1.0); - - printf("Each color corresponds to a separate sampler/texture.\n"); -} - - -int -main(int argc, char *argv[]) -{ - glutInit(&argc, argv); - glutInitWindowSize(500, 400); - glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE); - glutCreateWindow(Demo); - glewInit(); - glutReshapeFunc(Reshape); - glutKeyboardFunc(key); - glutSpecialFunc(specialkey); - glutDisplayFunc(draw); - if (Anim) - glutIdleFunc(idle); - InitGL(); - glutMainLoop(); - return 0; -} diff --git a/progs/glsl/shadow_sampler.c b/progs/glsl/shadow_sampler.c deleted file mode 100644 index 0adc9d88ba4..00000000000 --- a/progs/glsl/shadow_sampler.c +++ /dev/null @@ -1,337 +0,0 @@ -/** - * Test shadow2DRectProj() and shadow2D() functions. - * Brian Paul - * 11 April 2007 - */ - -#define GL_GLEXT_PROTOTYPES -#include <assert.h> -#include <string.h> -#include <stdio.h> -#include <stdlib.h> -#include <math.h> -#include <GL/glew.h> -#include <GL/glut.h> - - -/** Use GL_RECTANGLE texture (with projective texcoords)? */ -#define USE_RECT 01 - -#define TEXSIZE 16 - - -static char *FragProgFile = NULL; -static char *VertProgFile = NULL; - -static GLuint fragShader; -static GLuint vertShader; -static GLuint program; - -static GLint uTexture2D; -static GLint uTextureRect; - -static GLint win = 0; - -static GLenum Filter = GL_LINEAR; - -static void -CheckError(int line) -{ - GLenum err = glGetError(); - if (err) { - printf("GL Error %s (0x%x) at line %d\n", - gluErrorString(err), (int) err, line); - } -} - - -static void -PrintString(const char *s) -{ - while (*s) { - glutBitmapCharacter(GLUT_BITMAP_8_BY_13, (int) *s); - s++; - } -} - - -static void -Redisplay(void) -{ - CheckError(__LINE__); - glClear(GL_COLOR_BUFFER_BIT); - - glPushMatrix(); - - CheckError(__LINE__); - glUseProgram(program); - CheckError(__LINE__); - - glBegin(GL_POLYGON); -#if USE_RECT - /* scale coords by two to test projection */ - glTexCoord4f( 0, 0, 0, 2.0); glVertex2f(-1, -1); - glTexCoord4f(2*TEXSIZE, 0, 2*1, 2.0); glVertex2f( 1, -1); - glTexCoord4f(2*TEXSIZE, 2*TEXSIZE, 2*1, 2.0); glVertex2f( 1, 1); - glTexCoord4f( 0, 2*TEXSIZE, 0, 2.0); glVertex2f(-1, 1); -#else - glTexCoord3f(0, 0, 0); glVertex2f(-1, -1); - glTexCoord3f(1, 0, 1); glVertex2f( 1, -1); - glTexCoord3f(1, 1, 1); glVertex2f( 1, 1); - glTexCoord3f(0, 1, 0); glVertex2f(-1, 1); -#endif - glEnd(); - - glPopMatrix(); - - glUseProgram(0); - glWindowPos2iARB(80, 20); - PrintString("white black white black"); - - glutSwapBuffers(); -} - - -static void -Reshape(int width, int height) -{ - glViewport(0, 0, width, height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glTranslatef(0.0f, 0.0f, -8.0f); -} - - -static void -CleanUp(void) -{ - glDeleteShader(fragShader); - glDeleteShader(vertShader); - glDeleteProgram(program); - glutDestroyWindow(win); -} - - -static void -Key(unsigned char key, int x, int y) -{ - (void) x; - (void) y; - - switch(key) { - case 27: - CleanUp(); - exit(0); - break; - } - glutPostRedisplay(); -} - - -static void -MakeTexture(void) -{ - GLfloat image[TEXSIZE][TEXSIZE]; - GLuint i, j; - - for (i = 0; i < TEXSIZE; i++) { - for (j = 0; j < TEXSIZE; j++) { - if (j < (TEXSIZE / 2)) { - image[i][j] = 0.25; - } - else { - image[i][j] = 0.75; - } - } - } - - glActiveTexture(GL_TEXTURE0); /* unit 0 */ - glBindTexture(GL_TEXTURE_2D, 42); - glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, TEXSIZE, TEXSIZE, 0, - GL_DEPTH_COMPONENT, GL_FLOAT, image); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, Filter); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, Filter); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, - GL_COMPARE_R_TO_TEXTURE_ARB); - CheckError(__LINE__); - - glActiveTexture(GL_TEXTURE1); /* unit 1 */ - glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 43); - glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_DEPTH_COMPONENT, - TEXSIZE, 10, 0,/*16x10*/ - GL_DEPTH_COMPONENT, GL_FLOAT, image); - glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, Filter); - glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, Filter); - glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_COMPARE_MODE_ARB, - GL_COMPARE_R_TO_TEXTURE_ARB); - CheckError(__LINE__); -} - - -static void -LoadAndCompileShader(GLuint shader, const char *text) -{ - GLint stat; - glShaderSource(shader, 1, (const GLchar **) &text, NULL); - glCompileShader(shader); - glGetShaderiv(shader, GL_COMPILE_STATUS, &stat); - if (!stat) { - GLchar log[1000]; - GLsizei len; - glGetShaderInfoLog(shader, 1000, &len, log); - fprintf(stderr, "fslight: problem compiling shader:\n%s\n", log); - exit(1); - } -} - - -/** - * Read a shader from a file. - */ -static void -ReadShader(GLuint shader, const char *filename) -{ - const int max = 100*1000; - int n; - char *buffer = (char*) malloc(max); - FILE *f = fopen(filename, "r"); - if (!f) { - fprintf(stderr, "fslight: Unable to open shader file %s\n", filename); - exit(1); - } - - n = fread(buffer, 1, max, f); - printf("fslight: read %d bytes from shader file %s\n", n, filename); - if (n > 0) { - buffer[n] = 0; - LoadAndCompileShader(shader, buffer); - } - - fclose(f); - free(buffer); -} - - -static void -CheckLink(GLuint prog) -{ - GLint stat; - glGetProgramiv(prog, GL_LINK_STATUS, &stat); - if (!stat) { - GLchar log[1000]; - GLsizei len; - glGetProgramInfoLog(prog, 1000, &len, log); - fprintf(stderr, "Linker error:\n%s\n", log); - } -} - - -static void -Init(void) -{ - static const char *fragShaderText = - "uniform sampler2DShadow shadowTex2D; \n" - "uniform sampler2DRectShadow shadowTexRect; \n" - "void main() {\n" -#if USE_RECT - " gl_FragColor = shadow2DRectProj(shadowTexRect, gl_TexCoord[0]); \n" -#else - " gl_FragColor = shadow2D(shadowTex2D, gl_TexCoord[0].xyz); \n" -#endif - "}\n"; - static const char *vertShaderText = - "void main() {\n" - " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n" - " gl_TexCoord[0] = gl_MultiTexCoord0; \n" - "}\n"; - const char *version; - -#if USE_RECT - if (!glutExtensionSupported("GL_ARB_texture_rectangle")) { - printf("This program requires GL_ARB_texture_rectangle\n"); - exit(1); - } -#endif - - version = (const char *) glGetString(GL_VERSION); - if (version[0] != '2' || version[1] != '.') { - printf("This program requires OpenGL 2.x, found %s\n", version); - exit(1); - } - printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER)); - - fragShader = glCreateShader(GL_FRAGMENT_SHADER); - if (FragProgFile) - ReadShader(fragShader, FragProgFile); - else - LoadAndCompileShader(fragShader, fragShaderText); - - vertShader = glCreateShader(GL_VERTEX_SHADER); - if (VertProgFile) - ReadShader(vertShader, VertProgFile); - else - LoadAndCompileShader(vertShader, vertShaderText); - - program = glCreateProgram(); - glAttachShader(program, fragShader); - glAttachShader(program, vertShader); - glLinkProgram(program); - CheckLink(program); - glUseProgram(program); - - uTexture2D = glGetUniformLocation(program, "shadowTex2D"); - uTextureRect = glGetUniformLocation(program, "shadowTexRect"); - printf("uTexture2D %d uTextureRect %d\n", uTexture2D, uTextureRect); - if (uTexture2D >= 0) { - glUniform1i(uTexture2D, 0); /* use texture unit 0 */ - } - if (uTextureRect >= 0) { - glUniform1i(uTextureRect, 1); /* use texture unit 0 */ - } - CheckError(__LINE__); - - glClearColor(0.3f, 0.3f, 0.3f, 0.0f); - glColor3f(1, 1, 1); - - MakeTexture(); - CheckError(__LINE__); -} - - -static void -ParseOptions(int argc, char *argv[]) -{ - int i; - for (i = 1; i < argc; i++) { - if (strcmp(argv[i], "-fs") == 0) { - FragProgFile = argv[i+1]; - } - else if (strcmp(argv[i], "-vs") == 0) { - VertProgFile = argv[i+1]; - } - } -} - - -int -main(int argc, char *argv[]) -{ - glutInit(&argc, argv); - glutInitWindowSize(400, 300); - glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); - win = glutCreateWindow(argv[0]); - glewInit(); - glutReshapeFunc(Reshape); - glutKeyboardFunc(Key); - glutDisplayFunc(Redisplay); - ParseOptions(argc, argv); - Init(); - glutMainLoop(); - return 0; -} - - diff --git a/progs/glsl/shadowtex.frag b/progs/glsl/shadowtex.frag deleted file mode 100644 index a6a80da47f2..00000000000 --- a/progs/glsl/shadowtex.frag +++ /dev/null @@ -1,21 +0,0 @@ -// Fragment shader for 2D texture with shadow attenuation -// Brian Paul - - -uniform sampler2D tex2d; -uniform vec3 lightPos; - -void main() -{ - // XXX should compute this from lightPos - vec2 shadowCenter = vec2(-0.25, -0.25); - - // d = distance from center - float d = distance(gl_TexCoord[0].xy, shadowCenter); - - // attenuate and clamp - d = clamp(d * d * d, 0.0, 2.0); - - // modulate texture by d for shadow effect - gl_FragColor = d * texture2D(tex2d, gl_TexCoord[0].xy, 0.0); -} diff --git a/progs/glsl/shtest.c b/progs/glsl/shtest.c deleted file mode 100644 index 520eccfb6d8..00000000000 --- a/progs/glsl/shtest.c +++ /dev/null @@ -1,711 +0,0 @@ -/* - * Simple shader test harness. - * Brian Paul - * 13 Aug 2009 - * - * Usage: - * shtest --vs vertShaderFile --fs fragShaderFile - * - * In this case the given vertex/frag shaders are read and compiled. - * Random values are assigned to the uniforms. - * - * or: - * shtest configFile - * - * In this case a config file is read that specifies the file names - * of the shaders plus initial values for uniforms. - * - * Example config file: - * - * vs shader.vert - * fs shader.frag - * uniform pi 3.14159 - * uniform v1 1.0 0.5 0.2 0.3 - * texture 0 2D texture0.rgb - * texture 1 CUBE texture1.rgb - * texture 2 RECT texture2.rgb - * - */ - - -#include <assert.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <math.h> -#include <GL/glew.h> -#include <GL/glu.h> -#include <GL/glut.h> -#include "shaderutil.h" -#include "readtex.h" - - -typedef enum -{ - SPHERE, - CUBE, - NUM_SHAPES -} shape; - - -static char *FragShaderFile = NULL; -static char *VertShaderFile = NULL; -static char *ConfigFile = NULL; - -/* program/shader objects */ -static GLuint fragShader; -static GLuint vertShader; -static GLuint Program; - - -#define MAX_UNIFORMS 100 -static struct uniform_info Uniforms[MAX_UNIFORMS]; -static GLuint NumUniforms = 0; - - -#define MAX_ATTRIBS 100 -static struct attrib_info Attribs[MAX_ATTRIBS]; -static GLuint NumAttribs = 0; - - -/** - * Config file info. - */ -struct config_file -{ - struct name_value - { - char name[100]; - float value[4]; - int type; - } uniforms[100]; - - int num_uniforms; -}; - - -static GLint win = 0; -static GLboolean Anim = GL_FALSE; -static GLfloat TexRot = 0.0; -static GLfloat xRot = 0.0f, yRot = 0.0f, zRot = 0.0f; -static shape Object = SPHERE; - - -static float -RandomFloat(float min, float max) -{ - int k = rand() % 10000; - float x = min + (max - min) * k / 10000.0; - return x; -} - - -/** Set new random values for uniforms */ -static void -RandomUniformValues(void) -{ - GLuint i; - for (i = 0; i < NumUniforms; i++) { - switch (Uniforms[i].type) { - case GL_FLOAT: - Uniforms[i].value[0] = RandomFloat(0.0, 1.0); - break; - case GL_SAMPLER_1D: - case GL_SAMPLER_2D: - case GL_SAMPLER_3D: - case GL_SAMPLER_CUBE: - case GL_SAMPLER_2D_RECT_ARB: - /* don't change sampler values - random values are bad */ - break; - default: - Uniforms[i].value[0] = RandomFloat(-1.0, 2.0); - Uniforms[i].value[1] = RandomFloat(-1.0, 2.0); - Uniforms[i].value[2] = RandomFloat(-1.0, 2.0); - Uniforms[i].value[3] = RandomFloat(-1.0, 2.0); - } - } -} - - -static void -Idle(void) -{ - yRot += 2.0; - if (yRot > 360.0) - yRot -= 360.0; - glutPostRedisplay(); -} - - - -static void -SquareVertex(GLfloat s, GLfloat t, GLfloat size) -{ - GLfloat x = -size + s * 2.0 * size; - GLfloat y = -size + t * 2.0 * size; - GLuint i; - - glMultiTexCoord2f(GL_TEXTURE0, s, t); - glMultiTexCoord2f(GL_TEXTURE1, s, t); - glMultiTexCoord2f(GL_TEXTURE2, s, t); - glMultiTexCoord2f(GL_TEXTURE3, s, t); - - /* assign (s,t) to the generic attributes */ - for (i = 0; i < NumAttribs; i++) { - if (Attribs[i].location >= 0) { - glVertexAttrib2f(Attribs[i].location, s, t); - } - } - - glVertex2f(x, y); -} - - -/* - * Draw a square, specifying normal and tangent vectors. - */ -static void -Square(GLfloat size) -{ - GLint tangentAttrib = 1; - glNormal3f(0, 0, 1); - glVertexAttrib3f(tangentAttrib, 1, 0, 0); - glBegin(GL_POLYGON); -#if 1 - SquareVertex(0, 0, size); - SquareVertex(1, 0, size); - SquareVertex(1, 1, size); - SquareVertex(0, 1, size); -#else - glTexCoord2f(0, 0); glVertex2f(-size, -size); - glTexCoord2f(1, 0); glVertex2f( size, -size); - glTexCoord2f(1, 1); glVertex2f( size, size); - glTexCoord2f(0, 1); glVertex2f(-size, size); -#endif - glEnd(); -} - - -static void -Cube(GLfloat size) -{ - /* +X */ - glPushMatrix(); - glRotatef(90, 0, 1, 0); - glTranslatef(0, 0, size); - Square(size); - glPopMatrix(); - - /* -X */ - glPushMatrix(); - glRotatef(-90, 0, 1, 0); - glTranslatef(0, 0, size); - Square(size); - glPopMatrix(); - - /* +Y */ - glPushMatrix(); - glRotatef(90, 1, 0, 0); - glTranslatef(0, 0, size); - Square(size); - glPopMatrix(); - - /* -Y */ - glPushMatrix(); - glRotatef(-90, 1, 0, 0); - glTranslatef(0, 0, size); - Square(size); - glPopMatrix(); - - - /* +Z */ - glPushMatrix(); - glTranslatef(0, 0, size); - Square(size); - glPopMatrix(); - - /* -Z */ - glPushMatrix(); - glRotatef(180, 0, 1, 0); - glTranslatef(0, 0, size); - Square(size); - glPopMatrix(); -} - - -static void -Sphere(GLfloat radius, GLint slices, GLint stacks) -{ - static GLUquadricObj *q = NULL; - - if (!q) { - q = gluNewQuadric(); - gluQuadricDrawStyle(q, GLU_FILL); - gluQuadricNormals(q, GLU_SMOOTH); - gluQuadricTexture(q, GL_TRUE); - } - - gluSphere(q, radius, slices, stacks); -} - - -static void -Redisplay(void) -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - glPushMatrix(); - glRotatef(xRot, 1.0f, 0.0f, 0.0f); - glRotatef(yRot, 0.0f, 1.0f, 0.0f); - glRotatef(zRot, 0.0f, 0.0f, 1.0f); - - glMatrixMode(GL_TEXTURE); - glLoadIdentity(); - glRotatef(TexRot, 0.0f, 1.0f, 0.0f); - glMatrixMode(GL_MODELVIEW); - - if (Object == SPHERE) { - Sphere(2.5, 20, 10); - } - else if (Object == CUBE) { - Cube(2.0); - } - - glPopMatrix(); - - glutSwapBuffers(); -} - - -static void -Reshape(int width, int height) -{ - glViewport(0, 0, width, height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glTranslatef(0.0f, 0.0f, -15.0f); -} - - -static void -CleanUp(void) -{ - glDeleteShader(fragShader); - glDeleteShader(vertShader); - glDeleteProgram(Program); - glutDestroyWindow(win); -} - - -static void -Key(unsigned char key, int x, int y) -{ - const GLfloat step = 2.0; - (void) x; - (void) y; - - switch(key) { - case 'a': - Anim = !Anim; - if (Anim) - glutIdleFunc(Idle); - else - glutIdleFunc(NULL); - break; - case 'z': - zRot += step; - break; - case 'Z': - zRot -= step; - break; - case 'o': - Object = (Object + 1) % NUM_SHAPES; - break; - case 'r': - RandomUniformValues(); - SetUniformValues(Program, Uniforms); - PrintUniforms(Uniforms); - break; - case 27: - CleanUp(); - exit(0); - break; - } - glutPostRedisplay(); -} - - -static void -SpecialKey(int key, int x, int y) -{ - const GLfloat step = 2.0; - - (void) x; - (void) y; - - switch(key) { - case GLUT_KEY_UP: - xRot += step; - break; - case GLUT_KEY_DOWN: - xRot -= step; - break; - case GLUT_KEY_LEFT: - yRot -= step; - break; - case GLUT_KEY_RIGHT: - yRot += step; - break; - } - glutPostRedisplay(); -} - - -static void -InitUniforms(const struct config_file *conf, - struct uniform_info uniforms[]) -{ - int i; - - for (i = 0; i < conf->num_uniforms; i++) { - int j; - for (j = 0; uniforms[j].name; j++) { - if (strcmp(uniforms[j].name, conf->uniforms[i].name) == 0) { - uniforms[j].type = conf->uniforms[i].type; - uniforms[j].value[0] = conf->uniforms[i].value[0]; - uniforms[j].value[1] = conf->uniforms[i].value[1]; - uniforms[j].value[2] = conf->uniforms[i].value[2]; - uniforms[j].value[3] = conf->uniforms[i].value[3]; - } - } - } -} - - -static void -LoadTexture(GLint unit, GLenum target, const char *texFileName) -{ - GLint imgWidth, imgHeight; - GLenum imgFormat; - GLubyte *image = NULL; - GLuint tex; - GLenum filter = GL_LINEAR; - GLenum objTarget; - - image = LoadRGBImage(texFileName, &imgWidth, &imgHeight, &imgFormat); - if (!image) { - printf("Couldn't read %s\n", texFileName); - exit(1); - } - - printf("Load Texture: unit %d, target 0x%x: %s %d x %d\n", - unit, target, texFileName, imgWidth, imgHeight); - - if (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X && - target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z) { - objTarget = GL_TEXTURE_CUBE_MAP; - } - else { - objTarget = target; - } - - glActiveTexture(GL_TEXTURE0 + unit); - glGenTextures(1, &tex); - glBindTexture(objTarget, tex); - - if (target == GL_TEXTURE_3D) { - /* depth=1 */ - gluBuild3DMipmaps(target, 4, imgWidth, imgHeight, 1, - imgFormat, GL_UNSIGNED_BYTE, image); - } - else if (target == GL_TEXTURE_1D) { - gluBuild1DMipmaps(target, 4, imgWidth, - imgFormat, GL_UNSIGNED_BYTE, image); - } - else { - gluBuild2DMipmaps(target, 4, imgWidth, imgHeight, - imgFormat, GL_UNSIGNED_BYTE, image); - } - - free(image); - - glTexParameteri(objTarget, GL_TEXTURE_WRAP_S, GL_REPEAT); - glTexParameteri(objTarget, GL_TEXTURE_WRAP_T, GL_REPEAT); - glTexParameteri(objTarget, GL_TEXTURE_MIN_FILTER, filter); - glTexParameteri(objTarget, GL_TEXTURE_MAG_FILTER, filter); -} - - -static GLenum -TypeFromName(const char *n) -{ - static const struct { - const char *name; - GLenum type; - } types[] = { - { "GL_FLOAT", GL_FLOAT }, - { "GL_FLOAT_VEC2", GL_FLOAT_VEC2 }, - { "GL_FLOAT_VEC3", GL_FLOAT_VEC3 }, - { "GL_FLOAT_VEC4", GL_FLOAT_VEC4 }, - { "GL_INT", GL_INT }, - { "GL_INT_VEC2", GL_INT_VEC2 }, - { "GL_INT_VEC3", GL_INT_VEC3 }, - { "GL_INT_VEC4", GL_INT_VEC4 }, - { "GL_SAMPLER_1D", GL_SAMPLER_1D }, - { "GL_SAMPLER_2D", GL_SAMPLER_2D }, - { "GL_SAMPLER_3D", GL_SAMPLER_3D }, - { "GL_SAMPLER_CUBE", GL_SAMPLER_CUBE }, - { "GL_SAMPLER_2D_RECT", GL_SAMPLER_2D_RECT_ARB }, - { NULL, 0 } - }; - GLuint i; - - for (i = 0; types[i].name; i++) { - if (strcmp(types[i].name, n) == 0) - return types[i].type; - } - abort(); - return GL_NONE; -} - - - -/** - * Read a config file. - */ -static void -ReadConfigFile(const char *filename, struct config_file *conf) -{ - char line[1000]; - FILE *f; - - f = fopen(filename, "r"); - if (!f) { - fprintf(stderr, "Unable to open config file %s\n", filename); - exit(1); - } - - conf->num_uniforms = 0; - - /* ugly but functional parser */ - while (fgets(line, sizeof(line), f) != NULL) { - if (line[0]) { - if (strncmp(line, "vs ", 3) == 0) { - VertShaderFile = strdup(line + 3); - VertShaderFile[strlen(VertShaderFile) - 1] = 0; - } - else if (strncmp(line, "fs ", 3) == 0) { - FragShaderFile = strdup(line + 3); - FragShaderFile[strlen(FragShaderFile) - 1] = 0; - } - else if (strncmp(line, "texture ", 8) == 0) { - char target[100], texFileName[100]; - int unit, k; - k = sscanf(line + 8, "%d %s %s", &unit, target, texFileName); - assert(k == 3 || k == 8); - if (strcmp(target, "CUBE") == 0) { - char texFileNames[6][100]; - k = sscanf(line + 8, "%d %s %s %s %s %s %s %s", - &unit, target, - texFileNames[0], - texFileNames[1], - texFileNames[2], - texFileNames[3], - texFileNames[4], - texFileNames[5]); - LoadTexture(unit, GL_TEXTURE_CUBE_MAP_POSITIVE_X, texFileNames[0]); - LoadTexture(unit, GL_TEXTURE_CUBE_MAP_NEGATIVE_X, texFileNames[1]); - LoadTexture(unit, GL_TEXTURE_CUBE_MAP_POSITIVE_Y, texFileNames[2]); - LoadTexture(unit, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, texFileNames[3]); - LoadTexture(unit, GL_TEXTURE_CUBE_MAP_POSITIVE_Z, texFileNames[4]); - LoadTexture(unit, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, texFileNames[5]); - } - else if (!strcmp(target, "2D")) { - LoadTexture(unit, GL_TEXTURE_2D, texFileName); - } - else if (!strcmp(target, "3D")) { - LoadTexture(unit, GL_TEXTURE_3D, texFileName); - } - else if (!strcmp(target, "RECT")) { - LoadTexture(unit, GL_TEXTURE_RECTANGLE_ARB, texFileName); - } - else { - printf("Bad texture target: %s\n", target); - exit(1); - } - } - else if (strncmp(line, "uniform ", 8) == 0) { - char name[1000], typeName[100]; - int k; - float v1 = 0.0F, v2 = 0.0F, v3 = 0.0F, v4 = 0.0F; - GLenum type; - - k = sscanf(line + 8, "%s %s %f %f %f %f", name, typeName, - &v1, &v2, &v3, &v4); - - type = TypeFromName(typeName); - - if (strlen(name) + 1 > sizeof(conf->uniforms[conf->num_uniforms].name)) { - fprintf(stderr, "string overflow\n"); - exit(1); - } - strcpy(conf->uniforms[conf->num_uniforms].name, name); - conf->uniforms[conf->num_uniforms].value[0] = v1; - conf->uniforms[conf->num_uniforms].value[1] = v2; - conf->uniforms[conf->num_uniforms].value[2] = v3; - conf->uniforms[conf->num_uniforms].value[3] = v4; - conf->uniforms[conf->num_uniforms].type = type; - conf->num_uniforms++; - } - else { - if (strlen(line) > 1) { - fprintf(stderr, "syntax error in: %s\n", line); - break; - } - } - } - } - - fclose(f); -} - - -static void -Init(void) -{ - GLdouble vertTime, fragTime, linkTime; - struct config_file config; - - memset(&config, 0, sizeof(config)); - - if (ConfigFile) - ReadConfigFile(ConfigFile, &config); - - if (!VertShaderFile) { - fprintf(stderr, "Error: no vertex shader\n"); - exit(1); - } - - if (!FragShaderFile) { - fprintf(stderr, "Error: no fragment shader\n"); - exit(1); - } - - if (!ShadersSupported()) - exit(1); - - vertShader = CompileShaderFile(GL_VERTEX_SHADER, VertShaderFile); - vertTime = GetShaderCompileTime(); - fragShader = CompileShaderFile(GL_FRAGMENT_SHADER, FragShaderFile); - fragTime = GetShaderCompileTime(); - - Program = LinkShaders(vertShader, fragShader); - linkTime = GetShaderLinkTime(); - - printf("Read vert shader %s\n", VertShaderFile); - printf("Read frag shader %s\n", FragShaderFile); - - printf("Time to compile vertex shader: %fs\n", vertTime); - printf("Time to compile fragment shader: %fs\n", fragTime); - printf("Time to link shaders: %fs\n", linkTime); - - assert(ValidateShaderProgram(Program)); - - glUseProgram(Program); - - NumUniforms = GetUniforms(Program, Uniforms); - if (config.num_uniforms) { - InitUniforms(&config, Uniforms); - } - else { - RandomUniformValues(); - } - SetUniformValues(Program, Uniforms); - PrintUniforms(Uniforms); - - NumAttribs = GetAttribs(Program, Attribs); - PrintAttribs(Attribs); - - /* assert(glGetError() == 0); */ - - glClearColor(0.4f, 0.4f, 0.8f, 0.0f); - - glEnable(GL_DEPTH_TEST); - - glColor3f(1, 0, 0); -} - - -static void -Keys(void) -{ - printf("Keyboard:\n"); - printf(" a Animation toggle\n"); - printf(" r Randomize uniform values\n"); - printf(" o Change object\n"); - printf(" arrows Rotate object\n"); - printf(" ESC Exit\n"); -} - - -static void -Usage(void) -{ - printf("Usage:\n"); - printf(" shtest config.shtest\n"); - printf(" Run w/ given config file.\n"); - printf(" shtest --vs vertShader --fs fragShader\n"); - printf(" Load/compile given shaders.\n"); -} - - -static void -ParseOptions(int argc, char *argv[]) -{ - int i; - - if (argc == 1) { - Usage(); - exit(1); - } - - for (i = 1; i < argc; i++) { - if (strcmp(argv[i], "--fs") == 0) { - FragShaderFile = argv[i+1]; - i++; - } - else if (strcmp(argv[i], "--vs") == 0) { - VertShaderFile = argv[i+1]; - i++; - } - else { - /* assume the arg is a config file */ - ConfigFile = argv[i]; - break; - } - } -} - - -int -main(int argc, char *argv[]) -{ - glutInitWindowSize(400, 400); - glutInit(&argc, argv); - glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); - win = glutCreateWindow(argv[0]); - glewInit(); - glutReshapeFunc(Reshape); - glutKeyboardFunc(Key); - glutSpecialFunc(SpecialKey); - glutDisplayFunc(Redisplay); - ParseOptions(argc, argv); - Init(); - Keys(); - glutMainLoop(); - return 0; -} - diff --git a/progs/glsl/simple.vert b/progs/glsl/simple.vert deleted file mode 100644 index a0abe0dc0b2..00000000000 --- a/progs/glsl/simple.vert +++ /dev/null @@ -1,9 +0,0 @@ -// Simple vertex shader -// Brian Paul - - -void main() -{ - gl_TexCoord[0] = gl_MultiTexCoord0; - gl_Position = ftransform(); -} diff --git a/progs/glsl/skinning.c b/progs/glsl/skinning.c deleted file mode 100644 index 2b96f31d060..00000000000 --- a/progs/glsl/skinning.c +++ /dev/null @@ -1,280 +0,0 @@ -/** - * Vertex "skinning" example. - * The idea is there are multiple modeling matrices applied to every - * vertex. Weighting values in [0,1] control the influence of each - * matrix on each vertex. - * - * 4 Nov 2008 - */ - -#include <assert.h> -#include <string.h> -#include <stdio.h> -#include <stdlib.h> -#include <math.h> -#include <GL/glew.h> -#include <GL/glut.h> -#include "shaderutil.h" - -#ifndef M_PI -#define M_PI 3.1415926535 -#endif - -static char *FragProgFile = "skinning.frag"; -static char *VertProgFile = "skinning.vert"; - -/* program/shader objects */ -static GLuint fragShader; -static GLuint vertShader; -static GLuint program; - - -static GLint win = 0; -static GLboolean Anim = GL_TRUE; -static GLboolean WireFrame = GL_TRUE; -static GLfloat xRot = 0.0f, yRot = 90.0f, zRot = 0.0f; - -#define NUM_MATS 2 - -static GLfloat Matrices[NUM_MATS][16]; -static GLint uMat0, uMat1; -static GLint WeightAttr; - - -static void -Idle(void) -{ - yRot = 90 + glutGet(GLUT_ELAPSED_TIME) * 0.005; - glutPostRedisplay(); -} - - -static void -Cylinder(GLfloat length, GLfloat radius, GLint slices, GLint stacks) -{ - float dw = 1.0 / (stacks - 1); - float dz = length / stacks; - int i, j; - - for (j = 0; j < stacks; j++) { - float w0 = j * dw; - float z0 = j * dz; - - glBegin(GL_TRIANGLE_STRIP); - for (i = 0; i < slices; i++) { - float a = (float) i / (slices - 1) * M_PI * 2.0; - float x = radius * cos(a); - float y = radius * sin(a); - glVertexAttrib1f(WeightAttr, w0); - glNormal3f(x, y, 0.0); - glVertex3f(x, y, z0); - - glVertexAttrib1f(WeightAttr, w0 + dw); - glNormal3f(x, y, 0.0); - glVertex3f(x, y, z0 + dz); - } - glEnd(); - } -} - - -/** - * Update/animate the two matrices. One rotates, the other scales. - */ -static void -UpdateMatrices(void) -{ - GLfloat t = glutGet(GLUT_ELAPSED_TIME) * 0.0025; - GLfloat scale = 0.5 * (1.1 + sin(0.5 * t)); - GLfloat rot = cos(t) * 90.0; - - glPushMatrix(); - glLoadIdentity(); - glScalef(1.0, scale, 1.0); - glGetFloatv(GL_MODELVIEW_MATRIX, Matrices[0]); - glPopMatrix(); - - glPushMatrix(); - glLoadIdentity(); - glRotatef(rot, 0, 0, 1); - glGetFloatv(GL_MODELVIEW_MATRIX, Matrices[1]); - glPopMatrix(); -} - - -static void -Redisplay(void) -{ - UpdateMatrices(); - - glUniformMatrix4fv(uMat0, 1, GL_FALSE, Matrices[0]); - glUniformMatrix4fv(uMat1, 1, GL_FALSE, Matrices[1]); - - if (WireFrame) - glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); - else - glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - glPushMatrix(); - glRotatef(xRot, 1.0f, 0.0f, 0.0f); - glRotatef(yRot, 0.0f, 1.0f, 0.0f); - glRotatef(zRot, 0.0f, 0.0f, 1.0f); - - glPushMatrix(); - glTranslatef(0, 0, -2.5); - Cylinder(5.0, 1.0, 10, 20); - glPopMatrix(); - - glPopMatrix(); - - glutSwapBuffers(); -} - - -static void -Reshape(int width, int height) -{ - glViewport(0, 0, width, height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glTranslatef(0.0f, 0.0f, -15.0f); -} - - -static void -CleanUp(void) -{ - glDeleteShader(fragShader); - glDeleteShader(vertShader); - glDeleteProgram(program); - glutDestroyWindow(win); -} - - -static void -Key(unsigned char key, int x, int y) -{ - const GLfloat step = 2.0; - (void) x; - (void) y; - - switch(key) { - case 'a': - Anim = !Anim; - if (Anim) - glutIdleFunc(Idle); - else - glutIdleFunc(NULL); - break; - case 'w': - WireFrame = !WireFrame; - break; - case 'z': - zRot += step; - break; - case 'Z': - zRot -= step; - break; - case 27: - CleanUp(); - exit(0); - break; - } - glutPostRedisplay(); -} - - -static void -SpecialKey(int key, int x, int y) -{ - const GLfloat step = 2.0; - - (void) x; - (void) y; - - switch(key) { - case GLUT_KEY_UP: - xRot += step; - break; - case GLUT_KEY_DOWN: - xRot -= step; - break; - case GLUT_KEY_LEFT: - yRot -= step; - break; - case GLUT_KEY_RIGHT: - yRot += step; - break; - } - glutPostRedisplay(); -} - - - -static void -Init(void) -{ - if (!ShadersSupported()) - exit(1); - - vertShader = CompileShaderFile(GL_VERTEX_SHADER, VertProgFile); - fragShader = CompileShaderFile(GL_FRAGMENT_SHADER, FragProgFile); - program = LinkShaders(vertShader, fragShader); - - glUseProgram(program); - - uMat0 = glGetUniformLocation(program, "mat0"); - uMat1 = glGetUniformLocation(program, "mat1"); - - WeightAttr = glGetAttribLocation(program, "weight"); - - assert(glGetError() == 0); - - glClearColor(0.4f, 0.4f, 0.8f, 0.0f); - - glEnable(GL_DEPTH_TEST); - - glColor3f(1, 0, 0); -} - - -static void -ParseOptions(int argc, char *argv[]) -{ - int i; - for (i = 1; i < argc; i++) { - if (strcmp(argv[i], "-fs") == 0) { - FragProgFile = argv[i+1]; - } - else if (strcmp(argv[i], "-vs") == 0) { - VertProgFile = argv[i+1]; - } - } -} - - -int -main(int argc, char *argv[]) -{ - glutInit(&argc, argv); - glutInitWindowSize(500, 500); - glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); - win = glutCreateWindow(argv[0]); - glewInit(); - glutReshapeFunc(Reshape); - glutKeyboardFunc(Key); - glutSpecialFunc(SpecialKey); - glutDisplayFunc(Redisplay); - ParseOptions(argc, argv); - Init(); - if (Anim) - glutIdleFunc(Idle); - glutMainLoop(); - return 0; -} - diff --git a/progs/glsl/skinning.frag b/progs/glsl/skinning.frag deleted file mode 100644 index 9053755a830..00000000000 --- a/progs/glsl/skinning.frag +++ /dev/null @@ -1,6 +0,0 @@ -// color pass-through - -void main() -{ - gl_FragColor = gl_Color; -} diff --git a/progs/glsl/skinning.vert b/progs/glsl/skinning.vert deleted file mode 100644 index 28970eee584..00000000000 --- a/progs/glsl/skinning.vert +++ /dev/null @@ -1,24 +0,0 @@ -// Vertex weighting/blendin shader -// Brian Paul -// 4 Nov 2008 - -uniform mat4 mat0, mat1; -attribute float weight; - -void main() -{ - // simple diffuse shading - // Note that we should really transform the normal vector along with - // the postion below... someday. - vec3 lightVec = vec3(0, 0, 1); - vec3 norm = gl_NormalMatrix * gl_Normal; - float dot = 0.2 + max(0.0, dot(norm, lightVec)); - gl_FrontColor = vec4(dot); - - // compute sum of weighted transformations - vec4 pos0 = mat0 * gl_Vertex; - vec4 pos1 = mat1 * gl_Vertex; - vec4 pos = mix(pos0, pos1, weight); - - gl_Position = gl_ModelViewProjectionMatrix * pos; -} diff --git a/progs/glsl/texaaline.c b/progs/glsl/texaaline.c deleted file mode 100644 index 00edab73108..00000000000 --- a/progs/glsl/texaaline.c +++ /dev/null @@ -1,372 +0,0 @@ -/** - * AA lines with texture mapped quads - * - * Brian Paul - * 9 Feb 2008 - */ - - -#include <assert.h> -#include <string.h> -#include <stdio.h> -#include <stdlib.h> -#include <math.h> -#include <GL/glew.h> -#include <GL/glut.h> - -#ifndef M_PI -#define M_PI 3.1415926535 -#endif - -static GLint WinWidth = 300, WinHeight = 300; -static GLint win = 0; -static GLfloat Width = 8.; - -/* - * Quad strip for line from v0 to v1: - * - 1 3 5 7 - +---+---------------------+---+ - | | - | *v0 v1* | - | | - +---+---------------------+---+ - 0 2 4 6 - */ -static void -QuadLine(const GLfloat *v0, const GLfloat *v1, GLfloat width) -{ - GLfloat dx = v1[0] - v0[0]; - GLfloat dy = v1[1] - v0[1]; - GLfloat len = sqrt(dx*dx + dy*dy); - float dx0, dx1, dx2, dx3, dx4, dx5, dx6, dx7; - float dy0, dy1, dy2, dy3, dy4, dy5, dy6, dy7; - - dx /= len; - dy /= len; - - width *= 0.5; /* half width */ - dx = dx * (width + 0.0); - dy = dy * (width + 0.0); - - dx0 = -dx+dy; dy0 = -dy-dx; - dx1 = -dx-dy; dy1 = -dy+dx; - - dx2 = 0+dy; dy2 = -dx+0; - dx3 = 0-dy; dy3 = +dx+0; - - dx4 = 0+dy; dy4 = -dx+0; - dx5 = 0-dy; dy5 = +dx+0; - - dx6 = dx+dy; dy6 = dy-dx; - dx7 = dx-dy; dy7 = dy+dx; - - /* - printf("dx, dy = %g, %g\n", dx, dy); - printf(" dx0, dy0: %g, %g\n", dx0, dy0); - printf(" dx1, dy1: %g, %g\n", dx1, dy1); - printf(" dx2, dy2: %g, %g\n", dx2, dy2); - printf(" dx3, dy3: %g, %g\n", dx3, dy3); - */ - - glBegin(GL_QUAD_STRIP); - glTexCoord2f(0, 0); - glVertex2f(v0[0] + dx0, v0[1] + dy0); - glTexCoord2f(0, 1); - glVertex2f(v0[0] + dx1, v0[1] + dy1); - - glTexCoord2f(0.5, 0); - glVertex2f(v0[0] + dx2, v0[1] + dy2); - glTexCoord2f(0.5, 1); - glVertex2f(v0[0] + dx3, v0[1] + dy3); - - glTexCoord2f(0.5, 0); - glVertex2f(v1[0] + dx2, v1[1] + dy2); - glTexCoord2f(0.5, 1); - glVertex2f(v1[0] + dx3, v1[1] + dy3); - - glTexCoord2f(1, 0); - glVertex2f(v1[0] + dx6, v1[1] + dy6); - glTexCoord2f(1, 1); - glVertex2f(v1[0] + dx7, v1[1] + dy7); - glEnd(); -} - - -static float Cos(float a) -{ - return cos(a * M_PI / 180.); -} - -static float Sin(float a) -{ - return sin(a * M_PI / 180.); -} - -static void -Redisplay(void) -{ - float cx = 0.5 * WinWidth, cy = 0.5 * WinHeight; - float len = 0.5 * WinWidth - 20.0; - int i; - - glClear(GL_COLOR_BUFFER_BIT); - - glColor3f(1, 1, 1); - - glEnable(GL_BLEND); - glEnable(GL_TEXTURE_2D); - - for (i = 0; i < 360; i+=5) { - float v0[2], v1[2]; - v0[0] = cx + 40 * Cos(i); - v0[1] = cy + 40 * Sin(i); - v1[0] = cx + len * Cos(i); - v1[1] = cy + len * Sin(i); - QuadLine(v0, v1, Width); - } - - { - float v0[2], v1[2], x; - for (x = 0; x < 1.0; x += 0.2) { - v0[0] = cx + x; - v0[1] = cy + x * 40 - 20; - v1[0] = cx + x + 5.0; - v1[1] = cy + x * 40 - 20; - QuadLine(v0, v1, Width); - } - } - - glDisable(GL_BLEND); - glDisable(GL_TEXTURE_2D); - - glutSwapBuffers(); -} - - -static void -Reshape(int width, int height) -{ - WinWidth = width; - WinHeight = height; - glViewport(0, 0, width, height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrtho(0, width, 0, height, -1, 1); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); -} - - -static void -CleanUp(void) -{ - glutDestroyWindow(win); -} - - -static void -Key(unsigned char key, int x, int y) -{ - (void) x; - (void) y; - - switch(key) { - case 'w': - Width -= 0.5; - break; - case 'W': - Width += 0.5; - break; - case 27: - CleanUp(); - exit(0); - break; - } -#if 0 - if (Width < 3) - Width = 3; -#endif - printf("Width = %g\n", Width); - glutPostRedisplay(); -} - - -static float -ramp4(GLint i, GLint size) -{ - float d; - if (i < 4 ) { - d = i / 4.0; - } - else if (i >= size - 5) { - d = 1.0 - (i - (size - 5)) / 4.0; - } - else { - d = 1.0; - } - return d; -} - -static float -ramp2(GLint i, GLint size) -{ - float d; - if (i < 2 ) { - d = i / 2.0; - } - else if (i >= size - 3) { - d = 1.0 - (i - (size - 3)) / 2.0; - } - else { - d = 1.0; - } - return d; -} - -static float -ramp1(GLint i, GLint size) -{ - float d; - if (i == 0 || i == size-1) { - d = 0.0; - } - else { - d = 1.0; - } - return d; -} - - -/** - * Make an alpha texture for antialiasing lines. - * Just a linear fall-off ramp for now. - * Should have a number of different textures for different line widths. - * Could try a bell-like-curve.... - */ -static void -MakeTexture(void) -{ -#define SZ 8 - GLfloat tex[SZ][SZ]; /* alpha tex */ - int i, j; - for (i = 0; i < SZ; i++) { - for (j = 0; j < SZ; j++) { -#if 0 - float k = (SZ-1) / 2.0; - float dx = fabs(i - k) / k; - float dy = fabs(j - k) / k; - float d; - - dx = 1.0 - dx; - dy = 1.0 - dy; - d = dx * dy; - -#else - float d = ramp1(i, SZ) * ramp1(j, SZ); - printf("%d, %d: %g\n", i, j, d); -#endif - tex[i][j] = d; - } - } - - glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, SZ, SZ, 0, GL_ALPHA, GL_FLOAT, tex); - 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_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); -#undef SZ -} - - -static void -MakeMipmap(void) -{ -#define SZ 64 - GLfloat tex[SZ][SZ]; /* alpha tex */ - int level; - - glPixelStorei(GL_UNPACK_ROW_LENGTH, SZ); - for (level = 0; level < 7; level++) { - int sz = 1 << (6 - level); - int i, j; - for (i = 0; i < sz; i++) { - for (j = 0; j < sz; j++) { - if (level == 6) - tex[i][j] = 1.0; - else if (level == 5) - tex[i][j] = 0.5; - else - tex[i][j] = ramp1(i, sz) * ramp1(j, sz); - } - } - - glTexImage2D(GL_TEXTURE_2D, level, GL_ALPHA, - sz, sz, 0, GL_ALPHA, GL_FLOAT, tex); - } - - 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_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - /* glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LOD, 4); */ - /* glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 5); */ - - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); -#undef SZ -} - - -static void -Init(void) -{ - const char *version; - - (void) MakeTexture; - (void) ramp4; - (void) ramp2; - - version = (const char *) glGetString(GL_VERSION); - if (version[0] != '2' || version[1] != '.') { - printf("This program requires OpenGL 2.x, found %s\n", version); - exit(1); - } - - glClearColor(0.3f, 0.3f, 0.3f, 0.0f); - - printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER)); - - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); -#if 0 - glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); -#elif 0 - MakeTexture(); -#else - MakeMipmap(); -#endif -} - - -static void -ParseOptions(int argc, char *argv[]) -{ -} - - -int -main(int argc, char *argv[]) -{ - glutInit(&argc, argv); - glutInitWindowSize(WinWidth, WinHeight); - glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); - win = glutCreateWindow(argv[0]); - glewInit(); - glutReshapeFunc(Reshape); - glutKeyboardFunc(Key); - glutDisplayFunc(Redisplay); - ParseOptions(argc, argv); - Init(); - glutMainLoop(); - return 0; -} diff --git a/progs/glsl/texdemo1.c b/progs/glsl/texdemo1.c deleted file mode 100644 index 2076e6aef94..00000000000 --- a/progs/glsl/texdemo1.c +++ /dev/null @@ -1,438 +0,0 @@ -/** - * Test texturing with GL shading language. - * - * Copyright (C) 2007 Brian Paul All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is 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 Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN - * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - - - -#include <assert.h> -#include <math.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <GL/glew.h> -#include "GL/glut.h" -#include "readtex.h" -#include "shaderutil.h" - -static const char *Demo = "texdemo1"; - -static const char *ReflectVertFile = "reflect.vert"; -static const char *CubeFragFile = "cubemap.frag"; - -static const char *SimpleVertFile = "simple.vert"; -static const char *SimpleTexFragFile = "shadowtex.frag"; - -static const char *GroundImage = "../images/tile.rgb"; - -static GLuint Program1, Program2; - -static GLfloat TexXrot = 0, TexYrot = 0; -static GLfloat Xrot = 20.0, Yrot = 20.0, Zrot = 0.0; -static GLfloat EyeDist = 10; -static GLboolean Anim = GL_TRUE; -static int win = 0; - - -static struct uniform_info ReflectUniforms[] = { - { "cubeTex", 1, GL_SAMPLER_CUBE, { 0, 0, 0, 0 }, -1 }, - { "lightPos", 1, GL_FLOAT_VEC3, { 10, 10, 20, 0 }, -1 }, - END_OF_UNIFORMS -}; - -static struct uniform_info SimpleUniforms[] = { - { "tex2d", 1, GL_SAMPLER_2D, { 1, 0, 0, 0 }, -1 }, - { "lightPos", 1, GL_FLOAT_VEC3, { 10, 10, 20, 0 }, -1 }, - END_OF_UNIFORMS -}; - - -static void -DrawGround(GLfloat size) -{ - glPushMatrix(); - glRotatef(90, 1, 0, 0); - glNormal3f(0, 0, 1); - glBegin(GL_POLYGON); - glTexCoord2f(-2, -2); glVertex2f(-size, -size); - glTexCoord2f( 2, -2); glVertex2f( size, -size); - glTexCoord2f( 2, 2); glVertex2f( size, size); - glTexCoord2f(-2, 2); glVertex2f(-size, size); - glEnd(); - glPopMatrix(); -} - - -static void -draw(void) -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - glEnable(GL_TEXTURE_2D); - - glPushMatrix(); /* modelview matrix */ - glTranslatef(0.0, 0.0, -EyeDist); - glRotatef(Xrot, 1, 0, 0); - glRotatef(Yrot, 0, 1, 0); - glRotatef(Zrot, 0, 0, 1); - - /* sphere w/ reflection map */ - glPushMatrix(); - glTranslatef(0, 1, 0); - glUseProgram(Program1); - - /* setup texture matrix */ - glActiveTexture(GL_TEXTURE0); - glMatrixMode(GL_TEXTURE); - glLoadIdentity(); - glRotatef(-TexYrot, 0, 1, 0); - glRotatef(-TexXrot, 1, 0, 0); - - glEnable(GL_TEXTURE_GEN_S); - glEnable(GL_TEXTURE_GEN_T); - glEnable(GL_TEXTURE_GEN_R); - glutSolidSphere(2.0, 20, 20); - - glLoadIdentity(); /* texture matrix */ - glMatrixMode(GL_MODELVIEW); - glPopMatrix(); - - /* ground */ - glUseProgram(Program2); - glTranslatef(0, -1.0, 0); - DrawGround(5); - - glPopMatrix(); - - glutSwapBuffers(); -} - - -static void -idle(void) -{ - GLfloat t = 0.05 * glutGet(GLUT_ELAPSED_TIME); - TexYrot = t; - glutPostRedisplay(); -} - - -static void -key(unsigned char k, int x, int y) -{ - (void) x; - (void) y; - switch (k) { - case ' ': - case 'a': - Anim = !Anim; - if (Anim) - glutIdleFunc(idle); - else - glutIdleFunc(NULL); - break; - case 'z': - EyeDist -= 0.5; - if (EyeDist < 6.0) - EyeDist = 6.0; - break; - case 'Z': - EyeDist += 0.5; - if (EyeDist > 90.0) - EyeDist = 90; - break; - case 27: - glutDestroyWindow(win); - exit(0); - } - glutPostRedisplay(); -} - - -static void -specialkey(int key, int x, int y) -{ - GLfloat step = 2.0; - (void) x; - (void) y; - switch (key) { - case GLUT_KEY_UP: - Xrot += step; - break; - case GLUT_KEY_DOWN: - Xrot -= step; - break; - case GLUT_KEY_LEFT: - Yrot -= step; - break; - case GLUT_KEY_RIGHT: - Yrot += step; - break; - } - glutPostRedisplay(); -} - - -/* new window size or exposure */ -static void -Reshape(int width, int height) -{ - GLfloat ar = (float) width / (float) height; - glViewport(0, 0, (GLint)width, (GLint)height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glFrustum(-2.0*ar, 2.0*ar, -2.0, 2.0, 4.0, 100.0); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); -} - - -static void -InitCheckers(void) -{ -#define CUBE_TEX_SIZE 64 - GLubyte image[CUBE_TEX_SIZE][CUBE_TEX_SIZE][3]; - static const GLubyte colors[6][3] = { - { 255, 0, 0 }, /* face 0 - red */ - { 0, 255, 255 }, /* face 1 - cyan */ - { 0, 255, 0 }, /* face 2 - green */ - { 255, 0, 255 }, /* face 3 - purple */ - { 0, 0, 255 }, /* face 4 - blue */ - { 255, 255, 0 } /* face 5 - yellow */ - }; - static const GLenum targets[6] = { - GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB, - GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB, - GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB, - GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB, - GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB, - GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB - }; - - GLint i, j, f; - - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - - /* make colored checkerboard cube faces */ - for (f = 0; f < 6; f++) { - for (i = 0; i < CUBE_TEX_SIZE; i++) { - for (j = 0; j < CUBE_TEX_SIZE; j++) { - if ((i/4 + j/4) & 1) { - image[i][j][0] = colors[f][0]; - image[i][j][1] = colors[f][1]; - image[i][j][2] = colors[f][2]; - } - else { - image[i][j][0] = 255; - image[i][j][1] = 255; - image[i][j][2] = 255; - } - } - } - - glTexImage2D(targets[f], 0, GL_RGB, CUBE_TEX_SIZE, CUBE_TEX_SIZE, 0, - GL_RGB, GL_UNSIGNED_BYTE, image); - } -} - - -static void -LoadFace(GLenum target, const char *filename, - GLboolean flipTB, GLboolean flipLR) -{ - GLint w, h; - GLenum format; - GLubyte *img = LoadRGBImage(filename, &w, &h, &format); - if (!img) { - printf("Error: couldn't load texture image %s\n", filename); - exit(1); - } - assert(format == GL_RGB); - - /* <sigh> the way the texture cube mapping works, we have to flip - * images to make things look right. - */ - if (flipTB) { - const int stride = 3 * w; - GLubyte temp[3*1024]; - int i; - for (i = 0; i < h / 2; i++) { - memcpy(temp, img + i * stride, stride); - memcpy(img + i * stride, img + (h - i - 1) * stride, stride); - memcpy(img + (h - i - 1) * stride, temp, stride); - } - } - if (flipLR) { - const int stride = 3 * w; - GLubyte temp[3]; - GLubyte *row; - int i, j; - for (i = 0; i < h; i++) { - row = img + i * stride; - for (j = 0; j < w / 2; j++) { - int k = w - j - 1; - temp[0] = row[j*3+0]; - temp[1] = row[j*3+1]; - temp[2] = row[j*3+2]; - row[j*3+0] = row[k*3+0]; - row[j*3+1] = row[k*3+1]; - row[j*3+2] = row[k*3+2]; - row[k*3+0] = temp[0]; - row[k*3+1] = temp[1]; - row[k*3+2] = temp[2]; - } - } - } - - gluBuild2DMipmaps(target, GL_RGB, w, h, format, GL_UNSIGNED_BYTE, img); - free(img); -} - - -static void -LoadEnvmaps(void) -{ - LoadFace(GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB, "right.rgb", GL_TRUE, GL_FALSE); - LoadFace(GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB, "left.rgb", GL_TRUE, GL_FALSE); - LoadFace(GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB, "top.rgb", GL_FALSE, GL_TRUE); - LoadFace(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB, "bottom.rgb", GL_FALSE, GL_TRUE); - LoadFace(GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB, "front.rgb", GL_TRUE, GL_FALSE); - LoadFace(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB, "back.rgb", GL_TRUE, GL_FALSE); -} - - -static void -InitTextures(GLboolean useImageFiles) -{ - GLenum filter; - - /* - * Env map - */ - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_CUBE_MAP, 1); - if (useImageFiles) { - LoadEnvmaps(); - filter = GL_LINEAR; - } - else { - InitCheckers(); - filter = GL_NEAREST; - } - glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_MIN_FILTER, filter); - glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_MAG_FILTER, filter); - glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - - /* - * Ground texture - */ - { - GLint imgWidth, imgHeight; - GLenum imgFormat; - GLubyte *image = NULL; - - image = LoadRGBImage(GroundImage, &imgWidth, &imgHeight, &imgFormat); - if (!image) { - printf("Couldn't read %s\n", GroundImage); - exit(0); - } - - glActiveTexture(GL_TEXTURE1); - glBindTexture(GL_TEXTURE_2D, 2); - gluBuild2DMipmaps(GL_TEXTURE_2D, 3, imgWidth, imgHeight, - imgFormat, GL_UNSIGNED_BYTE, image); - free(image); - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - } -} - - -static GLuint -CreateProgram(const char *vertProgFile, const char *fragProgFile, - struct uniform_info *uniforms) -{ - GLuint fragShader, vertShader, program; - - vertShader = CompileShaderFile(GL_VERTEX_SHADER, vertProgFile); - fragShader = CompileShaderFile(GL_FRAGMENT_SHADER, fragProgFile); - program = LinkShaders(vertShader, fragShader); - - glUseProgram(program); - - SetUniformValues(program, uniforms); - PrintUniforms(uniforms); - - return program; -} - - -static void -InitPrograms(void) -{ - Program1 = CreateProgram(ReflectVertFile, CubeFragFile, ReflectUniforms); - Program2 = CreateProgram(SimpleVertFile, SimpleTexFragFile, SimpleUniforms); -} - - -static void -Init(GLboolean useImageFiles) -{ - if (!ShadersSupported()) { - exit(1); - } - printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER)); - - InitTextures(useImageFiles); - InitPrograms(); - - glEnable(GL_DEPTH_TEST); - - glClearColor(.6, .6, .9, 0); - glColor3f(1.0, 1.0, 1.0); -} - - -int -main(int argc, char *argv[]) -{ - glutInit(&argc, argv); - glutInitWindowSize(500, 400); - glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE); - win = glutCreateWindow(Demo); - glewInit(); - glutReshapeFunc(Reshape); - glutKeyboardFunc(key); - glutSpecialFunc(specialkey); - glutDisplayFunc(draw); - if (Anim) - glutIdleFunc(idle); - if (argc > 1 && strcmp(argv[1] , "-i") == 0) - Init(1); - else - Init(0); - glutMainLoop(); - return 0; -} diff --git a/progs/glsl/toyball.c b/progs/glsl/toyball.c deleted file mode 100644 index c502f24077e..00000000000 --- a/progs/glsl/toyball.c +++ /dev/null @@ -1,221 +0,0 @@ -/** - * "Toy Ball" shader demo. Uses the example shaders from - * chapter 11 of the OpenGL Shading Language "orange" book. - * 16 Jan 2007 - */ - -#include <assert.h> -#include <string.h> -#include <stdio.h> -#include <stdlib.h> -#include <math.h> -#include <GL/glew.h> -#include <GL/glut.h> -#include "shaderutil.h" - - -static char *FragProgFile = "CH11-toyball.frag"; -static char *VertProgFile = "CH11-toyball.vert"; - -/* program/shader objects */ -static GLuint fragShader; -static GLuint vertShader; -static GLuint program; - - -static struct uniform_info Uniforms[] = { - { "LightDir", 1, GL_FLOAT_VEC4, { 0.57737, 0.57735, 0.57735, 0.0 }, -1 }, - { "HVector", 1, GL_FLOAT_VEC4, { 0.32506, 0.32506, 0.88808, 0.0 }, -1 }, - { "BallCenter", 1, GL_FLOAT_VEC4, { 0.0, 0.0, 0.0, 1.0 }, -1 }, - { "SpecularColor", 1, GL_FLOAT_VEC4, { 0.4, 0.4, 0.4, 60.0 }, -1 }, - { "Red", 1, GL_FLOAT_VEC4, { 0.6, 0.0, 0.0, 1.0 }, -1 }, - { "Blue", 1, GL_FLOAT_VEC4, { 0.0, 0.3, 0.6, 1.0 }, -1 }, - { "Yellow", 1, GL_FLOAT_VEC4, { 0.6, 0.5, 0.0, 1.0 }, -1 }, - { "HalfSpace0", 1, GL_FLOAT_VEC4, { 1.0, 0.0, 0.0, 0.2 }, -1 }, - { "HalfSpace1", 1, GL_FLOAT_VEC4, { 0.309016994, 0.951056516, 0.0, 0.2 }, -1 }, - { "HalfSpace2", 1, GL_FLOAT_VEC4, { -0.809016994, 0.587785252, 0.0, 0.2 }, -1 }, - { "HalfSpace3", 1, GL_FLOAT_VEC4, { -0.809016994, -0.587785252, 0.0, 0.2 }, -1 }, - { "HalfSpace4", 1, GL_FLOAT_VEC4, { 0.309116994, -0.951056516, 0.0, 0.2 }, -1 }, - { "InOrOutInit", 1, GL_FLOAT, { -3.0, 0, 0, 0 }, -1 }, - { "StripeWidth", 1, GL_FLOAT, { 0.3, 0, 0, 0 }, -1 }, - { "FWidth", 1, GL_FLOAT, { 0.005, 0, 0, 0 }, -1 }, - END_OF_UNIFORMS -}; - -static GLint win = 0; -static GLboolean Anim = GL_FALSE; -static GLfloat TexRot = 0.0; -static GLfloat xRot = 0.0f, yRot = 0.0f, zRot = 0.0f; - - -static void -Idle(void) -{ - TexRot += 2.0; - if (TexRot > 360.0) - TexRot -= 360.0; - glutPostRedisplay(); -} - - -static void -Redisplay(void) -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - glPushMatrix(); - glRotatef(xRot, 1.0f, 0.0f, 0.0f); - glRotatef(yRot, 0.0f, 1.0f, 0.0f); - glRotatef(zRot, 0.0f, 0.0f, 1.0f); - - glMatrixMode(GL_TEXTURE); - glLoadIdentity(); - glRotatef(TexRot, 0.0f, 1.0f, 0.0f); - glMatrixMode(GL_MODELVIEW); - - glutSolidSphere(2.0, 20, 10); - - glPopMatrix(); - - glutSwapBuffers(); -} - - -static void -Reshape(int width, int height) -{ - glViewport(0, 0, width, height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glTranslatef(0.0f, 0.0f, -15.0f); -} - - -static void -CleanUp(void) -{ - glDeleteShader(fragShader); - glDeleteShader(vertShader); - glDeleteProgram(program); - glutDestroyWindow(win); -} - - -static void -Key(unsigned char key, int x, int y) -{ - const GLfloat step = 2.0; - (void) x; - (void) y; - - switch(key) { - case 'a': - Anim = !Anim; - if (Anim) - glutIdleFunc(Idle); - else - glutIdleFunc(NULL); - break; - case 'z': - zRot += step; - break; - case 'Z': - zRot -= step; - break; - case 27: - CleanUp(); - exit(0); - break; - } - glutPostRedisplay(); -} - - -static void -SpecialKey(int key, int x, int y) -{ - const GLfloat step = 2.0; - - (void) x; - (void) y; - - switch(key) { - case GLUT_KEY_UP: - xRot += step; - break; - case GLUT_KEY_DOWN: - xRot -= step; - break; - case GLUT_KEY_LEFT: - yRot -= step; - break; - case GLUT_KEY_RIGHT: - yRot += step; - break; - } - glutPostRedisplay(); -} - - - -static void -Init(void) -{ - if (!ShadersSupported()) - exit(1); - - vertShader = CompileShaderFile(GL_VERTEX_SHADER, VertProgFile); - fragShader = CompileShaderFile(GL_FRAGMENT_SHADER, FragProgFile); - program = LinkShaders(vertShader, fragShader); - - glUseProgram(program); - - SetUniformValues(program, Uniforms); - PrintUniforms(Uniforms); - - assert(glGetError() == 0); - - glClearColor(0.4f, 0.4f, 0.8f, 0.0f); - - glEnable(GL_DEPTH_TEST); - - glColor3f(1, 0, 0); -} - - -static void -ParseOptions(int argc, char *argv[]) -{ - int i; - for (i = 1; i < argc; i++) { - if (strcmp(argv[i], "-fs") == 0) { - FragProgFile = argv[i+1]; - } - else if (strcmp(argv[i], "-vs") == 0) { - VertProgFile = argv[i+1]; - } - } -} - - -int -main(int argc, char *argv[]) -{ - glutInit(&argc, argv); - glutInitWindowSize(400, 400); - glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); - win = glutCreateWindow(argv[0]); - glewInit(); - glutReshapeFunc(Reshape); - glutKeyboardFunc(Key); - glutSpecialFunc(SpecialKey); - glutDisplayFunc(Redisplay); - ParseOptions(argc, argv); - Init(); - glutMainLoop(); - return 0; -} - diff --git a/progs/glsl/toyball.shtest b/progs/glsl/toyball.shtest deleted file mode 100644 index 887663abd32..00000000000 --- a/progs/glsl/toyball.shtest +++ /dev/null @@ -1,17 +0,0 @@ -vs CH11-toyball.vert -fs CH11-toyball.frag -uniform LightDir GL_FLOAT_VEC4 0.57737 0.57735 0.57735 0.0 -uniform HVector GL_FLOAT_VEC4 0.32506 0.32506 0.88808 0.0 -uniform BallCenter GL_FLOAT_VEC4 0.0 0.0 0.0 1.0 -uniform SpecularColor GL_FLOAT_VEC4 0.4 0.4 0.4 60.0 -uniform Red GL_FLOAT_VEC4 0.6 0.0 0.0 1.0 -uniform Blue GL_FLOAT_VEC4 0.0 0.3 0.6 1.0 -uniform Yellow GL_FLOAT_VEC4 0.6 0.5 0.0 1.0 -uniform HalfSpace0 GL_FLOAT_VEC4 1.0 0.0 0.0 0.2 -uniform HalfSpace1 GL_FLOAT_VEC4 .309016994 0.951056516 0.0 0.2 -uniform HalfSpace2 GL_FLOAT_VEC4 -0.809016994 0.587785252 0.0 0.2 -uniform HalfSpace3 GL_FLOAT_VEC4 -0.809016994 -0.587785252 0.0 0.2 -uniform HalfSpace4 GL_FLOAT_VEC4 .309116994 -0.951056516 0.0 0.2 -uniform InOrOutInit GL_FLOAT -3.0 -uniform StripeWidth GL_FLOAT 0.3 -uniform FWidth GL_FLOAT .005 diff --git a/progs/glsl/trirast.c b/progs/glsl/trirast.c deleted file mode 100644 index 857342636dc..00000000000 --- a/progs/glsl/trirast.c +++ /dev/null @@ -1,255 +0,0 @@ -/** - * Demonstration of doing triangle rasterization with a fragment program. - * Basic idea: - * 1. Draw screen-aligned quad / bounding box around the triangle verts. - * 2. For each pixel in the quad, determine if pixel is inside/outside - * the triangle edges. - * - * Brian Paul - * 1 Aug 2007 - */ - - -#include <assert.h> -#include <string.h> -#include <stdio.h> -#include <stdlib.h> -#include <math.h> -#include <GL/glew.h> -#include <GL/glut.h> -#include "shaderutil.h" - - -static GLint WinWidth = 300, WinHeight = 300; -static char *FragProgFile = NULL; -static char *VertProgFile = NULL; -static GLuint fragShader; -static GLuint vertShader; -static GLuint program; -static GLint win = 0; -static GLboolean anim = GL_TRUE; -static GLfloat Zrot = 0.0f; -static GLint uv0, uv1, uv2; - - -static const GLfloat TriVerts[3][2] = { - { 50, 50 }, - { 250, 50 }, - { 150, 250 } -}; - - -static void -RotateVerts(GLfloat a, - GLuint n, const GLfloat vertsIn[][2], GLfloat vertsOut[][2]) -{ - GLuint i; - GLfloat cx = WinWidth / 2, cy = WinHeight / 2; - for (i = 0; i < n; i++) { - float x = vertsIn[i][0] - cx; - float y = vertsIn[i][1] - cy; - - vertsOut[i][0] = x * cos(a) + y * sin(a) + cx; - vertsOut[i][1] = -x * sin(a) + y * cos(a) + cy; - } -} - -static void -ComputeBounds(GLuint n, GLfloat vertsIn[][2], - GLfloat *xmin, GLfloat *ymin, - GLfloat *xmax, GLfloat *ymax) -{ - GLuint i; - *xmin = *xmax = vertsIn[0][0]; - *ymin = *ymax = vertsIn[0][1]; - for (i = 1; i < n; i++) { - if (vertsIn[i][0] < *xmin) - *xmin = vertsIn[i][0]; - else if (vertsIn[i][0] > *xmax) - *xmax = vertsIn[i][0]; - if (vertsIn[i][1] < *ymin) - *ymin = vertsIn[i][1]; - else if (vertsIn[i][1] > *ymax) - *ymax = vertsIn[i][1]; - } -} - - -static void -Redisplay(void) -{ - GLfloat v[3][2], xmin, ymin, xmax, ymax; - - RotateVerts(Zrot, 3, TriVerts, v); - ComputeBounds(3, v, &xmin, &ymin, &xmax, &ymax); - - glUniform2fv(uv0, 1, v[0]); - glUniform2fv(uv1, 1, v[1]); - glUniform2fv(uv2, 1, v[2]); - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - glPushMatrix(); - glBegin(GL_POLYGON); - glVertex2f(xmin, ymin); - glVertex2f(xmax, ymin); - glVertex2f(xmax, ymax); - glVertex2f(xmin, ymax); - glEnd(); - glPopMatrix(); - - glutSwapBuffers(); -} - - -static void -Idle(void) -{ - if (anim) { - Zrot = glutGet(GLUT_ELAPSED_TIME) * 0.0005; - glutPostRedisplay(); - } - else - abort(); -} - - -static void -Reshape(int width, int height) -{ - glViewport(0, 0, width, height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrtho(0, width, 0, height, -1, 1); - - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); -} - - -static void -CleanUp(void) -{ - glDeleteShader(fragShader); - glDeleteShader(vertShader); - glDeleteProgram(program); - glutDestroyWindow(win); -} - - -static void -Key(unsigned char key, int x, int y) -{ - (void) x; - (void) y; - - switch(key) { - case ' ': - case 'a': - anim = !anim; - if (anim) - glutIdleFunc(Idle); - else - glutIdleFunc(NULL); - break; - case 'z': - Zrot = 0; - break; - case 's': - Zrot += 0.05; - break; - case 27: - CleanUp(); - exit(0); - break; - } - glutPostRedisplay(); -} - - -static void -Init(void) -{ - static const char *fragShaderText = - "uniform vec2 v0, v1, v2; \n" - "float crs(const vec2 u, const vec2 v) \n" - "{ \n" - " return u.x * v.y - u.y * v.x; \n" - "} \n" - "\n" - "void main() {\n" - " vec2 p = gl_FragCoord.xy; \n" - " if (crs(v1 - v0, p - v0) >= 0.0 && \n" - " crs(v2 - v1, p - v1) >= 0.0 && \n" - " crs(v0 - v2, p - v2) >= 0.0) \n" - " gl_FragColor = vec4(1.0); \n" - " else \n" - " gl_FragColor = vec4(0.5); \n" - "}\n"; - static const char *vertShaderText = - "void main() {\n" - " gl_Position = ftransform(); \n" - "}\n"; - - if (!ShadersSupported()) - exit(1); - - vertShader = CompileShaderText(GL_VERTEX_SHADER, vertShaderText); - fragShader = CompileShaderText(GL_FRAGMENT_SHADER, fragShaderText); - program = LinkShaders(vertShader, fragShader); - - glUseProgram(program); - - uv0 = glGetUniformLocation(program, "v0"); - uv1 = glGetUniformLocation(program, "v1"); - uv2 = glGetUniformLocation(program, "v2"); - printf("Uniforms: %d %d %d\n", uv0, uv1, uv2); - - /*assert(glGetError() == 0);*/ - - glClearColor(0.3f, 0.3f, 0.3f, 0.0f); - glEnable(GL_DEPTH_TEST); - - printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER)); - - assert(glIsProgram(program)); - assert(glIsShader(fragShader)); - assert(glIsShader(vertShader)); - - glColor3f(1, 0, 0); -} - - -static void -ParseOptions(int argc, char *argv[]) -{ - int i; - for (i = 1; i < argc; i++) { - if (strcmp(argv[i], "-fs") == 0) { - FragProgFile = argv[i+1]; - } - else if (strcmp(argv[i], "-vs") == 0) { - VertProgFile = argv[i+1]; - } - } -} - - -int -main(int argc, char *argv[]) -{ - glutInit(&argc, argv); - glutInitWindowSize(WinWidth, WinHeight); - glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); - win = glutCreateWindow(argv[0]); - glewInit(); - glutReshapeFunc(Reshape); - glutKeyboardFunc(Key); - glutDisplayFunc(Redisplay); - if (anim) - glutIdleFunc(Idle); - ParseOptions(argc, argv); - Init(); - glutMainLoop(); - return 0; -} diff --git a/progs/glsl/twoside.c b/progs/glsl/twoside.c deleted file mode 100644 index ce155d64e9e..00000000000 --- a/progs/glsl/twoside.c +++ /dev/null @@ -1,305 +0,0 @@ -/** - * Test two-sided lighting with shaders. - * Both GL_VERTEX_PROGRAM_TWO_SIDE and gl_FrontFacing can be tested - * (see keys below). - * - * Brian Paul - * 18 Dec 2007 - */ - -#include <assert.h> -#include <string.h> -#include <stdio.h> -#include <stdlib.h> -#include <math.h> -#include <GL/glew.h> -#include <GL/glut.h> -#include "shaderutil.h" - -#ifndef M_PI -#define M_PI 3.1415926535 -#endif - -static GLint WinWidth = 300, WinHeight = 300; -static char *FragProgFile = NULL; -static char *VertProgFile = NULL; -static GLuint fragShader; -static GLuint vertShader; -static GLuint program; -static GLint win = 0; -static GLboolean anim; -static GLboolean DetermineFacingInFragProg; -static GLfloat Xrot; -static GLint u_fragface; -static GLenum FrontWinding; -static int prevTime = 0; - - -static const GLfloat Red[4] = {1, 0, 0, 1}; -static const GLfloat Green[4] = {0, 1, 0, 0}; - - -static void -SetDefaults(void) -{ - DetermineFacingInFragProg = GL_TRUE; - FrontWinding = GL_CCW; - Xrot = 30; - anim = 0; - glutIdleFunc(NULL); -} - - -static void -Redisplay(void) -{ - const int sections = 20; - int i; - float radius = 2; - - glFrontFace(FrontWinding); - - if (DetermineFacingInFragProg) { - glUniform1i(u_fragface, 1); - glDisable(GL_VERTEX_PROGRAM_TWO_SIDE); - } - else { - glUniform1i(u_fragface, 0); - glEnable(GL_VERTEX_PROGRAM_TWO_SIDE); - } - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); - - glPushMatrix(); - glRotatef(Xrot, 1, 0, 0); - - /* Draw a tristrip ring */ - glBegin(GL_TRIANGLE_STRIP); - glColor4fv(Red); - glSecondaryColor3fv(Green); - for (i = 0; i <= sections; i++) { - float a = (float) i / (sections) * M_PI * 2.0; - float x = radius * cos(a); - float y = radius * sin(a); - glVertex3f(x, -1, y); - glVertex3f(x, +1, y); - } - glEnd(); - - glPopMatrix(); - - glutSwapBuffers(); -} - - -static void -Idle(void) -{ - int curTime = glutGet(GLUT_ELAPSED_TIME); - int dt = curTime - prevTime; - - if (prevTime == 0) { - prevTime = curTime; - return; - } - prevTime = curTime; - - Xrot += dt * 0.1; - glutPostRedisplay(); -} - - -static void -Reshape(int width, int height) -{ - float ar = (float) width / height; - glViewport(0, 0, width, height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glFrustum(-ar, ar, -1, 1, 3, 25); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glTranslatef(0, 0, -10); -} - - -static void -CleanUp(void) -{ - glDeleteShader(fragShader); - glDeleteShader(vertShader); - glDeleteProgram(program); - glutDestroyWindow(win); -} - - -static void -Key(unsigned char key, int x, int y) -{ - (void) x; - (void) y; - - switch(key) { - case ' ': - case 'a': - anim = !anim; - if (anim) { - prevTime = glutGet(GLUT_ELAPSED_TIME); - glutIdleFunc(Idle); - } - else - glutIdleFunc(NULL); - break; - case 'f': - printf("Using frag shader gl_FrontFacing\n"); - DetermineFacingInFragProg = GL_TRUE; - break; - case 'v': - printf("Using vert shader Two-sided lighting\n"); - DetermineFacingInFragProg = GL_FALSE; - break; - case 'r': - /* reset */ - SetDefaults(); - break; - case 's': - Xrot += 5; - break; - case 'S': - Xrot -= 5; - break; - case 'w': - if (FrontWinding == GL_CCW) { - FrontWinding = GL_CW; - printf("FrontFace = GL_CW\n"); - } - else { - FrontWinding = GL_CCW; - printf("FrontFace = GL_CCW\n"); - } - break; - case 27: - CleanUp(); - exit(0); - break; - } - glutPostRedisplay(); -} - - -static void -Init(void) -{ - static const char *fragShaderText = - "uniform bool fragface; \n" - "void main() { \n" -#if 1 - " if (!fragface || gl_FrontFacing) { \n" - " gl_FragColor = gl_Color; \n" - " } \n" - " else { \n" - " // note: dim green to help debug \n" - " gl_FragColor = 0.8 * gl_SecondaryColor; \n" - " } \n" -#else - /* DEBUG CODE */ - " bool f = gl_FrontFacing; \n" - " if (f) { \n" - " gl_FragColor = vec4(1.0, 0.0, 0.0, 0.0); \n" - " } \n" - " else { \n" - " gl_FragColor = vec4(0.0, 1.0, 0.0, 0.0); \n" - " } \n" -#endif - "} \n"; - static const char *vertShaderText = - "uniform bool fragface; \n" - "void main() { \n" - " gl_FrontColor = gl_Color; \n" - " if (fragface) { \n" - " // front/back chosen in frag prog \n" - " gl_FrontSecondaryColor = gl_SecondaryColor; \n" - " } \n" - " else { \n" - " // front/back chosen in prim setup \n" - " gl_BackColor = gl_SecondaryColor; \n" - " } \n" - " gl_Position = ftransform(); \n" - "} \n"; - - if (!ShadersSupported()) - exit(1); - - vertShader = CompileShaderText(GL_VERTEX_SHADER, vertShaderText); - fragShader = CompileShaderText(GL_FRAGMENT_SHADER, fragShaderText); - program = LinkShaders(vertShader, fragShader); - - glUseProgram(program); - - u_fragface = glGetUniformLocation(program, "fragface"); - printf("Uniforms: %d\n", u_fragface); - - /*assert(glGetError() == 0);*/ - - glClearColor(0.3f, 0.3f, 0.3f, 0.0f); - - printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER)); - - assert(glIsProgram(program)); - assert(glIsShader(fragShader)); - assert(glIsShader(vertShader)); - - glEnable(GL_DEPTH_TEST); - - SetDefaults(); -} - - -static void -ParseOptions(int argc, char *argv[]) -{ - int i; - for (i = 1; i < argc; i++) { - if (strcmp(argv[i], "-fs") == 0) { - FragProgFile = argv[i+1]; - } - else if (strcmp(argv[i], "-vs") == 0) { - VertProgFile = argv[i+1]; - } - } -} - - -static void -Usage(void) -{ - printf("Keys:\n"); - printf(" f - do front/back determination in fragment shader\n"); - printf(" v - do front/back determination in vertex shader\n"); - printf(" r - reset, show front\n"); - printf(" a - toggle animation\n"); - printf(" s - step rotation\n"); - printf(" w - toggle CW, CCW front-face winding\n"); - printf("NOTE: red = front face, green = back face.\n"); -} - - -int -main(int argc, char *argv[]) -{ - glutInit(&argc, argv); - glutInitWindowSize(WinWidth, WinHeight); - glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE); - win = glutCreateWindow(argv[0]); - glewInit(); - glutReshapeFunc(Reshape); - glutKeyboardFunc(Key); - glutDisplayFunc(Redisplay); - if (anim) - glutIdleFunc(Idle); - ParseOptions(argc, argv); - Init(); - Usage(); - glutMainLoop(); - return 0; -} diff --git a/progs/glsl/vert-or-frag-only.c b/progs/glsl/vert-or-frag-only.c deleted file mode 100644 index 148991ca83e..00000000000 --- a/progs/glsl/vert-or-frag-only.c +++ /dev/null @@ -1,187 +0,0 @@ -/** - * Draw two quads, one using only a vertex shader, the other only with a - * fragment shader. They should appear the same. - * 17 Dec 2008 - * Brian Paul - */ - - -#include <assert.h> -#include <string.h> -#include <stdio.h> -#include <stdlib.h> -#include <math.h> -#include <GL/glew.h> -#include <GL/glut.h> -#include "shaderutil.h" - - -static char *FragProgFile = NULL; -static char *VertProgFile = NULL; -static GLuint FragShader; -static GLuint VertShader; -static GLuint VertProgram; /* w/out vertex shader */ -static GLuint FragProgram; /* w/out fragment shader */ -static GLint Win = 0; - - -static void -DrawQuadColor(void) -{ - glBegin(GL_QUADS); - glColor3f(1, 0, 0); glVertex2f(-1, -1); - glColor3f(0, 1, 0); glVertex2f( 1, -1); - glColor3f(0, 0, 1); glVertex2f( 1, 1); - glColor3f(1, 0, 1); glVertex2f(-1, 1); - glEnd(); -} - - -/** as above, but specify color via texcoords */ -static void -DrawQuadTex(void) -{ - glBegin(GL_QUADS); - glTexCoord3f(1, 0, 0); glVertex2f(-1, -1); - glTexCoord3f(0, 1, 0); glVertex2f( 1, -1); - glTexCoord3f(0, 0, 1); glVertex2f( 1, 1); - glTexCoord3f(1, 0, 1); glVertex2f(-1, 1); - glEnd(); -} - - -static void -Redisplay(void) -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - /* render with vertex shader only */ - glUseProgram(VertProgram); - glPushMatrix(); - glTranslatef(-1.5, 0, 0); - DrawQuadTex(); - glPopMatrix(); - - /* render with fragment shader only */ - glUseProgram(FragProgram); - glPushMatrix(); - glTranslatef(+1.5, 0, 0); - DrawQuadColor(); - glPopMatrix(); - - glutSwapBuffers(); -} - - -static void -Reshape(int width, int height) -{ - glViewport(0, 0, width, height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrtho(-4, 4, -2, 2, -1, 1); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); -} - - -static void -CleanUp(void) -{ - glDeleteShader(FragShader); - glDeleteShader(VertShader); - glDeleteProgram(VertProgram); - glDeleteProgram(FragProgram); - glutDestroyWindow(Win); -} - - -static void -Key(unsigned char key, int x, int y) -{ - (void) x; - (void) y; - switch(key) { - case 27: - CleanUp(); - exit(0); - break; - } - glutPostRedisplay(); -} - - -static void -Init(void) -{ - static const char *fragShaderText = - "void main() {\n" - " gl_FragColor = gl_Color;\n" - "}\n"; - static const char *vertShaderText = - "void main() {\n" - " gl_Position = ftransform();\n" - " gl_FrontColor = gl_MultiTexCoord0;\n" /* see DrawQuadTex() */ - "}\n"; - - if (!ShadersSupported()) - exit(1); - - if (FragProgFile) - FragShader = CompileShaderFile(GL_FRAGMENT_SHADER, FragProgFile); - else - FragShader = CompileShaderText(GL_FRAGMENT_SHADER, fragShaderText); - - if (VertProgFile) - VertShader = CompileShaderFile(GL_VERTEX_SHADER, VertProgFile); - else - VertShader = CompileShaderText(GL_VERTEX_SHADER, vertShaderText); - - VertProgram = LinkShaders(VertShader, 0); - FragProgram = LinkShaders(0, FragShader); - - glClearColor(0.3f, 0.3f, 0.3f, 0.0f); - glEnable(GL_DEPTH_TEST); - - printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER)); - - assert(glIsProgram(VertProgram)); - assert(glIsProgram(FragProgram)); - assert(glIsShader(FragShader)); - assert(glIsShader(VertShader)); - - glColor3f(1, 0, 0); -} - - -static void -ParseOptions(int argc, char *argv[]) -{ - int i; - for (i = 1; i < argc; i++) { - if (strcmp(argv[i], "-fs") == 0) { - FragProgFile = argv[i+1]; - } - else if (strcmp(argv[i], "-vs") == 0) { - VertProgFile = argv[i+1]; - } - } -} - - -int -main(int argc, char *argv[]) -{ - glutInit(&argc, argv); - glutInitWindowSize(400, 200); - glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); - Win = glutCreateWindow(argv[0]); - glewInit(); - glutReshapeFunc(Reshape); - glutKeyboardFunc(Key); - glutDisplayFunc(Redisplay); - ParseOptions(argc, argv); - Init(); - glutMainLoop(); - return 0; -} diff --git a/progs/glsl/vert-tex.c b/progs/glsl/vert-tex.c deleted file mode 100644 index 2b93c788889..00000000000 --- a/progs/glsl/vert-tex.c +++ /dev/null @@ -1,267 +0,0 @@ -/** - * Vertex shader texture sampling test. - * Brian Paul - * 2 Dec 2008 - */ - -#include <assert.h> -#include <string.h> -#include <stdio.h> -#include <stdlib.h> -#include <math.h> -#include <GL/glew.h> -#include <GL/glut.h> -#include "shaderutil.h" - - -static const char *VertShaderText = - "uniform sampler2D tex1; \n" - "void main() \n" - "{ \n" - " vec4 pos = gl_Vertex; \n" - " pos.z = texture2D(tex1, gl_MultiTexCoord0.xy).x - 0.5; \n" - " gl_Position = gl_ModelViewProjectionMatrix * pos; \n" - " gl_FrontColor = pos; \n" - "} \n"; - -static const char *FragShaderText = - "void main() \n" - "{ \n" - " gl_FragColor = gl_Color; \n" - "} \n"; - - -static GLuint fragShader; -static GLuint vertShader; -static GLuint program; - -static GLint win = 0; -static GLboolean Anim = GL_TRUE; -static GLboolean WireFrame = GL_TRUE; -static GLfloat xRot = -70.0f, yRot = 0.0f, zRot = 0.0f; - -static void -Idle(void) -{ - zRot = 90 + glutGet(GLUT_ELAPSED_TIME) * 0.05; - glutPostRedisplay(); -} - - -static void -DrawMesh(void) -{ - GLfloat xmin = -2.0, xmax = 2.0; - GLfloat ymin = -2.0, ymax = 2.0; - GLuint xdivs = 20, ydivs = 20; - GLfloat dx = (xmax - xmin) / xdivs; - GLfloat dy = (ymax - ymin) / ydivs; - GLfloat ds = 1.0 / xdivs, dt = 1.0 / ydivs; - GLfloat x, y, s, t; - GLuint i, j; - - y = ymin; - t = 0.0; - for (i = 0; i < ydivs; i++) { - x = xmin; - s = 0.0; - glBegin(GL_QUAD_STRIP); - for (j = 0; j < xdivs; j++) { - glTexCoord2f(s, t); - glVertex2f(x, y); - glTexCoord2f(s, t + dt); - glVertex2f(x, y + dy); - x += dx; - s += ds; - } - glEnd(); - y += dy; - t += dt; - } -} - - -static void -Redisplay(void) -{ - if (WireFrame) - glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); - else - glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - glPushMatrix(); - glRotatef(xRot, 1.0f, 0.0f, 0.0f); - glRotatef(yRot, 0.0f, 1.0f, 0.0f); - glRotatef(zRot, 0.0f, 0.0f, 1.0f); - - glPushMatrix(); - DrawMesh(); - glPopMatrix(); - - glPopMatrix(); - - glutSwapBuffers(); -} - - -static void -Reshape(int width, int height) -{ - glViewport(0, 0, width, height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glTranslatef(0.0f, 0.0f, -15.0f); -} - - -static void -CleanUp(void) -{ - glDeleteShader(fragShader); - glDeleteShader(vertShader); - glDeleteProgram(program); - glutDestroyWindow(win); -} - - -static void -Key(unsigned char key, int x, int y) -{ - const GLfloat step = 2.0; - (void) x; - (void) y; - - switch(key) { - case 'a': - Anim = !Anim; - if (Anim) - glutIdleFunc(Idle); - else - glutIdleFunc(NULL); - break; - case 'w': - WireFrame = !WireFrame; - break; - case 'z': - zRot += step; - break; - case 'Z': - zRot -= step; - break; - case 27: - CleanUp(); - exit(0); - break; - } - glutPostRedisplay(); -} - - -static void -SpecialKey(int key, int x, int y) -{ - const GLfloat step = 2.0; - - (void) x; - (void) y; - - switch(key) { - case GLUT_KEY_UP: - xRot += step; - break; - case GLUT_KEY_DOWN: - xRot -= step; - break; - case GLUT_KEY_LEFT: - yRot -= step; - break; - case GLUT_KEY_RIGHT: - yRot += step; - break; - } - glutPostRedisplay(); -} - - -static void -MakeTexture(void) -{ - const GLuint texWidth = 64, texHeight = 64; - GLfloat texImage[64][64]; - GLuint i, j; - - /* texture is basically z = f(x, y) */ - for (i = 0; i < texHeight; i++) { - GLfloat y = 2.0 * (i / (float) (texHeight - 1)) - 1.0; - for (j = 0; j < texWidth; j++) { - GLfloat x = 2.0 * (j / (float) (texWidth - 1)) - 1.0; - GLfloat z = 0.5 + 0.5 * (sin(4.0 * x) * sin(4.0 * y)); - texImage[i][j] = z; - } - } - - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, 42); - glTexImage2D(GL_TEXTURE_2D, 0, GL_INTENSITY, texWidth, texHeight, 0, - GL_LUMINANCE, GL_FLOAT, texImage); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); -} - - -static void -Init(void) -{ - GLint m; - - glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB, &m); - if (m < 1) { - printf("Error: no vertex shader texture units supported.\n"); - exit(1); - } - - if (!ShadersSupported()) - exit(1); - - vertShader = CompileShaderText(GL_VERTEX_SHADER, VertShaderText); - fragShader = CompileShaderText(GL_FRAGMENT_SHADER, FragShaderText); - program = LinkShaders(vertShader, fragShader); - - glUseProgram(program); - - assert(glGetError() == 0); - - MakeTexture(); - - glClearColor(0.4f, 0.4f, 0.8f, 0.0f); - - glEnable(GL_DEPTH_TEST); - - glColor3f(1, 1, 1); -} - - -int -main(int argc, char *argv[]) -{ - glutInit(&argc, argv); - glutInitWindowSize(500, 500); - glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); - win = glutCreateWindow(argv[0]); - glewInit(); - glutReshapeFunc(Reshape); - glutKeyboardFunc(Key); - glutSpecialFunc(SpecialKey); - glutDisplayFunc(Redisplay); - Init(); - if (Anim) - glutIdleFunc(Idle); - glutMainLoop(); - return 0; -} - diff --git a/progs/glsl/vsraytrace.c b/progs/glsl/vsraytrace.c deleted file mode 100644 index 64d928883ed..00000000000 --- a/progs/glsl/vsraytrace.c +++ /dev/null @@ -1,401 +0,0 @@ -/* -*- mode: c; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; coding: utf-8-unix -*- */ -/* - Copyright (c) 2010 Kristóf Ralovich - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - 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 Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. -*/ - - -#include <stdio.h> -#include <stdlib.h> -#include <GL/glew.h> -#include <GL/glut.h> -#include "shaderutil.h" -#include <math.h> - -static int Win; -static int WinWidth = 256, WinHeight = 256; -static GLboolean mouseGrabbed = GL_FALSE; -static GLuint vertShader; -static GLuint program; -float rot[9] = {1,0,0, 0,1,0, 0,0,1}; - -static const char* vsSource = - "const float INF = 9999.9; \n" - "const float EPSILON = 0.00001; \n" - "const vec3 lightPos = vec3(0.0, 8.0, 1.0); \n" - "const vec4 backgroundColor = vec4(0.2,0.3,0.4,1); \n" - " \n" - "uniform mat3 rot; \n" - " \n" - "struct Ray \n" - "{ \n" - "vec3 orig; \n" - "vec3 dir; \n" - "}; \n" - " \n" - "struct Sphere \n" - "{ \n" - " vec3 c; \n" - " float r; \n" - "}; \n" - " \n" - "struct Isec \n" - "{ \n" - " float t; \n" - " int idx; \n" - " vec3 hit; \n" - " vec3 n; \n" - "}; \n" - " \n" -#ifdef __APPLE__ - "Sphere spheres0 = Sphere( vec3(0.0,0.0,-1.0), 0.5 ); \n" - "Sphere spheres1 = Sphere( vec3(-3.0,0.0,-1.0), 1.5 ); \n" - "Sphere spheres2 = Sphere( vec3(0.0,3.0,-1.0), 0.5 ); \n" - "Sphere spheres3 = Sphere( vec3(2.0,0.0,-1.0), 1.0 ); \n" -#else - "const Sphere spheres0 = Sphere( vec3(0.0,0.0,-1.0), 0.5 ); \n" - "const Sphere spheres1 = Sphere( vec3(-3.0,0.0,-1.0), 1.5 ); \n" - "const Sphere spheres2 = Sphere( vec3(0.0,3.0,-1.0), 0.5 ); \n" - "const Sphere spheres3 = Sphere( vec3(2.0,0.0,-1.0), 1.0 ); \n" -#endif - " \n" - "// Mesa intel gen4 generates \"unsupported IR in fragment shader 13\" for\n" - "// sqrt, let's work around. \n" - "float \n" - "sqrt_hack(float f2) \n" - "{ \n" - " vec3 v = vec3(f2,0.0,0.0); \n" - " return length(v); \n" - "} \n" - " \n" - "void \n" - "intersect(const in Ray ray, \n" - " const in Sphere sph, \n" - " const in int idx, \n" - " inout Isec isec) \n" - "{ \n" - " // Project both o and the sphere to the plane perpendicular to d \n" - " // and containing c. Let x be the point where the ray intersects \n" - " // the plane. If |x-c| < r, the ray intersects the sphere. \n" - " vec3 o = ray.orig; \n" - " vec3 d = ray.dir; \n" - " vec3 n = -d; \n" - " vec3 c = sph.c; \n" - " float r = sph.r; \n" - " float t = dot(c-o,n)/dot(n,d); \n" - " vec3 x = o+d*t; \n" - " float e = length(x-c); \n" - " if(e > r) \n" - " { \n" - " // no intersection \n" - " return; \n" - " } \n" - " \n" - " // Apply Pythagorean theorem on the (intersection,x,c) triangle \n" - " // to get the distance between c and the intersection. \n" - "#define BUGGY_INTEL_GEN4_GLSL 1 \n" - "#ifndef BUGGY_INTEL_GEN4_GLSL \n" - " float f = sqrt(r*r - e*e); \n" - "#else \n" - " float f = sqrt_hack(r*r - e*e); \n" - "#endif \n" - " float dist = t - f; \n" - " if(dist < 0.0) \n" - " { \n" - " // inside the sphere \n" - " return; \n" - " } \n" - " \n" - " if(dist < EPSILON) \n" - " return; \n" - " \n" - " if(dist > isec.t) \n" - " return; \n" - " \n" - " isec.t = dist; \n" - " isec.idx = idx; \n" - " \n" - " isec.hit = ray.orig + ray.dir * isec.t; \n" - " isec.n = (isec.hit - c) / r; \n" - "} \n" - " \n" - "Isec \n" - "intersect(const in Ray ray, \n" - " const in float max_t /*= INF*/) \n" - "{ \n" - " Isec nearest; \n" - " nearest.t = max_t; \n" - " nearest.idx = -1; \n" - " \n" - " intersect(ray, spheres0, 0, nearest); \n" - " intersect(ray, spheres1, 1, nearest); \n" - " intersect(ray, spheres2, 2, nearest); \n" - " intersect(ray, spheres3, 3, nearest); \n" - " \n" - " return nearest; \n" - "} \n" - " \n" - "vec4 \n" - "idx2color(const in int idx) \n" - "{ \n" - " vec4 diff; \n" - " if(idx == 0) \n" - " diff = vec4(1.0, 0.0, 0.0, 0.0); \n" - " else if(idx == 1) \n" - " diff = vec4(0.0, 1.0, 0.0, 0.0); \n" - " else if(idx == 2) \n" - " diff = vec4(0.0, 0.0, 1.0, 0.0); \n" - " else if(idx == 3) \n" - " diff = vec4(1.0, 1.0, 0.0, 0.0); \n" - " return diff; \n" - "} \n" - " \n" - "vec4 \n" - "trace0(const in Ray ray) \n" - "{ \n" - " Isec isec = intersect(ray, INF); \n" - " \n" - " if(isec.idx == -1) \n" - " { \n" - " return backgroundColor; \n" - " } \n" - " \n" - " vec4 diff = idx2color(isec.idx); \n" - " \n" - " vec3 N = isec.n; \n" - " vec3 L = normalize(lightPos-isec.hit); \n" - " vec3 camera_dir = normalize(ray.orig - isec.hit); \n" - " return dot(N,L)*diff + pow( \n" - " clamp(dot(reflect(-L,N),camera_dir),0.0,1.0),16.0); \n" - "} \n" - " \n" - "vec4 \n" - "trace1(const in Ray ray) \n" - "{ \n" - " Isec isec = intersect(ray, INF); \n" - " \n" - " if(isec.idx == -1) \n" - " { \n" - " return backgroundColor; \n" - " } \n" - " \n" - " Ray reflRay = Ray(isec.hit, reflect(ray.dir, isec.n)); \n" - " \n" - " vec4 reflCol = trace0(reflRay); \n" - " \n" - " vec4 diff = idx2color(isec.idx) + reflCol; \n" - " \n" - " vec3 N = isec.n; \n" - " vec3 L = normalize(lightPos-isec.hit); \n" - " vec3 camera_dir = normalize(ray.orig - isec.hit); \n" - " return dot(N,L)*diff + pow( \n" - " clamp(dot(reflect(-L,N),camera_dir),0.0,1.0),16.0); \n" - "} \n" - " \n" - "void main() \n" - "{ \n" - " const vec3 cameraPos = vec3(0,0,3); \n" - " vec3 rayDir = normalize(vec3(gl_Vertex.x, gl_Vertex.y, -1.0) * rot);\n" - " Ray ray = Ray(cameraPos, rayDir); \n" - " gl_Position = gl_Vertex; \n" - " gl_FrontColor = trace1(ray); \n" - "}\n"; - - -static -float -deg2rad(const float degree) -{ - return( degree * 0.017453292519943295769236907684886F); -} - -static void -rotate_xy(float* mat3, const float degreesAroundX, const float degreesAroundY) -{ - const float rad1 = deg2rad(degreesAroundX); - const float c1 = cosf(rad1); - const float s1 = sinf(rad1); - const float rad2 = deg2rad(degreesAroundY); - const float c2 = cosf(rad2); - const float s2 = sinf(rad2); - mat3[0] = c2; mat3[3] = 0.0F; mat3[6] = s2; - mat3[1] = s1*s2; mat3[4] = c1; mat3[7] = -s1*c2; - mat3[2] = -c1*s2;mat3[5] = s1; mat3[8] = c1*c2; -} - -static void -identity(float* mat3) -{ - mat3[0] = 1.0F; mat3[3] = 0.0F; mat3[6] = 0.0F; - mat3[1] = 0.0F; mat3[4] = 1.0F; mat3[7] = 0.0F; - mat3[2] = 0.0F; mat3[5] = 0.0F; mat3[8] = 1.0F; -} - -static void -Draw(void) -{ - const float w = 0.5F * WinWidth; - const float h = 0.5F * WinHeight; - int x,y; - - GLint location = glGetUniformLocation(program, "rot"); - - glUseProgram(program); - glUniformMatrix3fv(location, 1, 0, rot); - glBegin(GL_POINTS); - for(y = 0; y < WinHeight; y++) - { - for(x = 0; x < WinWidth; x++) - { - const float posx = x / w - 1.0F; - const float posy = y / h - 1.0F; - glVertex2f(posx, posy); - } - } - glEnd(); - glUseProgram(0); - - glutSwapBuffers(); - - { - static int frames = 0; - static int t0 = 0; - static int t1 = 0; - float dt; - frames++; - t1 = glutGet(GLUT_ELAPSED_TIME); - dt = (float)(t1-t0)/1000.0F; - if (dt >= 5.0F) - { - float fps = (float)frames / dt; - printf("%f FPS (%d frames in %f seconds)\n", fps, frames, dt); - frames = 0; - t0 = t1; - } - } -} - - -static void -Reshape(int width, int height) -{ - WinWidth = width; - WinHeight = height; - glViewport(0, 0, width, height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); -} - - -static void -Key(unsigned char key, int x, int y) -{ - if(key == 27) - { - glutDestroyWindow(Win); - exit(0); - } - glutPostRedisplay(); -} - - -static -void -drag(int x, int y) -{ - float scale = 1.5F; - if(mouseGrabbed) - { - static GLfloat xRot = 0, yRot = 0; - xRot = (float)(x - WinWidth/2) / scale; - yRot = (float)(y - WinHeight/2) / scale; - identity(rot); - rotate_xy(rot, yRot, xRot); - glutPostRedisplay(); - } -} - - -static -void -mouse(int button, int state, int x, int y) -{ - mouseGrabbed = (state == GLUT_DOWN); -} - - -static void -Init(void) -{ - glDisable(GL_DEPTH_TEST); - - if(!ShadersSupported()) - { - fprintf(stderr, "Shaders are not supported!\n"); - exit(-1); - } - - vertShader = CompileShaderText(GL_VERTEX_SHADER, vsSource); - program = LinkShaders(vertShader, 0); - glUseProgram(0); - - if(glGetError() != 0) - { - fprintf(stderr, "Shaders were not loaded!\n"); - exit(-1); - } - - if(!glIsShader(vertShader)) - { - fprintf(stderr, "Vertex shader failed!\n"); - exit(-1); - } - - if(!glIsProgram(program)) - { - fprintf(stderr, "Shader program failed!\n"); - exit(-1); - } - - printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER)); -} - - -int -main(int argc, char *argv[]) -{ - glutInitWindowSize(WinWidth, WinHeight); - glutInit(&argc, argv); - glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); - Win = glutCreateWindow(argv[0]); - glewInit(); - glutReshapeFunc(Reshape); - glutKeyboardFunc(Key); - glutDisplayFunc(Draw); - glutIdleFunc(Draw); - glutMouseFunc(mouse); - glutMotionFunc(drag); - Init(); - glutMainLoop(); - return 0; -} - |