Merge branch 'master' of git://factorcode.org/git/factor into mongo-factor-driver
commit
28fa05858f
|
@ -4,7 +4,7 @@
|
||||||
USING: accessors arrays ascii assocs calendar combinators fry kernel
|
USING: accessors arrays ascii assocs calendar combinators fry kernel
|
||||||
generalizations io io.encodings.ascii io.files io.streams.string
|
generalizations io io.encodings.ascii io.files io.streams.string
|
||||||
macros math math.functions math.parser peg.ebnf quotations
|
macros math math.functions math.parser peg.ebnf quotations
|
||||||
sequences splitting strings unicode.case vectors ;
|
sequences splitting strings unicode.case vectors combinators.smart ;
|
||||||
|
|
||||||
IN: formatting
|
IN: formatting
|
||||||
|
|
||||||
|
@ -113,7 +113,6 @@ MACRO: printf ( format-string -- )
|
||||||
: sprintf ( format-string -- result )
|
: sprintf ( format-string -- result )
|
||||||
[ printf ] with-string-writer ; inline
|
[ printf ] with-string-writer ; inline
|
||||||
|
|
||||||
|
|
||||||
<PRIVATE
|
<PRIVATE
|
||||||
|
|
||||||
: pad-00 ( n -- string ) number>string 2 CHAR: 0 pad-head ; inline
|
: pad-00 ( n -- string ) number>string 2 CHAR: 0 pad-head ; inline
|
||||||
|
@ -129,12 +128,15 @@ MACRO: printf ( format-string -- )
|
||||||
[ pad-00 ] map "/" join ; inline
|
[ pad-00 ] map "/" join ; inline
|
||||||
|
|
||||||
: >datetime ( timestamp -- string )
|
: >datetime ( timestamp -- string )
|
||||||
{ [ day-of-week day-abbreviation3 ]
|
[
|
||||||
|
{
|
||||||
|
[ day-of-week day-abbreviation3 ]
|
||||||
[ month>> month-abbreviation ]
|
[ month>> month-abbreviation ]
|
||||||
[ day>> pad-00 ]
|
[ day>> pad-00 ]
|
||||||
[ >time ]
|
[ >time ]
|
||||||
[ year>> number>string ]
|
[ year>> number>string ]
|
||||||
} cleave 5 narray " " join ; inline
|
} cleave
|
||||||
|
] output>array " " join ; inline
|
||||||
|
|
||||||
: (week-of-year) ( timestamp day -- n )
|
: (week-of-year) ( timestamp day -- n )
|
||||||
[ dup clone 1 >>month 1 >>day day-of-week dup ] dip > [ 7 swap - ] when
|
[ dup clone 1 >>month 1 >>day day-of-week dup ] dip > [ 7 swap - ] when
|
||||||
|
@ -187,5 +189,3 @@ PRIVATE>
|
||||||
MACRO: strftime ( format-string -- )
|
MACRO: strftime ( format-string -- )
|
||||||
parse-strftime [ length ] keep [ ] join
|
parse-strftime [ length ] keep [ ] join
|
||||||
'[ _ <vector> @ reverse concat nip ] ;
|
'[ _ <vector> @ reverse concat nip ] ;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -19,3 +19,9 @@ IN: literals.tests
|
||||||
[ { 0.5 2.0 } ] [ { $[ 1.0 2.0 / ] 2.0 } ] unit-test
|
[ { 0.5 2.0 } ] [ { $[ 1.0 2.0 / ] 2.0 } ] unit-test
|
||||||
|
|
||||||
[ { 1.0 { 0.5 1.5 } 4.0 } ] [ { 1.0 { $[ 1.0 2.0 / ] 1.5 } $[ 2.0 2.0 * ] } ] unit-test
|
[ { 1.0 { 0.5 1.5 } 4.0 } ] [ { 1.0 { $[ 1.0 2.0 / ] 1.5 } $[ 2.0 2.0 * ] } ] unit-test
|
||||||
|
|
||||||
|
<<
|
||||||
|
CONSTANT: constant-a 3
|
||||||
|
>>
|
||||||
|
|
||||||
|
[ { 3 10 "ftw" } ] [ ${ constant-a 10 "ftw" } ] unit-test
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
! (c) Joe Groff, see license for details
|
! (c) Joe Groff, see license for details
|
||||||
USING: accessors continuations kernel parser words quotations vectors ;
|
USING: accessors continuations kernel parser words quotations
|
||||||
|
combinators.smart vectors sequences ;
|
||||||
IN: literals
|
IN: literals
|
||||||
|
|
||||||
SYNTAX: $ scan-word [ def>> call ] curry with-datastack >vector ;
|
SYNTAX: $ scan-word [ def>> call ] curry with-datastack >vector ;
|
||||||
SYNTAX: $[ parse-quotation with-datastack >vector ;
|
SYNTAX: $[ parse-quotation with-datastack >vector ;
|
||||||
|
SYNTAX: ${ \ } [ [ ?execute ] { } map-as ] parse-literal ;
|
||||||
|
|
|
@ -135,8 +135,8 @@ M: pathname pprint*
|
||||||
[ text ] [ f <inset pprint* block> ] bi*
|
[ text ] [ f <inset pprint* block> ] bi*
|
||||||
\ } pprint-word block> ;
|
\ } pprint-word block> ;
|
||||||
|
|
||||||
M: tuple pprint*
|
: pprint-tuple ( tuple -- )
|
||||||
boa-tuples? get [ call-next-method ] [
|
boa-tuples? get [ pprint-object ] [
|
||||||
[
|
[
|
||||||
<flow
|
<flow
|
||||||
\ T{ pprint-word
|
\ T{ pprint-word
|
||||||
|
@ -149,6 +149,9 @@ M: tuple pprint*
|
||||||
] check-recursion
|
] check-recursion
|
||||||
] if ;
|
] if ;
|
||||||
|
|
||||||
|
M: tuple pprint*
|
||||||
|
pprint-tuple ;
|
||||||
|
|
||||||
: do-length-limit ( seq -- trimmed n/f )
|
: do-length-limit ( seq -- trimmed n/f )
|
||||||
length-limit get dup [
|
length-limit get dup [
|
||||||
over length over [-]
|
over length over [-]
|
||||||
|
|
|
@ -9,7 +9,7 @@ threads combinators math.rectangles ;
|
||||||
IN: ui.backend.cocoa.views
|
IN: ui.backend.cocoa.views
|
||||||
|
|
||||||
: send-mouse-moved ( view event -- )
|
: send-mouse-moved ( view event -- )
|
||||||
[ mouse-location ] [ drop window ] 2bi move-hand fire-motion ;
|
[ mouse-location ] [ drop window ] 2bi move-hand fire-motion yield ;
|
||||||
|
|
||||||
: button ( event -- n )
|
: button ( event -- n )
|
||||||
#! Cocoa -> Factor UI button mapping
|
#! Cocoa -> Factor UI button mapping
|
||||||
|
|
|
@ -3,7 +3,8 @@
|
||||||
USING: accessors arrays hashtables kernel models math namespaces
|
USING: accessors arrays hashtables kernel models math namespaces
|
||||||
make sequences quotations math.vectors combinators sorting
|
make sequences quotations math.vectors combinators sorting
|
||||||
binary-search vectors dlists deques models threads
|
binary-search vectors dlists deques models threads
|
||||||
concurrency.flags math.order math.rectangles fry locals ;
|
concurrency.flags math.order math.rectangles fry locals
|
||||||
|
prettyprint.backend prettyprint.custom ;
|
||||||
IN: ui.gadgets
|
IN: ui.gadgets
|
||||||
|
|
||||||
! Values for orientation slot
|
! Values for orientation slot
|
||||||
|
@ -27,6 +28,9 @@ interior
|
||||||
boundary
|
boundary
|
||||||
model ;
|
model ;
|
||||||
|
|
||||||
|
! Don't print gadgets with RECT: syntax
|
||||||
|
M: gadget pprint* pprint-tuple ;
|
||||||
|
|
||||||
M: gadget equal? 2drop f ;
|
M: gadget equal? 2drop f ;
|
||||||
|
|
||||||
M: gadget hashcode* nip [ [ \ gadget counter ] unless* ] change-id id>> ;
|
M: gadget hashcode* nip [ [ \ gadget counter ] unless* ] change-id id>> ;
|
||||||
|
|
|
@ -18,7 +18,7 @@ HELP: <status-bar>
|
||||||
{ $notes "If the " { $snippet "model" } " is " { $snippet "status" } ", this gadget will display mouse over help for " { $link "ui.gadgets.presentations" } "." } ;
|
{ $notes "If the " { $snippet "model" } " is " { $snippet "status" } ", this gadget will display mouse over help for " { $link "ui.gadgets.presentations" } "." } ;
|
||||||
|
|
||||||
HELP: open-status-window
|
HELP: open-status-window
|
||||||
{ $values { "gadget" gadget } { "title" string } }
|
{ $values { "gadget" gadget } { "title/attributes" { "a " { $link string } " or a " { $link world-attributes } " tuple" } } }
|
||||||
{ $description "Like " { $link open-window } ", with the additional feature that the new window iwll have a status bar displaying the value stored in the world's " { $slot "status" } " slot." }
|
{ $description "Like " { $link open-window } ", with the additional feature that the new window iwll have a status bar displaying the value stored in the world's " { $slot "status" } " slot." }
|
||||||
{ $see-also show-status hide-status } ;
|
{ $see-also show-status hide-status } ;
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: accessors models models.delay models.arrow
|
USING: accessors models models.delay models.arrow
|
||||||
sequences ui.gadgets.labels ui.gadgets.tracks
|
sequences ui.gadgets.labels ui.gadgets.tracks
|
||||||
ui.gadgets.worlds ui.gadgets ui kernel calendar summary ;
|
ui.gadgets.worlds ui.gadgets ui ui.private kernel calendar summary ;
|
||||||
IN: ui.gadgets.status-bar
|
IN: ui.gadgets.status-bar
|
||||||
|
|
||||||
: <status-bar> ( model -- gadget )
|
: <status-bar> ( model -- gadget )
|
||||||
|
@ -10,9 +10,9 @@ IN: ui.gadgets.status-bar
|
||||||
reverse-video-theme
|
reverse-video-theme
|
||||||
t >>root? ;
|
t >>root? ;
|
||||||
|
|
||||||
: open-status-window ( gadget title -- )
|
: open-status-window ( gadget title/attributes -- )
|
||||||
f <model> [ <world> ] keep
|
?attributes f <model> >>status <world>
|
||||||
<status-bar> f track-add
|
dup status>> <status-bar> f track-add
|
||||||
open-world-window ;
|
open-world-window ;
|
||||||
|
|
||||||
: show-summary ( object gadget -- )
|
: show-summary ( object gadget -- )
|
||||||
|
|
|
@ -48,8 +48,8 @@ HELP: world
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
HELP: <world>
|
HELP: <world>
|
||||||
{ $values { "gadget" gadget } { "title" string } { "status" model } { "world" "a new " { $link world } } }
|
{ $values { "world-attributes" world-attributes } { "world" "a new " { $link world } } }
|
||||||
{ $description "Creates a new " { $link world } " delegating to the given gadget." } ;
|
{ $description "Creates a new " { $link world } " or world subclass with the given attributes." } ;
|
||||||
|
|
||||||
HELP: find-world
|
HELP: find-world
|
||||||
{ $values { "gadget" gadget } { "world/f" { $maybe world } } }
|
{ $values { "gadget" gadget } { "world/f" { $maybe world } } }
|
||||||
|
@ -65,6 +65,30 @@ HELP: find-gl-context
|
||||||
{ $description "Makes the OpenGL context of the gadget's containing native window the current OpenGL context." }
|
{ $description "Makes the OpenGL context of the gadget's containing native window the current OpenGL context." }
|
||||||
{ $notes "This word should be called from " { $link graft* } " and " { $link ungraft* } " methods which need to allocate and deallocate OpenGL resources, such as textures, display lists, and so on." } ;
|
{ $notes "This word should be called from " { $link graft* } " and " { $link ungraft* } " methods which need to allocate and deallocate OpenGL resources, such as textures, display lists, and so on." } ;
|
||||||
|
|
||||||
|
HELP: begin-world
|
||||||
|
{ $values { "world" world } }
|
||||||
|
{ $description "Called immediately after " { $snippet "world" } "'s OpenGL context has been created. The world's OpenGL context is current when this method is called." } ;
|
||||||
|
|
||||||
|
HELP: end-world
|
||||||
|
{ $values { "world" world } }
|
||||||
|
{ $description "Called immediately before " { $snippet "world" } "'s OpenGL context is destroyed. The world's OpenGL context is current when this method is called." } ;
|
||||||
|
|
||||||
|
HELP: resize-world
|
||||||
|
{ $values { "world" world } }
|
||||||
|
{ $description "Called when the window containing " { $snippet "world" } " is resized. The " { $snippet "loc" } " and " { $snippet "dim" } " slots of " { $snippet "world" } " will be updated with the world's new position and size. The world's OpenGL context is current when this method is called." } ;
|
||||||
|
|
||||||
|
HELP: draw-world*
|
||||||
|
{ $values { "world" world } }
|
||||||
|
{ $description "Called when " { $snippet "world" } " needs to be redrawn. The world's OpenGL context is current when this method is called." } ;
|
||||||
|
|
||||||
|
ARTICLE: "ui.gadgets.worlds-subclassing" "Subclassing worlds"
|
||||||
|
"The " { $link world } " gadget can be subclassed, giving Factor code full control of the window's OpenGL context. The following generic words can be overridden to replace standard UI behavior:"
|
||||||
|
{ $subsection begin-world }
|
||||||
|
{ $subsection end-world }
|
||||||
|
{ $subsection resize-world }
|
||||||
|
{ $subsection draw-world* }
|
||||||
|
"See the " { $vocab-link "spheres" } " and " { $vocab-link "bunny" } " demos for examples." ;
|
||||||
|
|
||||||
ARTICLE: "ui-paint-custom" "Implementing custom drawing logic"
|
ARTICLE: "ui-paint-custom" "Implementing custom drawing logic"
|
||||||
"The UI uses OpenGL to render gadgets. Custom rendering logic can be plugged in with the " { $link "ui-pen-protocol" } ", or by implementing a generic word:"
|
"The UI uses OpenGL to render gadgets. Custom rendering logic can be plugged in with the " { $link "ui-pen-protocol" } ", or by implementing a generic word:"
|
||||||
{ $subsection draw-gadget* }
|
{ $subsection draw-gadget* }
|
||||||
|
@ -72,7 +96,8 @@ ARTICLE: "ui-paint-custom" "Implementing custom drawing logic"
|
||||||
$nl
|
$nl
|
||||||
"Gadgets which need to allocate and deallocate OpenGL resources such as textures, display lists, and so on, should perform the allocation in the " { $link graft* } " method, and the deallocation in the " { $link ungraft* } " method. Since those words are not necessarily called with the gadget's OpenGL context active, a utility word can be used to find and make the correct OpenGL context current:"
|
"Gadgets which need to allocate and deallocate OpenGL resources such as textures, display lists, and so on, should perform the allocation in the " { $link graft* } " method, and the deallocation in the " { $link ungraft* } " method. Since those words are not necessarily called with the gadget's OpenGL context active, a utility word can be used to find and make the correct OpenGL context current:"
|
||||||
{ $subsection find-gl-context }
|
{ $subsection find-gl-context }
|
||||||
"OpenGL state must not be altered as a result of drawing a gadget, so any flags which were enabled should be disabled, and vice versa."
|
"OpenGL state must not be altered as a result of drawing a gadget, so any flags which were enabled should be disabled, and vice versa. To take full control of the OpenGL context, see " { $link "ui.gadgets.worlds-subclassing" } "."
|
||||||
{ $subsection "ui-paint-coord" }
|
{ $subsection "ui-paint-coord" }
|
||||||
|
{ $subsection "ui.gadgets.worlds-subclassing" }
|
||||||
{ $subsection "gl-utilities" }
|
{ $subsection "gl-utilities" }
|
||||||
{ $subsection "text-rendering" } ;
|
{ $subsection "text-rendering" } ;
|
||||||
|
|
|
@ -4,15 +4,28 @@ USING: accessors arrays assocs continuations kernel math models
|
||||||
namespaces opengl opengl.textures sequences io combinators
|
namespaces opengl opengl.textures sequences io combinators
|
||||||
combinators.short-circuit fry math.vectors math.rectangles cache
|
combinators.short-circuit fry math.vectors math.rectangles cache
|
||||||
ui.gadgets ui.gestures ui.render ui.backend ui.gadgets.tracks
|
ui.gadgets ui.gestures ui.render ui.backend ui.gadgets.tracks
|
||||||
ui.commands ui.pixel-formats destructors ;
|
ui.commands ui.pixel-formats destructors literals ;
|
||||||
IN: ui.gadgets.worlds
|
IN: ui.gadgets.worlds
|
||||||
|
|
||||||
|
CONSTANT: default-world-pixel-format-attributes
|
||||||
|
{ windowed double-buffered T{ depth-bits { value 16 } } }
|
||||||
|
|
||||||
TUPLE: world < track
|
TUPLE: world < track
|
||||||
active? focused?
|
active? focused?
|
||||||
layers
|
layers
|
||||||
title status status-owner
|
title status status-owner
|
||||||
text-handle handle images
|
text-handle handle images
|
||||||
window-loc ;
|
window-loc
|
||||||
|
pixel-format-attributes ;
|
||||||
|
|
||||||
|
TUPLE: world-attributes
|
||||||
|
{ world-class initial: world }
|
||||||
|
title
|
||||||
|
status
|
||||||
|
gadgets
|
||||||
|
{ pixel-format-attributes initial: $ default-world-pixel-format-attributes } ;
|
||||||
|
|
||||||
|
C: <world-attributes> world-attributes
|
||||||
|
|
||||||
: find-world ( gadget -- world/f ) [ world? ] find-parent ;
|
: find-world ( gadget -- world/f ) [ world? ] find-parent ;
|
||||||
|
|
||||||
|
@ -45,18 +58,23 @@ M: world request-focus-on ( child gadget -- )
|
||||||
2dup eq?
|
2dup eq?
|
||||||
[ 2drop ] [ dup focused?>> (request-focus) ] if ;
|
[ 2drop ] [ dup focused?>> (request-focus) ] if ;
|
||||||
|
|
||||||
: new-world ( gadget title status class -- world )
|
: new-world ( class -- world )
|
||||||
vertical swap new-track
|
vertical swap new-track
|
||||||
t >>root?
|
t >>root?
|
||||||
t >>active?
|
t >>active?
|
||||||
{ 0 0 } >>window-loc
|
{ 0 0 } >>window-loc ;
|
||||||
swap >>status
|
|
||||||
swap >>title
|
|
||||||
swap 1 track-add
|
|
||||||
dup request-focus ;
|
|
||||||
|
|
||||||
: <world> ( gadget title status -- world )
|
: apply-world-attributes ( world attributes -- world )
|
||||||
world new-world ;
|
{
|
||||||
|
[ title>> >>title ]
|
||||||
|
[ status>> >>status ]
|
||||||
|
[ pixel-format-attributes>> >>pixel-format-attributes ]
|
||||||
|
[ gadgets>> [ 1 track-add ] each ]
|
||||||
|
} cleave ;
|
||||||
|
|
||||||
|
: <world> ( world-attributes -- world )
|
||||||
|
[ world-class>> new-world ] keep apply-world-attributes
|
||||||
|
dup request-focus ;
|
||||||
|
|
||||||
: as-big-as-possible ( world gadget -- )
|
: as-big-as-possible ( world gadget -- )
|
||||||
dup [ { 0 0 } >>loc over dim>> >>dim ] when 2drop ; inline
|
dup [ { 0 0 } >>loc over dim>> >>dim ] when 2drop ; inline
|
||||||
|
@ -77,17 +95,36 @@ SYMBOL: flush-layout-cache-hook
|
||||||
|
|
||||||
flush-layout-cache-hook [ [ ] ] initialize
|
flush-layout-cache-hook [ [ ] ] initialize
|
||||||
|
|
||||||
: (draw-world) ( world -- )
|
GENERIC: begin-world ( world -- )
|
||||||
dup handle>> [
|
GENERIC: end-world ( world -- )
|
||||||
|
|
||||||
|
GENERIC: resize-world ( world -- )
|
||||||
|
|
||||||
|
M: world begin-world
|
||||||
|
drop ;
|
||||||
|
M: world end-world
|
||||||
|
drop ;
|
||||||
|
M: world resize-world
|
||||||
|
drop ;
|
||||||
|
|
||||||
|
M: world (>>dim)
|
||||||
|
[ call-next-method ]
|
||||||
|
[
|
||||||
|
dup handle>>
|
||||||
|
[ select-gl-context resize-world ]
|
||||||
|
[ drop ] if*
|
||||||
|
] bi ;
|
||||||
|
|
||||||
|
GENERIC: draw-world* ( world -- )
|
||||||
|
|
||||||
|
M: world draw-world*
|
||||||
check-extensions
|
check-extensions
|
||||||
{
|
{
|
||||||
[ init-gl ]
|
[ init-gl ]
|
||||||
[ draw-gadget ]
|
[ draw-gadget ]
|
||||||
[ text-handle>> [ purge-cache ] when* ]
|
[ text-handle>> [ purge-cache ] when* ]
|
||||||
[ images>> [ purge-cache ] when* ]
|
[ images>> [ purge-cache ] when* ]
|
||||||
} cleave
|
} cleave ;
|
||||||
] with-gl-context
|
|
||||||
flush-layout-cache-hook get call( -- ) ;
|
|
||||||
|
|
||||||
: draw-world? ( world -- ? )
|
: draw-world? ( world -- ? )
|
||||||
#! We don't draw deactivated worlds, or those with 0 size.
|
#! We don't draw deactivated worlds, or those with 0 size.
|
||||||
|
@ -108,7 +145,10 @@ ui-error-hook [ [ rethrow ] ] initialize
|
||||||
: draw-world ( world -- )
|
: draw-world ( world -- )
|
||||||
dup draw-world? [
|
dup draw-world? [
|
||||||
dup world [
|
dup world [
|
||||||
[ (draw-world) ] [
|
[
|
||||||
|
dup handle>> [ draw-world* ] with-gl-context
|
||||||
|
flush-layout-cache-hook get call( -- )
|
||||||
|
] [
|
||||||
over <world-error> ui-error
|
over <world-error> ui-error
|
||||||
f >>active? drop
|
f >>active? drop
|
||||||
] recover
|
] recover
|
||||||
|
@ -151,8 +191,7 @@ M: world handle-gesture ( gesture gadget -- ? )
|
||||||
[ get-global find-world eq? ] keep '[ f _ set-global ] when ;
|
[ get-global find-world eq? ] keep '[ f _ set-global ] when ;
|
||||||
|
|
||||||
M: world world-pixel-format-attributes
|
M: world world-pixel-format-attributes
|
||||||
drop
|
pixel-format-attributes>> ;
|
||||||
{ windowed double-buffered T{ depth-bits { value 16 } } } ;
|
|
||||||
|
|
||||||
M: world check-world-pixel-format
|
M: world check-world-pixel-format
|
||||||
2drop ;
|
2drop ;
|
||||||
|
@ -160,3 +199,4 @@ M: world check-world-pixel-format
|
||||||
: with-world-pixel-format ( world quot -- )
|
: with-world-pixel-format ( world quot -- )
|
||||||
[ dup dup world-pixel-format-attributes <pixel-format> ]
|
[ dup dup world-pixel-format-attributes <pixel-format> ]
|
||||||
dip [ 2dup check-world-pixel-format ] prepose with-disposal ; inline
|
dip [ 2dup check-world-pixel-format ] prepose with-disposal ; inline
|
||||||
|
|
||||||
|
|
|
@ -91,29 +91,29 @@ HELP: backing-store
|
||||||
{ double-buffered backing-store } related-words
|
{ double-buffered backing-store } related-words
|
||||||
|
|
||||||
HELP: multisampled
|
HELP: multisampled
|
||||||
{ $class-description "Requests a pixel format with multisampled antialiasing enabled. The " { $link sample-buffers } " and " { $link samples } " attributes must also be specified to specify the level of multisampling." }
|
{ $class-description "Requests a pixel format with multisampled antialiasing enabled. The " { $link sample-buffers } " and " { $link samples } " attributes must also be provided to specify the level of multisampling." }
|
||||||
{ $notes "On some window systems this is not distinct from " { $link supersampled } "." } ;
|
{ $notes "On some window systems this is not distinct from " { $link supersampled } "." } ;
|
||||||
|
|
||||||
HELP: supersampled
|
HELP: supersampled
|
||||||
{ $class-description "Requests a pixel format with supersampled antialiasing enabled. The " { $link sample-buffers } " and " { $link samples } " attributes must also be specified to specify the level of supersampling." }
|
{ $class-description "Requests a pixel format with supersampled antialiasing enabled. The " { $link sample-buffers } " and " { $link samples } " attributes must also be provided to specify the level of supersampling." }
|
||||||
{ $notes "On some window systems this is not distinct from " { $link multisampled } "." } ;
|
{ $notes "On some window systems this is not distinct from " { $link multisampled } "." } ;
|
||||||
|
|
||||||
HELP: sample-alpha
|
HELP: sample-alpha
|
||||||
{ $class-description "Used with " { $link multisampled } " or " { $link supersampled } " to request more accurate multisampling of alpha values." } ;
|
{ $class-description "Used with " { $link multisampled } " or " { $link supersampled } " to request more accurate multisampling of alpha values." } ;
|
||||||
|
|
||||||
HELP: color-float
|
HELP: color-float
|
||||||
{ $class-description "Requests a pixel format where the pixels are stored in floating-point format." } ;
|
{ $class-description "Requests a pixel format where the color buffer is stored in floating-point format." } ;
|
||||||
|
|
||||||
HELP: color-bits
|
HELP: color-bits
|
||||||
{ $class-description "Requests a pixel format of at least " { $snippet "value" } " bits per pixel." } ;
|
{ $class-description "Requests a pixel format with a color buffer of at least " { $snippet "value" } " bits per pixel." } ;
|
||||||
HELP: red-bits
|
HELP: red-bits
|
||||||
{ $class-description "Requests a pixel format with at least " { $snippet "value" } " red bits per pixel." } ;
|
{ $class-description "Requests a pixel format with a color buffer with at least " { $snippet "value" } " red bits per pixel." } ;
|
||||||
HELP: green-bits
|
HELP: green-bits
|
||||||
{ $class-description "Requests a pixel format with at least " { $snippet "value" } " green bits per pixel." } ;
|
{ $class-description "Requests a pixel format with a color buffer with at least " { $snippet "value" } " green bits per pixel." } ;
|
||||||
HELP: blue-bits
|
HELP: blue-bits
|
||||||
{ $class-description "Requests a pixel format with at least " { $snippet "value" } " blue bits per pixel." } ;
|
{ $class-description "Requests a pixel format with a color buffer with at least " { $snippet "value" } " blue bits per pixel." } ;
|
||||||
HELP: alpha-bits
|
HELP: alpha-bits
|
||||||
{ $class-description "Requests a pixel format with at least " { $snippet "value" } " alpha bits per pixel." } ;
|
{ $class-description "Requests a pixel format with a color buffer with at least " { $snippet "value" } " alpha bits per pixel." } ;
|
||||||
|
|
||||||
{ color-float color-bits red-bits green-bits blue-bits alpha-bits } related-words
|
{ color-float color-bits red-bits green-bits blue-bits alpha-bits } related-words
|
||||||
|
|
||||||
|
|
|
@ -2,17 +2,28 @@ USING: help.markup help.syntax strings quotations debugger
|
||||||
namespaces ui.backend ui.gadgets ui.gadgets.worlds
|
namespaces ui.backend ui.gadgets ui.gadgets.worlds
|
||||||
ui.gadgets.tracks ui.gadgets.packs ui.gadgets.grids
|
ui.gadgets.tracks ui.gadgets.packs ui.gadgets.grids
|
||||||
ui.gadgets.private math.rectangles colors ui.text fonts
|
ui.gadgets.private math.rectangles colors ui.text fonts
|
||||||
kernel ui.private ;
|
kernel ui.private classes sequences ;
|
||||||
IN: ui
|
IN: ui
|
||||||
|
|
||||||
HELP: windows
|
HELP: windows
|
||||||
{ $var-description "Global variable holding an association list mapping native window handles to " { $link world } " instances." } ;
|
{ $var-description "Global variable holding an association list mapping native window handles to " { $link world } " instances." } ;
|
||||||
|
|
||||||
{ windows open-window find-window } related-words
|
{ windows open-window find-window world-attributes } related-words
|
||||||
|
|
||||||
HELP: open-window
|
HELP: open-window
|
||||||
{ $values { "gadget" gadget } { "title" string } }
|
{ $values { "gadget" gadget } { "title/attributes" { "a " { $link string } " or a " { $link world-attributes } " tuple" } } }
|
||||||
{ $description "Opens a native window with the specified title." } ;
|
{ $description "Opens a native window containing " { $snippet "gadget" } " with the specified attributes. If a string is provided, it is used as the window title; otherwise, the window attributes are specified in a " { $link world-attributes } " tuple." } ;
|
||||||
|
|
||||||
|
HELP: world-attributes
|
||||||
|
{ $values { "world-class" class } { "title" string } { "status" gadget } { "gadgets" sequence } { "pixel-format-attributes" sequence } }
|
||||||
|
{ $class-description "Tuples of this class can be passed to " { $link open-window } " to control attributes of the window opened. The following attributes can be set:" }
|
||||||
|
{ $list
|
||||||
|
{ { $snippet "world-class" } " specifies the class of world to construct. " { $link world } " is the default." }
|
||||||
|
{ { $snippet "title" } " is the window title." }
|
||||||
|
{ { $snippet "status" } ", if specified, is a gadget that will be used as the window's status bar." }
|
||||||
|
{ { $snippet "gadgets" } " is a sequence of gadgets that will be placed inside the window." }
|
||||||
|
{ { $snippet "pixel-format-attributes" } " is a sequence of " { $link "ui.pixel-formats-attributes" } " that the window will request for its OpenGL pixel format." }
|
||||||
|
} ;
|
||||||
|
|
||||||
HELP: set-fullscreen?
|
HELP: set-fullscreen?
|
||||||
{ $values { "?" "a boolean" } { "gadget" gadget } }
|
{ $values { "?" "a boolean" } { "gadget" gadget } }
|
||||||
|
|
|
@ -4,7 +4,8 @@ USING: arrays assocs io kernel math models namespaces make dlists
|
||||||
deques sequences threads sequences words continuations init
|
deques sequences threads sequences words continuations init
|
||||||
combinators combinators.short-circuit hashtables concurrency.flags
|
combinators combinators.short-circuit hashtables concurrency.flags
|
||||||
sets accessors calendar fry destructors ui.gadgets ui.gadgets.private
|
sets accessors calendar fry destructors ui.gadgets ui.gadgets.private
|
||||||
ui.gadgets.worlds ui.gadgets.tracks ui.gestures ui.backend ui.render ;
|
ui.gadgets.worlds ui.gadgets.tracks ui.gestures ui.backend ui.render
|
||||||
|
strings ;
|
||||||
IN: ui
|
IN: ui
|
||||||
|
|
||||||
<PRIVATE
|
<PRIVATE
|
||||||
|
@ -49,8 +50,20 @@ SYMBOL: windows
|
||||||
f >>focused?
|
f >>focused?
|
||||||
focus-path f swap focus-gestures ;
|
focus-path f swap focus-gestures ;
|
||||||
|
|
||||||
M: world graft*
|
: try-to-open-window ( world -- )
|
||||||
|
{
|
||||||
[ (open-window) ]
|
[ (open-window) ]
|
||||||
|
[ handle>> select-gl-context ]
|
||||||
|
[
|
||||||
|
[ begin-world ]
|
||||||
|
[ [ handle>> (close-window) ] [ ui-error ] bi* ]
|
||||||
|
recover
|
||||||
|
]
|
||||||
|
[ resize-world ]
|
||||||
|
} cleave ;
|
||||||
|
|
||||||
|
M: world graft*
|
||||||
|
[ try-to-open-window ]
|
||||||
[ [ title>> ] keep set-title ]
|
[ [ title>> ] keep set-title ]
|
||||||
[ request-focus ] tri ;
|
[ request-focus ] tri ;
|
||||||
|
|
||||||
|
@ -66,6 +79,7 @@ M: world graft*
|
||||||
[ images>> [ dispose ] when* ]
|
[ images>> [ dispose ] when* ]
|
||||||
[ hand-clicked close-global ]
|
[ hand-clicked close-global ]
|
||||||
[ hand-gadget close-global ]
|
[ hand-gadget close-global ]
|
||||||
|
[ end-world ]
|
||||||
} cleave ;
|
} cleave ;
|
||||||
|
|
||||||
M: world ungraft*
|
M: world ungraft*
|
||||||
|
@ -166,13 +180,17 @@ PRIVATE>
|
||||||
: restore-windows? ( -- ? )
|
: restore-windows? ( -- ? )
|
||||||
windows get empty? not ;
|
windows get empty? not ;
|
||||||
|
|
||||||
|
: ?attributes ( gadget title/attributes -- attributes )
|
||||||
|
dup string? [ world-attributes new swap >>title ] when
|
||||||
|
swap [ [ [ 1array ] [ f ] if* ] curry unless* ] curry change-gadgets ;
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
||||||
: open-world-window ( world -- )
|
: open-world-window ( world -- )
|
||||||
dup pref-dim >>dim dup relayout graft ;
|
dup pref-dim >>dim dup relayout graft ;
|
||||||
|
|
||||||
: open-window ( gadget title -- )
|
: open-window ( gadget title/attributes -- )
|
||||||
f <world> open-world-window ;
|
?attributes <world> open-world-window ;
|
||||||
|
|
||||||
: set-fullscreen? ( ? gadget -- )
|
: set-fullscreen? ( ? gadget -- )
|
||||||
find-world set-fullscreen* ;
|
find-world set-fullscreen* ;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
USING: alien.c-types kernel locals math math.bitwise
|
USING: alien.c-types kernel locals math math.bitwise
|
||||||
windows.kernel32 sequences byte-arrays unicode.categories
|
windows.kernel32 sequences byte-arrays unicode.categories
|
||||||
io.encodings.string io.encodings.utf16n alien.strings
|
io.encodings.string io.encodings.utf16n alien.strings
|
||||||
arrays ;
|
arrays literals ;
|
||||||
IN: windows.errors
|
IN: windows.errors
|
||||||
|
|
||||||
CONSTANT: ERROR_SUCCESS 0
|
CONSTANT: ERROR_SUCCESS 0
|
||||||
|
@ -732,11 +732,13 @@ ERROR: error-message-failed id ;
|
||||||
win32-error-string throw
|
win32-error-string throw
|
||||||
] when ;
|
] when ;
|
||||||
|
|
||||||
: expected-io-errors ( -- seq )
|
CONSTANT: expected-io-errors
|
||||||
|
${
|
||||||
ERROR_SUCCESS
|
ERROR_SUCCESS
|
||||||
ERROR_IO_INCOMPLETE
|
ERROR_IO_INCOMPLETE
|
||||||
ERROR_IO_PENDING
|
ERROR_IO_PENDING
|
||||||
WAIT_TIMEOUT 4array ; foldable
|
WAIT_TIMEOUT
|
||||||
|
}
|
||||||
|
|
||||||
: expected-io-error? ( error-code -- ? )
|
: expected-io-error? ( error-code -- ? )
|
||||||
expected-io-errors member? ;
|
expected-io-errors member? ;
|
||||||
|
|
|
@ -1,58 +1,67 @@
|
||||||
USING: accessors arrays bunny.cel-shaded bunny.fixed-pipeline
|
USING: accessors arrays bunny.cel-shaded bunny.fixed-pipeline
|
||||||
bunny.model bunny.outlined destructors kernel math opengl.demo-support
|
bunny.model bunny.outlined destructors kernel math opengl.demo-support
|
||||||
opengl.gl sequences ui ui.gadgets ui.gadgets.worlds ui.gestures
|
opengl.gl sequences ui ui.gadgets ui.gadgets.worlds ui.gestures
|
||||||
ui.render words ;
|
ui.render words ui.pixel-formats ;
|
||||||
IN: bunny
|
IN: bunny
|
||||||
|
|
||||||
TUPLE: bunny-gadget < demo-gadget model-triangles geom draw-seq draw-n ;
|
TUPLE: bunny-world < demo-world model-triangles geom draw-seq draw-n ;
|
||||||
|
|
||||||
: <bunny-gadget> ( -- bunny-gadget )
|
: get-draw ( gadget -- draw )
|
||||||
0.0 0.0 0.375 bunny-gadget new-demo-gadget
|
|
||||||
maybe-download read-model >>model-triangles ;
|
|
||||||
|
|
||||||
: bunny-gadget-draw ( gadget -- draw )
|
|
||||||
[ draw-n>> ] [ draw-seq>> ] bi nth ;
|
[ draw-n>> ] [ draw-seq>> ] bi nth ;
|
||||||
|
|
||||||
: bunny-gadget-next-draw ( gadget -- )
|
: next-draw ( gadget -- )
|
||||||
dup [ draw-seq>> ] [ draw-n>> ] bi
|
dup [ draw-seq>> ] [ draw-n>> ] bi
|
||||||
1+ swap length mod
|
1+ swap length mod
|
||||||
>>draw-n relayout-1 ;
|
>>draw-n relayout-1 ;
|
||||||
|
|
||||||
M: bunny-gadget graft* ( gadget -- )
|
: make-draws ( gadget -- draw-seq )
|
||||||
dup find-gl-context
|
|
||||||
GL_DEPTH_TEST glEnable
|
|
||||||
dup model-triangles>> <bunny-geom> >>geom
|
|
||||||
dup
|
|
||||||
[ <bunny-fixed-pipeline> ]
|
[ <bunny-fixed-pipeline> ]
|
||||||
[ <bunny-cel-shaded> ]
|
[ <bunny-cel-shaded> ]
|
||||||
[ <bunny-outlined> ] tri 3array
|
[ <bunny-outlined> ] tri 3array
|
||||||
sift >>draw-seq
|
sift ;
|
||||||
|
|
||||||
|
M: bunny-world begin-world
|
||||||
|
GL_DEPTH_TEST glEnable
|
||||||
|
0.0 0.0 0.375 set-demo-orientation
|
||||||
|
maybe-download read-model
|
||||||
|
[ >>model-triangles ] [ <bunny-geom> >>geom ] bi
|
||||||
|
dup make-draws >>draw-seq
|
||||||
0 >>draw-n
|
0 >>draw-n
|
||||||
drop ;
|
drop ;
|
||||||
|
|
||||||
M: bunny-gadget ungraft* ( gadget -- )
|
M: bunny-world end-world
|
||||||
dup find-gl-context
|
dup find-gl-context
|
||||||
[ geom>> [ dispose ] when* ]
|
[ geom>> [ dispose ] when* ]
|
||||||
[ draw-seq>> [ [ dispose ] when* ] each ] bi ;
|
[ draw-seq>> [ [ dispose ] when* ] each ] bi ;
|
||||||
|
|
||||||
M: bunny-gadget draw-gadget* ( gadget -- )
|
M: bunny-world draw-world*
|
||||||
dup draw-seq>> empty? [ drop ] [
|
dup draw-seq>> empty? [ drop ] [
|
||||||
0.15 0.15 0.15 1.0 glClearColor
|
0.15 0.15 0.15 1.0 glClearColor
|
||||||
GL_DEPTH_BUFFER_BIT GL_COLOR_BUFFER_BIT bitor glClear
|
GL_DEPTH_BUFFER_BIT GL_COLOR_BUFFER_BIT bitor glClear
|
||||||
dup demo-gadget-set-matrices
|
dup demo-world-set-matrix
|
||||||
GL_MODELVIEW glMatrixMode
|
GL_MODELVIEW glMatrixMode
|
||||||
0.02 -0.105 0.0 glTranslatef
|
0.02 -0.105 0.0 glTranslatef
|
||||||
[ geom>> ] [ bunny-gadget-draw ] bi draw-bunny
|
[ geom>> ] [ get-draw ] bi draw-bunny
|
||||||
] if ;
|
] if ;
|
||||||
|
|
||||||
M: bunny-gadget pref-dim* ( gadget -- dim )
|
M: bunny-world pref-dim* ( gadget -- dim )
|
||||||
drop { 640 480 } ;
|
drop { 640 480 } ;
|
||||||
|
|
||||||
bunny-gadget H{
|
bunny-world H{
|
||||||
{ T{ key-down f f "TAB" } [ bunny-gadget-next-draw ] }
|
{ T{ key-down f f "TAB" } [ next-draw ] }
|
||||||
} set-gestures
|
} set-gestures
|
||||||
|
|
||||||
: bunny-window ( -- )
|
: bunny-window ( -- )
|
||||||
[ <bunny-gadget> "Bunny" open-window ] with-ui ;
|
[
|
||||||
|
f T{ world-attributes
|
||||||
|
{ world-class bunny-world }
|
||||||
|
{ title "Bunny" }
|
||||||
|
{ pixel-format-attributes {
|
||||||
|
windowed
|
||||||
|
double-buffered
|
||||||
|
T{ depth-bits { value 16 } }
|
||||||
|
} }
|
||||||
|
} open-window
|
||||||
|
] with-ui ;
|
||||||
|
|
||||||
MAIN: bunny-window
|
MAIN: bunny-window
|
||||||
|
|
|
@ -216,7 +216,11 @@ MACRO: (framebuffer-texture>>draw) ( iformat xformat setter -- )
|
||||||
] with-framebuffer ;
|
] with-framebuffer ;
|
||||||
|
|
||||||
: (pass2) ( draw -- )
|
: (pass2) ( draw -- )
|
||||||
init-matrices {
|
GL_PROJECTION glMatrixMode
|
||||||
|
glPushMatrix glLoadIdentity
|
||||||
|
GL_MODELVIEW glMatrixMode
|
||||||
|
glLoadIdentity
|
||||||
|
{
|
||||||
[ color-texture>> GL_TEXTURE_2D GL_TEXTURE0 bind-texture-unit ]
|
[ color-texture>> GL_TEXTURE_2D GL_TEXTURE0 bind-texture-unit ]
|
||||||
[ normal-texture>> GL_TEXTURE_2D GL_TEXTURE1 bind-texture-unit ]
|
[ normal-texture>> GL_TEXTURE_2D GL_TEXTURE1 bind-texture-unit ]
|
||||||
[ depth-texture>> GL_TEXTURE_2D GL_TEXTURE2 bind-texture-unit ]
|
[ depth-texture>> GL_TEXTURE_2D GL_TEXTURE2 bind-texture-unit ]
|
||||||
|
@ -230,7 +234,9 @@ MACRO: (framebuffer-texture>>draw) ( iformat xformat setter -- )
|
||||||
} cleave { -1.0 -1.0 } { 1.0 1.0 } rect-vertices
|
} cleave { -1.0 -1.0 } { 1.0 1.0 } rect-vertices
|
||||||
] with-gl-program
|
] with-gl-program
|
||||||
]
|
]
|
||||||
} cleave ;
|
} cleave
|
||||||
|
GL_PROJECTION glMatrixMode
|
||||||
|
glPopMatrix ;
|
||||||
|
|
||||||
M: bunny-outlined draw-bunny
|
M: bunny-outlined draw-bunny
|
||||||
[ remake-framebuffer-if-needed ]
|
[ remake-framebuffer-if-needed ]
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
USING: accessors delegate delegate.protocols io.pathnames
|
USING: accessors arrays delegate delegate.protocols
|
||||||
kernel locals namespaces sequences vectors
|
io.pathnames kernel locals namespaces prettyprint sequences
|
||||||
tools.annotations prettyprint ;
|
ui.frp vectors ;
|
||||||
IN: file-trees
|
IN: file-trees
|
||||||
|
|
||||||
TUPLE: tree node children ;
|
TUPLE: tree node children ;
|
||||||
CONSULT: sequence-protocol tree children>> [ node>> ] map ;
|
CONSULT: sequence-protocol tree children>> ;
|
||||||
|
|
||||||
: <tree> ( start -- tree ) V{ } clone
|
: <tree> ( start -- tree ) V{ } clone
|
||||||
[ tree boa dup children>> ] [ ".." swap tree boa ] bi swap push ;
|
[ tree boa dup children>> ] [ ".." swap tree boa ] bi swap push ;
|
||||||
|
@ -21,3 +21,8 @@ DEFER: (tree-insert)
|
||||||
] if* ;
|
] if* ;
|
||||||
: create-tree ( file-list -- tree ) [ path-components ] map
|
: create-tree ( file-list -- tree ) [ path-components ] map
|
||||||
t <tree> [ [ tree-insert ] curry each ] keep ;
|
t <tree> [ [ tree-insert ] curry each ] keep ;
|
||||||
|
|
||||||
|
: <dir-table> ( tree-model -- table )
|
||||||
|
<frp-list*> [ node>> 1array ] >>quot
|
||||||
|
[ selected-value>> <switch> ]
|
||||||
|
[ swap >>model ] bi ;
|
|
@ -1,6 +1,6 @@
|
||||||
USING: arrays kernel math math.functions math.order math.vectors
|
USING: arrays kernel math math.functions math.order math.vectors
|
||||||
namespaces opengl opengl.gl sequences ui ui.gadgets ui.gestures
|
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
|
IN: opengl.demo-support
|
||||||
|
|
||||||
: FOV ( -- x ) 2.0 sqrt 1+ ; inline
|
: FOV ( -- x ) 2.0 sqrt 1+ ; inline
|
||||||
|
@ -9,62 +9,62 @@ CONSTANT: KEY-ROTATE-STEP 10.0
|
||||||
|
|
||||||
SYMBOL: last-drag-loc
|
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 )
|
: set-demo-orientation ( world yaw pitch distance -- world )
|
||||||
new
|
[ >>yaw ] [ >>pitch ] [ >>distance ] tri* ;
|
||||||
swap >>distance
|
|
||||||
swap >>pitch
|
|
||||||
swap >>yaw ; inline
|
|
||||||
|
|
||||||
GENERIC: far-plane ( gadget -- z )
|
GENERIC: far-plane ( gadget -- z )
|
||||||
GENERIC: near-plane ( gadget -- z )
|
GENERIC: near-plane ( gadget -- z )
|
||||||
GENERIC: distance-step ( gadget -- dz )
|
GENERIC: distance-step ( gadget -- dz )
|
||||||
|
|
||||||
M: demo-gadget far-plane ( gadget -- z )
|
M: demo-world far-plane ( gadget -- z )
|
||||||
drop 4.0 ;
|
drop 4.0 ;
|
||||||
M: demo-gadget near-plane ( gadget -- z )
|
M: demo-world near-plane ( gadget -- z )
|
||||||
drop 1.0 64.0 / ;
|
drop 1.0 64.0 / ;
|
||||||
M: demo-gadget distance-step ( gadget -- dz )
|
M: demo-world distance-step ( gadget -- dz )
|
||||||
drop 1.0 64.0 / ;
|
drop 1.0 64.0 / ;
|
||||||
|
|
||||||
: fov-ratio ( gadget -- fov ) dim>> dup first2 min v/n ;
|
: 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 ;
|
[ + ] with change-yaw relayout-1 ;
|
||||||
|
|
||||||
: pitch-demo-gadget ( pitch gadget -- )
|
: pitch-demo-world ( pitch gadget -- )
|
||||||
[ + ] with change-pitch relayout-1 ;
|
[ + ] with change-pitch relayout-1 ;
|
||||||
|
|
||||||
: zoom-demo-gadget ( distance gadget -- )
|
: zoom-demo-world ( distance gadget -- )
|
||||||
[ + ] with change-distance relayout-1 ;
|
[ + ] 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 } ;
|
drop { 640 480 } ;
|
||||||
|
|
||||||
: -+ ( x -- -x x )
|
: -+ ( x -- -x x )
|
||||||
[ neg ] keep ;
|
[ neg ] keep ;
|
||||||
|
|
||||||
: demo-gadget-frustum ( gadget -- -x x -y y near far )
|
: demo-world-frustum ( world -- -x x -y y near far )
|
||||||
[ near-plane ] [ far-plane ] [ fov-ratio ] tri [
|
[ near-plane ] [ far-plane ] [ fov-ratio ] tri [
|
||||||
nip swap FOV / v*n
|
nip swap FOV / v*n
|
||||||
first2 [ -+ ] bi@
|
first2 [ -+ ] bi@
|
||||||
] 3keep drop ;
|
] 3keep drop ;
|
||||||
|
|
||||||
: demo-gadget-set-matrices ( gadget -- )
|
M: demo-world resize-world
|
||||||
GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT bitor glClear
|
|
||||||
[
|
|
||||||
GL_PROJECTION glMatrixMode
|
GL_PROJECTION glMatrixMode
|
||||||
glLoadIdentity
|
glLoadIdentity
|
||||||
demo-gadget-frustum glFrustum
|
[ [ 0 0 ] dip dim>> first2 glViewport ]
|
||||||
] [
|
[ demo-world-frustum glFrustum ] bi ;
|
||||||
|
|
||||||
|
: demo-world-set-matrix ( gadget -- )
|
||||||
|
GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT bitor glClear
|
||||||
GL_MODELVIEW glMatrixMode
|
GL_MODELVIEW glMatrixMode
|
||||||
glLoadIdentity
|
glLoadIdentity
|
||||||
[ [ 0.0 0.0 ] dip distance>> neg glTranslatef ]
|
[ [ 0.0 0.0 ] dip distance>> neg glTranslatef ]
|
||||||
[ pitch>> 1.0 0.0 0.0 glRotatef ]
|
[ pitch>> 1.0 0.0 0.0 glRotatef ]
|
||||||
[ yaw>> 0.0 1.0 0.0 glRotatef ]
|
[ yaw>> 0.0 1.0 0.0 glRotatef ]
|
||||||
tri
|
tri ;
|
||||||
] bi ;
|
|
||||||
|
|
||||||
: reset-last-drag-rel ( -- )
|
: reset-last-drag-rel ( -- )
|
||||||
{ 0 0 } last-drag-loc set-global ;
|
{ 0 0 } last-drag-loc set-global ;
|
||||||
|
@ -94,16 +94,16 @@ M: demo-gadget pref-dim* ( gadget -- dim )
|
||||||
swap first swap second glVertex2d
|
swap first swap second glVertex2d
|
||||||
] do-state ;
|
] do-state ;
|
||||||
|
|
||||||
demo-gadget H{
|
demo-world H{
|
||||||
{ T{ key-down f f "LEFT" } [ KEY-ROTATE-STEP neg swap yaw-demo-gadget ] }
|
{ 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-gadget ] }
|
{ 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-gadget ] }
|
{ 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-gadget ] }
|
{ 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-gadget ] }
|
{ T{ key-down f f "=" } [ dup distance-step neg swap zoom-demo-world ] }
|
||||||
{ T{ key-down f f "-" } [ dup distance-step swap zoom-demo-gadget ] }
|
{ T{ key-down f f "-" } [ dup distance-step swap zoom-demo-world ] }
|
||||||
|
|
||||||
{ T{ button-down f f 1 } [ drop reset-last-drag-rel ] }
|
{ 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 ] }
|
{ 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-gadget ] }
|
{ mouse-scroll [ scroll-direction get second over distance-step * swap zoom-demo-world ] }
|
||||||
} set-gestures
|
} set-gestures
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
USING: kernel opengl opengl.demo-support opengl.gl opengl.textures
|
USING: kernel opengl opengl.demo-support opengl.gl opengl.textures
|
||||||
opengl.shaders opengl.framebuffers opengl.capabilities multiline
|
opengl.shaders opengl.framebuffers opengl.capabilities multiline
|
||||||
ui.gadgets accessors sequences ui.render ui math locals arrays
|
ui.gadgets accessors sequences ui.render ui math locals arrays
|
||||||
generalizations combinators ui.gadgets.worlds ;
|
generalizations combinators ui.gadgets.worlds
|
||||||
|
literals ui.pixel-formats ;
|
||||||
IN: spheres
|
IN: spheres
|
||||||
|
|
||||||
STRING: plane-vertex-shader
|
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
|
plane-program solid-sphere-program texture-sphere-program
|
||||||
reflection-framebuffer reflection-depthbuffer
|
reflection-framebuffer reflection-depthbuffer
|
||||||
reflection-texture initialized? ;
|
reflection-texture ;
|
||||||
|
|
||||||
: <spheres-gadget> ( -- gadget )
|
M: spheres-world near-plane ( gadget -- z )
|
||||||
20.0 10.0 20.0 spheres-gadget new-demo-gadget ;
|
|
||||||
|
|
||||||
M: spheres-gadget near-plane ( gadget -- z )
|
|
||||||
drop 1.0 ;
|
drop 1.0 ;
|
||||||
M: spheres-gadget far-plane ( gadget -- z )
|
M: spheres-world far-plane ( gadget -- z )
|
||||||
drop 512.0 ;
|
drop 512.0 ;
|
||||||
M: spheres-gadget distance-step ( gadget -- dz )
|
M: spheres-world distance-step ( gadget -- dz )
|
||||||
drop 0.5 ;
|
drop 0.5 ;
|
||||||
|
|
||||||
: (reflection-dim) ( -- w h )
|
: (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_S GL_CLAMP glTexParameteri
|
||||||
GL_TEXTURE_CUBE_MAP GL_TEXTURE_WRAP_T 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 GL_TEXTURE_WRAP_R GL_CLAMP glTexParameteri
|
||||||
|
${
|
||||||
GL_TEXTURE_CUBE_MAP_POSITIVE_X
|
GL_TEXTURE_CUBE_MAP_POSITIVE_X
|
||||||
GL_TEXTURE_CUBE_MAP_POSITIVE_Y
|
GL_TEXTURE_CUBE_MAP_POSITIVE_Y
|
||||||
GL_TEXTURE_CUBE_MAP_POSITIVE_Z
|
GL_TEXTURE_CUBE_MAP_POSITIVE_Z
|
||||||
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
|
||||||
|
}
|
||||||
[ 0 GL_RGBA8 (reflection-dim) 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 ;
|
||||||
|
@ -171,22 +171,19 @@ M: spheres-gadget distance-step ( gadget -- dz )
|
||||||
sphere-main-fragment-shader <fragment-shader> check-gl-shader
|
sphere-main-fragment-shader <fragment-shader> check-gl-shader
|
||||||
3array <gl-program> check-gl-program ;
|
3array <gl-program> check-gl-program ;
|
||||||
|
|
||||||
M: spheres-gadget graft* ( gadget -- )
|
M: spheres-world begin-world
|
||||||
dup find-gl-context
|
|
||||||
"2.0" { "GL_ARB_shader_objects" } require-gl-version-or-extensions
|
"2.0" { "GL_ARB_shader_objects" } require-gl-version-or-extensions
|
||||||
{ "GL_EXT_framebuffer_object" } require-gl-extensions
|
{ "GL_EXT_framebuffer_object" } require-gl-extensions
|
||||||
|
20.0 10.0 20.0 set-demo-orientation
|
||||||
(plane-program) >>plane-program
|
(plane-program) >>plane-program
|
||||||
(solid-sphere-program) >>solid-sphere-program
|
(solid-sphere-program) >>solid-sphere-program
|
||||||
(texture-sphere-program) >>texture-sphere-program
|
(texture-sphere-program) >>texture-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
|
||||||
t >>initialized?
|
|
||||||
drop ;
|
drop ;
|
||||||
|
|
||||||
M: spheres-gadget ungraft* ( gadget -- )
|
M: spheres-world end-world
|
||||||
f >>initialized?
|
|
||||||
dup find-gl-context
|
|
||||||
{
|
{
|
||||||
[ reflection-framebuffer>> [ delete-framebuffer ] when* ]
|
[ reflection-framebuffer>> [ delete-framebuffer ] when* ]
|
||||||
[ reflection-depthbuffer>> [ delete-renderbuffer ] when* ]
|
[ reflection-depthbuffer>> [ delete-renderbuffer ] when* ]
|
||||||
|
@ -196,7 +193,7 @@ M: spheres-gadget ungraft* ( gadget -- )
|
||||||
[ plane-program>> [ delete-gl-program ] when* ]
|
[ plane-program>> [ delete-gl-program ] when* ]
|
||||||
} cleave ;
|
} cleave ;
|
||||||
|
|
||||||
M: spheres-gadget pref-dim* ( gadget -- dim )
|
M: spheres-world pref-dim* ( gadget -- dim )
|
||||||
drop { 640 480 } ;
|
drop { 640 480 } ;
|
||||||
|
|
||||||
:: (draw-sphere) ( program center radius -- )
|
:: (draw-sphere) ( program center radius -- )
|
||||||
|
@ -254,7 +251,7 @@ M: spheres-gadget pref-dim* ( gadget -- dim )
|
||||||
[ drop 0 0 (reflection-dim) glViewport ]
|
[ drop 0 0 (reflection-dim) glViewport ]
|
||||||
[
|
[
|
||||||
GL_PROJECTION glMatrixMode
|
GL_PROJECTION glMatrixMode
|
||||||
glLoadIdentity
|
glPushMatrix glLoadIdentity
|
||||||
reflection-frustum glFrustum
|
reflection-frustum glFrustum
|
||||||
GL_MODELVIEW glMatrixMode
|
GL_MODELVIEW glMatrixMode
|
||||||
glLoadIdentity
|
glLoadIdentity
|
||||||
|
@ -277,15 +274,19 @@ M: spheres-gadget pref-dim* ( gadget -- dim )
|
||||||
[ GL_TEXTURE_CUBE_MAP_POSITIVE_Y (reflection-face)
|
[ GL_TEXTURE_CUBE_MAP_POSITIVE_Y (reflection-face)
|
||||||
glPopMatrix 90.0 1.0 0.0 0.0 glRotatef ]
|
glPopMatrix 90.0 1.0 0.0 0.0 glRotatef ]
|
||||||
[ sphere-scene ]
|
[ sphere-scene ]
|
||||||
[ dim>> 0 0 rot first2 glViewport ]
|
[
|
||||||
|
[ 0 0 ] dip dim>> first2 glViewport
|
||||||
|
GL_PROJECTION glMatrixMode
|
||||||
|
glPopMatrix
|
||||||
|
]
|
||||||
} cleave ] with-framebuffer ;
|
} cleave ] with-framebuffer ;
|
||||||
|
|
||||||
: (draw-gadget) ( gadget -- )
|
M: spheres-world draw-world*
|
||||||
GL_DEPTH_TEST glEnable
|
GL_DEPTH_TEST glEnable
|
||||||
GL_SCISSOR_TEST glDisable
|
GL_SCISSOR_TEST glDisable
|
||||||
0.15 0.15 1.0 1.0 glClearColor {
|
0.15 0.15 1.0 1.0 glClearColor {
|
||||||
[ (draw-reflection-texture) ]
|
[ (draw-reflection-texture) ]
|
||||||
[ demo-gadget-set-matrices ]
|
[ demo-world-set-matrix ]
|
||||||
[ sphere-scene ]
|
[ sphere-scene ]
|
||||||
[ reflection-texture>> GL_TEXTURE_CUBE_MAP GL_TEXTURE0 bind-texture-unit ]
|
[ reflection-texture>> GL_TEXTURE_CUBE_MAP GL_TEXTURE0 bind-texture-unit ]
|
||||||
[
|
[
|
||||||
|
@ -297,10 +298,17 @@ M: spheres-gadget pref-dim* ( gadget -- dim )
|
||||||
]
|
]
|
||||||
} cleave ;
|
} cleave ;
|
||||||
|
|
||||||
M: spheres-gadget draw-gadget* ( gadget -- )
|
|
||||||
dup initialized?>> [ (draw-gadget) ] [ drop ] if ;
|
|
||||||
|
|
||||||
: spheres-window ( -- )
|
: 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
|
MAIN: spheres-window
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
USING: kernel sequences splitting strings.parser ;
|
USING: combinators effects kernel math sequences splitting
|
||||||
|
strings.parser ;
|
||||||
IN: str-fry
|
IN: str-fry
|
||||||
: str-fry ( str -- quot ) "_" split unclip [ [ rot glue ] reduce ] 2curry ;
|
: str-fry ( str -- quot ) "_" split
|
||||||
|
[ unclip [ [ rot glue ] reduce ] 2curry ]
|
||||||
|
[ length 1 - 1 <effect> [ call-effect ] 2curry ] bi ;
|
||||||
SYNTAX: I" parse-string rest str-fry over push-all ;
|
SYNTAX: I" parse-string rest str-fry over push-all ;
|
|
@ -36,7 +36,7 @@ HELP: <fold>
|
||||||
{ $values { "oldval" "starting value" } { "quot" "applied to update and previous values" } { "model" model } { "model'" model } }
|
{ $values { "oldval" "starting value" } { "quot" "applied to update and previous values" } { "model" model } { "model'" model } }
|
||||||
{ $description "Similar to " { $link reduce } " but works on models, applying a quotation to the previous and new values at each update" } ;
|
{ $description "Similar to " { $link reduce } " but works on models, applying a quotation to the previous and new values at each update" } ;
|
||||||
|
|
||||||
HELP: switch
|
HELP: <switch>
|
||||||
{ $values { "signal1" model } { "signal2" model } { "signal'" model } }
|
{ $values { "signal1" model } { "signal2" model } { "signal'" model } }
|
||||||
{ $description "Creates a model that starts with the behavior of model1 and switches to the behavior of model2 on its update" } ;
|
{ $description "Creates a model that starts with the behavior of model1 and switches to the behavior of model2 on its update" } ;
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
USING: accessors arrays colors fonts fry kernel models
|
USING: accessors arrays colors fonts kernel models
|
||||||
models.product monads sequences ui.gadgets ui.gadgets.buttons
|
models.product monads sequences ui.gadgets ui.gadgets.buttons
|
||||||
ui.gadgets.editors ui.gadgets.line-support ui.gadgets.tables
|
ui.gadgets.editors ui.gadgets.line-support ui.gadgets.tables
|
||||||
ui.gadgets.tracks ui.render ;
|
ui.gadgets.tracks ui.render ui.gadgets.scrollers ;
|
||||||
QUALIFIED: make
|
QUALIFIED: make
|
||||||
IN: ui.frp
|
IN: ui.frp
|
||||||
|
|
||||||
|
@ -18,8 +18,11 @@ M: frp-table row-color color-quot>> [ call( a -- b ) ] [ drop f ] if* ;
|
||||||
frp-table new-line-gadget dup >>renderer [ ] >>quot swap >>model
|
frp-table new-line-gadget dup >>renderer [ ] >>quot swap >>model
|
||||||
f <model> >>selected-value sans-serif-font >>font
|
f <model> >>selected-value sans-serif-font >>font
|
||||||
focus-border-color >>focus-border-color
|
focus-border-color >>focus-border-color
|
||||||
transparent >>column-line-color ;
|
transparent >>column-line-color [ ] >>val-quot ;
|
||||||
|
: <frp-table*> ( -- table ) f <model> <frp-table> ;
|
||||||
: <frp-list> ( model -- table ) <frp-table> [ 1array ] >>quot ;
|
: <frp-list> ( model -- table ) <frp-table> [ 1array ] >>quot ;
|
||||||
|
: <frp-list*> ( -- table ) f <model> <frp-list> ;
|
||||||
|
|
||||||
: <frp-field> ( -- field ) f <model> <model-field> ;
|
: <frp-field> ( -- field ) f <model> <model-field> ;
|
||||||
|
|
||||||
! Layout utilities
|
! Layout utilities
|
||||||
|
@ -27,6 +30,8 @@ M: frp-table row-color color-quot>> [ call( a -- b ) ] [ drop f ] if* ;
|
||||||
GENERIC: output-model ( gadget -- model )
|
GENERIC: output-model ( gadget -- model )
|
||||||
M: gadget output-model model>> ;
|
M: gadget output-model model>> ;
|
||||||
M: frp-table output-model selected-value>> ;
|
M: frp-table output-model selected-value>> ;
|
||||||
|
M: model-field output-model field-model>> ;
|
||||||
|
M: scroller output-model children>> first model>> ;
|
||||||
|
|
||||||
GENERIC: , ( uiitem -- )
|
GENERIC: , ( uiitem -- )
|
||||||
M: gadget , make:, ;
|
M: gadget , make:, ;
|
||||||
|
@ -41,13 +46,16 @@ M: table -> dup , selected-value>> ;
|
||||||
[ { } make:make ] dip <track> swap [ f track-add ] each ; inline
|
[ { } make:make ] dip <track> swap [ f track-add ] each ; inline
|
||||||
: <box*> ( gadgets type -- track ) [ <box> ] [ [ model>> ] map <product> ] bi >>model ; inline
|
: <box*> ( gadgets type -- track ) [ <box> ] [ [ model>> ] map <product> ] bi >>model ; inline
|
||||||
: <hbox> ( gadgets -- track ) horizontal <box> ; inline
|
: <hbox> ( gadgets -- track ) horizontal <box> ; inline
|
||||||
|
: <hbox*> ( gadgets -- track ) horizontal <box*> ; inline
|
||||||
: <vbox> ( gadgets -- track ) vertical <box> ; inline
|
: <vbox> ( gadgets -- track ) vertical <box> ; inline
|
||||||
|
: <vbox*> ( gadgets -- track ) vertical <box*> ; inline
|
||||||
|
|
||||||
! Model utilities
|
! !!! Model utilities
|
||||||
TUPLE: multi-model < model ;
|
TUPLE: multi-model < model ;
|
||||||
! M: multi-model model-activated dup model-changed ;
|
|
||||||
: <multi-model> ( models kind -- model ) f swap new-model [ [ add-dependency ] curry each ] keep ;
|
: <multi-model> ( models kind -- model ) f swap new-model [ [ add-dependency ] curry each ] keep ;
|
||||||
|
|
||||||
|
! Events- discrete model utilities
|
||||||
|
|
||||||
TUPLE: merge-model < multi-model ;
|
TUPLE: merge-model < multi-model ;
|
||||||
M: merge-model model-changed [ value>> ] dip set-model ;
|
M: merge-model model-changed [ value>> ] dip set-model ;
|
||||||
: <merge> ( models -- model ) merge-model <multi-model> ;
|
: <merge> ( models -- model ) merge-model <multi-model> ;
|
||||||
|
@ -57,15 +65,21 @@ M: filter-model model-changed [ value>> ] dip [ quot>> call( val -- bool ) ] 2ke
|
||||||
[ set-model ] [ 2drop ] if ;
|
[ set-model ] [ 2drop ] if ;
|
||||||
: <filter> ( model quot -- filter-model ) [ 1array filter-model <multi-model> ] dip >>quot ;
|
: <filter> ( model quot -- filter-model ) [ 1array filter-model <multi-model> ] dip >>quot ;
|
||||||
|
|
||||||
|
! Behaviors - continuous model utilities
|
||||||
|
|
||||||
TUPLE: fold-model < multi-model oldval quot ;
|
TUPLE: fold-model < multi-model oldval quot ;
|
||||||
M: fold-model model-changed [ [ value>> ] [ [ oldval>> ] [ quot>> ] bi ] bi*
|
M: fold-model model-changed [ [ value>> ] [ [ oldval>> ] [ quot>> ] bi ] bi*
|
||||||
call( val oldval -- newval ) ] keep set-model ;
|
call( val oldval -- newval ) ] keep set-model ;
|
||||||
: <fold> ( oldval quot model -- model' ) 1array fold-model <multi-model> swap >>quot swap >>oldval ;
|
: <fold> ( oldval quot model -- model' ) 1array fold-model <multi-model> swap >>quot
|
||||||
|
swap [ >>oldval ] [ >>value ] bi ;
|
||||||
|
|
||||||
TUPLE: switch-model < multi-model switcher on ;
|
TUPLE: switch-model < multi-model original switcher on ;
|
||||||
M: switch-model model-changed tuck [ switcher>> = ] 2keep
|
M: switch-model model-changed 2dup switcher>> =
|
||||||
'[ on>> [ _ value>> _ set-model ] when ] [ t swap (>>on) ] if ;
|
[ over value>> [ [ value>> ] [ t >>on ] bi* set-model ] [ 2drop ] if ]
|
||||||
: switch ( signal1 signal2 -- signal' ) [ 2array switch-model <multi-model> ] keep >>switcher ;
|
[ dup on>> [ 2drop ] [ [ value>> ] dip set-model ] if ] if ;
|
||||||
|
M: switch-model model-activated [ original>> ] keep model-changed ;
|
||||||
|
: <switch> ( signal1 signal2 -- signal' ) [ 2array switch-model <multi-model> ] 2keep
|
||||||
|
[ >>original ] [ >>switcher ] bi* ;
|
||||||
|
|
||||||
TUPLE: mapped < model model quot ;
|
TUPLE: mapped < model model quot ;
|
||||||
|
|
||||||
|
@ -87,4 +101,4 @@ INSTANCE: gadget-monad monad
|
||||||
INSTANCE: gadget monad
|
INSTANCE: gadget monad
|
||||||
M: gadget monad-of drop gadget-monad ;
|
M: gadget monad-of drop gadget-monad ;
|
||||||
M: gadget-monad return drop <gadget> swap >>model ;
|
M: gadget-monad return drop <gadget> swap >>model ;
|
||||||
M: gadget >>= model>> '[ _ swap call( x -- y ) ] ;
|
M: gadget >>= output-model [ swap call( x -- y ) ] curry ;
|
Loading…
Reference in New Issue