comparison org/games.org @ 30:0206878c28b4

going to start on games.org
author Robert McIntyre <rlm@mit.edu>
date Mon, 24 Oct 2011 12:43:58 -0700
parents org/cortex.org@6372c108c5c6
children f0562b9bde94
comparison
equal deleted inserted replaced
29:6372c108c5c6 30:0206878c28b4
1 #+title: Simulated Senses
2 #+author: Robert McIntyre
3 #+email: rlm@mit.edu
4 #+description: Simulating senses for AI research using JMonkeyEngine3
5 #+SETUPFILE: ../../aurellem/org/setup.org
6 #+INCLUDE: ../../aurellem/org/level-0.org
7 #+babel: :mkdirp yes :noweb yes :exports both
8
9
10 * Simulation Base
11
12
13 ** Hello
14 Here are the jmonkeyengine "Hello" programs translated to clojure.
15 *** Hello Simple App
16 Here is the hello world example for jme3 in clojure. It's a more or
17 less direct translation from the java source [[http://jmonkeyengine.org/wiki/doku.php/jme3:beginner:hello_simpleapplication][here]].
18
19 Of note is the fact that since we don't have access to the
20 =AssetManager= via extendig =SimpleApplication=, we have to build one
21 ourselves.
22
23 #+srcname: hello-simple-app
24 #+begin_src clojure :results silent
25 (ns hello.hello-simple-app)
26 (require 'cortex.import)
27 (use 'clojure.contrib.def)
28 (rlm.rlm-commands/help)
29 (cortex.import/mega-import-jme3)
30 (use 'cortex.world)
31
32
33 (def cube (Box. Vector3f/ZERO 1 1 1))
34
35 (def geom (Geometry. "Box" cube))
36
37 (def mat (Material. (asset-manager) "Common/MatDefs/Misc/Unshaded.j3md"))
38
39 (.setColor mat "Color" ColorRGBA/Blue)
40
41 (.setMaterial geom mat)
42
43 (defn simple-app []
44 (doto
45 (proxy [SimpleApplication] []
46 (simpleInitApp
47 []
48 ;; Don't take control of the mouse
49 (org.lwjgl.input.Mouse/setGrabbed false)
50 (.attachChild (.getRootNode this) geom)))
51 ;; don't show a menu to change options.
52 (.setShowSettings false)
53 (.setPauseOnLostFocus false)
54 (.setSettings *app-settings*)))
55 #+end_src
56
57 Running this program will begin a new jMonkeyEngine game which
58 displays a single blue cube.
59
60 #+begin_src clojure :exports code :results silent
61 (.start (hello.hello-simple-app/simple-app))
62 #+end_src
63
64 #+caption: the simplest JME game.
65 [[./images/simple-app.jpg]]
66
67
68
69 *** Hello Physics
70 From http://jmonkeyengine.org/wiki/doku.php/jme3:beginner:hello_physics
71
72 #+srcname: brick-wall-header
73 #+begin_src clojure :results silent
74 (ns hello.brick-wall)
75 (require 'cortex.import)
76 (use 'clojure.contrib.def)
77 (rlm.rlm-commands/help)
78 (cortex.import/mega-import-jme3)
79 (use '[pokemon [lpsolve :only [constant-map]]])
80 (use 'cortex.world)
81 (use 'cortex.util)
82 #+end_src
83
84 #+srcname: brick-wall-body
85 #+begin_src clojure :results silent
86 (in-ns 'hello.brick-wall)
87
88 (defn floor
89 "make a sturdy, unmovable physical floor"
90 []
91 (box 20 1 20 :mass 0 :color false :position (Vector3f. 0 -2 0)))
92
93 (def brick-length 0.48)
94 (def brick-width 0.24)
95 (def brick-height 0.12)
96
97
98 (defn brick* [position]
99 (doto (box brick-length brick-height brick-width
100 :position position :name "brick"
101 :material "Common/MatDefs/Misc/Unshaded.j3md"
102 :texture "Textures/Terrain/BrickWall/BrickWall.jpg"
103 :mass 36)
104 (->
105 (.getMesh)
106 (.scaleTextureCoordinates (Vector2f. 1 0.5)))
107 ;;(.setShadowMode RenderQueue$ShadowMode/CastAndReceive)
108 )
109 )
110
111 (defn inception-brick-wall
112 "construct a physical brick wall"
113 []
114 (let [node (Node. "brick-wall")]
115 (dorun
116 (map (comp #(.attachChild node %) brick*)
117 (for
118 [x (range 15)
119 y (range 10)
120 z (range 1)]
121 (Vector3f.
122 (* brick-length x 1.03)
123 (* brick-width y y 10)
124 (* brick-height z)))))
125 node))
126
127 (defn gravity-toggle
128 [new-value]
129 (fn [game value]
130 (println-repl "set gravity to " new-value)
131 (if value
132 (set-gravity* game new-value)
133 (set-gravity* game gravity))))
134
135 (defn fire-cannon-ball
136 ([node]
137 (fn [game value]
138 (if (not value)
139 (let [camera (.getCamera game)
140 cannon-ball
141 (sphere 0.7
142 :material "Common/MatDefs/Misc/Unshaded.j3md"
143 :texture "Textures/PokeCopper.jpg"
144 :position
145 (.add (.getLocation camera)
146 (.mult (.getDirection camera) (float 1)))
147 :mass 3)] ;200 0.05
148 (.setShadowMode cannon-ball RenderQueue$ShadowMode/CastAndReceive)
149 (.setLinearVelocity
150 (.getControl cannon-ball RigidBodyControl)
151 (.mult (.getDirection camera) (float 50))) ;50
152 (add-element game cannon-ball (if node node (.getRootNode game)))))))
153 ([]
154 (fire-cannon-ball false)))
155
156
157 (defn floor* []
158 (doto (box 10 0.1 5 :name "floor" ;10 0.1 5 ; 240 0.1 240
159 :material "Common/MatDefs/Misc/Unshaded.j3md"
160 :texture "Textures/Terrain/Pond/Pond.png"
161 :position (Vector3f. 0 -0.1 0 )
162 :mass 0)
163 (->
164 (.getMesh)
165 (.scaleTextureCoordinates (Vector2f. 3 6)));64 64
166 (->
167 (.getMaterial)
168 (.getTextureParam "ColorMap")
169 (.getTextureValue)
170 (.setWrap Texture$WrapMode/Repeat))
171 (.setShadowMode RenderQueue$ShadowMode/Receive)
172 ))
173
174 (defn brick-wall* []
175 (let [node (Node. "brick-wall")]
176 (dorun
177 (map
178 (comp #(.attachChild node %) brick*)
179 (for [y (range 15)
180 x (range 4)
181 z (range 1)]
182 (Vector3f.
183 (+ (* 2 x brick-length)
184 (if (even? (+ y z))
185 (/ brick-length 4) (/ brick-length -4)))
186 (+ (* brick-height (inc (* 2 y))))
187 (* 2 z brick-width) ))))
188 (.setShadowMode node RenderQueue$ShadowMode/CastAndReceive)
189 node))
190
191 (defn brick-wall-game-run []
192 (doto
193 (world
194 (doto (Node.) (.attachChild (floor*))
195 (.attachChild (brick-wall*))
196 )
197 {"key-i" (gravity-toggle (Vector3f. 0 0 -9.81))
198 "key-m" (gravity-toggle (Vector3f. 0 0 9.81))
199 "key-l" (gravity-toggle (Vector3f. 9.81 0 0))
200 "key-j" (gravity-toggle (Vector3f. -9.81 0 0))
201 "key-k" (gravity-toggle Vector3f/ZERO)
202 "key-u" (gravity-toggle (Vector3f. 0 9.81 0))
203 "key-o" (gravity-toggle (Vector3f. 0 -9.81 0))
204 "key-f" (fn[game value]
205 (if (not value) (add-element game (brick-wall*))))
206 "key-return" (fire-cannon-ball)}
207 position-camera
208 (fn [& _]))
209 (.start)))
210 #+end_src
211
212 #+begin_src clojure :results silent
213 (hello.brick-wall/brick-wall-game-run)
214 #+end_src
215
216 #+caption: the brick wall standing
217 [[./images/brick-wall-standing.jpg]]
218
219 #+caption: the brick wall after it has been knocked over by a "pok\eacute{}ball"
220 [[./images/brick-wall-knocked-down.jpg]]
221
222 *** Other Brick Games
223 #+srcname: other-games
224 #+begin_src clojure :results silent
225 (ns cortex.other-games
226 {:author "Dylan Holmes"})
227 (use 'cortex.world)
228 (use 'hello.brick-wall)
229 (use 'cortex.import)
230 (cortex.import/mega-import-jme3)
231
232 (defn scad [position]
233 (doto (box 0.1 0.1 0.1
234 :position position :name "brick"
235 :material "Common/MatDefs/Misc/Unshaded.j3md"
236 :texture "Textures/Terrain/BrickWall/BrickWall.jpg"
237 :mass 20)
238 (->
239 (.getMesh)
240 (.scaleTextureCoordinates (Vector2f. 1 0.5))
241 )
242 (-> (.getControl RigidBodyControl)
243 (.setLinearVelocity (Vector3f. 0 100 0))
244 )
245
246 ;;(.setShadowMode RenderQueue$ShadowMode/Cast)
247 ))
248
249
250 (defn shrapnel []
251 (let [node (Node. "explosion-day")]
252 (dorun
253 (map
254 (comp #(.attachChild node %) scad)
255 (for [y (range 15)
256 x (range 4)
257 z (range 1)]
258 (Vector3f.
259 (+ (* 2 x brick-height)
260 (if (even? (+ y z)) (/ brick-height 4) (/ brick-height -4)))
261 (+ (* brick-height (inc (* 2 y))))
262 (* 2 z brick-height) ))))
263 node))
264
265
266 (def domino-height 0.48)
267 (def domino-thickness 0.12)
268 (def domino-width 0.24)
269
270 (def domino-thickness 0.05)
271 (def domino-width 0.5)
272 (def domino-height 1)
273
274 (defn domino
275 ([position]
276 (domino position (Quaternion/IDENTITY)))
277 ([position rotation]
278 (doto (box domino-width domino-height domino-thickness
279 :position position :name "domino"
280 :material "Common/MatDefs/Misc/Unshaded.j3md"
281 :texture "Textures/Terrain/BrickWall/BrickWall.jpg"
282 :mass 1
283 :rotation rotation)
284 (.setShadowMode RenderQueue$ShadowMode/CastAndReceive)
285 )))
286
287
288 (defn domino-row []
289 (let [node (Node. "domino-row")]
290 (dorun
291 (map
292 (comp #(.attachChild node %) domino)
293 (for [
294 z (range 10)
295 x (range 5)
296 ]
297 (Vector3f.
298 (+ (* z domino-width) (* x 5 domino-width))
299 (/ domino-height 1)
300 (* -5.5 domino-thickness z) ))))
301
302 node))
303
304 (defn domino-cycle []
305 (let [node (Node. "domino-cycle")]
306 (dorun
307 (map
308 (comp #(.attachChild node %) (partial apply domino) )
309 (for [n (range 720)]
310 (let [space (* domino-height 5.5)
311 r (fn[n] (* (+ n 3) domino-width 0.5))
312 t (fn[n] (reduce
313 +
314 (map
315 (fn dt[n] (/ space (* 2 (Math/PI) (r n))))
316 (range n))))
317 t (t n)
318 r (r n)
319 ct (Math/cos t)
320 st (Math/sin t)
321 ]
322 (list
323 (Vector3f.
324 (* -1 r st)
325 (/ domino-height 1)
326 (* r ct))
327 (.fromAngleAxis (Quaternion.)
328 (- (/ 3.1415926 2) t) (Vector3f. 0 1 0))
329 )))
330 ))
331 node))
332
333
334 (defn domino-game-run []
335 (doto
336 (world
337 (doto (Node.) (.attachChild (floor*))
338 )
339 {"key-i" (gravity-toggle (Vector3f. 0 0 -9.81))
340 "key-m" (gravity-toggle (Vector3f. 0 0 9.81))
341 "key-l" (gravity-toggle (Vector3f. 9.81 0 0))
342 "key-j" (gravity-toggle (Vector3f. -9.81 0 0))
343 "key-k" (gravity-toggle (Vector3f. 0 9.81 0) )
344 "key-u" (fn[g v] ((gravity-toggle (Vector3f. 0 -0 0)) g true))
345 "key-o" (gravity-toggle (Vector3f. 0 -9.81 0))
346
347 "key-space"
348 (fn[game value]
349
350 (if (not value)
351 (let [d (domino (Vector3f. 0 (/ domino-height 0.25) 0)
352 (.fromAngleAxis (Quaternion.)
353 (/ Math/PI 2) (Vector3f. 0 1 0)))]
354 (add-element game d))))
355 "key-f"
356 (fn[game value](if (not value) (add-element game (domino-cycle))))
357 "key-return" (fire-cannon-ball)}
358 position-camera
359 (fn [& _]))
360 (.start)))
361 #+end_src
362
363 #+begin_src clojure :results silent
364 (cortex.other-games/domino-game-run)
365 #+end_src
366
367 #+caption: floating dominos
368 [[./images/dominos.jpg]]
369
370 *** Hello Loop
371 #+srcname: hello-loop
372 #+begin_src clojure :results silent
373 (ns hello.loop)
374 (use 'cortex.world)
375 (use 'cortex.import)
376 (cortex.import/mega-import-jme3)
377 (rlm.rlm-commands/help)
378
379 (defn blue-cube []
380 (box 1 1 1
381 :color ColorRGBA/Blue
382 :texture false
383 :material "Common/MatDefs/Misc/Unshaded.j3md"
384 :name "blue-cube"
385 :physical? false))
386
387 (defn blue-cube-game []
388 (let [cube (blue-cube)
389 root (doto (Node.) (.attachChild cube))]
390 (world root
391 {}
392 no-op
393 (fn [game tpf]
394 (.rotate cube 0.0 (* 2 tpf) 0.0)))))
395 #+end_src
396
397 *** Hello Collision
398
399 #+srcname: hello-collision
400 #+begin_src clojure :results silent
401 (ns hello.collision)
402 (use 'cortex.world)
403 (use 'cortex.import)
404 (use 'clojure.contrib.def)
405
406
407 (cortex.import/mega-import-jme3)
408 (rlm.rlm-commands/help)
409 (use '[hello [brick-wall :only [fire-cannon-ball brick-wall*]]])
410
411
412 (defn environment []
413 (let
414 [scene-model
415 (doto
416 (.loadModel
417 (doto (asset-manager)
418 (.registerLocator
419 "/home/r/cortex/assets/zips/town.zip" ZipLocator))
420 "main.scene")
421 (.setLocalScale (float 2.0)))
422 collision-shape
423 (CollisionShapeFactory/createMeshShape #^Node scene-model)
424 landscape (RigidBodyControl. collision-shape 0)]
425 (.setShadowMode scene-model RenderQueue$ShadowMode/CastAndReceive)
426 (.addControl scene-model landscape)
427 scene-model))
428
429 (defn player-fn []
430 (doto
431 (CharacterControl.
432 (CapsuleCollisionShape. (float 1.5) (float 6)(float 1))
433 (float 0.05))
434 (.setJumpSpeed 20)
435 (.setFallSpeed 30)
436 (.setGravity 30) ;30
437 (.setPhysicsLocation (Vector3f. 0 10 0))))
438
439 (defn lights []
440 [(doto (AmbientLight.) (.setColor (.mult (ColorRGBA. 1 1 1 1) (float 1))))
441 (doto (AmbientLight.) (.setColor (.mult (ColorRGBA. 1 0.7 0 1) (float 1))))
442 (doto (DirectionalLight.)
443 (.setColor (.mult ColorRGBA/White (float 0.9) ))
444 (.setDirection (.normalizeLocal (Vector3f. 2.8 -28 2.8))))])
445
446 (defn night-lights []
447 [(doto (AmbientLight.) (.setColor (.mult (ColorRGBA. 0.275 0.467 0.784 1) (float 0.3))))
448 (doto (DirectionalLight.)
449 (.setColor (.mult ColorRGBA/White (float 0.2) ))
450 (.setDirection (.normalizeLocal (Vector3f. 2.8 -28 2.8))))])
451
452 (def player (atom (player-fn)))
453
454 (defn setup-fn [game]
455 (dorun (map #(.addLight (.getRootNode game) %) (lights)))
456 ;; set the color of the sky
457 (.setBackgroundColor (.getViewPort game) (ColorRGBA. 0.3 0.4 0.9 1))
458 ;(.setBackgroundColor (.getViewPort game) (ColorRGBA. 0 0 0 1)
459 (doto (.getFlyByCamera game)
460 (.setMoveSpeed (float 100))
461 (.setRotationSpeed 3))
462 (.add
463 (.getPhysicsSpace
464 (.getState (.getStateManager game) BulletAppState))
465 @player)
466
467 (doto (Node.) (.attachChild (.getRootNode game))
468 (.attachChild (brick-wall*))
469 )
470
471 )
472
473
474 (def walking-up? (atom false))
475 (def walking-down? (atom false))
476 (def walking-left? (atom false))
477 (def walking-right? (atom false))
478
479 (defn set-walk [walk-atom game value]
480 ;;(println-repl "setting stuff to " value)
481 (reset! walk-atom value))
482
483 (defn responses []
484 {"key-w" (partial set-walk walking-up?)
485 "key-d" (partial set-walk walking-right?)
486 "key-s" (partial set-walk walking-down?)
487 "key-a" (partial set-walk walking-left?)
488 "key-return" (fire-cannon-ball)
489 "key-space" (fn [game value] (.jump @player))
490 })
491
492 (defn update-fn
493 [game tpf]
494 (let [camera (.getCamera game)
495 cam-dir (.multLocal
496 (.clone
497 (.getDirection camera)) (float 0.6))
498 cam-left (.multLocal
499 (.clone
500 (.getLeft camera)) (float 0.4))
501 walk-direction (Vector3f. 0 0 0)]
502
503 (cond
504 @walking-up? (.addLocal walk-direction cam-dir)
505 @walking-right? (.addLocal walk-direction (.negate cam-left))
506 @walking-down? (.addLocal walk-direction (.negate cam-dir))
507 @walking-left? (.addLocal walk-direction cam-left))
508 (.setWalkDirection @player walk-direction)
509 (.setLocation camera (.getPhysicsLocation @player))))
510
511 (defn run-game []
512 (.start
513 (world (environment)
514 (responses)
515 setup-fn
516 update-fn)))
517 #+end_src
518
519 *** Hello Terrain
520 #+srcname: hello-terrain
521 #+begin_src clojure :results silent
522 (ns hello.terrain)
523 (use 'cortex.world)
524 (use 'cortex.import)
525 (use 'clojure.contrib.def)
526 (import jme3tools.converters.ImageToAwt)
527
528
529 (cortex.import/mega-import-jme3)
530 (rlm.rlm-commands/help)
531 (use '[hello [brick-wall :only [fire-cannon-ball brick-wall*]]])
532
533
534 (defn setup-fn [type game]
535 (.setMoveSpeed (.getFlyByCamera game) 50)
536 (.setFrustumFar (.getCamera game) 10000)
537 (let [env (environment type)
538 cameras [(.getCamera game)]
539 control (TerrainLodControl. env cameras)]
540 ;;(.addControl env control)
541 (.attachChild (.getRootNode game) env)))
542
543 (defn environment [type]
544 (let
545 [mat_terrain
546 (Material. (asset-manager) "Common/MatDefs/Terrain/Terrain.j3md")
547 grass (.loadTexture (asset-manager) "Textures/Terrain/splat/grass.jpg")
548 dirt (.loadTexture (asset-manager) "Textures/Terrain/splat/dirt.jpg")
549 rock (.loadTexture (asset-manager) "Textures/Terrain/splat/road.jpg")
550 heightmap-image (.loadTexture (asset-manager)
551 ({:mountain "Textures/Terrain/splat/mountains512.png"
552 :fortress "Textures/Terrain/splat/fortress512.png"
553 }type))
554 heightmap (ImageBasedHeightMap.
555 (ImageToAwt/convert (.getImage heightmap-image) false true 0))
556 terrain (do (.load heightmap)
557 (TerrainQuad. "my terrain" 65 513 (.getHeightMap heightmap)))
558 ]
559
560 (dorun (map #(.setWrap % Texture$WrapMode/Repeat)
561 [grass dirt rock]))
562
563 (doto mat_terrain
564 (.setTexture "Tex1" grass)
565 (.setFloat "Tex1Scale" (float 64))
566
567 (.setTexture "Tex2" dirt)
568 (.setFloat "Tex2Scale" (float 32))
569
570 (.setTexture "Tex3" rock)
571 (.setFloat "Tex3Scale" (float 128))
572
573 (.setTexture "Alpha"
574 (.loadTexture
575 (asset-manager)
576 ({:mountain "Textures/Terrain/splat/alphamap.png"
577 :fortress "Textures/Terrain/splat/alphamap2.png"} type))))
578
579 (doto terrain
580 (.setMaterial mat_terrain)
581 (.setLocalTranslation 0 -100 0)
582 (.setLocalScale 2 1 2))))
583
584
585
586 (defn run-terrain-game [type]
587 (.start
588 (world
589 (Node.)
590 {}
591 (partial setup-fn type)
592 no-op)))
593 #+end_src
594
595
596
597 #+srcname: hello-animation
598 #+begin_src clojure :results silent
599 (ns hello.animation)
600 (use 'cortex.world)
601 (use 'cortex.import)
602 (use 'clojure.contrib.def)
603 (cortex.import/mega-import-jme3)
604 (rlm.rlm-commands/help)
605 (use '[hello [collision :only [lights]]])
606
607 (defn stand
608 [channel]
609 (doto channel
610 (.setAnim "stand" (float 0.5))
611 (.setLoopMode LoopMode/DontLoop)
612 (.setSpeed (float 1))))
613
614 (defn anim-listener []
615 (proxy [AnimEventListener] []
616 (onAnimChange
617 [control channel animation-name]
618 (println-repl "RLM --- onAnimChange"))
619 (onAnimCycleDone
620 [control channel animation-name]
621 (if (= animation-name "Walk")
622 (stand channel)
623 ))))
624
625 (defn setup-fn [channel game]
626 (dorun (map #(.addLight (.getRootNode game) %) (lights)))
627 ;; set the color of the sky
628 (.setBackgroundColor (.getViewPort game) (ColorRGBA. 0.3 0.4 0.9 1))
629 ;(.setBackgroundColor (.getViewPort game) (ColorRGBA. 0 0 0 1)
630 (.setAnim channel "stand")
631 (doto (.getFlyByCamera game)
632 (.setMoveSpeed (float 10))
633 (.setRotationSpeed 1)))
634
635 (defn walk [channel]
636 (println-repl "zzz")
637 (doto channel
638 (.setAnim "Walk" (float 0.5))
639 (.setLoopMode LoopMode/Loop)))
640
641
642 (defn key-map [channel]
643 {"key-space" (fn [game value]
644 (if (not value)
645 (walk channel)))})
646
647 (defn player []
648 (let [model (.loadModel (asset-manager) "Models/Oto/Oto.mesh.xml")
649 control (.getControl model AnimControl)]
650 (.setLocalScale model (float 0.5))
651 (.clearListeners control)
652 (.addListener control (anim-control))
653 model))
654
655
656
657 (defn run-anim-game []
658 (let [ninja (player)
659 control (.getControl ninja AnimControl)
660 channel (.createChannel control)]
661 (.start
662 (world
663 ninja
664 (key-map channel)
665 (partial setup-fn channel)
666 no-op))))
667 #+end_src
668
669 *** Hello Materials
670 #+srcname: material
671 #+begin_src clojure :results silent
672 (ns hello.material)
673 (use 'cortex.world)
674 (use 'cortex.import)
675 (use 'clojure.contrib.def)
676 (cortex.import/mega-import-jme3)
677 (rlm.rlm-commands/help)
678
679 (defn simple-cube []
680 (box 1 1 1
681 :position (Vector3f. -3 1.1 0)
682 :material "Common/MatDefs/Misc/Unshaded.j3md"
683 :texture "Interface/Logo/Monkey.jpg"
684 :physical? false))
685
686 (defn leaky-box []
687 (box 1 1 1
688 :position (Vector3f. 3 -1 0)
689 :material "Common/MatDefs/Misc/ColoredTextured.j3md"
690 :texture "Textures/ColoredTex/Monkey.png"
691 :color (ColorRGBA. 1 0 1 1)
692 :physical? false))
693
694 (defn transparent-box []
695 (doto
696 (box 1 1 0.1
697 :position Vector3f/ZERO
698 :name "window frame"
699 :material "Common/MatDefs/Misc/Unshaded.j3md"
700 :texture "Textures/ColoredTex/Monkey.png"
701 :physical? false)
702 (-> (.getMaterial)
703 (.getAdditionalRenderState)
704 (.setBlendMode RenderState$BlendMode/Alpha))
705 (.setQueueBucket RenderQueue$Bucket/Transparent)))
706
707 (defn bumpy-sphere []
708 (doto
709 (sphere 2
710 :position (Vector3f. 0 2 -2)
711 :name "Shiny rock"
712 :material "Common/MatDefs/Light/Lighting.j3md"
713 :texture false
714 :physical? false)
715 (-> (.getMesh)
716 (doto
717 (.setTextureMode Sphere$TextureMode/Projected)
718 (TangentBinormalGenerator/generate)))
719 (-> (.getMaterial)
720 (doto
721 (.setTexture "DiffuseMap" (.loadTexture (asset-manager)
722 "Textures/Terrain/Pond/Pond.png"))
723 (.setTexture "NormalMap" (.loadTexture (asset-manager)
724 "Textures/Terrain/Pond/Pond_normal.png"))
725 (.setFloat "Shininess" (float 5))))
726 (.rotate (float 1.6) 0 0)))
727
728
729 (defn start-game []
730 (.start
731 (world
732 (let [root (Node.)]
733 (dorun (map #(.attachChild root %)
734 [(simple-cube) (leaky-box) (transparent-box) (bumpy-sphere)]))
735 root)
736 {}
737 (fn [world]
738 (let [sun (doto (DirectionalLight.)
739 (.setDirection (.normalizeLocal (Vector3f. 1 0 -2)))
740 (.setColor ColorRGBA/White))]
741 (.addLight (.getRootNode world) sun)))
742 no-op
743 )))
744 #+end_src
745
746
747
748 * COMMENT code generation
749
750 #+begin_src clojure :tangle ../src/hello/brick_wall.clj
751 <<brick-wall-header>>
752 <<brick-wall-body>>
753 #+end_src
754
755 #+begin_src clojure :tangle ../src/hello/hello_simple_app.clj
756 <<hello-simple-app>>
757 #+end_src
758
759 #+begin_src clojure :tangle ../src/cortex/other_games.clj
760 <<other-games>>
761 #+end_src
762
763 #+begin_src clojure :tangle ../src/hello/loop.clj
764 <<hello-loop>>
765 #+end_src
766
767 #+begin_src clojure :tangle ../src/hello/collision.clj
768 <<hello-collision>>
769 #+end_src
770
771 #+begin_src clojure :tangle ../src/hello/terrain.clj
772 <<hello-terrain>>
773 #+end_src
774
775 #+begin_src clojure :tangle ../src/hello/animation.clj
776 <<hello-animation>>
777 #+end_src
778
779 #+begin_src clojure :tangle ../src/hello/material.clj
780 <<material>>
781 #+end_src
782
783
784
785
786
787
788
789