Mercurial > cortex
comparison org/util.org @ 23:cab2da252494
split off the rest of cortex.org
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Sun, 23 Oct 2011 23:54:26 -0700 |
parents | |
children | e965675ec4d0 |
comparison
equal
deleted
inserted
replaced
22:157b416152ea | 23:cab2da252494 |
---|---|
1 #+title: Helper Utilities | |
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 ** Imports | |
10 jMonkeyEngine has a plethora of classes which can be overwhelming at | |
11 first. So that I one can get right to coding, it's good to take the | |
12 time right now and make a "import all" function which brings in all of | |
13 the important jme3 classes. Once I'm happy with the general structure | |
14 of a namespace I can deal with importing only the classes it actually | |
15 needs. | |
16 | |
17 #+srcname: import | |
18 #+begin_src clojure :results silent | |
19 (ns cortex.import | |
20 (:require swank.util.class-browse)) | |
21 | |
22 (defn permissive-import | |
23 [classname] | |
24 (eval `(try (import '~classname) | |
25 (catch java.lang.Exception e# | |
26 (println "couldn't import " '~classname)))) | |
27 classname) | |
28 | |
29 (defn jme-class? [classname] | |
30 (and | |
31 (.startsWith classname "com.jme3.") | |
32 ;; Don't import the Lwjgl stuff since it can throw exceptions | |
33 ;; upon being loaded. | |
34 (not (re-matches #".*Lwjgl.*" classname)))) | |
35 | |
36 (defn jme-classes | |
37 "returns a list of all jme3 classes" | |
38 [] | |
39 (filter | |
40 jme-class? | |
41 (map :name | |
42 swank.util.class-browse/available-classes))) | |
43 | |
44 (defn mega-import-jme3 | |
45 "Import ALL the jme classes. For REPL use." | |
46 [] | |
47 (doall | |
48 (map (comp permissive-import symbol) (jme-classes)))) | |
49 #+end_src | |
50 | |
51 The =mega-import-jme3= is quite usefull for debugging purposes since | |
52 it allows completion for almost all of JME's classes. | |
53 | |
54 Out of curiousity, let's see just how many classes =mega-import-jme3= | |
55 imports: | |
56 | |
57 #+begin_src clojure :exports both | |
58 (clojure.core/count (cortex.import/jme-classes)) | |
59 #+end_src | |
60 | |
61 #+results: | |
62 : 955 | |
63 | |
64 ** Simplification | |
65 #+srcname: world-view | |
66 #+begin_src clojure :results silent | |
67 (in-ns 'cortex.world) | |
68 | |
69 (defprotocol Viewable | |
70 (view [something])) | |
71 | |
72 (extend-type com.jme3.scene.Geometry | |
73 Viewable | |
74 (view [geo] | |
75 (view (doto (Node.)(.attachChild geo))))) | |
76 | |
77 (extend-type com.jme3.scene.Node | |
78 Viewable | |
79 (view [node] | |
80 (.start | |
81 (world node | |
82 {} | |
83 (fn [world] | |
84 (.enableDebug | |
85 (.getPhysicsSpace | |
86 (.getState | |
87 (.getStateManager world) | |
88 BulletAppState)) | |
89 (asset-manager)) | |
90 (set-gravity* world Vector3f/ZERO) | |
91 ;; (set-gravity* world (Vector3f. 0 (float -0.4) 0)) | |
92 (let [sun (doto (DirectionalLight.) | |
93 (.setDirection (.normalizeLocal (Vector3f. 1 0 -2))) | |
94 (.setColor ColorRGBA/White))] | |
95 (.addLight (.getRootNode world) sun))) | |
96 no-op)))) | |
97 | |
98 (defn position-camera [game] | |
99 (doto (.getCamera game) | |
100 (.setLocation (Vector3f. 0 6 6)) | |
101 (.lookAt Vector3f/ZERO (Vector3f. 0 1 0)))) | |
102 | |
103 #+end_src | |
104 | |
105 Here I make the =Viewable= protocol and extend it to JME's types. Now | |
106 hello-world can be written as easily as: | |
107 | |
108 #+begin_src clojure :results silent | |
109 (cortex.world/view (cortex.world/box)) | |
110 #+end_src |