diff org/body.org @ 206:df46a609fed9

removed dead code
author Robert McIntyre <rlm@mit.edu>
date Thu, 09 Feb 2012 04:21:12 -0700
parents d3a2abfac405
children bb3b75bf1664
line wrap: on
line diff
     1.1 --- a/org/body.org	Thu Feb 09 04:15:09 2012 -0700
     1.2 +++ b/org/body.org	Thu Feb 09 04:21:12 2012 -0700
     1.3 @@ -568,727 +568,8 @@
     1.4  - cortex.test.body
     1.5  - blender files
     1.6  
     1.7 -* COMMENT Examples
     1.8  
     1.9 -#+name: test-body
    1.10 -#+begin_src clojure
    1.11 -
    1.12 -(defn worm-segments
    1.13 -  "Create multiple evenly spaced box segments. They're fabulous!"
    1.14 -  [segment-length num-segments interstitial-space radius]
    1.15 -  (letfn [(nth-segment
    1.16 -            [n]
    1.17 -            (box segment-length radius radius :mass 0.1
    1.18 -                 :position
    1.19 -                 (Vector3f.
    1.20 -                  (* 2 n (+ interstitial-space segment-length)) 0 0)
    1.21 -                 :name (str "worm-segment" n)
    1.22 -                 :color (ColorRGBA/randomColor)))]
    1.23 -    (map nth-segment (range num-segments))))
    1.24 -
    1.25 -(defn connect-at-midpoint
    1.26 -  "Connect two physics objects with a Point2Point joint constraint at
    1.27 -  the point equidistant from both objects' centers."
    1.28 -  [segmentA segmentB]
    1.29 -  (let [centerA (.getWorldTranslation segmentA)
    1.30 -        centerB (.getWorldTranslation segmentB)
    1.31 -        midpoint (.mult (.add centerA centerB) (float 0.5))
    1.32 -        pivotA (.subtract midpoint centerA)
    1.33 -        pivotB (.subtract midpoint centerB)
    1.34 -        
    1.35 -        ;; A side-effect of creating a joint registers
    1.36 -        ;; it with both physics objects which in turn
    1.37 -        ;; will register the joint with the physics system
    1.38 -        ;; when the simulation is started.
    1.39 -        joint (Point2PointJoint.
    1.40 -               (.getControl segmentA RigidBodyControl)
    1.41 -               (.getControl segmentB RigidBodyControl)
    1.42 -               pivotA
    1.43 -               pivotB)]
    1.44 -    segmentB))
    1.45 -
    1.46 -(defn eve-worm
    1.47 -  "Create a worm-like body bound by invisible joint constraints."
    1.48 -  []
    1.49 -  (let [segments (worm-segments 0.2 5 0.1 0.1)]
    1.50 -    (dorun (map (partial apply connect-at-midpoint)
    1.51 -                (partition 2 1 segments)))
    1.52 -    (nodify "worm" segments)))
    1.53 -
    1.54 -(defn worm-pattern
    1.55 -  "This is a simple, mindless motor control pattern that drives the
    1.56 -   second segment of the worm's body at an offset angle with
    1.57 -   sinusoidally varying strength."
    1.58 -  [time]
    1.59 -  (let [angle (* Math/PI (/ 9 20))
    1.60 -        direction (Vector3f. 0 (Math/sin angle) (Math/cos angle))]
    1.61 -    [Vector3f/ZERO
    1.62 -     (.mult
    1.63 -      direction
    1.64 -      (float (* 2 (Math/sin (* Math/PI 2 (/ (rem time 300 ) 300))))))
    1.65 -     Vector3f/ZERO
    1.66 -     Vector3f/ZERO
    1.67 -     Vector3f/ZERO]))
    1.68 -
    1.69 -(defn test-motor-control
    1.70 -  "Testing motor-control:
    1.71 -   You should see a multi-segmented worm-like object fall onto the
    1.72 -   table and begin writhing and moving."
    1.73 -  []
    1.74 -  (let [worm (eve-worm)
    1.75 -        time (atom 0)
    1.76 -        worm-motor-map (vector-motor-control worm)]
    1.77 -    (world
    1.78 -     (nodify [worm
    1.79 -              (box 10 0.5 10 :position (Vector3f. 0 -5 0) :mass 0
    1.80 -                   :color ColorRGBA/Gray)])
    1.81 -     standard-debug-controls
    1.82 -     (fn [world]
    1.83 -       (enable-debug world)
    1.84 -       (light-up-everything world)
    1.85 -       (comment
    1.86 -         (com.aurellem.capture.Capture/captureVideo
    1.87 -          world
    1.88 -          (file-str "/home/r/proj/cortex/tmp/moving-worm")))
    1.89 -       )
    1.90 -     
    1.91 -     (fn [_ _]
    1.92 -       (swap! time inc)
    1.93 -       (Thread/sleep 20)
    1.94 -       (dorun (worm-motor-map
    1.95 -               (worm-pattern @time)))))))
    1.96 -
    1.97 -
    1.98 -
    1.99 -(defn join-at-point [obj-a obj-b world-pivot]
   1.100 -  (cortex.silly/joint-dispatch
   1.101 -   {:type :point}
   1.102 -   (.getControl obj-a RigidBodyControl)
   1.103 -   (.getControl obj-b RigidBodyControl)
   1.104 -   (cortex.silly/world-to-local obj-a world-pivot)
   1.105 -   (cortex.silly/world-to-local obj-b world-pivot)
   1.106 -   nil
   1.107 -   ))
   1.108 -
   1.109 -(import com.jme3.bullet.collision.PhysicsCollisionObject)
   1.110 -
   1.111 -(defn blab-* []
   1.112 -  (let [hand   (box 0.5 0.2 0.2 :position (Vector3f. 0 0 0)
   1.113 -                     :mass 0 :color ColorRGBA/Green)
   1.114 -        finger (box 0.5 0.2 0.2 :position (Vector3f. 2.4 0 0)
   1.115 -                    :mass 1 :color ColorRGBA/Red)
   1.116 -        connection-point (Vector3f. 1.2 0 0)
   1.117 -        root (nodify [hand finger])]
   1.118 -
   1.119 -    (join-at-point hand finger (Vector3f. 1.2 0 0))
   1.120 -    
   1.121 -    (.setCollisionGroup
   1.122 -     (.getControl hand RigidBodyControl)
   1.123 -     PhysicsCollisionObject/COLLISION_GROUP_NONE)
   1.124 -    (world
   1.125 -     root
   1.126 -     standard-debug-controls
   1.127 -     (fn [world]
   1.128 -       (enable-debug world)
   1.129 -       (.setTimer world (com.aurellem.capture.RatchetTimer. 60))
   1.130 -       (set-gravity world Vector3f/ZERO)
   1.131 -       )
   1.132 -     no-op)))
   1.133 -(comment  
   1.134 -     
   1.135 -(defn proprioception-debug-window
   1.136 -  []
   1.137 -  (let [time (atom 0)]
   1.138 -    (fn [prop-data]
   1.139 -      (if (= 0 (rem (swap! time inc) 40))
   1.140 -        (println-repl prop-data)))))
   1.141 -)
   1.142 -
   1.143 -(comment
   1.144 -  (dorun
   1.145 -   (map
   1.146 -    (comp 
   1.147 -     println-repl
   1.148 -     (fn [[p y r]]
   1.149 -       (format
   1.150 -        "pitch: %1.2f\nyaw: %1.2f\nroll: %1.2f\n"
   1.151 -        p y r)))
   1.152 -    prop-data)))
   1.153 -
   1.154 -
   1.155 -
   1.156 -
   1.157 -(defn test-proprioception
   1.158 -  "Testing proprioception:
   1.159 -   You should see two foating bars, and a printout of pitch, yaw, and
   1.160 -   roll. Pressing key-r/key-t should move the blue bar up and down and
   1.161 -   change only the value of pitch. key-f/key-g moves it side to side
   1.162 -   and changes yaw. key-v/key-b will spin the blue segment clockwise
   1.163 -   and counterclockwise, and only affect roll."
   1.164 -  []
   1.165 -  (let [hand    (box 0.2 1 0.2 :position (Vector3f. 0 0 0)
   1.166 -                     :mass 0 :color ColorRGBA/Green :name "hand")
   1.167 -        finger (box 0.2 1 0.2 :position (Vector3f. 0 2.4 0)
   1.168 -                    :mass 1 :color ColorRGBA/Red :name "finger")
   1.169 -        joint-node (box 0.1 0.05 0.05 :color ColorRGBA/Yellow
   1.170 -                        :position (Vector3f. 0 1.2 0)
   1.171 -                        :rotation (doto (Quaternion.)
   1.172 -                                    (.fromAngleAxis
   1.173 -                                     (/ Math/PI 2)
   1.174 -                                     (Vector3f. 0 0 1)))
   1.175 -                        :physical? false)
   1.176 -        joint (join-at-point hand finger (Vector3f. 0 1.2 0 ))
   1.177 -        creature (nodify [hand finger joint-node])
   1.178 -        finger-control (.getControl finger RigidBodyControl)
   1.179 -        hand-control (.getControl hand RigidBodyControl)]
   1.180 -    
   1.181 -
   1.182 -    (let
   1.183 -        ;; *******************************************
   1.184 -                
   1.185 -        [floor   (box 10 10 10 :position (Vector3f. 0 -15 0)
   1.186 -                     :mass 0 :color ColorRGBA/Gray)
   1.187 -        
   1.188 -        root (nodify [creature floor])
   1.189 -        prop (joint-proprioception creature joint-node)
   1.190 -        prop-view (proprioception-debug-window)
   1.191 -        
   1.192 -        controls
   1.193 -        (merge standard-debug-controls
   1.194 -               {"key-o"
   1.195 -                (fn [_ _] (.setEnabled finger-control true))
   1.196 -                "key-p"
   1.197 -                (fn [_ _] (.setEnabled finger-control false))
   1.198 -                "key-k"
   1.199 -                (fn [_ _] (.setEnabled hand-control true))
   1.200 -                "key-l"
   1.201 -                (fn [_ _] (.setEnabled hand-control false))
   1.202 -                "key-i"
   1.203 -                (fn [world _] (set-gravity world (Vector3f. 0 0 0)))
   1.204 -                "key-period"
   1.205 -                (fn [world _]
   1.206 -                  (.setEnabled finger-control false)
   1.207 -                  (.setEnabled hand-control false)
   1.208 -                  (.rotate creature (doto (Quaternion.)
   1.209 -                                      (.fromAngleAxis
   1.210 -                                       (float (/ Math/PI 15))
   1.211 -                                       (Vector3f. 0 0 -1))))
   1.212 -                                              
   1.213 -                  (.setEnabled finger-control true)
   1.214 -                  (.setEnabled hand-control true)
   1.215 -                  (set-gravity world (Vector3f. 0 0 0))
   1.216 -                  )
   1.217 -                
   1.218 -                  
   1.219 -                }
   1.220 -               )
   1.221 -
   1.222 -        ]
   1.223 -    (comment
   1.224 -      (.setCollisionGroup
   1.225 -       (.getControl hand RigidBodyControl)
   1.226 -       PhysicsCollisionObject/COLLISION_GROUP_NONE)
   1.227 -      )
   1.228 -    (apply
   1.229 -     world
   1.230 -     (with-movement
   1.231 -       hand
   1.232 -       ["key-y" "key-u" "key-h" "key-j" "key-n" "key-m"]
   1.233 -       [10 10 10 10 1 1]
   1.234 -       (with-movement
   1.235 -         finger
   1.236 -         ["key-r" "key-t" "key-f" "key-g" "key-v" "key-b"]
   1.237 -         [1 1 10 10 10 10]
   1.238 -         [root
   1.239 -          controls
   1.240 -          (fn [world]
   1.241 -            (.setTimer world (com.aurellem.capture.RatchetTimer. 60))
   1.242 -            (set-gravity world (Vector3f. 0 0 0))
   1.243 -            (light-up-everything world))
   1.244 -          (fn [_ _] (prop-view (list (prop))))]))))))
   1.245 -
   1.246 -#+end_src
   1.247 -
   1.248 -#+results: test-body
   1.249 -: #'cortex.test.body/test-proprioception
   1.250 -
   1.251 -
   1.252 -* COMMENT code-limbo
   1.253 -#+begin_src clojure
   1.254 -;;(.loadModel 
   1.255 -;; (doto (asset-manager)
   1.256 -;;   (.registerLoader BlenderModelLoader (into-array String ["blend"])))
   1.257 -;;   "Models/person/person.blend")
   1.258 -
   1.259 -
   1.260 -(defn load-blender-model
   1.261 -  "Load a .blend file using an asset folder relative path."
   1.262 -  [^String model]
   1.263 -  (.loadModel
   1.264 -   (doto (asset-manager)
   1.265 -     (.registerLoader BlenderModelLoader (into-array String ["blend"])))
   1.266 -   model))
   1.267 -
   1.268 -
   1.269 -(defn view-model [^String model]
   1.270 -  (view 
   1.271 -   (.loadModel 
   1.272 -    (doto (asset-manager)
   1.273 -      (.registerLoader BlenderModelLoader (into-array String ["blend"])))
   1.274 -    model)))
   1.275 -
   1.276 -(defn load-blender-scene [^String model]
   1.277 -  (.loadModel
   1.278 -   (doto (asset-manager)
   1.279 -     (.registerLoader BlenderLoader (into-array String ["blend"])))
   1.280 -    model))
   1.281 -
   1.282 -(defn worm
   1.283 -  []
   1.284 -  (.loadModel (asset-manager) "Models/anim2/Cube.mesh.xml"))
   1.285 -
   1.286 -(defn oto
   1.287 -  []
   1.288 -  (.loadModel (asset-manager) "Models/Oto/Oto.mesh.xml"))
   1.289 -
   1.290 -(defn sinbad
   1.291 -  []
   1.292 -  (.loadModel (asset-manager) "Models/Sinbad/Sinbad.mesh.xml"))
   1.293 -
   1.294 -(defn worm-blender
   1.295 -  []
   1.296 -  (first (seq (.getChildren (load-blender-model
   1.297 -                             "Models/anim2/simple-worm.blend")))))
   1.298 -
   1.299 -(defn body
   1.300 -  "given a node with a SkeletonControl, will produce a body sutiable
   1.301 -  for AI control with movement and proprioception."
   1.302 -  [node]
   1.303 -  (let [skeleton-control (.getControl node SkeletonControl)
   1.304 -        krc (KinematicRagdollControl.)]
   1.305 -    (comment
   1.306 -    (dorun
   1.307 -     (map #(.addBoneName krc %)
   1.308 -          ["mid2" "tail" "head" "mid1" "mid3" "mid4" "Dummy-Root" ""]
   1.309 -           ;;"mid2" "mid3" "tail" "head"]
   1.310 -        )))
   1.311 -    (.addControl node krc)
   1.312 -    (.setRagdollMode krc)
   1.313 -    )
   1.314 -  node
   1.315 -  )
   1.316 -(defn show-skeleton [node]
   1.317 -  (let [sd
   1.318 -
   1.319 -        (doto
   1.320 -            (SkeletonDebugger. "aurellem-skel-debug"
   1.321 -                               (skel node))
   1.322 -          (.setMaterial (green-x-ray)))]
   1.323 -    (.attachChild node sd)
   1.324 -    node))
   1.325 -
   1.326 -
   1.327 -  
   1.328 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   1.329 -
   1.330 -;; this could be a good way to give objects special properties like
   1.331 -;; being eyes and the like
   1.332 -
   1.333 -(.getUserData 
   1.334 - (.getChild
   1.335 -  (load-blender-model "Models/property/test.blend") 0)
   1.336 - "properties")
   1.337 -
   1.338 -;; the properties are saved along with the blender file.
   1.339 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   1.340 -
   1.341 -
   1.342 -
   1.343 -
   1.344 -(defn init-debug-skel-node
   1.345 -  [f debug-node skeleton]
   1.346 -  (let [bones 
   1.347 -        (map #(.getBone skeleton %)
   1.348 -             (range (.getBoneCount skeleton)))]
   1.349 -  (dorun (map #(.setUserControl % true) bones)) 
   1.350 -  (dorun (map (fn [b]
   1.351 -                (println (.getName b)
   1.352 -                         " -- " (f b)))
   1.353 -              bones))
   1.354 -  (dorun
   1.355 -   (map #(.attachChild
   1.356 -          debug-node 
   1.357 -          (doto 
   1.358 -              (sphere 0.1
   1.359 -                      :position (f %)
   1.360 -                      :physical? false)
   1.361 -          (.setMaterial (green-x-ray))))
   1.362 -        bones)))
   1.363 -    debug-node)
   1.364 -
   1.365 -(import jme3test.bullet.PhysicsTestHelper)
   1.366 -
   1.367 -
   1.368 -(defn test-zzz [the-worm world value]
   1.369 -  (if (not value)
   1.370 -    (let [skeleton (skel the-worm)]
   1.371 -      (println-repl "enabling bones")
   1.372 -      (dorun
   1.373 -       (map
   1.374 -        #(.setUserControl (.getBone skeleton %) true)
   1.375 -        (range (.getBoneCount skeleton))))
   1.376 -
   1.377 -
   1.378 -      (let [b (.getBone skeleton 2)]
   1.379 -        (println-repl "moving " (.getName b))
   1.380 -        (println-repl (.getLocalPosition b))
   1.381 -        (.setUserTransforms b
   1.382 -                            Vector3f/UNIT_X
   1.383 -                            Quaternion/IDENTITY
   1.384 -                            ;;(doto (Quaternion.)
   1.385 -                             ;; (.fromAngles (/ Math/PI 2)
   1.386 -                             ;;              0
   1.387 -                             ;;              0
   1.388 -                                          
   1.389 -                            (Vector3f. 1 1 1))
   1.390 -        )
   1.391 -      
   1.392 -      (println-repl "hi! <3"))))
   1.393 -
   1.394 -
   1.395 -(defn test-ragdoll []
   1.396 -  
   1.397 -  (let [the-worm
   1.398 -        
   1.399 -         ;;(.loadModel (asset-manager) "Models/anim2/Cube.mesh.xml")
   1.400 -         (doto (show-skeleton (worm-blender))
   1.401 -           (.setLocalTranslation (Vector3f. 0 10 0))
   1.402 -         ;;(worm)
   1.403 -         ;;(oto)
   1.404 -         ;;(sinbad)
   1.405 -        )
   1.406 -    ]
   1.407 -
   1.408 -
   1.409 -    (.start 
   1.410 -     (world
   1.411 -      (doto (Node.)
   1.412 -        (.attachChild the-worm))
   1.413 -      {"key-return" (fire-cannon-ball)
   1.414 -       "key-space" (partial test-zzz the-worm)
   1.415 -       }
   1.416 -      (fn [world]
   1.417 -        (light-up-everything world)
   1.418 -        (PhysicsTestHelper/createPhysicsTestWorld
   1.419 -         (.getRootNode world)
   1.420 -         (asset-manager)
   1.421 -         (.getPhysicsSpace
   1.422 -          (.getState (.getStateManager world) BulletAppState)))
   1.423 -        (set-gravity world Vector3f/ZERO)
   1.424 -        ;;(.setTimer world (NanoTimer.))
   1.425 -        ;;(org.lwjgl.input.Mouse/setGrabbed false)
   1.426 -        )
   1.427 -      no-op
   1.428 -      )
   1.429 -  
   1.430 -     
   1.431 -     )))
   1.432 -
   1.433 -
   1.434 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   1.435 -;;; here is the ragdoll stuff
   1.436 -
   1.437 -(def worm-mesh (.getMesh (.getChild (worm-blender) 0)))
   1.438 -(def mesh worm-mesh)
   1.439 -
   1.440 -(.getFloatBuffer mesh VertexBuffer$Type/Position)
   1.441 -(.getFloatBuffer mesh VertexBuffer$Type/BoneWeight)
   1.442 -(.getData  (.getBuffer mesh VertexBuffer$Type/BoneIndex))
   1.443 -
   1.444 -
   1.445 -(defn position [index]
   1.446 -  (.get
   1.447 -   (.getFloatBuffer worm-mesh VertexBuffer$Type/Position)
   1.448 -     index))
   1.449 -
   1.450 -(defn bones [index]
   1.451 -  (.get
   1.452 -   (.getData  (.getBuffer mesh VertexBuffer$Type/BoneIndex))
   1.453 -   index))
   1.454 -
   1.455 -(defn bone-weights [index]
   1.456 -  (.get
   1.457 -   (.getFloatBuffer mesh VertexBuffer$Type/BoneWeight)
   1.458 -   index))
   1.459 -
   1.460 -
   1.461 -
   1.462 -(defn vertex-bones [vertex]
   1.463 -  (vec (map (comp int bones) (range (* vertex 4) (+ (* vertex 4) 4)))))
   1.464 -
   1.465 -(defn vertex-weights [vertex]
   1.466 -  (vec (map (comp float bone-weights) (range (* vertex 4) (+ (* vertex 4) 4)))))
   1.467 -
   1.468 -(defn vertex-position [index]
   1.469 -  (let [offset (* index 3)]
   1.470 -    (Vector3f. (position offset)
   1.471 -               (position (inc offset))
   1.472 -               (position (inc(inc offset))))))
   1.473 -
   1.474 -(def vertex-info (juxt vertex-position vertex-bones vertex-weights))
   1.475 -
   1.476 -(defn bone-control-color [index]
   1.477 -  (get {[1 0 0 0] ColorRGBA/Red
   1.478 -        [1 2 0 0] ColorRGBA/Magenta
   1.479 -        [2 0 0 0] ColorRGBA/Blue}
   1.480 -       (vertex-bones index)
   1.481 -       ColorRGBA/White))
   1.482 -
   1.483 -(defn influence-color [index bone-num]
   1.484 -  (get
   1.485 -   {(float 0)   ColorRGBA/Blue
   1.486 -    (float 0.5) ColorRGBA/Green
   1.487 -    (float 1)   ColorRGBA/Red}
   1.488 -     ;; find the weight of the desired bone
   1.489 -   ((zipmap (vertex-bones index)(vertex-weights index))
   1.490 -    bone-num)
   1.491 -   ColorRGBA/Blue))
   1.492 -         
   1.493 -(def worm-vertices (set (map vertex-info (range 60))))
   1.494 -
   1.495 -
   1.496 -(defn test-info []
   1.497 -  (let [points (Node.)]
   1.498 -    (dorun
   1.499 -     (map #(.attachChild points %)
   1.500 -          (map #(sphere 0.01
   1.501 -                        :position (vertex-position %)
   1.502 -                        :color (influence-color % 1)
   1.503 -                        :physical? false)
   1.504 -               (range 60))))
   1.505 -    (view points)))
   1.506 -  
   1.507 -
   1.508 -(defrecord JointControl [joint physics-space]
   1.509 -  PhysicsControl
   1.510 -  (setPhysicsSpace [this space]
   1.511 -    (dosync
   1.512 -     (ref-set (:physics-space this) space))
   1.513 -    (.addJoint space (:joint this)))
   1.514 -  (update [this tpf])
   1.515 -  (setSpatial [this spatial])
   1.516 -  (render [this rm vp])
   1.517 -  (getPhysicsSpace [this] (deref (:physics-space this)))
   1.518 -  (isEnabled [this] true)
   1.519 -  (setEnabled [this state]))
   1.520 -  
   1.521 -(defn add-joint
   1.522 -  "Add a joint to a particular object. When the object is added to the
   1.523 -  PhysicsSpace of a simulation, the joint will also be added"
   1.524 -  [object joint]
   1.525 -  (let [control (JointControl. joint (ref nil))]
   1.526 -    (.addControl object control))
   1.527 -  object)
   1.528 -
   1.529 -
   1.530 -(defn hinge-world
   1.531 -  []
   1.532 -  (let [sphere1 (sphere)
   1.533 -        sphere2 (sphere 1 :position (Vector3f. 3 3 3))
   1.534 -        joint (Point2PointJoint.
   1.535 -               (.getControl sphere1 RigidBodyControl)
   1.536 -               (.getControl sphere2 RigidBodyControl) 
   1.537 -               Vector3f/ZERO (Vector3f. 3 3 3))]
   1.538 -    (add-joint sphere1 joint)
   1.539 -    (doto (Node. "hinge-world")
   1.540 -      (.attachChild sphere1)
   1.541 -      (.attachChild sphere2))))
   1.542 -
   1.543 -
   1.544 -(defn test-joint []
   1.545 -  (view (hinge-world)))
   1.546 -
   1.547 -;; (defn copier-gen []
   1.548 -;;   (let [count (atom 0)]
   1.549 -;;     (fn [in]
   1.550 -;;       (swap! count inc)
   1.551 -;;       (clojure.contrib.duck-streams/copy
   1.552 -;;        in (File. (str "/home/r/tmp/mao-test/clojure-images/"
   1.553 -;;                      ;;/home/r/tmp/mao-test/clojure-images
   1.554 -;;                (format "%08d.png" @count)))))))
   1.555 -;; (defn decrease-framerate []
   1.556 -;;   (map
   1.557 -;;    (copier-gen)
   1.558 -;;    (sort
   1.559 -;;     (map first
   1.560 -;;          (partition
   1.561 -;;           4
   1.562 -;;           (filter #(re-matches #".*.png$" (.getCanonicalPath %))
   1.563 -;;                   (file-seq
   1.564 -;;                    (file-str
   1.565 -;;                     "/home/r/media/anime/mao-temp/images"))))))))
   1.566 -
   1.567 -
   1.568 -
   1.569 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   1.570 -
   1.571 -(defn proprioception
   1.572 -  "Create a proprioception map that reports the rotations of the
   1.573 -  various limbs of the creature's body"
   1.574 -  [creature]
   1.575 -  [#^Node creature]
   1.576 -  (let [
   1.577 -        nodes (node-seq creature)
   1.578 -        joints
   1.579 -        (map
   1.580 -         :joint 
   1.581 -         (filter
   1.582 -          #(isa? (class %) JointControl)
   1.583 -          (reduce
   1.584 -           concat
   1.585 -           (map (fn [node]
   1.586 -                  (map (fn [num] (.getControl node num))
   1.587 -                       (range (.getNumControls node))))
   1.588 -                nodes))))]
   1.589 -    (fn []
   1.590 -      (reduce concat (map relative-positions (list (first joints)))))))
   1.591 -
   1.592 -
   1.593 -(defn skel [node]
   1.594 -  (doto
   1.595 -      (.getSkeleton
   1.596 -       (.getControl node SkeletonControl))
   1.597 -    ;; this is necessary to force the skeleton to have accurate world
   1.598 -    ;; transforms before it is rendered to the screen. 
   1.599 -    (.resetAndUpdate)))
   1.600 -
   1.601 -(defn green-x-ray []
   1.602 -  (doto (Material. (asset-manager)
   1.603 -                   "Common/MatDefs/Misc/Unshaded.j3md")
   1.604 -    (.setColor "Color" ColorRGBA/Green)
   1.605 -    (-> (.getAdditionalRenderState)
   1.606 -        (.setDepthTest false))))
   1.607 -
   1.608 -(defn test-worm []
   1.609 -  (.start
   1.610 -   (world
   1.611 -    (doto (Node.)
   1.612 -      ;;(.attachChild (point-worm))
   1.613 -      (.attachChild (load-blender-model
   1.614 -                     "Models/anim2/joint-worm.blend"))
   1.615 -                      
   1.616 -      (.attachChild (box 10 1 10
   1.617 -                         :position (Vector3f. 0 -2 0) :mass 0
   1.618 -                         :color (ColorRGBA/Gray))))
   1.619 -    {
   1.620 -     "key-space" (fire-cannon-ball)
   1.621 -     }
   1.622 -    (fn [world]
   1.623 -      (enable-debug world)
   1.624 -      (light-up-everything world)
   1.625 -      ;;(.setTimer world (NanoTimer.))
   1.626 -      )
   1.627 -    no-op)))
   1.628 -
   1.629 -
   1.630 -
   1.631 -;; defunct movement stuff
   1.632 -(defn torque-controls [control]
   1.633 -  (let [torques
   1.634 -        (concat
   1.635 -         (map #(Vector3f. 0 (Math/sin %) (Math/cos %))
   1.636 -              (range 0 (* Math/PI 2) (/ (* Math/PI 2) 20)))
   1.637 -         [Vector3f/UNIT_X])]
   1.638 -    (map (fn [torque-axis]
   1.639 -           (fn [torque]
   1.640 -             (.applyTorque
   1.641 -              control
   1.642 -              (.mult (.mult (.getPhysicsRotation control)
   1.643 -                            torque-axis)
   1.644 -                     (float
   1.645 -                      (* (.getMass control) torque))))))
   1.646 -         torques)))
   1.647 -
   1.648 -(defn motor-map
   1.649 -  "Take a creature and generate a function that will enable fine
   1.650 -   grained control over all the creature's limbs."  
   1.651 -  [#^Node creature]
   1.652 -  (let [controls (keep #(.getControl % RigidBodyControl)
   1.653 -                       (node-seq creature))
   1.654 -        limb-controls (reduce concat (map torque-controls controls))
   1.655 -        body-control  (partial map #(%1 %2) limb-controls)]
   1.656 -    body-control))
   1.657 -
   1.658 -(defn test-motor-map
   1.659 -  "see how torque works."
   1.660 -  []
   1.661 -  (let [finger (box 3 0.5 0.5 :position (Vector3f. 0 2 0)
   1.662 -                    :mass 1 :color ColorRGBA/Green)
   1.663 -        motor-map (motor-map finger)]
   1.664 -    (world
   1.665 -     (nodify [finger
   1.666 -              (box 10 0.5 10 :position (Vector3f. 0 -5 0) :mass 0
   1.667 -                   :color ColorRGBA/Gray)])
   1.668 -     standard-debug-controls
   1.669 -     (fn [world]
   1.670 -       (set-gravity world Vector3f/ZERO)
   1.671 -       (light-up-everything world)
   1.672 -       (.setTimer world (NanoTimer.)))
   1.673 -     (fn [_ _]
   1.674 -       (dorun (motor-map [0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
   1.675 -     0]))))))
   1.676 -
   1.677 -(defn joint-proprioception [#^Node parts #^Node joint]
   1.678 -  (let [[obj-a obj-b] (joint-targets parts joint)
   1.679 -        joint-rot (.getWorldRotation joint)
   1.680 -        pre-inv-a (.inverse (.getWorldRotation obj-a))
   1.681 -        x (.mult pre-inv-a (.mult joint-rot Vector3f/UNIT_X))
   1.682 -        y (.mult pre-inv-a (.mult joint-rot Vector3f/UNIT_Y))
   1.683 -        z (.mult pre-inv-a (.mult joint-rot Vector3f/UNIT_Z))
   1.684 -
   1.685 -        x Vector3f/UNIT_Y
   1.686 -        y Vector3f/UNIT_Z
   1.687 -        z Vector3f/UNIT_X
   1.688 -
   1.689 -
   1.690 -        tmp-rot-a (.getWorldRotation obj-a)]
   1.691 -    (println-repl "x:" (.mult tmp-rot-a x))
   1.692 -    (println-repl "y:" (.mult tmp-rot-a y))
   1.693 -    (println-repl "z:" (.mult tmp-rot-a z))
   1.694 -    (println-repl "rot-a" (.getWorldRotation obj-a))
   1.695 -    (println-repl "rot-b" (.getWorldRotation obj-b))
   1.696 -    (println-repl "joint-rot" joint-rot)
   1.697 -    ;; this function will report proprioceptive information for the
   1.698 -    ;; joint.
   1.699 -    (fn []
   1.700 -      ;; x is the "twist" axis, y and z are the "bend" axes
   1.701 -      (let [rot-a (.getWorldRotation obj-a)
   1.702 -            ;;inv-a (.inverse rot-a)
   1.703 -            rot-b (.getWorldRotation obj-b)
   1.704 -            ;;relative (.mult rot-b inv-a)
   1.705 -            basis (doto (Matrix3f.)
   1.706 -                    (.setColumn 0 (.mult rot-a x))
   1.707 -                    (.setColumn 1 (.mult rot-a y))
   1.708 -                    (.setColumn 2 (.mult rot-a z)))
   1.709 -            rotation-about-joint
   1.710 -            (doto (Quaternion.)
   1.711 -              (.fromRotationMatrix 
   1.712 -               (.mult (.invert basis)
   1.713 -                      (.toRotationMatrix rot-b))))
   1.714 -            [yaw roll pitch]
   1.715 -            (seq (.toAngles rotation-about-joint nil))]
   1.716 -        ;;return euler angles of the quaternion around the new basis            
   1.717 -        [yaw roll pitch]))))
   1.718 -
   1.719 -#+end_src
   1.720 -
   1.721 -
   1.722 -
   1.723 -
   1.724 -
   1.725 -
   1.726 -
   1.727 -* COMMENT generate Source
   1.728 +* COMMENT Generate Source
   1.729  #+begin_src clojure :tangle ../src/cortex/body.clj
   1.730  <<body-header>>
   1.731  <<body-1>>
   1.732 @@ -1309,3 +590,4 @@
   1.733  
   1.734  
   1.735    
   1.736 +