Add environment mapping to spheres demo. Modernize more code in bunny and demo-support
parent
b26eadc5ea
commit
60025d45c3
|
@ -234,4 +234,4 @@ M: bunny-outlined draw-bunny
|
||||||
M: bunny-outlined dispose
|
M: bunny-outlined dispose
|
||||||
[ bunny-outlined-pass1-program [ delete-gl-program ] when* ]
|
[ bunny-outlined-pass1-program [ delete-gl-program ] when* ]
|
||||||
[ bunny-outlined-pass2-program [ delete-gl-program ] when* ]
|
[ bunny-outlined-pass2-program [ delete-gl-program ] when* ]
|
||||||
[ dispose-framebuffer ] tri
|
[ dispose-framebuffer ] tri ;
|
||||||
|
|
|
@ -1,13 +1,10 @@
|
||||||
USING: arrays combinators.lib kernel math math.functions math.vectors namespaces
|
USING: arrays combinators.lib kernel math math.functions math.vectors namespaces
|
||||||
opengl opengl.gl sequences ui ui.gadgets ui.gestures ui.render ;
|
opengl opengl.gl sequences ui ui.gadgets ui.gestures ui.render accessors ;
|
||||||
IN: opengl.demo-support
|
IN: opengl.demo-support
|
||||||
|
|
||||||
: FOV 2.0 sqrt 1+ ; inline
|
: FOV 2.0 sqrt 1+ ; inline
|
||||||
: MOUSE-MOTION-SCALE 0.5 ; inline
|
: MOUSE-MOTION-SCALE 0.5 ; inline
|
||||||
: KEY-ROTATE-STEP 1.0 ; inline
|
: KEY-ROTATE-STEP 1.0 ; inline
|
||||||
: DIMS { 640 480 } ; inline
|
|
||||||
|
|
||||||
: FOV-RATIO ( -- fov ) DIMS dup first2 min v/n ;
|
|
||||||
|
|
||||||
SYMBOL: last-drag-loc
|
SYMBOL: last-drag-loc
|
||||||
|
|
||||||
|
@ -15,7 +12,7 @@ TUPLE: demo-gadget yaw pitch distance ;
|
||||||
|
|
||||||
: <demo-gadget> ( yaw pitch distance -- gadget )
|
: <demo-gadget> ( yaw pitch distance -- gadget )
|
||||||
demo-gadget construct-gadget
|
demo-gadget construct-gadget
|
||||||
[ { set-demo-gadget-yaw set-demo-gadget-pitch set-demo-gadget-distance } set-slots ] keep ;
|
[ { (>>yaw) (>>pitch) (>>distance) } set-slots ] keep ;
|
||||||
|
|
||||||
GENERIC: far-plane ( gadget -- z )
|
GENERIC: far-plane ( gadget -- z )
|
||||||
GENERIC: near-plane ( gadget -- z )
|
GENERIC: near-plane ( gadget -- z )
|
||||||
|
@ -28,6 +25,8 @@ M: demo-gadget near-plane ( gadget -- z )
|
||||||
M: demo-gadget distance-step ( gadget -- dz )
|
M: demo-gadget distance-step ( gadget -- dz )
|
||||||
drop 1.0 64.0 / ;
|
drop 1.0 64.0 / ;
|
||||||
|
|
||||||
|
: fov-ratio ( gadget -- fov ) dim>> dup first2 min v/n ;
|
||||||
|
|
||||||
: yaw-demo-gadget ( yaw gadget -- )
|
: yaw-demo-gadget ( yaw gadget -- )
|
||||||
[ [ demo-gadget-yaw + ] keep set-demo-gadget-yaw ] keep relayout-1 ;
|
[ [ demo-gadget-yaw + ] keep set-demo-gadget-yaw ] keep relayout-1 ;
|
||||||
|
|
||||||
|
@ -38,16 +37,16 @@ M: demo-gadget distance-step ( gadget -- dz )
|
||||||
[ [ demo-gadget-distance + ] keep set-demo-gadget-distance ] keep relayout-1 ;
|
[ [ demo-gadget-distance + ] keep set-demo-gadget-distance ] keep relayout-1 ;
|
||||||
|
|
||||||
M: demo-gadget pref-dim* ( gadget -- dim )
|
M: demo-gadget pref-dim* ( gadget -- dim )
|
||||||
drop DIMS ;
|
drop { 640 480 } ;
|
||||||
|
|
||||||
: -+ ( x -- -x x )
|
: -+ ( x -- -x x )
|
||||||
dup neg swap ;
|
dup neg swap ;
|
||||||
|
|
||||||
: demo-gadget-frustum ( gadget -- -x x -y y near far )
|
: demo-gadget-frustum ( gadget -- -x x -y y near far )
|
||||||
[ near-plane ] [ far-plane ] bi [
|
[ near-plane ] [ far-plane ] [ fov-ratio ] tri [
|
||||||
drop FOV-RATIO swap FOV / v*n
|
nip swap FOV / v*n
|
||||||
first2 [ -+ ] bi@
|
first2 [ -+ ] bi@
|
||||||
] 2keep ;
|
] 3keep drop ;
|
||||||
|
|
||||||
: demo-gadget-set-matrices ( gadget -- )
|
: demo-gadget-set-matrices ( gadget -- )
|
||||||
GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT bitor glClear
|
GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT bitor glClear
|
||||||
|
@ -58,9 +57,9 @@ M: demo-gadget pref-dim* ( gadget -- dim )
|
||||||
] [
|
] [
|
||||||
GL_MODELVIEW glMatrixMode
|
GL_MODELVIEW glMatrixMode
|
||||||
glLoadIdentity
|
glLoadIdentity
|
||||||
[ >r 0.0 0.0 r> demo-gadget-distance neg glTranslatef ]
|
[ >r 0.0 0.0 r> distance>> neg glTranslatef ]
|
||||||
[ demo-gadget-pitch 1.0 0.0 0.0 glRotatef ]
|
[ pitch>> 1.0 0.0 0.0 glRotatef ]
|
||||||
[ demo-gadget-yaw 0.0 1.0 0.0 glRotatef ]
|
[ yaw>> 0.0 1.0 0.0 glRotatef ]
|
||||||
tri
|
tri
|
||||||
] bi ;
|
] bi ;
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
USING: kernel opengl.demo-support opengl.gl opengl.shaders opengl.framebuffers
|
USING: kernel opengl.demo-support opengl.gl opengl.shaders opengl.framebuffers
|
||||||
opengl multiline ui.gadgets accessors sequences ui.render ui math
|
opengl multiline ui.gadgets accessors sequences ui.render ui math
|
||||||
arrays.lib combinators ;
|
arrays arrays.lib combinators ;
|
||||||
IN: spheres
|
IN: spheres
|
||||||
|
|
||||||
STRING: plane-vertex-shader
|
STRING: plane-vertex-shader
|
||||||
|
@ -48,17 +48,15 @@ main()
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
STRING: sphere-fragment-shader
|
STRING: sphere-solid-color-fragment-shader
|
||||||
uniform vec3 light_position;
|
uniform vec3 light_position;
|
||||||
varying float vradius;
|
varying vec4 vcolor;
|
||||||
varying vec3 sphere_position;
|
|
||||||
varying vec4 world_position, vcolor;
|
|
||||||
|
|
||||||
vec4 ambient = vec4(0.3, 0.2, 0.2, 1.0);
|
const vec4 ambient = vec4(0.25, 0.2, 0.25, 1.0);
|
||||||
vec4 diffuse = vec4(0.7, 0.8, 0.8, 1.0);
|
const vec4 diffuse = vec4(0.75, 0.8, 0.75, 1.0);
|
||||||
|
|
||||||
vec4
|
vec4
|
||||||
light(vec3 point, vec3 normal)
|
sphere_color(vec3 point, vec3 normal)
|
||||||
{
|
{
|
||||||
vec3 transformed_light_position = (gl_ModelViewMatrix * vec4(light_position, 1)).xyz;
|
vec3 transformed_light_position = (gl_ModelViewMatrix * vec4(light_position, 1)).xyz;
|
||||||
vec3 direction = normalize(transformed_light_position - point);
|
vec3 direction = normalize(transformed_light_position - point);
|
||||||
|
@ -66,6 +64,25 @@ light(vec3 point, vec3 normal)
|
||||||
|
|
||||||
return ambient * vcolor + diffuse * vec4(d * vcolor.rgb, vcolor.a);
|
return ambient * vcolor + diffuse * vec4(d * vcolor.rgb, vcolor.a);
|
||||||
}
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
STRING: sphere-texture-fragment-shader
|
||||||
|
uniform samplerCube surface_texture;
|
||||||
|
|
||||||
|
vec4
|
||||||
|
sphere_color(vec3 point, vec3 normal)
|
||||||
|
{
|
||||||
|
vec3 reflect = reflect(normalize(point), normal);
|
||||||
|
return textureCube(surface_texture, reflect * gl_NormalMatrix);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
STRING: sphere-main-fragment-shader
|
||||||
|
varying float vradius;
|
||||||
|
varying vec3 sphere_position;
|
||||||
|
varying vec4 world_position;
|
||||||
|
|
||||||
|
vec4 sphere_color(vec3 point, vec3 normal);
|
||||||
|
|
||||||
void
|
void
|
||||||
main()
|
main()
|
||||||
|
@ -78,12 +95,12 @@ main()
|
||||||
vec4 transformed_surface = gl_ProjectionMatrix * world_surface;
|
vec4 transformed_surface = gl_ProjectionMatrix * world_surface;
|
||||||
|
|
||||||
gl_FragDepth = (transformed_surface.z/transformed_surface.w + 1.0) * 0.5;
|
gl_FragDepth = (transformed_surface.z/transformed_surface.w + 1.0) * 0.5;
|
||||||
gl_FragColor = light(world_surface.xyz, surface);
|
gl_FragColor = sphere_color(world_surface.xyz, surface);
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
TUPLE: spheres-gadget
|
TUPLE: spheres-gadget
|
||||||
plane-program sphere-program
|
plane-program solid-sphere-program texture-sphere-program
|
||||||
reflection-framebuffer reflection-depthbuffer
|
reflection-framebuffer reflection-depthbuffer
|
||||||
reflection-texture ;
|
reflection-texture ;
|
||||||
|
|
||||||
|
@ -98,6 +115,9 @@ M: spheres-gadget far-plane ( gadget -- z )
|
||||||
M: spheres-gadget distance-step ( gadget -- dz )
|
M: spheres-gadget distance-step ( gadget -- dz )
|
||||||
drop 0.5 ;
|
drop 0.5 ;
|
||||||
|
|
||||||
|
: (reflection-dim) ( -- w h )
|
||||||
|
1024 1024 ;
|
||||||
|
|
||||||
: (make-reflection-texture) ( -- texture )
|
: (make-reflection-texture) ( -- texture )
|
||||||
gen-texture [
|
gen-texture [
|
||||||
GL_TEXTURE_CUBE_MAP swap glBindTexture
|
GL_TEXTURE_CUBE_MAP swap glBindTexture
|
||||||
|
@ -109,14 +129,14 @@ M: spheres-gadget distance-step ( gadget -- dz )
|
||||||
GL_TEXTURE_CUBE_MAP_NEGATIVE_X
|
GL_TEXTURE_CUBE_MAP_NEGATIVE_X
|
||||||
GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
|
GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
|
||||||
GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 6 narray
|
GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 6 narray
|
||||||
[ 0 GL_RGBA8 1024 1024 0 GL_RGBA GL_UNSIGNED_BYTE f glTexImage2D ]
|
[ 0 GL_RGBA8 (reflection-dim) 0 GL_RGBA GL_UNSIGNED_BYTE f glTexImage2D ]
|
||||||
each
|
each
|
||||||
] keep ;
|
] keep ;
|
||||||
|
|
||||||
: (make-reflection-depthbuffer) ( -- depthbuffer )
|
: (make-reflection-depthbuffer) ( -- depthbuffer )
|
||||||
gen-renderbuffer [
|
gen-renderbuffer [
|
||||||
GL_RENDERBUFFER_EXT swap glBindRenderbufferEXT
|
GL_RENDERBUFFER_EXT swap glBindRenderbufferEXT
|
||||||
GL_RENDERBUFFER_EXT GL_DEPTH_COMPONENT32 1024 1024 glRenderbufferStorageEXT
|
GL_RENDERBUFFER_EXT GL_DEPTH_COMPONENT32 (reflection-dim) glRenderbufferStorageEXT
|
||||||
] keep ;
|
] keep ;
|
||||||
|
|
||||||
: (make-reflection-framebuffer) ( depthbuffer -- framebuffer )
|
: (make-reflection-framebuffer) ( depthbuffer -- framebuffer )
|
||||||
|
@ -126,11 +146,23 @@ M: spheres-gadget distance-step ( gadget -- dz )
|
||||||
glFramebufferRenderbufferEXT
|
glFramebufferRenderbufferEXT
|
||||||
] with-framebuffer ;
|
] with-framebuffer ;
|
||||||
|
|
||||||
|
: (plane-program) ( -- program )
|
||||||
|
plane-vertex-shader plane-fragment-shader <simple-gl-program> ;
|
||||||
|
: (solid-sphere-program) ( -- program )
|
||||||
|
sphere-vertex-shader <vertex-shader> check-gl-shader
|
||||||
|
sphere-solid-color-fragment-shader <fragment-shader> check-gl-shader
|
||||||
|
sphere-main-fragment-shader <fragment-shader> check-gl-shader
|
||||||
|
3array <gl-program> check-gl-program ;
|
||||||
|
: (texture-sphere-program) ( -- program )
|
||||||
|
sphere-vertex-shader <vertex-shader> check-gl-shader
|
||||||
|
sphere-texture-fragment-shader <fragment-shader> check-gl-shader
|
||||||
|
sphere-main-fragment-shader <fragment-shader> check-gl-shader
|
||||||
|
3array <gl-program> check-gl-program ;
|
||||||
|
|
||||||
M: spheres-gadget graft* ( gadget -- )
|
M: spheres-gadget graft* ( gadget -- )
|
||||||
plane-vertex-shader plane-fragment-shader
|
(plane-program) >>plane-program
|
||||||
<simple-gl-program> >>plane-program
|
(solid-sphere-program) >>solid-sphere-program
|
||||||
sphere-vertex-shader sphere-fragment-shader
|
(texture-sphere-program) >>texture-sphere-program
|
||||||
<simple-gl-program> >>sphere-program
|
|
||||||
(make-reflection-texture) >>reflection-texture
|
(make-reflection-texture) >>reflection-texture
|
||||||
(make-reflection-depthbuffer) [ >>reflection-depthbuffer ] keep
|
(make-reflection-depthbuffer) [ >>reflection-depthbuffer ] keep
|
||||||
(make-reflection-framebuffer) >>reflection-framebuffer
|
(make-reflection-framebuffer) >>reflection-framebuffer
|
||||||
|
@ -141,7 +173,8 @@ M: spheres-gadget ungraft* ( gadget -- )
|
||||||
[ reflection-framebuffer>> [ delete-framebuffer ] when* ]
|
[ reflection-framebuffer>> [ delete-framebuffer ] when* ]
|
||||||
[ reflection-depthbuffer>> [ delete-renderbuffer ] when* ]
|
[ reflection-depthbuffer>> [ delete-renderbuffer ] when* ]
|
||||||
[ reflection-texture>> [ delete-texture ] when* ]
|
[ reflection-texture>> [ delete-texture ] when* ]
|
||||||
[ sphere-program>> [ delete-gl-program ] when* ]
|
[ solid-sphere-program>> [ delete-gl-program ] when* ]
|
||||||
|
[ texture-sphere-program>> [ delete-gl-program ] when* ]
|
||||||
[ plane-program>> [ delete-gl-program ] when* ]
|
[ plane-program>> [ delete-gl-program ] when* ]
|
||||||
} cleave ;
|
} cleave ;
|
||||||
|
|
||||||
|
@ -157,15 +190,19 @@ M: spheres-gadget pref-dim* ( gadget -- dim )
|
||||||
{ -1.0 -1.0 } { 1.0 1.0 } rect-vertices ;
|
{ -1.0 -1.0 } { 1.0 1.0 } rect-vertices ;
|
||||||
|
|
||||||
: sphere-scene ( gadget -- )
|
: sphere-scene ( gadget -- )
|
||||||
GL_DEPTH_BUFFER_BIT GL_COLOR_BUFFER_BIT bitor
|
GL_DEPTH_BUFFER_BIT GL_COLOR_BUFFER_BIT bitor glClear
|
||||||
glClear
|
|
||||||
[
|
[
|
||||||
sphere-program>> dup {
|
solid-sphere-program>> dup {
|
||||||
{ "light_position" [ 0.0 0.0 100.0 glUniform3f ] }
|
{ "light_position" [ 0.0 0.0 100.0 glUniform3f ] }
|
||||||
} [
|
} [
|
||||||
[ { 0.0 0.0 0.0 } 4.0 { 1.0 1.0 0.0 1.0 } (draw-sphere) ]
|
{
|
||||||
[ { 7.0 0.0 0.0 } 1.0 { 1.0 0.0 0.0 1.0 } (draw-sphere) ]
|
[ { 7.0 0.0 0.0 } 1.0 { 1.0 0.0 0.0 1.0 } (draw-sphere) ]
|
||||||
[ { -7.0 0.0 0.0 } 1.0 { 0.0 1.0 0.0 1.0 } (draw-sphere) ] tri
|
[ { -7.0 0.0 0.0 } 1.0 { 0.0 1.0 0.0 1.0 } (draw-sphere) ]
|
||||||
|
[ { 0.0 0.0 7.0 } 1.0 { 0.0 0.0 1.0 1.0 } (draw-sphere) ]
|
||||||
|
[ { 0.0 0.0 -7.0 } 1.0 { 1.0 1.0 0.0 1.0 } (draw-sphere) ]
|
||||||
|
[ { 0.0 7.0 0.0 } 1.0 { 1.0 0.0 1.0 1.0 } (draw-sphere) ]
|
||||||
|
[ { 0.0 -7.0 0.0 } 1.0 { 0.0 1.0 1.0 1.0 } (draw-sphere) ]
|
||||||
|
} cleave
|
||||||
] with-gl-program
|
] with-gl-program
|
||||||
] [
|
] [
|
||||||
plane-program>> { } [
|
plane-program>> { } [
|
||||||
|
@ -187,44 +224,56 @@ M: spheres-gadget pref-dim* ( gadget -- dim )
|
||||||
swap reflection-texture>> >r >r
|
swap reflection-texture>> >r >r
|
||||||
GL_FRAMEBUFFER_EXT
|
GL_FRAMEBUFFER_EXT
|
||||||
GL_COLOR_ATTACHMENT0_EXT
|
GL_COLOR_ATTACHMENT0_EXT
|
||||||
r> r> 0 glFramebufferTexture2DEXT ;
|
r> r> 0 glFramebufferTexture2DEXT
|
||||||
|
check-framebuffer ;
|
||||||
|
|
||||||
M: spheres-gadget draw-gadget* ( gadget -- )
|
: (draw-reflection-texture) ( gadget -- )
|
||||||
GL_DEPTH_TEST glEnable
|
dup reflection-framebuffer>> [ {
|
||||||
0.15 0.15 1.0 1.0 glClearColor {
|
[ drop 0 0 (reflection-dim) glViewport ]
|
||||||
[
|
[
|
||||||
GL_PROJECTION glMatrixMode
|
GL_PROJECTION glMatrixMode
|
||||||
glLoadIdentity
|
glLoadIdentity
|
||||||
reflection-frustum glFrustum
|
reflection-frustum glFrustum
|
||||||
GL_MODELVIEW glMatrixMode
|
GL_MODELVIEW glMatrixMode
|
||||||
glLoadIdentity
|
glLoadIdentity
|
||||||
glPushMatrix
|
180.0 0.0 0.0 1.0 glRotatef
|
||||||
]
|
|
||||||
[
|
|
||||||
dup reflection-framebuffer>> [ {
|
|
||||||
[ GL_TEXTURE_CUBE_MAP_NEGATIVE_Z (reflection-face) ]
|
|
||||||
[ sphere-scene ]
|
|
||||||
[ GL_TEXTURE_CUBE_MAP_NEGATIVE_X (reflection-face)
|
|
||||||
90.0 0.0 1.0 0.0 glRotatef ]
|
|
||||||
[ sphere-scene ]
|
|
||||||
[ GL_TEXTURE_CUBE_MAP_POSITIVE_Z (reflection-face)
|
|
||||||
90.0 0.0 1.0 0.0 glRotatef ]
|
|
||||||
[ sphere-scene ]
|
|
||||||
[ GL_TEXTURE_CUBE_MAP_POSITIVE_X (reflection-face)
|
|
||||||
90.0 0.0 1.0 0.0 glRotatef ]
|
|
||||||
[ sphere-scene ]
|
|
||||||
[ GL_TEXTURE_CUBE_MAP_POSITIVE_Y (reflection-face)
|
|
||||||
glPopMatrix glPushMatrix
|
|
||||||
90.0 1.0 0.0 0.0 glRotatef ]
|
|
||||||
[ sphere-scene ]
|
|
||||||
[ GL_TEXTURE_CUBE_MAP_NEGATIVE_Y (reflection-face)
|
|
||||||
glPopMatrix
|
|
||||||
-90.0 1.0 0.0 0.0 glRotatef ]
|
|
||||||
[ sphere-scene ]
|
|
||||||
} cleave ] with-framebuffer
|
|
||||||
]
|
]
|
||||||
|
[ GL_TEXTURE_CUBE_MAP_NEGATIVE_Z (reflection-face) ]
|
||||||
|
[ sphere-scene ]
|
||||||
|
[ GL_TEXTURE_CUBE_MAP_POSITIVE_X (reflection-face)
|
||||||
|
90.0 0.0 1.0 0.0 glRotatef ]
|
||||||
|
[ sphere-scene ]
|
||||||
|
[ GL_TEXTURE_CUBE_MAP_POSITIVE_Z (reflection-face)
|
||||||
|
90.0 0.0 1.0 0.0 glRotatef glPushMatrix ]
|
||||||
|
[ sphere-scene ]
|
||||||
|
[ GL_TEXTURE_CUBE_MAP_NEGATIVE_X (reflection-face)
|
||||||
|
90.0 0.0 1.0 0.0 glRotatef ]
|
||||||
|
[ sphere-scene ]
|
||||||
|
[ GL_TEXTURE_CUBE_MAP_NEGATIVE_Y (reflection-face)
|
||||||
|
glPopMatrix glPushMatrix -90.0 1.0 0.0 0.0 glRotatef ]
|
||||||
|
[ sphere-scene ]
|
||||||
|
[ GL_TEXTURE_CUBE_MAP_POSITIVE_Y (reflection-face)
|
||||||
|
glPopMatrix 90.0 1.0 0.0 0.0 glRotatef ]
|
||||||
|
[ sphere-scene ]
|
||||||
|
[ dim>> 0 0 rot first2 glViewport ]
|
||||||
|
} cleave ] with-framebuffer ;
|
||||||
|
|
||||||
|
M: spheres-gadget draw-gadget* ( gadget -- )
|
||||||
|
GL_DEPTH_TEST glEnable
|
||||||
|
GL_SCISSOR_TEST glDisable
|
||||||
|
0.15 0.15 1.0 1.0 glClearColor {
|
||||||
|
[ (draw-reflection-texture) ]
|
||||||
[ demo-gadget-set-matrices ]
|
[ demo-gadget-set-matrices ]
|
||||||
[ sphere-scene ]
|
[ sphere-scene ]
|
||||||
|
[
|
||||||
|
{ texture-sphere-program>> reflection-texture>> } get-slots
|
||||||
|
GL_TEXTURE_CUBE_MAP GL_TEXTURE0 bind-texture-unit
|
||||||
|
dup {
|
||||||
|
{ "surface_texture" [ 0 glUniform1i ] }
|
||||||
|
} [
|
||||||
|
{ 0.0 0.0 0.0 } 4.0 { 1.0 0.0 0.0 1.0 } (draw-sphere)
|
||||||
|
] with-gl-program
|
||||||
|
]
|
||||||
} cleave ;
|
} cleave ;
|
||||||
|
|
||||||
: spheres-window ( -- )
|
: spheres-window ( -- )
|
||||||
|
|
Loading…
Reference in New Issue