ruby-glfw 0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README +1 -0
- data/README.API +73 -0
- data/Rakefile +120 -0
- data/examples/boing.rb +519 -0
- data/examples/gears.rb +327 -0
- data/examples/keytest.rb +117 -0
- data/examples/listmodes.rb +20 -0
- data/examples/mipmaps.rb +104 -0
- data/examples/mipmaps.tga +0 -0
- data/examples/particles.rb +837 -0
- data/examples/pong3d.rb +741 -0
- data/examples/pong3d_field.tga +0 -0
- data/examples/pong3d_instr.tga +0 -0
- data/examples/pong3d_menu.tga +0 -0
- data/examples/pong3d_title.tga +0 -0
- data/examples/pong3d_winner1.tga +0 -0
- data/examples/pong3d_winner2.tga +0 -0
- data/examples/splitview.rb +432 -0
- data/examples/triangle.rb +89 -0
- data/examples/wave.rb +294 -0
- data/ext/glfw/glfw.c +1094 -0
- data/ext/glfw/mkrf_conf.rb +70 -0
- data/glfw-src/Makefile +220 -0
- data/glfw-src/compile.ami +61 -0
- data/glfw-src/compile.bat +217 -0
- data/glfw-src/compile.sh +607 -0
- data/glfw-src/docs/Makefile +57 -0
- data/glfw-src/docs/Reference.pdf +0 -0
- data/glfw-src/docs/UsersGuide.pdf +0 -0
- data/glfw-src/docs/cleanup.bat +22 -0
- data/glfw-src/docs/glfwdoc.sty +80 -0
- data/glfw-src/docs/glfwrm.tex +3034 -0
- data/glfw-src/docs/glfwug.tex +2024 -0
- data/glfw-src/docs/readme.txt +80 -0
- data/glfw-src/examples/Makefile.amigaos.gcc +70 -0
- data/glfw-src/examples/Makefile.amigaos.vbcc +70 -0
- data/glfw-src/examples/Makefile.dos.djgpp +71 -0
- data/glfw-src/examples/Makefile.macosx.gcc +96 -0
- data/glfw-src/examples/Makefile.win32.bcc +75 -0
- data/glfw-src/examples/Makefile.win32.cross-mgw +79 -0
- data/glfw-src/examples/Makefile.win32.cygwin +79 -0
- data/glfw-src/examples/Makefile.win32.lcc +74 -0
- data/glfw-src/examples/Makefile.win32.mgw +75 -0
- data/glfw-src/examples/Makefile.win32.msvc +74 -0
- data/glfw-src/examples/Makefile.win32.ow +74 -0
- data/glfw-src/examples/Makefile.win32.pellesc +74 -0
- data/glfw-src/examples/Makefile.x11.in +54 -0
- data/glfw-src/examples/boing.c +606 -0
- data/glfw-src/examples/bundle.sh +46 -0
- data/glfw-src/examples/gears.c +382 -0
- data/glfw-src/examples/keytest.c +264 -0
- data/glfw-src/examples/listmodes.c +48 -0
- data/glfw-src/examples/mipmaps.c +126 -0
- data/glfw-src/examples/mipmaps.tga +0 -0
- data/glfw-src/examples/mtbench.c +301 -0
- data/glfw-src/examples/mthello.c +48 -0
- data/glfw-src/examples/particles.c +1148 -0
- data/glfw-src/examples/pong3d.c +839 -0
- data/glfw-src/examples/pong3d_field.tga +0 -0
- data/glfw-src/examples/pong3d_instr.tga +0 -0
- data/glfw-src/examples/pong3d_menu.tga +0 -0
- data/glfw-src/examples/pong3d_title.tga +0 -0
- data/glfw-src/examples/pong3d_winner1.tga +0 -0
- data/glfw-src/examples/pong3d_winner2.tga +0 -0
- data/glfw-src/examples/splitview.c +506 -0
- data/glfw-src/examples/triangle.c +108 -0
- data/glfw-src/examples/wave.c +397 -0
- data/glfw-src/images/opengl.gif +0 -0
- data/glfw-src/images/osicert.gif +0 -0
- data/glfw-src/include/GL/glfw.h +486 -0
- data/glfw-src/lib/amigaos/Makefile.amigaos.gcc +128 -0
- data/glfw-src/lib/amigaos/Makefile.amigaos.vbcc +128 -0
- data/glfw-src/lib/amigaos/SDI_compiler.h +94 -0
- data/glfw-src/lib/amigaos/amigaos_enable.c +51 -0
- data/glfw-src/lib/amigaos/amigaos_fullscreen.c +319 -0
- data/glfw-src/lib/amigaos/amigaos_glext.c +61 -0
- data/glfw-src/lib/amigaos/amigaos_init.c +284 -0
- data/glfw-src/lib/amigaos/amigaos_joystick.c +359 -0
- data/glfw-src/lib/amigaos/amigaos_thread.c +494 -0
- data/glfw-src/lib/amigaos/amigaos_time.c +206 -0
- data/glfw-src/lib/amigaos/amigaos_window.c +830 -0
- data/glfw-src/lib/amigaos/platform.h +337 -0
- data/glfw-src/lib/dos/Makefile.dos.djgpp +146 -0
- data/glfw-src/lib/dos/dos_enable.c +51 -0
- data/glfw-src/lib/dos/dos_events.c +173 -0
- data/glfw-src/lib/dos/dos_fullscreen.c +101 -0
- data/glfw-src/lib/dos/dos_glext.c +59 -0
- data/glfw-src/lib/dos/dos_init.c +105 -0
- data/glfw-src/lib/dos/dos_irq.s +246 -0
- data/glfw-src/lib/dos/dos_joystick.c +94 -0
- data/glfw-src/lib/dos/dos_keyboard.c +694 -0
- data/glfw-src/lib/dos/dos_mouse.c +337 -0
- data/glfw-src/lib/dos/dos_thread.c +267 -0
- data/glfw-src/lib/dos/dos_time.c +309 -0
- data/glfw-src/lib/dos/dos_window.c +563 -0
- data/glfw-src/lib/dos/platform.h +341 -0
- data/glfw-src/lib/enable.c +295 -0
- data/glfw-src/lib/fullscreen.c +95 -0
- data/glfw-src/lib/glext.c +201 -0
- data/glfw-src/lib/image.c +629 -0
- data/glfw-src/lib/init.c +108 -0
- data/glfw-src/lib/input.c +280 -0
- data/glfw-src/lib/internal.h +210 -0
- data/glfw-src/lib/joystick.c +101 -0
- data/glfw-src/lib/macosx/Makefile.macosx.gcc +172 -0
- data/glfw-src/lib/macosx/Makefile.macosx.gcc.universal +166 -0
- data/glfw-src/lib/macosx/libglfw.pc.in +11 -0
- data/glfw-src/lib/macosx/macosx_enable.c +42 -0
- data/glfw-src/lib/macosx/macosx_fullscreen.c +126 -0
- data/glfw-src/lib/macosx/macosx_glext.c +52 -0
- data/glfw-src/lib/macosx/macosx_init.c +194 -0
- data/glfw-src/lib/macosx/macosx_joystick.c +50 -0
- data/glfw-src/lib/macosx/macosx_thread.c +414 -0
- data/glfw-src/lib/macosx/macosx_time.c +112 -0
- data/glfw-src/lib/macosx/macosx_window.c +1279 -0
- data/glfw-src/lib/macosx/platform.h +349 -0
- data/glfw-src/lib/stream.c +194 -0
- data/glfw-src/lib/tga.c +405 -0
- data/glfw-src/lib/thread.c +340 -0
- data/glfw-src/lib/time.c +83 -0
- data/glfw-src/lib/win32/Makefile.win32.bcc +265 -0
- data/glfw-src/lib/win32/Makefile.win32.cross-mgw +274 -0
- data/glfw-src/lib/win32/Makefile.win32.cygwin +279 -0
- data/glfw-src/lib/win32/Makefile.win32.lcc +246 -0
- data/glfw-src/lib/win32/Makefile.win32.mgw +243 -0
- data/glfw-src/lib/win32/Makefile.win32.msvc +242 -0
- data/glfw-src/lib/win32/Makefile.win32.ow +242 -0
- data/glfw-src/lib/win32/Makefile.win32.pellesc +242 -0
- data/glfw-src/lib/win32/glfwdll.def +67 -0
- data/glfw-src/lib/win32/glfwdll_mgw1.def +67 -0
- data/glfw-src/lib/win32/glfwdll_mgw2.def +67 -0
- data/glfw-src/lib/win32/glfwdll_pellesc.def +65 -0
- data/glfw-src/lib/win32/libglfw.pc.in +11 -0
- data/glfw-src/lib/win32/platform.h +474 -0
- data/glfw-src/lib/win32/win32_dllmain.c +60 -0
- data/glfw-src/lib/win32/win32_enable.c +155 -0
- data/glfw-src/lib/win32/win32_fullscreen.c +317 -0
- data/glfw-src/lib/win32/win32_glext.c +85 -0
- data/glfw-src/lib/win32/win32_init.c +356 -0
- data/glfw-src/lib/win32/win32_joystick.c +234 -0
- data/glfw-src/lib/win32/win32_thread.c +511 -0
- data/glfw-src/lib/win32/win32_time.c +146 -0
- data/glfw-src/lib/win32/win32_window.c +1714 -0
- data/glfw-src/lib/window.c +727 -0
- data/glfw-src/lib/x11/Makefile.x11.in +243 -0
- data/glfw-src/lib/x11/platform.h +415 -0
- data/glfw-src/lib/x11/x11_enable.c +51 -0
- data/glfw-src/lib/x11/x11_fullscreen.c +524 -0
- data/glfw-src/lib/x11/x11_glext.c +69 -0
- data/glfw-src/lib/x11/x11_init.c +275 -0
- data/glfw-src/lib/x11/x11_joystick.c +371 -0
- data/glfw-src/lib/x11/x11_keysym2unicode.c +902 -0
- data/glfw-src/lib/x11/x11_thread.c +507 -0
- data/glfw-src/lib/x11/x11_time.c +154 -0
- data/glfw-src/lib/x11/x11_window.c +1746 -0
- data/glfw-src/license.txt +21 -0
- data/glfw-src/readme.html +927 -0
- data/glfw-src/support/d/examples/Makefile +59 -0
- data/glfw-src/support/d/examples/boing.d +610 -0
- data/glfw-src/support/d/examples/gears.d +379 -0
- data/glfw-src/support/d/examples/keytest.d +272 -0
- data/glfw-src/support/d/examples/listmodes.d +48 -0
- data/glfw-src/support/d/examples/mipmaps.d +126 -0
- data/glfw-src/support/d/examples/mtbench.d +304 -0
- data/glfw-src/support/d/examples/mthello.d +54 -0
- data/glfw-src/support/d/examples/particles.d +1150 -0
- data/glfw-src/support/d/examples/pong3d.d +840 -0
- data/glfw-src/support/d/examples/splitview.d +486 -0
- data/glfw-src/support/d/examples/triangle.d +108 -0
- data/glfw-src/support/d/examples/wave.d +400 -0
- data/glfw-src/support/d/imports/gl.d +4539 -0
- data/glfw-src/support/d/imports/glfw.d +349 -0
- data/glfw-src/support/d/imports/glu.d +328 -0
- data/glfw-src/support/d/lib/glfwdll.def +64 -0
- data/glfw-src/support/d/lib/glu32.def +56 -0
- data/glfw-src/support/d/lib/makefile +12 -0
- data/glfw-src/support/d/lib/opengl32.def +372 -0
- data/glfw-src/support/d/readme.html +83 -0
- data/glfw-src/support/delphi/examples/Triangle.dpr +105 -0
- data/glfw-src/support/delphi/lib/glfw.pas +437 -0
- data/glfw-src/support/delphi/readme.html +97 -0
- data/glfw-src/support/lua/examples/gears.lua +383 -0
- data/glfw-src/support/lua/examples/test1.lua +68 -0
- data/glfw-src/support/lua/readme.html +128 -0
- data/glfw-src/support/lua/src/luaglfw.c +1179 -0
- data/glfw-src/support/lua/src/luaglfw.h +48 -0
- data/glfw-src/support/lua/src/runlua.c +82 -0
- data/glfw-src/support/masm/examples/fpc.mac +47 -0
- data/glfw-src/support/masm/examples/makeit.bat +66 -0
- data/glfw-src/support/masm/examples/triangle.asm +232 -0
- data/glfw-src/support/masm/include/glfw.inc +326 -0
- data/glfw-src/support/masm/include/glu32.inc +55 -0
- data/glfw-src/support/masm/include/opengl32.inc +372 -0
- data/glfw-src/support/masm/lib/glfwdll.lib +0 -0
- data/glfw-src/support/masm/readme.html +170 -0
- data/glfw-src/support/msvc80/GLFW.sln +26 -0
- data/glfw-src/support/msvc80/GLFW.vcproj +257 -0
- data/glfw-src/support/msvc80/GLFWDLL.vcproj +287 -0
- data/glfw-src/support/visualbasic/bindings/glfw.bas +320 -0
- data/glfw-src/support/visualbasic/bindings/glu32.bas +284 -0
- data/glfw-src/support/visualbasic/bindings/opengl32.bas +999 -0
- data/glfw-src/support/visualbasic/examples/Triangle.bas +101 -0
- data/glfw-src/support/visualbasic/readme.html +164 -0
- data/website/index.html +84 -0
- data/website/style.css +110 -0
- metadata +301 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
//========================================================================
|
|
2
|
+
// This is a small test application for GLFW.
|
|
3
|
+
// The program opens a window (640x480), and renders a spinning colored
|
|
4
|
+
// triangle (it is controlled with both the GLFW timer and the mouse). It
|
|
5
|
+
// also calculates the rendering speed (FPS), which is displayed in the
|
|
6
|
+
// window title bar.
|
|
7
|
+
//========================================================================
|
|
8
|
+
|
|
9
|
+
import std.string;
|
|
10
|
+
import glfw;
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
//========================================================================
|
|
14
|
+
// main()
|
|
15
|
+
//========================================================================
|
|
16
|
+
|
|
17
|
+
int main()
|
|
18
|
+
{
|
|
19
|
+
int width, height, running, frames, x, y;
|
|
20
|
+
double t, t0, fps;
|
|
21
|
+
char[] titlestr;
|
|
22
|
+
|
|
23
|
+
// Initialise GLFW
|
|
24
|
+
glfwInit();
|
|
25
|
+
|
|
26
|
+
// Open OpenGL window
|
|
27
|
+
if( !glfwOpenWindow( 640, 480, 0,0,0,0, 0,0, GLFW_WINDOW ) )
|
|
28
|
+
{
|
|
29
|
+
glfwTerminate();
|
|
30
|
+
return 0;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Enable sticky keys
|
|
34
|
+
glfwEnable( GLFW_STICKY_KEYS );
|
|
35
|
+
|
|
36
|
+
// Disable vertical sync (on cards that support it)
|
|
37
|
+
glfwSwapInterval( 0 );
|
|
38
|
+
|
|
39
|
+
// Main loop
|
|
40
|
+
running = GL_TRUE;
|
|
41
|
+
frames = 0;
|
|
42
|
+
t0 = glfwGetTime();
|
|
43
|
+
while( running )
|
|
44
|
+
{
|
|
45
|
+
// Get time and mouse position
|
|
46
|
+
t = glfwGetTime();
|
|
47
|
+
glfwGetMousePos( &x, &y );
|
|
48
|
+
|
|
49
|
+
// Calculate and display FPS (frames per second)
|
|
50
|
+
if( (t-t0) > 1.0 || frames == 0 )
|
|
51
|
+
{
|
|
52
|
+
fps = cast(double)frames / (t-t0);
|
|
53
|
+
titlestr = "Spinning Triangle (" ~ toString(fps) ~ " FPS)\0";
|
|
54
|
+
glfwSetWindowTitle( titlestr );
|
|
55
|
+
t0 = t;
|
|
56
|
+
frames = 0;
|
|
57
|
+
}
|
|
58
|
+
frames ++;
|
|
59
|
+
|
|
60
|
+
// Get window size (may be different than the requested size)
|
|
61
|
+
glfwGetWindowSize( &width, &height );
|
|
62
|
+
height = height > 0 ? height : 1;
|
|
63
|
+
|
|
64
|
+
// Set viewport
|
|
65
|
+
glViewport( 0, 0, width, height );
|
|
66
|
+
|
|
67
|
+
// Clear color buffer
|
|
68
|
+
glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
|
|
69
|
+
glClear( GL_COLOR_BUFFER_BIT );
|
|
70
|
+
|
|
71
|
+
// Select and setup the projection matrix
|
|
72
|
+
glMatrixMode( GL_PROJECTION );
|
|
73
|
+
glLoadIdentity();
|
|
74
|
+
gluPerspective( 65.0f, cast(GLfloat)width/cast(GLfloat)height, 1.0f,
|
|
75
|
+
100.0f );
|
|
76
|
+
|
|
77
|
+
// Select and setup the modelview matrix
|
|
78
|
+
glMatrixMode( GL_MODELVIEW );
|
|
79
|
+
glLoadIdentity();
|
|
80
|
+
gluLookAt( 0.0f, 1.0f, 0.0f, // Eye-position
|
|
81
|
+
0.0f, 20.0f, 0.0f, // View-point
|
|
82
|
+
0.0f, 0.0f, 1.0f ); // Up-vector
|
|
83
|
+
|
|
84
|
+
// Draw a rotating colorful triangle
|
|
85
|
+
glTranslatef( 0.0f, 14.0f, 0.0f );
|
|
86
|
+
glRotatef( 0.3*cast(GLfloat)x + cast(GLfloat)t*100.0f, 0.0f, 0.0f, 1.0f );
|
|
87
|
+
glBegin( GL_TRIANGLES );
|
|
88
|
+
glColor3f( 1.0f, 0.0f, 0.0f );
|
|
89
|
+
glVertex3f( -5.0f, 0.0f, -4.0f );
|
|
90
|
+
glColor3f( 0.0f, 1.0f, 0.0f );
|
|
91
|
+
glVertex3f( 5.0f, 0.0f, -4.0f );
|
|
92
|
+
glColor3f( 0.0f, 0.0f, 1.0f );
|
|
93
|
+
glVertex3f( 0.0f, 0.0f, 6.0f );
|
|
94
|
+
glEnd();
|
|
95
|
+
|
|
96
|
+
// Swap buffers
|
|
97
|
+
glfwSwapBuffers();
|
|
98
|
+
|
|
99
|
+
// Check if the ESC key was pressed or the window was closed
|
|
100
|
+
running = !glfwGetKey( GLFW_KEY_ESC ) &&
|
|
101
|
+
glfwGetWindowParam( GLFW_OPENED );
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Close OpenGL window and terminate GLFW
|
|
105
|
+
glfwTerminate();
|
|
106
|
+
|
|
107
|
+
return 0;
|
|
108
|
+
}
|
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
/*****************************************************************************
|
|
2
|
+
* Wave Simulation in OpenGL
|
|
3
|
+
* (C) 2002 Jakob Thomsen
|
|
4
|
+
* http://home.in.tum.de/~thomsen
|
|
5
|
+
* Modified for GLFW by Sylvain Hellegouarch - sh@programmationworld.com
|
|
6
|
+
* Modified for variable frame rate by Marcus Geelnard
|
|
7
|
+
* 2003-Jan-31: Minor cleanups and speedups / MG
|
|
8
|
+
*****************************************************************************/
|
|
9
|
+
|
|
10
|
+
import glfw;
|
|
11
|
+
import std.math;
|
|
12
|
+
import std.c.stdlib;
|
|
13
|
+
import std.c.stdio;
|
|
14
|
+
|
|
15
|
+
/* Maximum delta T to allow for differential calculations */
|
|
16
|
+
const float MAX_DELTA_T = 0.01;
|
|
17
|
+
|
|
18
|
+
/* Animation speed (10.0 looks good) */
|
|
19
|
+
const float ANIMATION_SPEED = 10.0;
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
GLfloat alpha = 210.0f, beta = -70.0f;
|
|
23
|
+
GLfloat zoom = 2.0f;
|
|
24
|
+
|
|
25
|
+
int running = 1;
|
|
26
|
+
|
|
27
|
+
struct Vertex
|
|
28
|
+
{
|
|
29
|
+
GLfloat x,y,z;
|
|
30
|
+
GLfloat r,g,b;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const int GRIDW = 50;
|
|
34
|
+
const int GRIDH = 50;
|
|
35
|
+
const int VERTEXNUM = (GRIDW*GRIDH);
|
|
36
|
+
|
|
37
|
+
const int QUADW = (GRIDW-1);
|
|
38
|
+
const int QUADH = (GRIDH-1);
|
|
39
|
+
const int QUADNUM = (QUADW*QUADH);
|
|
40
|
+
|
|
41
|
+
GLuint quad[4*QUADNUM];
|
|
42
|
+
Vertex vertex[VERTEXNUM];
|
|
43
|
+
|
|
44
|
+
/* The grid will look like this:
|
|
45
|
+
*
|
|
46
|
+
* 3 4 5
|
|
47
|
+
* *---*---*
|
|
48
|
+
* | | |
|
|
49
|
+
* | 0 | 1 |
|
|
50
|
+
* | | |
|
|
51
|
+
* *---*---*
|
|
52
|
+
* 0 1 2
|
|
53
|
+
*/
|
|
54
|
+
|
|
55
|
+
void initVertices( )
|
|
56
|
+
{
|
|
57
|
+
int x,y,p;
|
|
58
|
+
|
|
59
|
+
/* place the vertices in a grid */
|
|
60
|
+
for(y=0;y<GRIDH;y++)
|
|
61
|
+
for(x=0;x<GRIDW;x++)
|
|
62
|
+
{
|
|
63
|
+
p = y*GRIDW + x;
|
|
64
|
+
|
|
65
|
+
//vertex[p].x = (-GRIDW/2)+x+sin(2.0*M_PI*(double)y/(double)GRIDH);
|
|
66
|
+
//vertex[p].y = (-GRIDH/2)+y+cos(2.0*M_PI*(double)x/(double)GRIDW);
|
|
67
|
+
vertex[p].x = cast(GLfloat)(x-GRIDW/2)/cast(GLfloat)(GRIDW/2);
|
|
68
|
+
vertex[p].y = cast(GLfloat)(y-GRIDH/2)/cast(GLfloat)(GRIDH/2);
|
|
69
|
+
vertex[p].z = 0;//sin(d*M_PI);
|
|
70
|
+
//vertex[p].r = (GLfloat)x/(GLfloat)GRIDW;
|
|
71
|
+
//vertex[p].g = (GLfloat)y/(GLfloat)GRIDH;
|
|
72
|
+
//vertex[p].b = 1.0-((GLfloat)x/(GLfloat)GRIDW+(GLfloat)y/(GLfloat)GRIDH)/2.0;
|
|
73
|
+
if((x%4<2)^(y%4<2))
|
|
74
|
+
{
|
|
75
|
+
vertex[p].r = 0.0;
|
|
76
|
+
}
|
|
77
|
+
else
|
|
78
|
+
{
|
|
79
|
+
vertex[p].r=1.0;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
vertex[p].g = cast(GLfloat)y/cast(GLfloat)GRIDH;
|
|
83
|
+
vertex[p].b = 1.0-(cast(GLfloat)x/cast(GLfloat)GRIDW+cast(GLfloat)y/cast(GLfloat)GRIDH)/2.0;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
for(y=0;y<QUADH;y++)
|
|
87
|
+
for(x=0;x<QUADW;x++)
|
|
88
|
+
{
|
|
89
|
+
p = 4*(y*QUADW + x);
|
|
90
|
+
|
|
91
|
+
/* first quad */
|
|
92
|
+
quad[p+0] = y *GRIDW+x; /* some point */
|
|
93
|
+
quad[p+1] = y *GRIDW+x+1; /* neighbor at the right side */
|
|
94
|
+
quad[p+2] = (y+1)*GRIDW+x+1; /* upper right neighbor */
|
|
95
|
+
quad[p+3] = (y+1)*GRIDW+x; /* upper neighbor */
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
double dt;
|
|
100
|
+
double p[GRIDW][GRIDH];
|
|
101
|
+
double vx[GRIDW][GRIDH];
|
|
102
|
+
double vy[GRIDW][GRIDH];
|
|
103
|
+
double ax[GRIDW][GRIDH];
|
|
104
|
+
double ay[GRIDW][GRIDH];
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
void initSurface( )
|
|
109
|
+
{
|
|
110
|
+
int x, y;
|
|
111
|
+
double dx, dy, d;
|
|
112
|
+
|
|
113
|
+
for(y = 0; y<GRIDH; y++)
|
|
114
|
+
{
|
|
115
|
+
for(x = 0; x<GRIDW; x++)
|
|
116
|
+
{
|
|
117
|
+
dx = cast(double)(x-GRIDW/2);
|
|
118
|
+
dy = cast(double)(y-GRIDH/2);
|
|
119
|
+
d = sqrt( dx*dx + dy*dy );
|
|
120
|
+
if(d < 0.1 * cast(double)(GRIDW/2))
|
|
121
|
+
{
|
|
122
|
+
d = d * 10.0;
|
|
123
|
+
p[x][y] = -cos(d * (PI / cast(double)(GRIDW * 4))) * 100.0;
|
|
124
|
+
}
|
|
125
|
+
else
|
|
126
|
+
{
|
|
127
|
+
p[x][y] = 0.0;
|
|
128
|
+
}
|
|
129
|
+
vx[x][y] = 0.0;
|
|
130
|
+
vy[x][y] = 0.0;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
/* Draw view */
|
|
137
|
+
void draw_screen( )
|
|
138
|
+
{
|
|
139
|
+
/* Clear the color and depth buffers. */
|
|
140
|
+
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
|
141
|
+
|
|
142
|
+
/* We don't want to modify the projection matrix. */
|
|
143
|
+
glMatrixMode(GL_MODELVIEW);
|
|
144
|
+
glLoadIdentity();
|
|
145
|
+
|
|
146
|
+
/* Move back. */
|
|
147
|
+
glTranslatef(0.0, 0.0, -zoom);
|
|
148
|
+
/* Rotate the view */
|
|
149
|
+
glRotatef(beta, 1.0, 0.0, 0.0);
|
|
150
|
+
glRotatef(alpha, 0.0, 0.0, 1.0);
|
|
151
|
+
|
|
152
|
+
//glDrawArrays(GL_POINTS,0,VERTEXNUM); /* Points only */
|
|
153
|
+
glDrawElements(GL_QUADS, 4*QUADNUM, GL_UNSIGNED_INT, quad);
|
|
154
|
+
//glDrawElements(GL_LINES, QUADNUM, GL_UNSIGNED_INT, quad);
|
|
155
|
+
|
|
156
|
+
glfwSwapBuffers();
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
/* Initialize OpenGL */
|
|
161
|
+
void setup_opengl( )
|
|
162
|
+
{
|
|
163
|
+
/* Our shading model--Gouraud (smooth). */
|
|
164
|
+
glShadeModel(GL_SMOOTH);
|
|
165
|
+
|
|
166
|
+
/* Culling. */
|
|
167
|
+
//glCullFace(GL_BACK);
|
|
168
|
+
//glFrontFace(GL_CCW);
|
|
169
|
+
//glEnable(GL_CULL_FACE);
|
|
170
|
+
|
|
171
|
+
/* Switch on the z-buffer. */
|
|
172
|
+
glEnable(GL_DEPTH_TEST);
|
|
173
|
+
|
|
174
|
+
glEnableClientState(GL_VERTEX_ARRAY);
|
|
175
|
+
glEnableClientState(GL_COLOR_ARRAY);
|
|
176
|
+
glVertexPointer(3/*3 components per vertex (x,y,z)*/, GL_FLOAT, Vertex.sizeof, vertex);
|
|
177
|
+
glColorPointer(3/*3 components per vertex (r,g,b)*/, GL_FLOAT, Vertex.sizeof, &vertex[0].r); //Pointer to the first color
|
|
178
|
+
glPointSize(2.0);
|
|
179
|
+
|
|
180
|
+
/* Background color is black. */
|
|
181
|
+
glClearColor(0, 0, 0, 0);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
/* Modify the height of each vertex according to the pressure. */
|
|
186
|
+
void adjustGrid( )
|
|
187
|
+
{
|
|
188
|
+
int pos;
|
|
189
|
+
int x, y;
|
|
190
|
+
|
|
191
|
+
for(y = 0; y<GRIDH; y++)
|
|
192
|
+
{
|
|
193
|
+
for(x = 0; x<GRIDW; x++)
|
|
194
|
+
{
|
|
195
|
+
pos = y*GRIDW + x;
|
|
196
|
+
vertex[pos].z = cast(float) (p[x][y]*(1.0/50.0));
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
/* Calculate wave propagation */
|
|
203
|
+
void calc( )
|
|
204
|
+
{
|
|
205
|
+
int x, y, x2, y2;
|
|
206
|
+
double time_step = dt * ANIMATION_SPEED;
|
|
207
|
+
|
|
208
|
+
/* compute accelerations */
|
|
209
|
+
for(x = 0; x < GRIDW; x++)
|
|
210
|
+
{
|
|
211
|
+
x2 = (x + 1) % GRIDW;
|
|
212
|
+
for(y = 0; y < GRIDH; y++)
|
|
213
|
+
{
|
|
214
|
+
ax[x][y] = p[x][y] - p[x2][y];
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
for(y = 0; y < GRIDH;y++)
|
|
219
|
+
{
|
|
220
|
+
y2 = (y + 1) % GRIDH;
|
|
221
|
+
for(x = 0; x < GRIDW; x++)
|
|
222
|
+
{
|
|
223
|
+
ay[x][y] = p[x][y] - p[x][y2];
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/* compute speeds */
|
|
228
|
+
for(x = 0; x < GRIDW; x++)
|
|
229
|
+
{
|
|
230
|
+
for(y = 0; y < GRIDH; y++)
|
|
231
|
+
{
|
|
232
|
+
vx[x][y] = vx[x][y] + ax[x][y] * time_step;
|
|
233
|
+
vy[x][y] = vy[x][y] + ay[x][y] * time_step;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/* compute pressure */
|
|
238
|
+
for(x = 1; x < GRIDW; x++)
|
|
239
|
+
{
|
|
240
|
+
x2 = x - 1;
|
|
241
|
+
for(y = 1; y < GRIDH; y++)
|
|
242
|
+
{
|
|
243
|
+
y2 = y - 1;
|
|
244
|
+
p[x][y] = p[x][y] + (vx[x2][y] - vx[x][y] + vy[x][y2] - vy[x][y]) * time_step;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
/* Program entry point */
|
|
251
|
+
int main(char[][] args)
|
|
252
|
+
{
|
|
253
|
+
/* Dimensions of our window. */
|
|
254
|
+
int width, height;
|
|
255
|
+
/* Style of our window. */
|
|
256
|
+
int mode;
|
|
257
|
+
/* Frame time */
|
|
258
|
+
double t, t_old, dt_total;
|
|
259
|
+
|
|
260
|
+
/* Initialize GLFW */
|
|
261
|
+
if(glfwInit() == GL_FALSE)
|
|
262
|
+
{
|
|
263
|
+
fprintf(stderr, "GLFW initialization failed\n");
|
|
264
|
+
exit(-1);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/* Desired window properties */
|
|
268
|
+
width = 640;
|
|
269
|
+
height = 480;
|
|
270
|
+
mode = GLFW_WINDOW;
|
|
271
|
+
|
|
272
|
+
/* Open window */
|
|
273
|
+
if( glfwOpenWindow(width,height,0,0,0,0,16,0,mode) == GL_FALSE )
|
|
274
|
+
{
|
|
275
|
+
fprintf(stderr, "Could not open window\n");
|
|
276
|
+
glfwTerminate();
|
|
277
|
+
exit(-1);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/* Set title */
|
|
281
|
+
glfwSetWindowTitle( "Wave Simulation" );
|
|
282
|
+
|
|
283
|
+
/* Keyboard handler */
|
|
284
|
+
glfwSetKeyCallback( &handle_key_down );
|
|
285
|
+
glfwEnable( GLFW_KEY_REPEAT );
|
|
286
|
+
|
|
287
|
+
/* Window resize handler */
|
|
288
|
+
glfwSetWindowSizeCallback( &handle_resize );
|
|
289
|
+
|
|
290
|
+
/* Initialize OpenGL */
|
|
291
|
+
setup_opengl();
|
|
292
|
+
|
|
293
|
+
/* Initialize simulation */
|
|
294
|
+
initVertices();
|
|
295
|
+
initSurface();
|
|
296
|
+
adjustGrid();
|
|
297
|
+
|
|
298
|
+
/* Initialize timer */
|
|
299
|
+
t_old = glfwGetTime() - 0.01;
|
|
300
|
+
|
|
301
|
+
/* Main loop */
|
|
302
|
+
while(running)
|
|
303
|
+
{
|
|
304
|
+
/* Timing */
|
|
305
|
+
t = glfwGetTime();
|
|
306
|
+
dt_total = t - t_old;
|
|
307
|
+
t_old = t;
|
|
308
|
+
|
|
309
|
+
/* Safety - iterate if dt_total is too large */
|
|
310
|
+
while( dt_total > 0.0f )
|
|
311
|
+
{
|
|
312
|
+
/* Select iteration time step */
|
|
313
|
+
dt = dt_total > MAX_DELTA_T ? MAX_DELTA_T : dt_total;
|
|
314
|
+
dt_total -= dt;
|
|
315
|
+
|
|
316
|
+
/* Calculate wave propagation */
|
|
317
|
+
calc();
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/* Compute height of each vertex */
|
|
321
|
+
adjustGrid();
|
|
322
|
+
|
|
323
|
+
/* Draw wave grid to OpenGL display */
|
|
324
|
+
draw_screen();
|
|
325
|
+
|
|
326
|
+
/* Still running? */
|
|
327
|
+
running = running && glfwGetWindowParam( GLFW_OPENED );
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
glfwTerminate();
|
|
331
|
+
|
|
332
|
+
return 0;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
version(Windows) {
|
|
336
|
+
extern(Windows):
|
|
337
|
+
} else {
|
|
338
|
+
extern(C):
|
|
339
|
+
}
|
|
340
|
+
/* Handle key strokes */
|
|
341
|
+
void handle_key_down(int key, int action)
|
|
342
|
+
{
|
|
343
|
+
if( action != GLFW_PRESS )
|
|
344
|
+
{
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
switch(key) {
|
|
349
|
+
case GLFW_KEY_ESC:
|
|
350
|
+
running = 0;
|
|
351
|
+
break;
|
|
352
|
+
case GLFW_KEY_SPACE:
|
|
353
|
+
initSurface();
|
|
354
|
+
break;
|
|
355
|
+
case GLFW_KEY_LEFT:
|
|
356
|
+
alpha+=5;
|
|
357
|
+
break;
|
|
358
|
+
case GLFW_KEY_RIGHT:
|
|
359
|
+
alpha-=5;
|
|
360
|
+
break;
|
|
361
|
+
case GLFW_KEY_UP:
|
|
362
|
+
beta-=5;
|
|
363
|
+
break;
|
|
364
|
+
case GLFW_KEY_DOWN:
|
|
365
|
+
beta+=5;
|
|
366
|
+
break;
|
|
367
|
+
case GLFW_KEY_PAGEUP:
|
|
368
|
+
if(zoom>1) zoom-=1;
|
|
369
|
+
break;
|
|
370
|
+
case GLFW_KEY_PAGEDOWN:
|
|
371
|
+
zoom+=1;
|
|
372
|
+
break;
|
|
373
|
+
default:
|
|
374
|
+
break;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
|
|
379
|
+
/* Callback function for window resize events */
|
|
380
|
+
void handle_resize( int width, int height )
|
|
381
|
+
{
|
|
382
|
+
float ratio = 1.0f;
|
|
383
|
+
|
|
384
|
+
if( height > 0 )
|
|
385
|
+
{
|
|
386
|
+
ratio = cast(float) width / cast(float) height;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
/* Setup viewport (Place where the stuff will appear in the main window). */
|
|
390
|
+
glViewport(0, 0, width, height);
|
|
391
|
+
|
|
392
|
+
/*
|
|
393
|
+
* Change to the projection matrix and set
|
|
394
|
+
* our viewing volume.
|
|
395
|
+
*/
|
|
396
|
+
glMatrixMode(GL_PROJECTION);
|
|
397
|
+
glLoadIdentity();
|
|
398
|
+
gluPerspective(60.0, ratio, 1.0, 1024.0);
|
|
399
|
+
}
|
|
400
|
+
|