Start work on making bunny demos use vertex buffers to draw

db4
Joe Groff 2008-01-31 20:24:08 -08:00
parent 7666949e13
commit f3b9e889ff
5 changed files with 83 additions and 23 deletions

View File

@ -3,7 +3,8 @@ USING: alien alien.c-types arrays sequences math
math.vectors math.matrices math.parser io io.files kernel opengl math.vectors math.matrices math.parser io io.files kernel opengl
opengl.gl opengl.glu shuffle http.client vectors timers opengl.gl opengl.glu shuffle http.client vectors timers
namespaces ui.gadgets ui.gadgets.canvas ui.render ui splitting namespaces ui.gadgets ui.gadgets.canvas ui.render ui splitting
combinators tools.time system combinators.lib ; combinators tools.time system combinators.lib combinators.cleave
float-arrays ;
IN: bunny IN: bunny
: numbers ( str -- seq ) : numbers ( str -- seq )
@ -45,6 +46,16 @@ IN: bunny
<file-reader> parse-model [ normals ] 2keep 3array <file-reader> parse-model [ normals ] 2keep 3array
] time ; ] time ;
: make-vertex-buffers ( model -- array element-array )
[
[ first concat ] [ second concat ] bi
append >float-array
GL_ARRAY_BUFFER swap GL_STATIC_DRAW <gl-buffer>
] [
third concat >c-uint-array
GL_ELEMENT_ARRAY_BUFFER swap GL_STATIC_DRAW <gl-buffer>
] bi ;
: model-path "bun_zipper.ply" ; : model-path "bun_zipper.ply" ;
: model-url "http://factorcode.org/bun_zipper.ply" ; : model-url "http://factorcode.org/bun_zipper.ply" ;

View File

@ -4,12 +4,14 @@ USING: arrays bunny combinators.lib io io.files kernel
sequences ui ui.gadgets ui.render ; sequences ui ui.gadgets ui.render ;
IN: cel-shading IN: cel-shading
TUPLE: cel-shading-gadget model program ; TUPLE: cel-shading-gadget model program vertices elements ;
: <cel-shading-gadget> ( -- cel-shading-gadget ) : <cel-shading-gadget> ( -- cel-shading-gadget )
0.0 0.0 0.375 <demo-gadget> 0.0 0.0 0.375 <demo-gadget>
maybe-download read-model maybe-download read-model {
{ set-delegate set-cel-shading-gadget-model } cel-shading-gadget construct ; set-delegate
set-cel-shading-gadget-model
} cel-shading-gadget construct ;
STRING: cel-shading-vertex-shader-source STRING: cel-shading-vertex-shader-source
varying vec3 position, normal; varying vec3 position, normal;
@ -53,34 +55,58 @@ main()
; ;
: cel-shading-program ( -- program ) : make-cel-shading-program ( -- program )
cel-shading-vertex-shader-source cel-shading-fragment-shader-source cel-shading-vertex-shader-source cel-shading-fragment-shader-source
<simple-gl-program> ; <simple-gl-program> ;
M: cel-shading-gadget graft* ( gadget -- ) M: cel-shading-gadget graft* ( gadget -- )
[ "2.0" { "GL_ARB_shader_objects" } require-gl-version-or-extensions "2.0" {
"GL_ARB_shader_objects"
"GL_ARB_vertex_buffer_object"
} require-gl-version-or-extensions
0.0 0.0 0.0 1.0 glClearColor 0.0 0.0 0.0 1.0 glClearColor
GL_CULL_FACE glEnable GL_CULL_FACE glEnable
GL_DEPTH_TEST glEnable GL_DEPTH_TEST glEnable
cel-shading-program swap set-cel-shading-gadget-program ] [ ] [ :c ] cleanup ; dup cel-shading-gadget-model make-vertex-buffers
make-cel-shading-program roll {
set-cel-shading-gadget-vertices
set-cel-shading-gadget-elements
set-cel-shading-gadget-program
} set-slots ;
M: cel-shading-gadget ungraft* ( gadget -- ) M: cel-shading-gadget ungraft* ( gadget -- )
cel-shading-gadget-program [ delete-gl-program ] when* ; {
[ cel-shading-gadget-program [ delete-gl-program ] when* ]
[ cel-shading-gadget-elements [ delete-gl-buffer ] when* ]
[ cel-shading-gadget-vertices [ delete-gl-buffer ] when* ]
} call-with ;
: cel-shading-draw-setup ( gadget -- gadget ) : cel-shading-draw-setup ( gadget -- gadget )
[ demo-gadget-set-matrices ] keep [ demo-gadget-set-matrices ] keep
[ cel-shading-gadget-program [ cel-shading-gadget-program {
{ [ "light_direction" glGetUniformLocation -25.0 45.0 80.0 glUniform3f ] [ "light_direction" glGetUniformLocation -25.0 45.0 80.0 glUniform3f ]
[ "color" glGetUniformLocation 0.6 0.5 0.5 1.0 glUniform4f ] [ "color" glGetUniformLocation 0.6 0.5 0.5 1.0 glUniform4f ]
[ "ambient" glGetUniformLocation 0.2 0.2 0.2 0.2 glUniform4f ] [ "ambient" glGetUniformLocation 0.2 0.2 0.2 0.2 glUniform4f ]
[ "diffuse" glGetUniformLocation 0.8 0.8 0.8 0.8 glUniform4f ] } call-with [ "diffuse" glGetUniformLocation 0.8 0.8 0.8 0.8 glUniform4f ]
] keep ; } call-with ] keep ;
M: cel-shading-gadget draw-gadget* ( gadget -- ) M: cel-shading-gadget draw-gadget* ( gadget -- )
dup cel-shading-gadget-program [ dup cel-shading-gadget-program [
cel-shading-draw-setup cel-shading-draw-setup
0.0 -0.12 0.0 glTranslatef 0.0 -0.12 0.0 glTranslatef
cel-shading-gadget-model first3 draw-bunny dup {
cel-shading-gadget-vertices
cel-shading-gadget-elements
} get-slots [
GL_VERTEX_ARRAY GL_NORMAL_ARRAY 2array [
GL_FLOAT 0 0 buffer-offset glNormalPointer
cel-shading-gadget-model dup
first length 3 * 4 * buffer-offset
3 GL_FLOAT 0 roll glVertexPointer
third length 3 *
GL_TRIANGLES swap GL_UNSIGNED_INT 0 buffer-offset glDrawElements
] all-enabled-client-state
] with-array-element-buffers
] with-gl-program ; ] with-gl-program ;
: cel-shading-window ( -- ) : cel-shading-window ( -- )

View File

@ -187,7 +187,7 @@ main()
] if ; ] if ;
M: line-art-gadget graft* ( gadget -- ) M: line-art-gadget graft* ( gadget -- )
[ "2.0" { "GL_ARB_draw_buffers" "2.0" { "GL_ARB_draw_buffers"
"GL_ARB_shader_objects" "GL_ARB_shader_objects"
"GL_ARB_multitexture" "GL_ARB_multitexture"
"GL_ARB_texture_float" } "GL_ARB_texture_float" }
@ -196,8 +196,7 @@ M: line-art-gadget graft* ( gadget -- )
GL_CULL_FACE glEnable GL_CULL_FACE glEnable
GL_DEPTH_TEST glEnable GL_DEPTH_TEST glEnable
(line-art-step1-program) over set-line-art-gadget-step1-program (line-art-step1-program) over set-line-art-gadget-step1-program
(line-art-step2-program) swap set-line-art-gadget-step2-program (line-art-step2-program) swap set-line-art-gadget-step2-program ;
] [ ] [ :c ] cleanup ;
M: line-art-gadget ungraft* ( gadget -- ) M: line-art-gadget ungraft* ( gadget -- )
dup line-art-gadget-framebuffer [ dup line-art-gadget-framebuffer [

View File

@ -65,7 +65,7 @@ HELP: gen-renderbuffer
{ $values { "id" integer } } { $values { "id" integer } }
{ $description "Wrapper for " { $link glGenRenderbuffersEXT } " to handle the common case of generating a single render buffer ID." } ; { $description "Wrapper for " { $link glGenRenderbuffersEXT } " to handle the common case of generating a single render buffer ID." } ;
HELP: gen-buffer HELP: gen-gl-buffer
{ $values { "id" integer } } { $values { "id" integer } }
{ $description "Wrapper for " { $link glGenBuffers } " to handle the common case of generating a single buffer ID." } ; { $description "Wrapper for " { $link glGenBuffers } " to handle the common case of generating a single buffer ID." } ;
@ -81,14 +81,14 @@ HELP: delete-renderbuffer
{ $values { "id" integer } } { $values { "id" integer } }
{ $description "Wrapper for " { $link glDeleteRenderbuffersEXT } " to handle the common case of deleting a single render buffer ID." } ; { $description "Wrapper for " { $link glDeleteRenderbuffersEXT } " to handle the common case of deleting a single render buffer ID." } ;
HELP: delete-buffer HELP: delete-gl-buffer
{ $values { "id" integer } } { $values { "id" integer } }
{ $description "Wrapper for " { $link glDeleteBuffers } " to handle the common case of deleting a single buffer ID." } ; { $description "Wrapper for " { $link glDeleteBuffers } " to handle the common case of deleting a single buffer ID." } ;
{ gen-texture delete-texture } related-words { gen-texture delete-texture } related-words
{ gen-framebuffer delete-framebuffer } related-words { gen-framebuffer delete-framebuffer } related-words
{ gen-renderbuffer delete-renderbuffer } related-words { gen-renderbuffer delete-renderbuffer } related-words
{ gen-buffer delete-buffer } related-words { gen-gl-buffer delete-gl-buffer } related-words
HELP: framebuffer-incomplete? HELP: framebuffer-incomplete?
{ $values { "status/f" "The framebuffer error code, or " { $snippet "f" } " if the framebuffer is render-complete." } } { $values { "status/f" "The framebuffer error code, or " { $snippet "f" } " if the framebuffer is render-complete." } }

View File

@ -30,6 +30,13 @@ IN: opengl
: do-enabled ( what quot -- ) : do-enabled ( what quot -- )
over glEnable dip glDisable ; inline over glEnable dip glDisable ; inline
: do-enabled-client-state ( what quot -- )
over glEnableClientState dip glDisableClientState ; inline
: all-enabled ( seq quot -- )
over [ glEnable ] each dip [ glDisable ] each ; inline
: all-enabled-client-state ( seq quot -- )
over [ glEnableClientState ] each dip [ glDisableClientState ] each ; inline
: do-matrix ( mode quot -- ) : do-matrix ( mode quot -- )
swap [ glMatrixMode glPushMatrix call ] keep swap [ glMatrixMode glPushMatrix call ] keep
@ -103,7 +110,7 @@ IN: opengl
[ glGenFramebuffersEXT ] (gen-gl-object) ; [ glGenFramebuffersEXT ] (gen-gl-object) ;
: gen-renderbuffer ( -- id ) : gen-renderbuffer ( -- id )
[ glGenRenderbuffersEXT ] (gen-gl-object) ; [ glGenRenderbuffersEXT ] (gen-gl-object) ;
: gen-buffer ( -- id ) : gen-gl-buffer ( -- id )
[ glGenBuffers ] (gen-gl-object) ; [ glGenBuffers ] (gen-gl-object) ;
: (delete-gl-object) ( id quot -- ) : (delete-gl-object) ( id quot -- )
@ -114,9 +121,26 @@ IN: opengl
[ glDeleteFramebuffersEXT ] (delete-gl-object) ; [ glDeleteFramebuffersEXT ] (delete-gl-object) ;
: delete-renderbuffer ( id -- ) : delete-renderbuffer ( id -- )
[ glDeleteRenderbuffersEXT ] (delete-gl-object) ; [ glDeleteRenderbuffersEXT ] (delete-gl-object) ;
: delete-buffer ( id -- ) : delete-gl-buffer ( id -- )
[ glDeleteBuffers ] (delete-gl-object) ; [ glDeleteBuffers ] (delete-gl-object) ;
: with-gl-buffer ( binding id quot -- )
-rot dupd glBindBuffer
[ slip ] [ 0 glBindBuffer ] [ ] cleanup ; inline
: with-array-element-buffers ( array-buffer element-buffer quot -- )
-rot GL_ELEMENT_ARRAY_BUFFER swap [
swap GL_ARRAY_BUFFER -rot with-gl-buffer
] with-gl-buffer ; inline
: <gl-buffer> ( target data hint -- id )
pick gen-gl-buffer [ [
>r dup byte-length swap r> glBufferData
] with-gl-buffer ] keep ;
: buffer-offset ( int -- alien )
<alien> ; inline
: framebuffer-incomplete? ( -- status/f ) : framebuffer-incomplete? ( -- status/f )
GL_FRAMEBUFFER_EXT glCheckFramebufferStatusEXT GL_FRAMEBUFFER_EXT glCheckFramebufferStatusEXT
dup GL_FRAMEBUFFER_COMPLETE_EXT = f rot ? ; dup GL_FRAMEBUFFER_COMPLETE_EXT = f rot ? ;