change spheres to use new world api
parent
474735a60c
commit
4e8df4a190
|
@ -1,6 +1,6 @@
|
|||
USING: arrays kernel math math.functions math.order math.vectors
|
||||
namespaces opengl opengl.gl sequences ui ui.gadgets ui.gestures
|
||||
ui.render accessors combinators ;
|
||||
ui.gadgets.worlds ui.render accessors combinators ;
|
||||
IN: opengl.demo-support
|
||||
|
||||
: FOV ( -- x ) 2.0 sqrt 1+ ; inline
|
||||
|
@ -9,62 +9,61 @@ CONSTANT: KEY-ROTATE-STEP 10.0
|
|||
|
||||
SYMBOL: last-drag-loc
|
||||
|
||||
TUPLE: demo-gadget < gadget yaw pitch distance ;
|
||||
TUPLE: demo-world < world yaw pitch distance ;
|
||||
|
||||
: new-demo-gadget ( yaw pitch distance class -- gadget )
|
||||
new
|
||||
swap >>distance
|
||||
swap >>pitch
|
||||
swap >>yaw ; inline
|
||||
: set-demo-orientation ( world yaw pitch distance -- world )
|
||||
[ >>yaw ] [ >>pitch ] [ >>distance ] tri* ;
|
||||
|
||||
GENERIC: far-plane ( gadget -- z )
|
||||
GENERIC: near-plane ( gadget -- z )
|
||||
GENERIC: distance-step ( gadget -- dz )
|
||||
|
||||
M: demo-gadget far-plane ( gadget -- z )
|
||||
M: demo-world far-plane ( gadget -- z )
|
||||
drop 4.0 ;
|
||||
M: demo-gadget near-plane ( gadget -- z )
|
||||
M: demo-world near-plane ( gadget -- z )
|
||||
drop 1.0 64.0 / ;
|
||||
M: demo-gadget distance-step ( gadget -- dz )
|
||||
M: demo-world distance-step ( gadget -- dz )
|
||||
drop 1.0 64.0 / ;
|
||||
|
||||
: fov-ratio ( gadget -- fov ) dim>> dup first2 min v/n ;
|
||||
|
||||
: yaw-demo-gadget ( yaw gadget -- )
|
||||
: yaw-demo-world ( yaw gadget -- )
|
||||
[ + ] with change-yaw relayout-1 ;
|
||||
|
||||
: pitch-demo-gadget ( pitch gadget -- )
|
||||
: pitch-demo-world ( pitch gadget -- )
|
||||
[ + ] with change-pitch relayout-1 ;
|
||||
|
||||
: zoom-demo-gadget ( distance gadget -- )
|
||||
: zoom-demo-world ( distance gadget -- )
|
||||
[ + ] with change-distance relayout-1 ;
|
||||
|
||||
M: demo-gadget pref-dim* ( gadget -- dim )
|
||||
M: demo-world focusable-child* ( world -- gadget )
|
||||
drop t ;
|
||||
|
||||
M: demo-world pref-dim* ( gadget -- dim )
|
||||
drop { 640 480 } ;
|
||||
|
||||
: -+ ( x -- -x x )
|
||||
[ neg ] keep ;
|
||||
|
||||
: demo-gadget-frustum ( gadget -- -x x -y y near far )
|
||||
: demo-world-frustum ( gadget -- -x x -y y near far )
|
||||
[ near-plane ] [ far-plane ] [ fov-ratio ] tri [
|
||||
nip swap FOV / v*n
|
||||
first2 [ -+ ] bi@
|
||||
] 3keep drop ;
|
||||
|
||||
: demo-gadget-set-matrices ( gadget -- )
|
||||
M: demo-world begin-world
|
||||
GL_PROJECTION glMatrixMode
|
||||
glLoadIdentity
|
||||
demo-world-frustum glFrustum ;
|
||||
|
||||
: demo-world-set-matrix ( gadget -- )
|
||||
GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT bitor glClear
|
||||
[
|
||||
GL_PROJECTION glMatrixMode
|
||||
glLoadIdentity
|
||||
demo-gadget-frustum glFrustum
|
||||
] [
|
||||
GL_MODELVIEW glMatrixMode
|
||||
glLoadIdentity
|
||||
[ [ 0.0 0.0 ] dip distance>> neg glTranslatef ]
|
||||
[ pitch>> 1.0 0.0 0.0 glRotatef ]
|
||||
[ yaw>> 0.0 1.0 0.0 glRotatef ]
|
||||
tri
|
||||
] bi ;
|
||||
GL_MODELVIEW glMatrixMode
|
||||
glLoadIdentity
|
||||
[ [ 0.0 0.0 ] dip distance>> neg glTranslatef ]
|
||||
[ pitch>> 1.0 0.0 0.0 glRotatef ]
|
||||
[ yaw>> 0.0 1.0 0.0 glRotatef ]
|
||||
tri ;
|
||||
|
||||
: reset-last-drag-rel ( -- )
|
||||
{ 0 0 } last-drag-loc set-global ;
|
||||
|
@ -94,16 +93,16 @@ M: demo-gadget pref-dim* ( gadget -- dim )
|
|||
swap first swap second glVertex2d
|
||||
] do-state ;
|
||||
|
||||
demo-gadget H{
|
||||
{ T{ key-down f f "LEFT" } [ KEY-ROTATE-STEP neg swap yaw-demo-gadget ] }
|
||||
{ T{ key-down f f "RIGHT" } [ KEY-ROTATE-STEP swap yaw-demo-gadget ] }
|
||||
{ T{ key-down f f "DOWN" } [ KEY-ROTATE-STEP neg swap pitch-demo-gadget ] }
|
||||
{ T{ key-down f f "UP" } [ KEY-ROTATE-STEP swap pitch-demo-gadget ] }
|
||||
{ T{ key-down f f "=" } [ dup distance-step neg swap zoom-demo-gadget ] }
|
||||
{ T{ key-down f f "-" } [ dup distance-step swap zoom-demo-gadget ] }
|
||||
demo-world H{
|
||||
{ T{ key-down f f "LEFT" } [ KEY-ROTATE-STEP neg swap yaw-demo-world ] }
|
||||
{ T{ key-down f f "RIGHT" } [ KEY-ROTATE-STEP swap yaw-demo-world ] }
|
||||
{ T{ key-down f f "DOWN" } [ KEY-ROTATE-STEP neg swap pitch-demo-world ] }
|
||||
{ T{ key-down f f "UP" } [ KEY-ROTATE-STEP swap pitch-demo-world ] }
|
||||
{ T{ key-down f f "=" } [ dup distance-step neg swap zoom-demo-world ] }
|
||||
{ T{ key-down f f "-" } [ dup distance-step swap zoom-demo-world ] }
|
||||
|
||||
{ T{ button-down f f 1 } [ drop reset-last-drag-rel ] }
|
||||
{ T{ drag f 1 } [ drag-yaw-pitch rot [ pitch-demo-gadget ] keep yaw-demo-gadget ] }
|
||||
{ mouse-scroll [ scroll-direction get second over distance-step * swap zoom-demo-gadget ] }
|
||||
{ T{ drag f 1 } [ drag-yaw-pitch rot [ pitch-demo-world ] keep yaw-demo-world ] }
|
||||
{ mouse-scroll [ scroll-direction get second over distance-step * swap zoom-demo-world ] }
|
||||
} set-gestures
|
||||
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
USING: kernel opengl opengl.demo-support opengl.gl opengl.textures
|
||||
opengl.shaders opengl.framebuffers opengl.capabilities multiline
|
||||
ui.gadgets accessors sequences ui.render ui math locals arrays
|
||||
generalizations combinators ui.gadgets.worlds ;
|
||||
generalizations combinators ui.gadgets.worlds method-chains
|
||||
literals ui.pixel-formats ;
|
||||
IN: spheres
|
||||
|
||||
STRING: plane-vertex-shader
|
||||
|
@ -110,19 +111,16 @@ main()
|
|||
}
|
||||
;
|
||||
|
||||
TUPLE: spheres-gadget < demo-gadget
|
||||
TUPLE: spheres-world < demo-world
|
||||
plane-program solid-sphere-program texture-sphere-program
|
||||
reflection-framebuffer reflection-depthbuffer
|
||||
reflection-texture initialized? ;
|
||||
reflection-texture ;
|
||||
|
||||
: <spheres-gadget> ( -- gadget )
|
||||
20.0 10.0 20.0 spheres-gadget new-demo-gadget ;
|
||||
|
||||
M: spheres-gadget near-plane ( gadget -- z )
|
||||
M: spheres-world near-plane ( gadget -- z )
|
||||
drop 1.0 ;
|
||||
M: spheres-gadget far-plane ( gadget -- z )
|
||||
M: spheres-world far-plane ( gadget -- z )
|
||||
drop 512.0 ;
|
||||
M: spheres-gadget distance-step ( gadget -- dz )
|
||||
M: spheres-world distance-step ( gadget -- dz )
|
||||
drop 0.5 ;
|
||||
|
||||
: (reflection-dim) ( -- w h )
|
||||
|
@ -136,12 +134,14 @@ M: spheres-gadget distance-step ( gadget -- dz )
|
|||
GL_TEXTURE_CUBE_MAP GL_TEXTURE_WRAP_S GL_CLAMP glTexParameteri
|
||||
GL_TEXTURE_CUBE_MAP GL_TEXTURE_WRAP_T GL_CLAMP glTexParameteri
|
||||
GL_TEXTURE_CUBE_MAP GL_TEXTURE_WRAP_R GL_CLAMP glTexParameteri
|
||||
GL_TEXTURE_CUBE_MAP_POSITIVE_X
|
||||
GL_TEXTURE_CUBE_MAP_POSITIVE_Y
|
||||
GL_TEXTURE_CUBE_MAP_POSITIVE_Z
|
||||
GL_TEXTURE_CUBE_MAP_NEGATIVE_X
|
||||
GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
|
||||
GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 6 narray
|
||||
{
|
||||
$ GL_TEXTURE_CUBE_MAP_POSITIVE_X
|
||||
$ GL_TEXTURE_CUBE_MAP_POSITIVE_Y
|
||||
$ GL_TEXTURE_CUBE_MAP_POSITIVE_Z
|
||||
$ GL_TEXTURE_CUBE_MAP_NEGATIVE_X
|
||||
$ GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
|
||||
$ GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
|
||||
}
|
||||
[ 0 GL_RGBA8 (reflection-dim) 0 GL_RGBA GL_UNSIGNED_BYTE f glTexImage2D ]
|
||||
each
|
||||
] keep ;
|
||||
|
@ -171,22 +171,19 @@ M: spheres-gadget distance-step ( gadget -- dz )
|
|||
sphere-main-fragment-shader <fragment-shader> check-gl-shader
|
||||
3array <gl-program> check-gl-program ;
|
||||
|
||||
M: spheres-gadget graft* ( gadget -- )
|
||||
dup find-gl-context
|
||||
AFTER: spheres-world begin-world
|
||||
"2.0" { "GL_ARB_shader_objects" } require-gl-version-or-extensions
|
||||
{ "GL_EXT_framebuffer_object" } require-gl-extensions
|
||||
20.0 10.0 20.0 set-demo-orientation
|
||||
(plane-program) >>plane-program
|
||||
(solid-sphere-program) >>solid-sphere-program
|
||||
(texture-sphere-program) >>texture-sphere-program
|
||||
(make-reflection-texture) >>reflection-texture
|
||||
(make-reflection-depthbuffer) [ >>reflection-depthbuffer ] keep
|
||||
(make-reflection-framebuffer) >>reflection-framebuffer
|
||||
t >>initialized?
|
||||
drop ;
|
||||
|
||||
M: spheres-gadget ungraft* ( gadget -- )
|
||||
f >>initialized?
|
||||
dup find-gl-context
|
||||
M: spheres-world end-world
|
||||
{
|
||||
[ reflection-framebuffer>> [ delete-framebuffer ] when* ]
|
||||
[ reflection-depthbuffer>> [ delete-renderbuffer ] when* ]
|
||||
|
@ -196,7 +193,7 @@ M: spheres-gadget ungraft* ( gadget -- )
|
|||
[ plane-program>> [ delete-gl-program ] when* ]
|
||||
} cleave ;
|
||||
|
||||
M: spheres-gadget pref-dim* ( gadget -- dim )
|
||||
M: spheres-world pref-dim* ( gadget -- dim )
|
||||
drop { 640 480 } ;
|
||||
|
||||
:: (draw-sphere) ( program center radius -- )
|
||||
|
@ -280,12 +277,12 @@ M: spheres-gadget pref-dim* ( gadget -- dim )
|
|||
[ dim>> 0 0 rot first2 glViewport ]
|
||||
} cleave ] with-framebuffer ;
|
||||
|
||||
: (draw-gadget) ( gadget -- )
|
||||
M: spheres-world draw-world*
|
||||
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-world-set-matrix ]
|
||||
[ sphere-scene ]
|
||||
[ reflection-texture>> GL_TEXTURE_CUBE_MAP GL_TEXTURE0 bind-texture-unit ]
|
||||
[
|
||||
|
@ -297,10 +294,17 @@ M: spheres-gadget pref-dim* ( gadget -- dim )
|
|||
]
|
||||
} cleave ;
|
||||
|
||||
M: spheres-gadget draw-gadget* ( gadget -- )
|
||||
dup initialized?>> [ (draw-gadget) ] [ drop ] if ;
|
||||
|
||||
: spheres-window ( -- )
|
||||
[ <spheres-gadget> "Spheres" open-window ] with-ui ;
|
||||
[
|
||||
f T{ world-attributes
|
||||
{ world-class spheres-world }
|
||||
{ title "Spheres" }
|
||||
{ pixel-format-attributes {
|
||||
windowed
|
||||
double-buffered
|
||||
T{ depth-bits { value 16 } }
|
||||
} }
|
||||
} open-window
|
||||
] with-ui ;
|
||||
|
||||
MAIN: spheres-window
|
||||
|
|
Loading…
Reference in New Issue