purple sky
							parent
							
								
									946602b8d7
								
							
						
					
					
						commit
						783c452a6a
					
				| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 } ;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue