Mercurial > cortex
diff org/eyes.org @ 113:a980462ebe76
more lazy/functional version of eyes
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Thu, 19 Jan 2012 22:08:46 -0700 |
parents | 128fa71ee188 |
children | 9d0fe7f54e14 |
line wrap: on
line diff
1.1 --- a/org/eyes.org Thu Jan 19 11:29:46 2012 -0700 1.2 +++ b/org/eyes.org Thu Jan 19 22:08:46 2012 -0700 1.3 @@ -20,21 +20,23 @@ 1.4 {:author "Robert McIntyre"} 1.5 (:use cortex.world) 1.6 (:import com.jme3.post.SceneProcessor) 1.7 - (:import (com.jme3.util BufferUtils)) 1.8 + (:import (com.jme3.util BufferUtils Screenshots)) 1.9 (:import java.nio.ByteBuffer) 1.10 (:import java.awt.image.BufferedImage) 1.11 (:import com.jme3.renderer.ViewPort) 1.12 - (:import com.jme3.math.ColorRGBA)) 1.13 + (:import com.jme3.math.ColorRGBA) 1.14 + (:import com.jme3.renderer.Renderer)) 1.15 1.16 -(defn scene-processor 1.17 + 1.18 +(defn vision-pipeline 1.19 "Create a SceneProcessor object which wraps a vision processing 1.20 - continuation function. The SceneProcessor will take care of 1.21 - converting the rendered frame to a BufferedImage and passing that 1.22 - BufferedImage to the continuation. The continuation should be a 1.23 - function that takes a ByteBuffer which represents the image." 1.24 + continuation function. The continuation is a function that takes 1.25 + [#^Renderer r #^FrameBuffer fb #^ByteBuffer b #^BufferedImage bi], 1.26 + each of which has already been appropiately sized." 1.27 [continuation] 1.28 (let [byte-buffer (atom nil) 1.29 - renderer (atom nil)] 1.30 + renderer (atom nil) 1.31 + image (atom nil)] 1.32 (proxy [SceneProcessor] [] 1.33 (initialize 1.34 [renderManager viewPort] 1.35 @@ -44,7 +46,10 @@ 1.36 (reset! renderer (.getRenderer renderManager)) 1.37 (reset! byte-buffer 1.38 (BufferUtils/createByteBuffer 1.39 - (* width height 4))))) 1.40 + (* width height 4))) 1.41 + (reset! image (BufferedImage. 1.42 + width height 1.43 + BufferedImage/TYPE_4BYTE_ABGR)))) 1.44 (isInitialized [] (not (nil? @byte-buffer))) 1.45 (reshape [_ _ _]) 1.46 (preFrame [_]) 1.47 @@ -52,16 +57,27 @@ 1.48 (postFrame 1.49 [#^FrameBuffer fb] 1.50 (.clear @byte-buffer) 1.51 - ;;(.readFrameBuffer @renderer fb @byte-buffer) 1.52 - (continuation @byte-buffer)) 1.53 + (continuation @renderer fb @byte-buffer @image)) 1.54 (cleanup [])))) 1.55 1.56 -(defn buffer->image! [width height] 1.57 - (let [image (BufferedImage. width height 1.58 - BufferedImage/TYPE_4BYTE_ABGR)] 1.59 - (fn [byte-buffer] 1.60 - (Screenshots/convertScreenShot byte-buffer image) 1.61 - image))) 1.62 +(defn frameBuffer->byteBuffer! 1.63 + "Transfer the data in the graphics card (Renderer, FrameBuffer) to 1.64 + the CPU (ByteBuffer)." 1.65 + [#^Renderer r #^FrameBuffer fb #^ByteBuffer bb] 1.66 + (.readFrameBuffer r fb bb) bb) 1.67 + 1.68 +(defn byteBuffer->bufferedImage! 1.69 + "Convert the C-style BGRA image data in the ByteBuffer bb to the AWT 1.70 + style ABGR image data and place it in BufferedImage bi." 1.71 + [#^ByteBuffer bb #^BufferedImage bi] 1.72 + (Screenshots/convertScreenShot bb bi) bi) 1.73 + 1.74 +(defn BufferedImage! 1.75 + "Continuation which will grab the buffered image from the materials 1.76 + provided by (vision-pipeline)." 1.77 + [#^Renderer r #^FrameBuffer fb #^ByteBuffer bb #^BufferedImage bi] 1.78 + (byteBuffer->bufferedImage! 1.79 + (frameBuffer->byteBuffer! r fb bb) bi)) 1.80 1.81 (defn add-eye 1.82 "Add an eye to the world, calling continuation on every frame 1.83 @@ -74,7 +90,7 @@ 1.84 (doto viewport 1.85 (.setClearFlags true true true) 1.86 (.setBackgroundColor ColorRGBA/Black) 1.87 - (.addProcessor (scene-processor continuation)) 1.88 + (.addProcessor (vision-pipeline continuation)) 1.89 (.attachScene (.getRootNode world))))) 1.90 #+end_src 1.91 1.92 @@ -101,8 +117,7 @@ 1.93 (:import javax.swing.JFrame) 1.94 (:import com.jme3.math.ColorRGBA) 1.95 (:import com.jme3.scene.Node) 1.96 - (:import com.jme3.math.Vector3f) 1.97 - (:import (com.jme3.util Screenshots))) 1.98 + (:import com.jme3.math.Vector3f)) 1.99 1.100 (defn view-image 1.101 "Initailizes a JPanel on which you may draw a BufferedImage. 1.102 @@ -152,18 +167,15 @@ 1.103 width (.getWidth cam) 1.104 height (.getHeight cam)] 1.105 (add-eye world cam 1.106 - no-op 1.107 - ;;(comp (view-image) (buffer->image! width height)) 1.108 + ;;no-op 1.109 + (comp (view-image) BufferedImage!) 1.110 ) 1.111 (add-eye world 1.112 (doto (.clone cam) 1.113 (.setLocation (Vector3f. -10 0 0)) 1.114 (.lookAt Vector3f/ZERO Vector3f/UNIT_Y)) 1.115 - no-op 1.116 - ;;(comp (view-image) (buffer->image! width height)) 1.117 - ) 1.118 - 1.119 - 1.120 + ;;no-op 1.121 + (comp (view-image) BufferedImage!)) 1.122 ;; This is here to restore the main view 1.123 ;; after the other views have completed processing 1.124 (add-eye world (.getCamera world) no-op)))