! Copyright (C) 2010 Your name. ! See http://factorcode.org/license.txt for BSD license. USING: colors game.loop game.worlds literals method-chains ui.gadgets.worlds arrays multiline prettyprint kernel math opengl opengl.gl opengl.glu opengl.demo-support ui ui.gadgets ui.render ui.pixel-formats accessors game.input game.input.scancodes sequences locals specialized-arrays.instances.alien.c-types.float gpu.buffers images gpu.shaders gpu.render ; IN: gfx GLSL-SHADER: fixed-vertex-shader vertex-shader varying vec3 normal; varying vec3 vtl; uniform vec4 light_dir; varying float dt; void main() { gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; normal = normalize(gl_NormalMatrix * gl_Normal); vtl = normalize(gl_ModelViewMatrix * light_dir); dt = clamp(dot(gl_Normal, light_dir), 0.0, 1.0); // float DiffuseTerm = clamp(dot(normal, vtl), 0.0, 1.0); } ; GLSL-SHADER: fixed-fragment-shader fragment-shader varying vec3 normal; varying vec3 vtl; uniform vec4 dcolor; uniform vec4 acolor; uniform float light; varying float dt; uniform sampler2D colorMap; void main() { float DiffuseTerm = clamp(dot(normal, vtl), 0.0, 1.0); float dterm = light * dt + (1.0-light); gl_FragColor = acolor + dcolor * dterm; //vec4(1, 1, 1, 1) * dt; } ; GLSL-PROGRAM: fixed-program fixed-vertex-shader fixed-fragment-shader ; ( -- buffer ) square-vertexs static-upload draw-usage vertex-buffer byte-array>buffer ; inline VERTEX-FORMAT: vertex-format { "vertex" float-components 3 f } ; : ( program-instance -- vertex-array ) [ ] dip vertex-format ; inline PRIVATE> TUPLE: min-world < game-world { angle initial: 0 } { angle-diff initial: 0 } { width initial: 640 } { height initial: 480 } { square-va } { fixed-program } ; M:: min-world resize-world ( g -- ) g dim>> first2 :> ( width height ) 0 0 width height glViewport GL_PROJECTION glMatrixMode glLoadIdentity 0 width - width 0 height - height -100.9 100.0 glOrtho GL_MODELVIEW glMatrixMode ; :: my-draw ( g -- ) g { { "primitive-mode" [ drop quads-mode ] } { "indexes" [ drop T{ index-range f 0 4 } ] } { "vertex-array" [ square-va>> ] } } render ; M:: min-world draw-world* ( g -- ) g g angle>> g angle-diff>> + >>angle drop GL_MODELVIEW glMatrixMode 0 0 1 0 0 0 0 1 0 gluLookAt glLoadIdentity 0.0 1.0 0.0 0.0 glClearColor 1.0 glClearDepth GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT bitor glClear glLoadIdentity g angle>> 0.0 0.0 1.0 glRotatef g fixed-program>> handle>> glUseProgram 0.0 0.0 0.0 0.0 glColor4f g my-draw ! GL_QUADS [ ! -10.0 10.0 0.0 glVertex3f ! -10.0 -10.0 0.0 glVertex3f ! 10.0 -10.0 0.0 glVertex3f ! 10.0 10.0 0.0 glVertex3f ! ] do-state key-w read-keyboard keys>> nth [ g 0 >>angle-diff drop ] [ ] if key-e read-keyboard keys>> nth [ g 1 >>angle-diff drop ] [ ] if ; M:: min-world begin-game-world ( g -- ) g 0.0 >>angle fixed-program >>fixed-program 0.0 >>angle-diff g fixed-program>> >>square-va drop gl_init 0 0 g dim>> first2 glViewport GL_PROJECTION glMatrixMode glLoadIdentity 0 width - width 0 height - height -100.9 100.0 glOrtho open-game-input ; M: min-world end-game-world ( gadget -- ) close-game-input drop ; GAME: run2 { { world-class min-world } { title "Minimal" } { pixel-format-attributes { windowed double-buffered T{ depth-bits { value 24 } } } } { pref-dim { $ width $ height } } { tick-interval-nanos $[ 60 fps ] } } ;