# HG changeset patch # User Robert McIntyre # Date 1326599053 25200 # Node ID 7eeb940bcbc84f3b4e3c12a8b984c37443a22488 # Parent 65332841b7d94f69906282bf3b8c6d81b4114a7e data format for touch implemented diff -r 65332841b7d9 -r 7eeb940bcbc8 org/test-creature.org --- a/org/test-creature.org Sat Jan 14 04:28:37 2012 -0700 +++ b/org/test-creature.org Sat Jan 14 20:44:13 2012 -0700 @@ -97,6 +97,9 @@ (defn points->image "Take a sparse collection of points and visuliaze it as a BufferedImage." + + ;; TODO maybe parallelize this since it's easy + [points] (let [xs (vec (map first points)) ys (vec (map second points)) @@ -112,16 +115,11 @@ image)) - - - -;;(defn visualize [points] - (defn test-data [] (vec - (for [a (range 0 100 2) - b (range 0 100 2)] + (for [a (range 0 1000 2) + b (range 0 1000 2)] (vector a b)) )) @@ -145,8 +143,8 @@ (let [num-points (count points) center (vector - (average (map first points)) - (average (map first points))) + (int (average (map first points))) + (int (average (map first points)))) flattened (reduce concat @@ -166,19 +164,31 @@ (collapse-1d (first center) (map first row)) (map second row))) - (partition-by second (sort-by second flattened))))] - squeezed + (partition-by second (sort-by second flattened)))) + ;;vi (view-image) + relocate + (let [min-x (apply min (map first squeezed)) + min-y (apply min (map second squeezed))] + (map (fn [[x y]] + [(- x min-x) + (- y min-y)]) + squeezed)) + ] + ;;(vi (points->image points)) + ;;(Thread/sleep 1000) + ;;(vi (points->image flattened)) + ;;(Thread/sleep 1000) + ;;(vi (points->image squeezed)) + relocate )) - - (defn load-bullet [] (let [sim (world (Node.) {} no-op no-op)] - (.enqueue - sim - (fn [] - (.stop sim))) - (.start sim))) + (doto sim + (.enqueue + (fn [] + (.stop sim))) + (.start)))) (defn load-blender-model "Load a .blend file using an asset folder relative path." @@ -536,14 +546,16 @@ [#^ImageProcessor ip] (filter-pixels #(= % white) ip)) -(defn same-side? [p1 p2 ref p] +(defn same-side? + "Given the points p1 and p2 and the reference point ref, is point p + on the same side of the line that goes through p1 and p2 as ref is?" + [p1 p2 ref p] (<= 0 (.dot (.cross (.subtract p2 p1) (.subtract p p1)) (.cross (.subtract p2 p1) (.subtract ref p1))))) - (defn triangle->matrix4f "Converts the triangle into a 4x4 matrix of vertices: The first three columns contain the vertices of the triangle; the last @@ -555,7 +567,6 @@ ((comp vec map) #(.get t %) (range 3)) unit-normal (do (.calculateNormal t)(.getNormal t)) vertices [vert-1 vert-2 vert-3 unit-normal]] - (dorun (for [row (range 4) col (range 3)] (do @@ -585,14 +596,12 @@ (defn vector2f->vector3f [v] (Vector3f. (.getX v) (.getY v) 0)) - (extend-type Triangle Textual (text [t] (println "Triangle: " \newline (.get1 t) \newline (.get2 t) \newline (.get3 t)))) - (defn map-triangle [f #^Triangle tri] (Triangle. (f 0 (.get1 tri)) @@ -625,7 +634,7 @@ (tri-uv-coord mesh tri)))) (defn pixel-triangle - "Convert the mesh triange into the corresponding triangle in + "Convert the mesh triangle into the corresponding triangle in UV-pixel-space. Z compenent will be zero." [#^Mesh mesh #^Triangle tri width height] (map-triangle (fn [_ v] @@ -645,7 +654,6 @@ (let [verts (map vector3f-seq (triangle-seq tri)) x (apply min (map first verts)) y (apply min (map second verts))] - [x y (- (apply max (map first verts)) x) (- (apply max (map second verts)) y) @@ -659,8 +667,7 @@ (if-let [image (touch-receptor-image geo)] (let [mesh (.getMesh geo) tris (triangles geo) - - + width (.getWidth image) height (.getHeight image) @@ -692,7 +699,17 @@ (map #(.mult transform %) whites))))] (vec (map sensor-coords tris))) (repeat (count (triangles geo)) []))) - + +(use 'clojure.contrib.def) + +(defn-memo touch-topology [#^Gemoetry geo] + (let [feeler-coords + (map + #(vector (int (.getX %)) (int (.getY %))) + (white-coordinates + (.getProcessor (touch-receptor-image (colorful)))))] + (vec (collapse feeler-coords)))) + (defn enable-touch [#^Geometry geo] (let [feeler-coords (locate-feelers geo) tris (triangles geo) @@ -711,24 +728,25 @@ (map #(doto (Ray. % norm) (.setLimit limit)) origins)) sensor-origins triangle-normals))] - (for [ray rays] - (do - (let [results (CollisionResults.)] - (.collideWith node ray results) - (let [touch-objects - (set - (filter #(not (= geo %)) - (map #(.getGeometry %) results)))] - (if (> (count touch-objects) 0) - 1 0))))))))) + (vector + (touch-topology geo) + (vec + (for [ray rays] + (do + (let [results (CollisionResults.)] + (.collideWith node ray results) + (let [touch-objects + (set + (filter #(not (= geo %)) + (map #(.getGeometry %) results)))] + (if (> (count touch-objects) 0) + 1 0))))))))))) (defn touch [#^Node pieces] - (let [touch-components - (map enable-touch - (filter #(isa? (class %) Geometry) - (node-seq pieces)))] - (fn [node] - (reduce into [] (map #(% node) touch-components))))) + (map enable-touch + (filter #(isa? (class %) Geometry) + (node-seq pieces)))) + (defn all-names [] (concat @@ -910,9 +928,7 @@ ;; translate pixel coordinates to world-space transform (triangle-transformation cutout-tri tri)] (map #(.mult transform %) whites))))] - - - + (for [mesh-tri mesh-tris] (let [uv-tri (rasterize mesh mesh-tri width height)