From: Doug Coleman Date: Sun, 4 Jun 2017 20:42:09 +0000 (-0500) Subject: unmaintained: New home for misfit Factor vocabularies. X-Git-Url: https://gitweb.factorcode.org/gitweb.cgi?p=factor-unmaintained.git;a=commitdiff_plain;h=649171903f74bf8f21f74045cc0b3a900bdc8cf6 unmaintained: New home for misfit Factor vocabularies. --- diff --git a/4DNav/4DNav-docs.factor b/4DNav/4DNav-docs.factor new file mode 100644 index 0000000..6f63f2e --- /dev/null +++ b/4DNav/4DNav-docs.factor @@ -0,0 +1,201 @@ +! Copyright (C) 2008 Jean-François Bigot. +! See http://factorcode.org/license.txt for BSD license. +USING: help.markup help.syntax kernel quotations strings ; +IN: 4DNav + + +HELP: menu-3D +{ $values + { "gadget" "gadget" } +} +{ $description "The menu dedicated to 3D movements of the camera" } ; + +HELP: menu-4D +{ $values + + { "gadget" "gadget" } +} +{ $description "The menu dedicated to 4D movements of space" } ; + +HELP: menu-bar +{ $values + + { "gadget" "gadget" } +} +{ $description "return gadget containing menu buttons" } ; + +HELP: model-projection +{ $values + { "x" "interger" } + { "space" "space" } +} +{ $description "Project space following coordinate x" } ; + +HELP: mvt-3D-1 +{ $values + + { "quot" "quotation" } +} +{ $description "return a quotation to orientate space to see it from first point of view" } ; + +HELP: mvt-3D-2 +{ $values + + { "quot" "quotation" } +} +{ $description "return a quotation to orientate space to see it from second point of view" } ; + +HELP: mvt-3D-3 +{ $values + + { "quot" "quotation" } +} +{ $description "return a quotation to orientate space to see it from third point of view" } ; + +HELP: mvt-3D-4 +{ $values + + { "quot" "quotation" } +} +{ $description "return a quotation to orientate space to see it from first point of view" } ; + +HELP: load-model-file +{ $description "load space from file" } ; + +HELP: rotation-4D +{ $values + { "m" "a rotation matrix" } +} +{ $description "Apply a 4D rotation matrix" } ; + +HELP: translation-4D +{ $values + { "v" "vector" } +} +{ $description "Apply a 4D translation" } ; + + +ARTICLE: "implementation details" "How 4DNav is done" +"4DNav is build using :" + +{ $subsections + "4DNav.camera" + "adsoda-main-page" +} +; + +ARTICLE: "Space file" "Create a new space file" +"To build a new space, create an XML file using " { $vocab-link "adsoda" } " model description. A solid is not caracterized by its corners but is defined as the intersection of hyperplanes." + +$nl +"An example is:" +{ $code """ + + + 4 + + 4cube1 + 4 + 1,0,0,0,100 + -1,0,0,0,-150 + 0,1,0,0,100 + 0,-1,0,0,-150 + 0,0,1,0,100 + 0,0,-1,0,-150 + 0,0,0,1,100 + 0,0,0,-1,-150 + 1,0,0 + + + 4triancube + 4 + 1,0,0,0,160 + -0.4999999999999998,-0.8660254037844387,0,0,-130 + -0.5000000000000004,0.8660254037844384,0,0,-130 + 0,0,1,0,140 + 0,0,-1,0,-180 + 0,0,0,1,110 + 0,0,0,-1,-180 + 0,1,0 + + + triangone + 4 + 1,0,0,0,60 + 0.5,0.8660254037844386,0,0,60 + -0.5,0.8660254037844387,0,0,-20 + -1.0,0,0,0,-100 + -0.5,-0.8660254037844384,0,0,-100 + 0.5,-0.8660254037844387,0,0,-20 + 0,0,1,0,120 + 0,0,-0.4999999999999998,-0.8660254037844387,-120 + 0,0,-0.5000000000000004,0.8660254037844384,-120 + 0,1,1 + + + 1,1,1,1 + 0.2,0.2,0.6 + + 0.8,0.9,0.9 + +""" } ; + +ARTICLE: "TODO" "Todo" +{ $list + "A vocab to initialize parameters" + "an editor mode" + { $list "add a face to a solid" + "add a solid to the space" + "move a face" + "move a solid" + "select a solid in a list" + "select a face" + "display selected face" + "edit a solid color" + "add a light" + "edit a light color" + "move a light" + } + "add a tool wich give an hyperplane normal vector with enought points. Will use adsoda.intersect-hyperplanes with { { 0 } { 0 } { 1 } } " + "decorrelate 3D camera and activate them with select buttons" + +} ; + + +ARTICLE: "4DNav" "The 4DNav app" +{ $vocab-link "4DNav" } +$nl +{ $heading "4D Navigator" } +"4DNav is a simple tool to visualize 4 dimensionnal objects." +$nl +"It uses " { $vocab-link "adsoda" } " library to display a 4D space and navigate thru it." +$nl +"It will display:" +{ $list + { "a menu window" } + { "4 visualization windows" } +} +"Each visualization window represents the projection of the 4D space on a particular 3D space." + +{ $heading "Start" } +"type:" { $code "\"4DNav\" run" } + +{ $heading "Navigation" } +"Menu window is divided in 4 areas" +{ $list + { "a space-file chooser to select the file to display" } + { "a parametrization area to select the projection mode" } + { "4D submenu to translate and rotate the 4D space" } + { "3D submenu to move the camera in 3D space. Cameras in every 3D spaces are manipulated as a single one" } + } + +{ $heading "Links" } +{ $subsections + "Space file" + "TODO" + "implementation details" +} + +; + +ABOUT: "4DNav" diff --git a/4DNav/4DNav.factor b/4DNav/4DNav.factor new file mode 100644 index 0000000..8ba0788 --- /dev/null +++ b/4DNav/4DNav.factor @@ -0,0 +1,567 @@ +! Copyright (C) 2008 Jeff Bigot +! See http://factorcode.org/license.txt for BSD license. +USING: kernel +namespaces +accessors +assocs +make +math +math.functions +math.trig +math.parser +hashtables +sequences +combinators +continuations +colors +colors.constants +prettyprint +vars +quotations +io +io.directories +io.pathnames +help.markup +io.files +ui.gadgets.panes + ui + ui.gadgets + ui.traverse + ui.gadgets.borders + ui.gadgets.frames + ui.gadgets.tracks + ui.gadgets.labels + ui.gadgets.labeled + ui.gadgets.lists + ui.gadgets.buttons + ui.gadgets.packs + ui.gadgets.grids + ui.gadgets.corners + ui.gestures + ui.gadgets.scrollers +splitting +vectors +math.vectors +values +4DNav.turtle +4DNav.window3D +4DNav.deep +4DNav.space-file-decoder +models +fry +adsoda +adsoda.tools +; +QUALIFIED-WITH: ui.pens.solid s +QUALIFIED-WITH: ui.gadgets.wrappers w + + +IN: 4DNav +VALUE: selected-file +VALUE: translation-step +VALUE: rotation-step + +3 \ translation-step set-value +5 \ rotation-step set-value + +VAR: selected-file-model +VAR: observer3d +VAR: view1 +VAR: view2 +VAR: view3 +VAR: view4 +VAR: present-space + +! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +! namespace utilities + +: closed-quot ( quot -- quot ) + namestack swap '[ namestack [ _ set-namestack @ ] dip set-namestack ] ; + +! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! waiting for deep-cleave-quots + +: 4D-Rxy ( angle -- Rx ) deg>rad +[ 1.0 , 0.0 , 0.0 , 0.0 , + 0.0 , 1.0 , 0.0 , 0.0 , + 0.0 , 0.0 , dup cos , dup sin neg , + 0.0 , 0.0 , dup sin , dup cos , ] 4 make-matrix nip ; + +: 4D-Rxz ( angle -- Ry ) deg>rad +[ 1.0 , 0.0 , 0.0 , 0.0 , + 0.0 , dup cos , 0.0 , dup sin neg , + 0.0 , 0.0 , 1.0 , 0.0 , + 0.0 , dup sin , 0.0 , dup cos , ] 4 make-matrix nip ; + +: 4D-Rxw ( angle -- Rz ) deg>rad +[ 1.0 , 0.0 , 0.0 , 0.0 , + 0.0 , dup cos , dup sin neg , 0.0 , + 0.0 , dup sin , dup cos , 0.0 , + 0.0 , 0.0 , 0.0 , 1.0 , ] 4 make-matrix nip ; + +: 4D-Ryz ( angle -- Rx ) deg>rad +[ dup cos , 0.0 , 0.0 , dup sin neg , + 0.0 , 1.0 , 0.0 , 0.0 , + 0.0 , 0.0 , 1.0 , 0.0 , + dup sin , 0.0 , 0.0 , dup cos , ] 4 make-matrix nip ; + +: 4D-Ryw ( angle -- Ry ) deg>rad +[ dup cos , 0.0 , dup sin neg , 0.0 , + 0.0 , 1.0 , 0.0 , 0.0 , + dup sin , 0.0 , dup cos , 0.0 , + 0.0 , 0.0 , 0.0 , 1.0 , ] 4 make-matrix nip ; + +: 4D-Rzw ( angle -- Rz ) deg>rad +[ dup cos , dup sin neg , 0.0 , 0.0 , + dup sin , dup cos , 0.0 , 0.0 , + 0.0 , 0.0 , 1.0 , 0.0 , + 0.0 , 0.0 , 0.0 , 1.0 , ] 4 make-matrix nip ; + +! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! UI +! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +: button* ( string quot -- button ) + closed-quot ; + +! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! +! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +: model-projection-chooser ( -- gadget ) + observer3d> projection-mode>> + { { 1 "perspective" } { 0 "orthogonal" } } + ; + +: collision-detection-chooser ( -- gadget ) + observer3d> collision-mode>> + { { t "on" } { f "off" } } ; + +: model-projection ( x -- space ) + present-space> swap space-project ; + +: update-observer-projections ( -- ) + view1> relayout-1 + view2> relayout-1 + view3> relayout-1 + view4> relayout-1 ; + +: update-model-projections ( -- ) + 0 model-projection view1> model<< + 1 model-projection view2> model<< + 2 model-projection view3> model<< + 3 model-projection view4> model<< ; + +: camera-action ( quot -- quot ) + '[ drop _ observer3d> + with-self update-observer-projections ] + closed-quot ; + +: win3D ( text gadget -- ) + "navigateur 4D : " rot append open-window ; + +! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! 4D object manipulation +! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +: (mvt-4D) ( quot -- ) + present-space> + swap call space-ensure-solids + >present-space + update-model-projections + update-observer-projections ; inline + +: rotation-4D ( m -- ) + '[ _ [ [ middle-of-space dup vneg ] keep + swap space-translate ] dip + space-transform + swap space-translate + ] (mvt-4D) ; + +: translation-4D ( v -- ) '[ _ space-translate ] (mvt-4D) ; + +! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! menu +! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +: menu-rotations-4D ( -- gadget ) + 3 3 + { 1 1 } >>filled-cell + 1 >>fill + "XY +" [ drop rotation-step 4D-Rxy rotation-4D ] + button* add-gadget + "XY -" [ drop rotation-step neg 4D-Rxy rotation-4D ] + button* add-gadget + @top-left grid-add + 1 >>fill + "XZ +" [ drop rotation-step 4D-Rxz rotation-4D ] + button* add-gadget + "XZ -" [ drop rotation-step neg 4D-Rxz rotation-4D ] + button* add-gadget + @top grid-add + 1 >>fill + "YZ +" [ drop rotation-step 4D-Ryz rotation-4D ] + button* add-gadget + "YZ -" [ drop rotation-step neg 4D-Ryz rotation-4D ] + button* add-gadget + @center grid-add + 1 >>fill + "XW +" [ drop rotation-step 4D-Rxw rotation-4D ] + button* add-gadget + "XW -" [ drop rotation-step neg 4D-Rxw rotation-4D ] + button* add-gadget + @top-right grid-add + 1 >>fill + "YW +" [ drop rotation-step 4D-Ryw rotation-4D ] + button* add-gadget + "YW -" [ drop rotation-step neg 4D-Ryw rotation-4D ] + button* add-gadget + @right grid-add + 1 >>fill + "ZW +" [ drop rotation-step 4D-Rzw rotation-4D ] + button* add-gadget + "ZW -" [ drop rotation-step neg 4D-Rzw rotation-4D ] + button* add-gadget + @bottom-right grid-add +; + +: menu-translations-4D ( -- gadget ) + 3 3 + { 1 1 } >>filled-cell + 1 >>fill + 1 >>fill + "X+" [ drop { 1 0 0 0 } translation-step v*n + translation-4D ] + button* add-gadget + "X-" [ drop { -1 0 0 0 } translation-step v*n + translation-4D ] + button* add-gadget + add-gadget + "YZW"