Mercurial > cortex
changeset 88:3e929630a25f
multimethod dispatch works
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Sat, 07 Jan 2012 05:24:14 -0700 |
parents | af1bb43661f9 |
children | cd5151b5e7c3 |
files | org/test-creature.org |
diffstat | 1 files changed, 4 insertions(+), 106 deletions(-) [+] |
line wrap: on
line diff
1.1 --- a/org/test-creature.org Sat Jan 07 05:06:58 2012 -0700 1.2 +++ b/org/test-creature.org Sat Jan 07 05:24:14 2012 -0700 1.3 @@ -123,18 +123,11 @@ 1.4 of object." 1.5 [#^Spatial object world-coordinate] 1.6 (let [out (Vector3f.)] 1.7 - (.worldToLocal object world-coordinate out) out)) 1.8 - 1.9 -(defmulti zz 1.10 - (fn [a b _ _ _ _ _] 1.11 - 1.12 - (:type a))) 1.13 -(defmethod zz :p [a b] (println "hi")) 1.14 - 1.15 + (.worldToLocal object world-coordinate out) out)) 1.16 1.17 (defmulti joint-dispatch 1.18 "Translate blender pseudo-joints into real JME joints." 1.19 - (fn [constraints _ _ _ _ _] 1.20 + (fn [constraints & _] 1.21 (:type constraints))) 1.22 1.23 (defmethod joint-dispatch :point 1.24 @@ -199,7 +192,7 @@ 1.25 1.26 1.27 1.28 -(defn connect* 1.29 +(defn connect 1.30 "here are some examples: 1.31 {:type :point} 1.32 {:type :hinge :limit [0 (/ Math/PI 2)] :axis (Vector3f. 0 1 0)} 1.33 @@ -234,101 +227,6 @@ 1.34 1.35 (println-repl "could not find joint meta-data!")))) 1.36 1.37 - 1.38 - 1.39 - 1.40 -(defn connect 1.41 - "here are some examples: 1.42 - {:type :point} 1.43 - {:type :hinge :limit [0 (/ Math/PI 2)] :axis (Vector3f. 0 1 0)} 1.44 - (:axis defaults to (Vector3f. 1 0 0) if not provided for hinge joints) 1.45 - 1.46 - {:type :cone :limit-xz 0] 1.47 - :limit-xy 0] 1.48 - :twist 0]} (use XZY rotation mode in blender!)" 1.49 - [#^Node obj-a #^Node obj-b #^Node joint] 1.50 - (let [control-a (.getControl obj-a RigidBodyControl) 1.51 - control-b (.getControl obj-b RigidBodyControl) 1.52 - joint-center (.getWorldTranslation joint) 1.53 - joint-rotation (.toRotationMatrix (.getWorldRotation joint)) 1.54 - pivot-a (world-to-local obj-a joint-center) 1.55 - pivot-b (world-to-local obj-b joint-center)] 1.56 - ;; A side-effect of creating a joint registers 1.57 - ;; it with both physics objects which in turn 1.58 - ;; will register the joint with the physics system 1.59 - ;; when the simulation is started. 1.60 - (if-let [constraints 1.61 - (map-vals 1.62 - eval 1.63 - (read-string 1.64 - (meta-data joint "joint")))] 1.65 - 1.66 - (let [joint-type (:type constraints)] 1.67 - (println-repl "creating joint between" 1.68 - (.getName obj-a) "and" (.getName obj-b)) 1.69 - (cond (= :point joint-type) 1.70 - (do 1.71 - (println-repl "creating POINT joint") 1.72 - (Point2PointJoint. 1.73 - control-a 1.74 - control-b 1.75 - pivot-a 1.76 - pivot-b)) 1.77 - (= :hinge joint-type) 1.78 - (do 1.79 - (println-repl "creating HINGE joint") 1.80 - (let [axis (if-let 1.81 - [axis (:axis constraints)] 1.82 - axis 1.83 - Vector3f/UNIT_X) 1.84 - [limit-1 limit-2] (:limit constraints) 1.85 - hinge-axis 1.86 - (.mult 1.87 - (.getWorldRotation joint) 1.88 - (blender-to-jme axis))] 1.89 - (doto 1.90 - (HingeJoint. 1.91 - control-a 1.92 - control-b 1.93 - pivot-a 1.94 - pivot-b 1.95 - hinge-axis 1.96 - hinge-axis) 1.97 - (.setLimit limit-1 limit-2)))) 1.98 - (= :cone joint-type) 1.99 - (do 1.100 - (let [limit-xz (:limit-xz constraints) 1.101 - limit-xy (:limit-xy constraints) 1.102 - twist (:twist constraints)] 1.103 - 1.104 - 1.105 - (println-repl "creating CONE joint") 1.106 - (println-repl joint-rotation) 1.107 - (println-repl 1.108 - "UNIT_X --> " (.mult joint-rotation (Vector3f. 1 0 0))) 1.109 - (println-repl 1.110 - "UNIT_Y --> " (.mult joint-rotation (Vector3f. 0 1 0))) 1.111 - (println-repl 1.112 - "UNIT_Z --> " (.mult joint-rotation (Vector3f. 0 0 1))) 1.113 - (doto 1.114 - (ConeJoint. 1.115 - control-a 1.116 - control-b 1.117 - pivot-a 1.118 - pivot-b 1.119 - joint-rotation 1.120 - joint-rotation 1.121 - ) 1.122 - (.setLimit (float limit-xz) 1.123 - (float limit-xy) 1.124 - (float twist))))) 1.125 - true 1.126 - (println-repl 1.127 - "joint-type" joint-type "not recognized"))) 1.128 - 1.129 - (println-repl "could not find joint meta-data!")))) 1.130 - 1.131 - 1.132 (defn assemble-creature [#^Node pieces joints] 1.133 (dorun 1.134 (map 1.135 @@ -353,7 +251,7 @@ 1.136 (fn [joint] 1.137 (let [[obj-a obj-b] 1.138 (joint-targets pieces joint)] 1.139 - (connect* obj-a obj-b joint))) 1.140 + (connect obj-a obj-b joint))) 1.141 joints)) 1.142 pieces) 1.143