]> gitweb.factorcode.org Git - factor.git/blob - extra/bunny/cel-shaded/cel-shaded.factor
factor: trim more using lists.
[factor.git] / extra / bunny / cel-shaded / cel-shaded.factor
1 USING: accessors arrays bunny.model combinators destructors
2 kernel multiline opengl.capabilities opengl.gl opengl.shaders ;
3 IN: bunny.cel-shaded
4
5 STRING: vertex-shader-source
6 varying vec3 position, normal, viewer;
7
8 void
9 main()
10 {
11     gl_Position = ftransform();
12
13     position = gl_Vertex.xyz;
14     normal = gl_Normal;
15     viewer = vec3(0, 0, 1) * gl_NormalMatrix;
16 }
17
18 ;
19
20 STRING: cel-shaded-fragment-shader-lib-source
21 varying vec3 position, normal, viewer;
22 uniform vec3 light_direction;
23 uniform vec4 color;
24 uniform vec4 ambient, diffuse;
25 uniform float shininess;
26
27 float
28 modulate(vec3 direction, vec3 normal)
29 {
30     return dot(direction, normal) * 0.5 + 0.5;
31 }
32
33 float
34 cel(float m)
35 {
36     return smoothstep(0.25, 0.255, m) * 0.4 + smoothstep(0.695, 0.70, m) * 0.5;
37 }
38
39 vec4
40 cel_light()
41 {
42     vec3 direction = normalize(light_direction - position);
43     vec3 reflection = reflect(direction, normal);
44     vec4 ad = (ambient + diffuse * vec4(vec3(cel(modulate(direction, normal))), 1));
45     float s = cel(pow(max(dot(-reflection, viewer), 0.0), shininess));
46     return ad * color + vec4(vec3(s), 0);
47 }
48
49 ;
50
51 STRING: cel-shaded-fragment-shader-main-source
52 vec4 cel_light();
53
54 void
55 main()
56 {
57     gl_FragColor = cel_light();
58 }
59
60 ;
61
62 TUPLE: bunny-cel-shaded program ;
63
64 : cel-shading-supported? ( -- ? )
65     "2.0" { "GL_ARB_shader_objects" }
66     has-gl-version-or-extensions? ;
67
68 : <bunny-cel-shaded> ( gadget -- draw )
69     drop
70     cel-shading-supported? [
71         bunny-cel-shaded new
72         vertex-shader-source <vertex-shader> check-gl-shader
73         cel-shaded-fragment-shader-lib-source <fragment-shader> check-gl-shader
74         cel-shaded-fragment-shader-main-source <fragment-shader> check-gl-shader
75         3array <gl-program> check-gl-program
76         >>program
77     ] [ f ] if ;
78
79 : (draw-cel-shaded-bunny) ( geom program -- )
80     [
81         {
82             [ "light_direction" glGetUniformLocation 1.0 -1.0 1.0 glUniform3f ]
83             [ "color"           glGetUniformLocation 0.6 0.5 0.5 1.0 glUniform4f ]
84             [ "ambient"         glGetUniformLocation 0.2 0.2 0.2 0.2 glUniform4f ]
85             [ "diffuse"         glGetUniformLocation 0.8 0.8 0.8 0.8 glUniform4f ]
86             [ "shininess"       glGetUniformLocation 100.0 glUniform1f ]
87         } cleave bunny-geom
88     ] with-gl-program ;
89
90 M: bunny-cel-shaded draw-bunny
91     program>> (draw-cel-shaded-bunny) ;
92
93 M: bunny-cel-shaded dispose
94     program>> delete-gl-program ;