Merge branch 'master' of git://factorcode.org/git/factor

db4
Doug Coleman 2009-05-10 14:01:41 -05:00
commit 0980516053
2 changed files with 74 additions and 17 deletions

View File

@ -1,6 +1,40 @@
USING: multiline ;
IN: terrain.shaders
STRING: sky-vertex-shader
uniform float sky_theta;
varying vec3 direction;
void main()
{
vec4 v = vec4(gl_Vertex.xy, -1.0, 1.0);
gl_Position = v;
float s = sin(sky_theta), c = cos(sky_theta);
direction = mat3(1, 0, 0, 0, c, s, 0, -s, c)
* (gl_ModelViewMatrixInverse * vec4(v.xyz, 0.0)).xyz;
}
;
STRING: sky-pixel-shader
uniform sampler2D sky;
uniform float sky_gradient, sky_theta;
const vec4 SKY_COLOR_A = vec4(0.25, 0.0, 0.5, 1.0),
SKY_COLOR_B = vec4(0.6, 0.5, 0.75, 1.0);
varying vec3 direction;
void main()
{
float t = texture2D(sky, normalize(direction.xyz).xy * 0.5 + vec2(0.5)).x + sky_gradient;
gl_FragColor = mix(SKY_COLOR_A, SKY_COLOR_B, sin(6.28*t));
}
;
STRING: terrain-vertex-shader
uniform sampler2D heightmap;

View File

@ -5,20 +5,23 @@ math.vectors opengl opengl.capabilities opengl.gl
opengl.shaders opengl.textures opengl.textures.private
sequences sequences.product specialized-arrays.float
terrain.generation terrain.shaders ui ui.gadgets
ui.gadgets.worlds ui.pixel-formats game-worlds method-chains ;
ui.gadgets.worlds ui.pixel-formats game-worlds method-chains
math.affine-transforms noise ;
IN: terrain
CONSTANT: FOV $[ 2.0 sqrt 1+ ]
CONSTANT: NEAR-PLANE $[ 1.0 2048.0 / ]
CONSTANT: FAR-PLANE 1.0
CONSTANT: NEAR-PLANE $[ 1.0 1024.0 / ]
CONSTANT: FAR-PLANE 2.0
CONSTANT: PLAYER-START-LOCATION { 0.5 0.51 0.5 }
CONSTANT: PLAYER-HEIGHT $[ 3.0 1024.0 / ]
CONSTANT: PLAYER-HEIGHT $[ 1.0 256.0 / ]
CONSTANT: GRAVITY $[ 1.0 4096.0 / ]
CONSTANT: JUMP $[ 1.0 1024.0 / ]
CONSTANT: MOUSE-SCALE $[ 1.0 10.0 / ]
CONSTANT: MOVEMENT-SPEED $[ 1.0 16384.0 / ]
CONSTANT: FRICTION 0.95
CONSTANT: COMPONENT-SCALE { 0.5 0.01 0.002 0.0 }
CONSTANT: COMPONENT-SCALE { 0.5 0.01 0.0005 0.0 }
CONSTANT: SKY-PERIOD 1200
CONSTANT: SKY-SPEED 0.0005
CONSTANT: terrain-vertex-size { 512 512 }
CONSTANT: terrain-vertex-distance { $[ 1.0 512.0 / ] $[ 1.0 512.0 / ] }
@ -29,6 +32,7 @@ TUPLE: player
TUPLE: terrain-world < game-world
player
sky-image sky-texture sky-program
terrain terrain-segment terrain-texture terrain-program
terrain-vertex-buffer ;
@ -41,7 +45,7 @@ M: terrain-world tick-length
NEAR-PLANE FAR-PLANE ;
: set-modelview-matrix ( gadget -- )
GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT bitor glClear
GL_DEPTH_BUFFER_BIT glClear
GL_MODELVIEW glMatrixMode
glLoadIdentity
player>>
@ -175,24 +179,33 @@ M: terrain-world tick*
[ dup focused?>> [ handle-input ] [ drop ] if ]
[ dup player>> tick-player ] bi ;
: set-heightmap-texture-parameters ( texture -- )
: set-texture-parameters ( texture -- )
GL_TEXTURE_2D GL_TEXTURE0 bind-texture-unit
GL_TEXTURE_2D GL_TEXTURE_MIN_FILTER GL_LINEAR glTexParameteri
GL_TEXTURE_2D GL_TEXTURE_MAG_FILTER GL_LINEAR glTexParameteri
GL_TEXTURE_2D GL_TEXTURE_WRAP_S GL_CLAMP_TO_EDGE glTexParameteri
GL_TEXTURE_2D GL_TEXTURE_WRAP_T GL_CLAMP_TO_EDGE glTexParameteri ;
: sky-gradient ( world -- t )
game-loop>> tick-number>> SKY-PERIOD mod SKY-PERIOD /f ;
: sky-theta ( world -- theta )
game-loop>> tick-number>> SKY-SPEED * ;
BEFORE: terrain-world begin-world
"2.0" { "GL_ARB_vertex_buffer_object" "GL_ARB_shader_objects" }
require-gl-version-or-extensions
GL_DEPTH_TEST glEnable
GL_TEXTURE_2D glEnable
GL_VERTEX_ARRAY glEnableClientState
0.5 0.5 0.5 1.0 glClearColor
PLAYER-START-LOCATION 0.0 0.0 { 0.0 0.0 0.0 } player boa >>player
<perlin-noise-table> 0.01 0.01 <scale> { 512 512 } perlin-noise-image
[ >>sky-image ] keep
make-texture [ set-texture-parameters ] keep >>sky-texture
<terrain> [ >>terrain ] keep
{ 0 0 } terrain-segment [ >>terrain-segment ] keep
make-texture [ set-heightmap-texture-parameters ] keep >>terrain-texture
make-texture [ set-texture-parameters ] keep >>terrain-texture
sky-vertex-shader sky-pixel-shader <simple-gl-program>
>>sky-program
terrain-vertex-shader terrain-pixel-shader <simple-gl-program>
>>terrain-program
vertex-array >vertex-buffer >>terrain-vertex-buffer
@ -203,6 +216,8 @@ AFTER: terrain-world end-world
[ terrain-vertex-buffer>> delete-gl-buffer ]
[ terrain-program>> delete-gl-program ]
[ terrain-texture>> delete-texture ]
[ sky-program>> delete-gl-program ]
[ sky-texture>> delete-texture ]
} cleave ;
M: terrain-world resize-world
@ -212,14 +227,22 @@ M: terrain-world resize-world
[ frustum glFrustum ] bi ;
M: terrain-world draw-world*
[ set-modelview-matrix ]
[ terrain-texture>> GL_TEXTURE_2D GL_TEXTURE0 bind-texture-unit ]
[ dup terrain-program>> [
[ "heightmap" glGetUniformLocation 0 glUniform1i ]
[ "component_scale" glGetUniformLocation COMPONENT-SCALE first4 glUniform4f ] bi
terrain-vertex-buffer>> draw-vertex-buffer
] with-gl-program ]
tri gl-error ;
{
[ set-modelview-matrix ]
[ terrain-texture>> GL_TEXTURE_2D GL_TEXTURE0 bind-texture-unit ]
[ sky-texture>> GL_TEXTURE_2D GL_TEXTURE1 bind-texture-unit ]
[ GL_DEPTH_TEST glDisable dup sky-program>> [
[ nip "sky" glGetUniformLocation 1 glUniform1i ]
[ "sky_gradient" glGetUniformLocation swap sky-gradient glUniform1f ]
[ "sky_theta" glGetUniformLocation swap sky-theta glUniform1f ] 2tri
{ -1.0 -1.0 } { 2.0 2.0 } gl-fill-rect
] with-gl-program ]
[ GL_DEPTH_TEST glEnable dup terrain-program>> [
[ "heightmap" glGetUniformLocation 0 glUniform1i ]
[ "component_scale" glGetUniformLocation COMPONENT-SCALE first4 glUniform4f ] bi
terrain-vertex-buffer>> draw-vertex-buffer
] with-gl-program ]
} cleave gl-error ;
M: terrain-world pref-dim* drop { 640 480 } ;