jax 0.0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (446) hide show
  1. data/.gitignore +12 -0
  2. data/.gitmodules +3 -0
  3. data/.rvmrc +7 -0
  4. data/Gemfile +4 -0
  5. data/README.rdoc +32 -0
  6. data/Rakefile +144 -0
  7. data/bin/jax +11 -0
  8. data/builtin/shaders/basic/common.ejs +11 -0
  9. data/builtin/shaders/basic/fragment.ejs +5 -0
  10. data/builtin/shaders/basic/vertex.ejs +13 -0
  11. data/builtin/shaders/depthmap/common.ejs +1 -0
  12. data/builtin/shaders/depthmap/fragment.ejs +5 -0
  13. data/builtin/shaders/depthmap/vertex.ejs +7 -0
  14. data/builtin/shaders/fog/common.ejs +7 -0
  15. data/builtin/shaders/fog/fragment.ejs +23 -0
  16. data/builtin/shaders/fog/manifest.yml +12 -0
  17. data/builtin/shaders/fog/material.js +34 -0
  18. data/builtin/shaders/fog/vertex.ejs +10 -0
  19. data/builtin/shaders/functions/depth_map.ejs +24 -0
  20. data/builtin/shaders/functions/lights.ejs +155 -0
  21. data/builtin/shaders/lighting/common.ejs +5 -0
  22. data/builtin/shaders/lighting/fragment.ejs +34 -0
  23. data/builtin/shaders/lighting/manifest.yml +4 -0
  24. data/builtin/shaders/lighting/material.js +26 -0
  25. data/builtin/shaders/lighting/vertex.ejs +7 -0
  26. data/builtin/shaders/normal_map/common.ejs +12 -0
  27. data/builtin/shaders/normal_map/fragment.ejs +26 -0
  28. data/builtin/shaders/normal_map/manifest.yml +17 -0
  29. data/builtin/shaders/normal_map/material.js +16 -0
  30. data/builtin/shaders/normal_map/vertex.ejs +57 -0
  31. data/builtin/shaders/paraboloid-depthmap/common.ejs +6 -0
  32. data/builtin/shaders/paraboloid-depthmap/fragment.ejs +8 -0
  33. data/builtin/shaders/paraboloid-depthmap/material.js +15 -0
  34. data/builtin/shaders/paraboloid-depthmap/vertex.ejs +26 -0
  35. data/builtin/shaders/shadow_map/common.ejs +14 -0
  36. data/builtin/shaders/shadow_map/fragment.ejs +66 -0
  37. data/builtin/shaders/shadow_map/manifest.yml +1 -0
  38. data/builtin/shaders/shadow_map/material.js +26 -0
  39. data/builtin/shaders/shadow_map/vertex.ejs +46 -0
  40. data/builtin/shaders/texture/common.ejs +4 -0
  41. data/builtin/shaders/texture/fragment.ejs +11 -0
  42. data/builtin/shaders/texture/manifest.yml +17 -0
  43. data/builtin/shaders/texture/material.js +18 -0
  44. data/builtin/shaders/texture/vertex.ejs +9 -0
  45. data/guides/assets/images/book_icon.gif +0 -0
  46. data/guides/assets/images/bullet.gif +0 -0
  47. data/guides/assets/images/chapters_icon.gif +0 -0
  48. data/guides/assets/images/check_bullet.gif +0 -0
  49. data/guides/assets/images/credits_pic_blank.gif +0 -0
  50. data/guides/assets/images/edge_badge.png +0 -0
  51. data/guides/assets/images/feature_tile.gif +0 -0
  52. data/guides/assets/images/footer_tile.gif +0 -0
  53. data/guides/assets/images/getting_started/clean_passing_jasmine_suite.png +0 -0
  54. data/guides/assets/images/getting_started/rock.png +0 -0
  55. data/guides/assets/images/getting_started/rock_normal.png +0 -0
  56. data/guides/assets/images/grey_bullet.gif +0 -0
  57. data/guides/assets/images/header_backdrop.png +0 -0
  58. data/guides/assets/images/header_tile.gif +0 -0
  59. data/guides/assets/images/icons/README +5 -0
  60. data/guides/assets/images/icons/callouts/1.png +0 -0
  61. data/guides/assets/images/icons/callouts/10.png +0 -0
  62. data/guides/assets/images/icons/callouts/11.png +0 -0
  63. data/guides/assets/images/icons/callouts/12.png +0 -0
  64. data/guides/assets/images/icons/callouts/13.png +0 -0
  65. data/guides/assets/images/icons/callouts/14.png +0 -0
  66. data/guides/assets/images/icons/callouts/15.png +0 -0
  67. data/guides/assets/images/icons/callouts/2.png +0 -0
  68. data/guides/assets/images/icons/callouts/3.png +0 -0
  69. data/guides/assets/images/icons/callouts/4.png +0 -0
  70. data/guides/assets/images/icons/callouts/5.png +0 -0
  71. data/guides/assets/images/icons/callouts/6.png +0 -0
  72. data/guides/assets/images/icons/callouts/7.png +0 -0
  73. data/guides/assets/images/icons/callouts/8.png +0 -0
  74. data/guides/assets/images/icons/callouts/9.png +0 -0
  75. data/guides/assets/images/icons/caution.png +0 -0
  76. data/guides/assets/images/icons/example.png +0 -0
  77. data/guides/assets/images/icons/home.png +0 -0
  78. data/guides/assets/images/icons/important.png +0 -0
  79. data/guides/assets/images/icons/next.png +0 -0
  80. data/guides/assets/images/icons/note.png +0 -0
  81. data/guides/assets/images/icons/prev.png +0 -0
  82. data/guides/assets/images/icons/tip.png +0 -0
  83. data/guides/assets/images/icons/up.png +0 -0
  84. data/guides/assets/images/icons/warning.png +0 -0
  85. data/guides/assets/images/nav_arrow.gif +0 -0
  86. data/guides/assets/images/tab_grey.gif +0 -0
  87. data/guides/assets/images/tab_info.gif +0 -0
  88. data/guides/assets/images/tab_note.gif +0 -0
  89. data/guides/assets/images/tab_red.gif +0 -0
  90. data/guides/assets/images/tab_yellow.gif +0 -0
  91. data/guides/assets/images/tab_yellow.png +0 -0
  92. data/guides/assets/javascripts/guides.js +7 -0
  93. data/guides/assets/javascripts/syntaxhighlighter/shBrushAS3.js +59 -0
  94. data/guides/assets/javascripts/syntaxhighlighter/shBrushAppleScript.js +75 -0
  95. data/guides/assets/javascripts/syntaxhighlighter/shBrushBash.js +59 -0
  96. data/guides/assets/javascripts/syntaxhighlighter/shBrushCSharp.js +65 -0
  97. data/guides/assets/javascripts/syntaxhighlighter/shBrushColdFusion.js +100 -0
  98. data/guides/assets/javascripts/syntaxhighlighter/shBrushCpp.js +97 -0
  99. data/guides/assets/javascripts/syntaxhighlighter/shBrushCss.js +91 -0
  100. data/guides/assets/javascripts/syntaxhighlighter/shBrushDelphi.js +55 -0
  101. data/guides/assets/javascripts/syntaxhighlighter/shBrushDiff.js +41 -0
  102. data/guides/assets/javascripts/syntaxhighlighter/shBrushErlang.js +52 -0
  103. data/guides/assets/javascripts/syntaxhighlighter/shBrushGroovy.js +67 -0
  104. data/guides/assets/javascripts/syntaxhighlighter/shBrushJScript.js +52 -0
  105. data/guides/assets/javascripts/syntaxhighlighter/shBrushJava.js +57 -0
  106. data/guides/assets/javascripts/syntaxhighlighter/shBrushJavaFX.js +58 -0
  107. data/guides/assets/javascripts/syntaxhighlighter/shBrushPerl.js +72 -0
  108. data/guides/assets/javascripts/syntaxhighlighter/shBrushPhp.js +88 -0
  109. data/guides/assets/javascripts/syntaxhighlighter/shBrushPlain.js +33 -0
  110. data/guides/assets/javascripts/syntaxhighlighter/shBrushPowerShell.js +74 -0
  111. data/guides/assets/javascripts/syntaxhighlighter/shBrushPython.js +64 -0
  112. data/guides/assets/javascripts/syntaxhighlighter/shBrushRuby.js +55 -0
  113. data/guides/assets/javascripts/syntaxhighlighter/shBrushSass.js +94 -0
  114. data/guides/assets/javascripts/syntaxhighlighter/shBrushScala.js +51 -0
  115. data/guides/assets/javascripts/syntaxhighlighter/shBrushSql.js +66 -0
  116. data/guides/assets/javascripts/syntaxhighlighter/shBrushVb.js +56 -0
  117. data/guides/assets/javascripts/syntaxhighlighter/shBrushXml.js +69 -0
  118. data/guides/assets/javascripts/syntaxhighlighter/shCore.js +17 -0
  119. data/guides/assets/stylesheets/fixes.css +16 -0
  120. data/guides/assets/stylesheets/main.css +445 -0
  121. data/guides/assets/stylesheets/print.css +52 -0
  122. data/guides/assets/stylesheets/reset.css +43 -0
  123. data/guides/assets/stylesheets/style.css +13 -0
  124. data/guides/assets/stylesheets/syntaxhighlighter/shCore.css +226 -0
  125. data/guides/assets/stylesheets/syntaxhighlighter/shCoreDefault.css +328 -0
  126. data/guides/assets/stylesheets/syntaxhighlighter/shCoreDjango.css +331 -0
  127. data/guides/assets/stylesheets/syntaxhighlighter/shCoreEclipse.css +339 -0
  128. data/guides/assets/stylesheets/syntaxhighlighter/shCoreEmacs.css +324 -0
  129. data/guides/assets/stylesheets/syntaxhighlighter/shCoreFadeToGrey.css +328 -0
  130. data/guides/assets/stylesheets/syntaxhighlighter/shCoreMDUltra.css +324 -0
  131. data/guides/assets/stylesheets/syntaxhighlighter/shCoreMidnight.css +324 -0
  132. data/guides/assets/stylesheets/syntaxhighlighter/shCoreRDark.css +324 -0
  133. data/guides/assets/stylesheets/syntaxhighlighter/shThemeDefault.css +117 -0
  134. data/guides/assets/stylesheets/syntaxhighlighter/shThemeDjango.css +120 -0
  135. data/guides/assets/stylesheets/syntaxhighlighter/shThemeEclipse.css +128 -0
  136. data/guides/assets/stylesheets/syntaxhighlighter/shThemeEmacs.css +113 -0
  137. data/guides/assets/stylesheets/syntaxhighlighter/shThemeFadeToGrey.css +117 -0
  138. data/guides/assets/stylesheets/syntaxhighlighter/shThemeJaxGuides.css +116 -0
  139. data/guides/assets/stylesheets/syntaxhighlighter/shThemeMDUltra.css +113 -0
  140. data/guides/assets/stylesheets/syntaxhighlighter/shThemeMidnight.css +113 -0
  141. data/guides/assets/stylesheets/syntaxhighlighter/shThemeRDark.css +113 -0
  142. data/guides/jax_guides.rb +41 -0
  143. data/guides/jax_guides/common.rb +7 -0
  144. data/guides/jax_guides/generator.rb +287 -0
  145. data/guides/jax_guides/helpers.rb +29 -0
  146. data/guides/jax_guides/indexer.rb +69 -0
  147. data/guides/jax_guides/levenshtein.rb +31 -0
  148. data/guides/jax_guides/textile_extensions.rb +61 -0
  149. data/guides/source/getting_started.textile +1171 -0
  150. data/guides/source/index.html.erb +50 -0
  151. data/guides/source/layout.html.erb +158 -0
  152. data/guides/source/lighting.textile +5 -0
  153. data/guides/source/materials.textile +5 -0
  154. data/guides/source/shaders.textile +5 -0
  155. data/guides/source/testing.textile +5 -0
  156. data/guides/w3c_validator.rb +91 -0
  157. data/jax.gems +1 -0
  158. data/jax.gemspec +40 -0
  159. data/lib/jax.rb +28 -0
  160. data/lib/jax/application.rb +92 -0
  161. data/lib/jax/application/configuration.rb +27 -0
  162. data/lib/jax/generators/app.rb +17 -0
  163. data/lib/jax/generators/app/app_generator.rb +78 -0
  164. data/lib/jax/generators/app/templates/Gemfile.tt +3 -0
  165. data/lib/jax/generators/app/templates/Rakefile +6 -0
  166. data/lib/jax/generators/app/templates/app/controllers/application_controller.js.tt +5 -0
  167. data/lib/jax/generators/app/templates/app/helpers/application_helper.js.tt +3 -0
  168. data/lib/jax/generators/app/templates/app/models/.empty_directory +0 -0
  169. data/lib/jax/generators/app/templates/app/resources/.empty_directory +0 -0
  170. data/lib/jax/generators/app/templates/app/views/.empty_directory +0 -0
  171. data/lib/jax/generators/app/templates/config/application.rb.tt +6 -0
  172. data/lib/jax/generators/app/templates/config/boot.rb +13 -0
  173. data/lib/jax/generators/app/templates/config/routes.rb.tt +5 -0
  174. data/lib/jax/generators/app/templates/public/javascripts/jax.js +7561 -0
  175. data/lib/jax/generators/app/templates/public/webgl_not_supported.html +26 -0
  176. data/lib/jax/generators/app/templates/script/jax +7 -0
  177. data/lib/jax/generators/app/templates/spec/javascripts/controllers/application_controller_spec.js +11 -0
  178. data/lib/jax/generators/app/templates/spec/javascripts/helpers/application_helper_spec.js +12 -0
  179. data/lib/jax/generators/app/templates/spec/javascripts/support/jasmine.yml +90 -0
  180. data/lib/jax/generators/app/templates/spec/javascripts/support/jasmine_config.rb +23 -0
  181. data/lib/jax/generators/app/templates/spec/javascripts/support/jasmine_runner.rb +32 -0
  182. data/lib/jax/generators/app/templates/spec/javascripts/support/spec_helpers/jax_spec_helper.js +216 -0
  183. data/lib/jax/generators/app/templates/spec/javascripts/support/spec_layout.html.erb +63 -0
  184. data/lib/jax/generators/commands.rb +81 -0
  185. data/lib/jax/generators/controller/USAGE +9 -0
  186. data/lib/jax/generators/controller/controller_generator.rb +59 -0
  187. data/lib/jax/generators/controller/templates/controller_source.js.tt +16 -0
  188. data/lib/jax/generators/controller/templates/controller_test.js.tt +11 -0
  189. data/lib/jax/generators/controller/templates/helper.js.tt +3 -0
  190. data/lib/jax/generators/controller/templates/helper_test.js.tt +12 -0
  191. data/lib/jax/generators/controller/templates/view.js.tt +4 -0
  192. data/lib/jax/generators/light_source/USAGE +14 -0
  193. data/lib/jax/generators/light_source/light_source_generator.rb +47 -0
  194. data/lib/jax/generators/light_source/templates/light.yml.tt +39 -0
  195. data/lib/jax/generators/material/USAGE +29 -0
  196. data/lib/jax/generators/material/material_generator.rb +81 -0
  197. data/lib/jax/generators/material/templates/append.yml.tt +7 -0
  198. data/lib/jax/generators/material/templates/material.yml.tt +33 -0
  199. data/lib/jax/generators/model/USAGE +5 -0
  200. data/lib/jax/generators/model/model_generator.rb +42 -0
  201. data/lib/jax/generators/model/templates/model.js.tt +11 -0
  202. data/lib/jax/generators/model/templates/test.js.tt +11 -0
  203. data/lib/jax/generators/script_jax_loader.rb +32 -0
  204. data/lib/jax/monkeypatch/jasmine.rb +3 -0
  205. data/lib/jax/monkeypatch/jasmine/config.rb +21 -0
  206. data/lib/jax/monkeypatch/jasmine/server.rb +50 -0
  207. data/lib/jax/packager.rb +58 -0
  208. data/lib/jax/packager/sprockets_template.rb +49 -0
  209. data/lib/jax/resource_compiler.rb +50 -0
  210. data/lib/jax/routes.rb +61 -0
  211. data/lib/jax/shader.rb +158 -0
  212. data/lib/jax/tasks/rake.rb +34 -0
  213. data/lib/jax/version.rb +12 -0
  214. data/public/images/brickwall.jpg +0 -0
  215. data/public/images/jacks.jpg +0 -0
  216. data/public/images/normal_map.jpg +0 -0
  217. data/public/images/rock.png +0 -0
  218. data/public/images/rockNormal.png +0 -0
  219. data/public/images/rss.png +0 -0
  220. data/public/webgl_not_supported.html +26 -0
  221. data/spec/example_app/Gemfile +1 -0
  222. data/spec/example_app/Rakefile +15 -0
  223. data/spec/example_app/app/controllers/application_controller.js +5 -0
  224. data/spec/example_app/app/controllers/courthouse_controller.js +24 -0
  225. data/spec/example_app/app/controllers/lighting_controller.js +69 -0
  226. data/spec/example_app/app/controllers/shadows_controller.js +130 -0
  227. data/spec/example_app/app/controllers/textures_controller.js +52 -0
  228. data/spec/example_app/app/helpers/application_helper.js +3 -0
  229. data/spec/example_app/app/helpers/textures_helper.js +3 -0
  230. data/spec/example_app/app/models/character.js +23 -0
  231. data/spec/example_app/app/models/door.js +10 -0
  232. data/spec/example_app/app/models/scene.js +19 -0
  233. data/spec/example_app/app/resources/characters/judge.yml +3 -0
  234. data/spec/example_app/app/resources/doors/courthouse_door.yml +5 -0
  235. data/spec/example_app/app/resources/light_sources/directional_light.yml +13 -0
  236. data/spec/example_app/app/resources/light_sources/point_light.yml +31 -0
  237. data/spec/example_app/app/resources/light_sources/spot_light.yml +15 -0
  238. data/spec/example_app/app/resources/light_sources/sun.yml +7 -0
  239. data/spec/example_app/app/resources/light_sources/textures_point.yml +34 -0
  240. data/spec/example_app/app/resources/materials/bricks.yml +36 -0
  241. data/spec/example_app/app/resources/materials/lighting_with_shadows.yml +27 -0
  242. data/spec/example_app/app/resources/scenes/courthouse.yml +4 -0
  243. data/spec/example_app/app/views/courthouse/index.js +4 -0
  244. data/spec/example_app/app/views/lighting/index.js +4 -0
  245. data/spec/example_app/app/views/shadows/index.js +6 -0
  246. data/spec/example_app/app/views/textures/index.js +4 -0
  247. data/spec/example_app/config/application.rb +6 -0
  248. data/spec/example_app/config/boot.rb +13 -0
  249. data/spec/example_app/config/routes.rb +6 -0
  250. data/spec/example_app/public/images/185__normalmap.png +0 -0
  251. data/spec/example_app/public/images/face_norm.jpg +0 -0
  252. data/spec/example_app/public/images/rock.png +0 -0
  253. data/spec/example_app/public/images/rockNormal.png +0 -0
  254. data/spec/example_app/public/images/rss.png +0 -0
  255. data/spec/example_app/public/webgl_not_supported.html +26 -0
  256. data/spec/example_app/script/jax +7 -0
  257. data/spec/example_app/spec/javascripts/controllers/textures_controller_spec.js +11 -0
  258. data/spec/example_app/spec/javascripts/helpers/application_helper_spec.js +12 -0
  259. data/spec/example_app/spec/javascripts/resources/directional_light_spec.js +16 -0
  260. data/spec/example_app/spec/javascripts/resources/point_light_spec.js +17 -0
  261. data/spec/example_app/spec/javascripts/resources/spot_light_spec.js +18 -0
  262. data/spec/example_app/spec/javascripts/support/jasmine.yml +89 -0
  263. data/spec/example_app/spec/javascripts/support/jasmine_runner.rb +32 -0
  264. data/spec/example_app/spec/javascripts/support/spec_helpers/jax_spec_helper.js +93 -0
  265. data/spec/example_app/spec/javascripts/support/spec_layout.html.erb +84 -0
  266. data/spec/generators/app_generator_spec.rb +46 -0
  267. data/spec/generators/controller_generator_spec.rb +68 -0
  268. data/spec/generators/light_generator_spec.rb +51 -0
  269. data/spec/generators/material_generator_spec.rb +35 -0
  270. data/spec/generators/model_generator_spec.rb +43 -0
  271. data/spec/javascripts/Player.js +58 -0
  272. data/spec/javascripts/helpers/SpecHelper.js +216 -0
  273. data/spec/javascripts/jax/builtin/materials/core_materials_spec.js +41 -0
  274. data/spec/javascripts/jax/builtin/materials/dual_paraboloid_spec.js +37 -0
  275. data/spec/javascripts/jax/builtin/materials/fog_spec.js +19 -0
  276. data/spec/javascripts/jax/builtin/materials/lighting_spec.js +19 -0
  277. data/spec/javascripts/jax/builtin/materials/normal_map_spec.js +19 -0
  278. data/spec/javascripts/jax/builtin/materials/shadow_map_spec.js +19 -0
  279. data/spec/javascripts/jax/builtin/materials/texture_spec.js +19 -0
  280. data/spec/javascripts/jax/builtin/meshes/cube_spec.js +10 -0
  281. data/spec/javascripts/jax/builtin/meshes/plane_spec.js +8 -0
  282. data/spec/javascripts/jax/builtin/meshes/quad_spec.js +8 -0
  283. data/spec/javascripts/jax/builtin/meshes/sphere_spec.js +8 -0
  284. data/spec/javascripts/jax/builtin/meshes/teapot_spec.js +8 -0
  285. data/spec/javascripts/jax/builtin/meshes/torus_spec.js +8 -0
  286. data/spec/javascripts/jax/compatibility_spec.js +50 -0
  287. data/spec/javascripts/jax/context_spec.js +82 -0
  288. data/spec/javascripts/jax/controller_spec.js +145 -0
  289. data/spec/javascripts/jax/core/delegation_spec.js +48 -0
  290. data/spec/javascripts/jax/core/events_spec.js +17 -0
  291. data/spec/javascripts/jax/core/matrix_stack_spec.js +28 -0
  292. data/spec/javascripts/jax/core/utils_spec.js +256 -0
  293. data/spec/javascripts/jax/helper_spec.js +33 -0
  294. data/spec/javascripts/jax/model_spec.js +87 -0
  295. data/spec/javascripts/jax/optimizations/material_limitations_spec.js +87 -0
  296. data/spec/javascripts/jax/optimizations/shaders/basic_spec.js +68 -0
  297. data/spec/javascripts/jax/prototype/extensions_spec.js +34 -0
  298. data/spec/javascripts/jax/route_set_spec.js +67 -0
  299. data/spec/javascripts/jax/view_manager_spec.js +17 -0
  300. data/spec/javascripts/jax/webgl/camera_spec.js +159 -0
  301. data/spec/javascripts/jax/webgl/framebuffer_spec.js +46 -0
  302. data/spec/javascripts/jax/webgl/lighting_spec.js +61 -0
  303. data/spec/javascripts/jax/webgl/material_spec.js +118 -0
  304. data/spec/javascripts/jax/webgl/mesh_spec.js +86 -0
  305. data/spec/javascripts/jax/webgl/shader/manifest_spec.js +60 -0
  306. data/spec/javascripts/jax/webgl/shader_chain_spec.js +192 -0
  307. data/spec/javascripts/jax/webgl/shader_spec.js +276 -0
  308. data/spec/javascripts/jax/webgl/tangent_space_spec.js +142 -0
  309. data/spec/javascripts/jax/webgl/texture_spec.js +162 -0
  310. data/spec/javascripts/jax/webgl_spec.js +5 -0
  311. data/spec/javascripts/jax/world_spec.js +88 -0
  312. data/spec/javascripts/jax_spec.js +27 -0
  313. data/spec/javascripts/support/jasmine.yml +85 -0
  314. data/spec/javascripts/support/jasmine_runner.rb +32 -0
  315. data/spec/lib/jax/routes_spec.rb +24 -0
  316. data/spec/lib/jax/shader_spec.rb +57 -0
  317. data/spec/lib/jax/tasks/jax_rake_spec.rb +79 -0
  318. data/spec/spec_helper.rb +11 -0
  319. data/spec/support/file_exist_matcher.rb +23 -0
  320. data/spec/support/spec_shell.rb +97 -0
  321. data/src/jax.js +84 -0
  322. data/src/jax/anim_frame.js +47 -0
  323. data/src/jax/builtin/all.js +7 -0
  324. data/src/jax/builtin/meshes/cube.js +62 -0
  325. data/src/jax/builtin/meshes/plane.js +36 -0
  326. data/src/jax/builtin/meshes/quad.js +80 -0
  327. data/src/jax/builtin/meshes/sphere.js +46 -0
  328. data/src/jax/builtin/meshes/teapot.js +38 -0
  329. data/src/jax/builtin/meshes/torus.js +46 -0
  330. data/src/jax/compatibility.js +140 -0
  331. data/src/jax/context.js +253 -0
  332. data/src/jax/controller.js +157 -0
  333. data/src/jax/core.js +39 -0
  334. data/src/jax/core/math.js +40 -0
  335. data/src/jax/core/matrix_stack.js +306 -0
  336. data/src/jax/core/util.js +226 -0
  337. data/src/jax/events.js +179 -0
  338. data/src/jax/geometry.js +3 -0
  339. data/src/jax/geometry/plane.js +59 -0
  340. data/src/jax/helper.js +8 -0
  341. data/src/jax/model.js +163 -0
  342. data/src/jax/prototype/class.js +78 -0
  343. data/src/jax/prototype/core.js +112 -0
  344. data/src/jax/prototype/extensions.js +124 -0
  345. data/src/jax/route_set.js +125 -0
  346. data/src/jax/vendor/ejs.js +4 -0
  347. data/src/jax/vendor/glMatrix.js +3 -0
  348. data/src/jax/view.js +37 -0
  349. data/src/jax/view_manager.js +46 -0
  350. data/src/jax/webgl.js +98 -0
  351. data/src/jax/webgl/camera.js +526 -0
  352. data/src/jax/webgl/core.js +6 -0
  353. data/src/jax/webgl/core/buffer.js +161 -0
  354. data/src/jax/webgl/core/edge.js +6 -0
  355. data/src/jax/webgl/core/events.js +25 -0
  356. data/src/jax/webgl/core/face.js +8 -0
  357. data/src/jax/webgl/core/framebuffer.js +206 -0
  358. data/src/jax/webgl/material.js +375 -0
  359. data/src/jax/webgl/mesh.js +412 -0
  360. data/src/jax/webgl/scene.js +11 -0
  361. data/src/jax/webgl/scene/frustum.js +260 -0
  362. data/src/jax/webgl/scene/light_manager.js +112 -0
  363. data/src/jax/webgl/scene/light_source.js +248 -0
  364. data/src/jax/webgl/shader.js +282 -0
  365. data/src/jax/webgl/shader/delegator.js +13 -0
  366. data/src/jax/webgl/shader/delegator/attribute.js +53 -0
  367. data/src/jax/webgl/shader/delegator/uniform.js +71 -0
  368. data/src/jax/webgl/shader/manifest.js +64 -0
  369. data/src/jax/webgl/shader/program.js +140 -0
  370. data/src/jax/webgl/shader_chain.js +256 -0
  371. data/src/jax/webgl/texture.js +312 -0
  372. data/src/jax/webgl/world.js +119 -0
  373. data/vendor/ejs/.svn/all-wcprops +17 -0
  374. data/vendor/ejs/.svn/entries +114 -0
  375. data/vendor/ejs/.svn/text-base/Eratta.txt.svn-base +3 -0
  376. data/vendor/ejs/.svn/text-base/license.txt.svn-base +21 -0
  377. data/vendor/ejs/Eratta.txt +3 -0
  378. data/vendor/ejs/example/.svn/all-wcprops +29 -0
  379. data/vendor/ejs/example/.svn/entries +164 -0
  380. data/vendor/ejs/example/.svn/prop-base/ejs.gif.svn-base +5 -0
  381. data/vendor/ejs/example/.svn/text-base/demo.html.svn-base +54 -0
  382. data/vendor/ejs/example/.svn/text-base/ejs.gif.svn-base +0 -0
  383. data/vendor/ejs/example/.svn/text-base/example.css.svn-base +31 -0
  384. data/vendor/ejs/example/.svn/text-base/example.js.svn-base +88 -0
  385. data/vendor/ejs/example/demo.html +54 -0
  386. data/vendor/ejs/example/ejs.gif +0 -0
  387. data/vendor/ejs/example/example.css +31 -0
  388. data/vendor/ejs/example/example.js +88 -0
  389. data/vendor/ejs/lib/.svn/all-wcprops +11 -0
  390. data/vendor/ejs/lib/.svn/entries +62 -0
  391. data/vendor/ejs/lib/.svn/text-base/ejs_fulljslint.js.svn-base +3774 -0
  392. data/vendor/ejs/lib/ejs_fulljslint.js +3774 -0
  393. data/vendor/ejs/license.txt +21 -0
  394. data/vendor/ejs/script/.svn/all-wcprops +17 -0
  395. data/vendor/ejs/script/.svn/entries +96 -0
  396. data/vendor/ejs/script/.svn/prop-base/yuicompressor-2.2.4.jar.svn-base +5 -0
  397. data/vendor/ejs/script/.svn/text-base/production.bat.svn-base +4 -0
  398. data/vendor/ejs/script/.svn/text-base/yuicompressor-2.2.4.jar.svn-base +0 -0
  399. data/vendor/ejs/script/production.bat +4 -0
  400. data/vendor/ejs/script/yuicompressor-2.2.4.jar +0 -0
  401. data/vendor/ejs/src/.svn/all-wcprops +17 -0
  402. data/vendor/ejs/src/.svn/entries +96 -0
  403. data/vendor/ejs/src/.svn/text-base/ejs.js.svn-base +505 -0
  404. data/vendor/ejs/src/.svn/text-base/view.js.svn-base +200 -0
  405. data/vendor/ejs/src/ejs.js +505 -0
  406. data/vendor/ejs/src/view.js +200 -0
  407. data/vendor/ejs/test/.svn/all-wcprops +23 -0
  408. data/vendor/ejs/test/.svn/entries +139 -0
  409. data/vendor/ejs/test/.svn/text-base/index.html.svn-base +18 -0
  410. data/vendor/ejs/test/.svn/text-base/setup_test.html.svn-base +44 -0
  411. data/vendor/ejs/test/.svn/text-base/sidebar.html.svn-base +28 -0
  412. data/vendor/ejs/test/included/.svn/all-wcprops +23 -0
  413. data/vendor/ejs/test/included/.svn/entries +130 -0
  414. data/vendor/ejs/test/included/.svn/text-base/prototype.js.svn-base +4184 -0
  415. data/vendor/ejs/test/included/.svn/text-base/test.css.svn-base +44 -0
  416. data/vendor/ejs/test/included/.svn/text-base/unittest.js.svn-base +564 -0
  417. data/vendor/ejs/test/included/prototype.js +4184 -0
  418. data/vendor/ejs/test/included/test.css +44 -0
  419. data/vendor/ejs/test/included/unittest.js +564 -0
  420. data/vendor/ejs/test/index.html +18 -0
  421. data/vendor/ejs/test/setup_test.html +44 -0
  422. data/vendor/ejs/test/sidebar.html +28 -0
  423. data/vendor/ejs/test/templates/.svn/all-wcprops +11 -0
  424. data/vendor/ejs/test/templates/.svn/entries +62 -0
  425. data/vendor/ejs/test/templates/.svn/text-base/test.ejs.svn-base +3 -0
  426. data/vendor/ejs/test/templates/test.ejs +3 -0
  427. data/vendor/ejs/test/tests/.svn/all-wcprops +23 -0
  428. data/vendor/ejs/test/tests/.svn/entries +130 -0
  429. data/vendor/ejs/test/tests/.svn/text-base/rendering.js.svn-base +94 -0
  430. data/vendor/ejs/test/tests/.svn/text-base/templating.js.svn-base +43 -0
  431. data/vendor/ejs/test/tests/.svn/text-base/views.js.svn-base +100 -0
  432. data/vendor/ejs/test/tests/rendering.js +94 -0
  433. data/vendor/ejs/test/tests/templating.js +43 -0
  434. data/vendor/ejs/test/tests/views.js +100 -0
  435. data/vendor/glmatrix/benchmark/js/CanvasMatrix.js +722 -0
  436. data/vendor/glmatrix/benchmark/js/EWGL_math.js +742 -0
  437. data/vendor/glmatrix/benchmark/js/mjs.js +1230 -0
  438. data/vendor/glmatrix/benchmark/matrix_benchmark.html +419 -0
  439. data/vendor/glmatrix/glMatrix-min.js +32 -0
  440. data/vendor/glmatrix/glMatrix.js +1815 -0
  441. data/vendor/glmatrix/unit tests/glMatrix-test.js +74 -0
  442. data/vendor/glmatrix/unit tests/qunit.css +119 -0
  443. data/vendor/glmatrix/unit tests/qunit.js +1069 -0
  444. data/vendor/glmatrix/unit tests/test_glMatrix.html +21 -0
  445. data/vendor/yuicompressor-2.4.2.jar +0 -0
  446. metadata +748 -0
@@ -0,0 +1,140 @@
1
+ /* Defines constants, functions, etc. that may exist in one browser but not in another */
2
+
3
+ /*
4
+ Object.keys defined only in the newest browsers. If they're going to fail, let them fail due to HTML5 incompatibility
5
+ and not standards compat.
6
+ */
7
+ if (!Object.keys) {
8
+ Object.keys = function(object) {
9
+ var arr = [];
10
+ for (var i in object)
11
+ arr.push(i);
12
+ return arr;
13
+ };
14
+ }
15
+
16
+
17
+ /* KeyEvent in Firefox contains various keyCode constants, but they are missing in Chrome. */
18
+ if (typeof(KeyEvent) == "undefined") {
19
+ // KeyEvent constants taken from Firefox 3.6
20
+ KeyEvent = {
21
+ fake: true,
22
+ DOM_VK_CANCEL : 3,
23
+ DOM_VK_HELP : 6,
24
+ DOM_VK_BACK_SPACE : 8,
25
+ DOM_VK_TAB : 9,
26
+ DOM_VK_CLEAR : 12,
27
+ DOM_VK_RETURN : 13,
28
+ DOM_VK_ENTER : 14,
29
+ DOM_VK_SHIFT : 16,
30
+ DOM_VK_CONTROL : 17,
31
+ DOM_VK_ALT : 18,
32
+ DOM_VK_PAUSE : 19,
33
+ DOM_VK_CAPS_LOCK : 20,
34
+ DOM_VK_ESCAPE : 27,
35
+ DOM_VK_SPACE : 32,
36
+ DOM_VK_PAGE_UP : 33,
37
+ DOM_VK_PAGE_DOWN : 34,
38
+ DOM_VK_END : 35,
39
+ DOM_VK_HOME : 36,
40
+ DOM_VK_LEFT : 37,
41
+ DOM_VK_UP : 38,
42
+ DOM_VK_RIGHT : 39,
43
+ DOM_VK_DOWN : 40,
44
+ DOM_VK_PRINTSCREEN : 44,
45
+ DOM_VK_INSERT : 45,
46
+ DOM_VK_DELETE : 46,
47
+ DOM_VK_0 : 48,
48
+ DOM_VK_1 : 49,
49
+ DOM_VK_2 : 50,
50
+ DOM_VK_3 : 51,
51
+ DOM_VK_4 : 52,
52
+ DOM_VK_5 : 53,
53
+ DOM_VK_6 : 54,
54
+ DOM_VK_7 : 55,
55
+ DOM_VK_8 : 56,
56
+ DOM_VK_9 : 57,
57
+ DOM_VK_SEMICOLON : 59,
58
+ DOM_VK_EQUALS : 61,
59
+ DOM_VK_A : 65,
60
+ DOM_VK_B : 66,
61
+ DOM_VK_C : 67,
62
+ DOM_VK_D : 68,
63
+ DOM_VK_E : 69,
64
+ DOM_VK_F : 70,
65
+ DOM_VK_G : 71,
66
+ DOM_VK_H : 72,
67
+ DOM_VK_I : 73,
68
+ DOM_VK_J : 74,
69
+ DOM_VK_K : 75,
70
+ DOM_VK_L : 76,
71
+ DOM_VK_M : 77,
72
+ DOM_VK_N : 78,
73
+ DOM_VK_O : 79,
74
+ DOM_VK_P : 80,
75
+ DOM_VK_Q : 81,
76
+ DOM_VK_R : 82,
77
+ DOM_VK_S : 83,
78
+ DOM_VK_T : 84,
79
+ DOM_VK_U : 85,
80
+ DOM_VK_V : 86,
81
+ DOM_VK_W : 87,
82
+ DOM_VK_X : 88,
83
+ DOM_VK_Y : 89,
84
+ DOM_VK_Z : 90,
85
+ DOM_VK_CONTEXT_MENU : 93,
86
+ DOM_VK_NUMPAD0 : 96,
87
+ DOM_VK_NUMPAD1 : 97,
88
+ DOM_VK_NUMPAD2 : 98,
89
+ DOM_VK_NUMPAD3 : 99,
90
+ DOM_VK_NUMPAD4 : 100,
91
+ DOM_VK_NUMPAD5 : 101,
92
+ DOM_VK_NUMPAD6 : 102,
93
+ DOM_VK_NUMPAD7 : 103,
94
+ DOM_VK_NUMPAD8 : 104,
95
+ DOM_VK_NUMPAD9 : 105,
96
+ DOM_VK_MULTIPLY : 106,
97
+ DOM_VK_ADD : 107,
98
+ DOM_VK_SEPARATOR : 108,
99
+ DOM_VK_SUBTRACT : 109,
100
+ DOM_VK_DECIMAL : 110,
101
+ DOM_VK_DIVIDE : 111,
102
+ DOM_VK_F1 : 112,
103
+ DOM_VK_F2 : 113,
104
+ DOM_VK_F3 : 114,
105
+ DOM_VK_F4 : 115,
106
+ DOM_VK_F5 : 116,
107
+ DOM_VK_F6 : 117,
108
+ DOM_VK_F7 : 118,
109
+ DOM_VK_F8 : 119,
110
+ DOM_VK_F9 : 120,
111
+ DOM_VK_F10 : 121,
112
+ DOM_VK_F11 : 122,
113
+ DOM_VK_F12 : 123,
114
+ DOM_VK_F13 : 124,
115
+ DOM_VK_F14 : 125,
116
+ DOM_VK_F15 : 126,
117
+ DOM_VK_F16 : 127,
118
+ DOM_VK_F17 : 128,
119
+ DOM_VK_F18 : 129,
120
+ DOM_VK_F19 : 130,
121
+ DOM_VK_F20 : 131,
122
+ DOM_VK_F21 : 132,
123
+ DOM_VK_F22 : 133,
124
+ DOM_VK_F23 : 134,
125
+ DOM_VK_F24 : 135,
126
+ DOM_VK_NUM_LOCK : 144,
127
+ DOM_VK_SCROLL_LOCK : 145,
128
+ DOM_VK_COMMA : 188,
129
+ DOM_VK_PERIOD : 190,
130
+ DOM_VK_SLASH : 191,
131
+ DOM_VK_BACK_QUOTE : 192,
132
+ DOM_VK_OPEN_BRACKET : 219,
133
+ DOM_VK_BACK_SLASH : 220,
134
+ DOM_VK_CLOSE_BRACKET : 221,
135
+ DOM_VK_QUOTE : 222,
136
+ DOM_VK_META: 224
137
+ };
138
+
139
+ /* TODO handle special cases -- see http://www.javascripter.net/faq/keycodes.htm */
140
+ }
@@ -0,0 +1,253 @@
1
+ //= require "webgl"
2
+ //= require "events"
3
+
4
+ /**
5
+ * class Jax.Context
6
+ * The highest level of operation in Jax. Initialization is simple:
7
+ *
8
+ * var context = new Jax.Context(canvas);
9
+ *
10
+ * where _canvas_ is a reference to an HTML5 Canvas element.
11
+ *
12
+ * If there is a root route set up, then at this point you are done.
13
+ * If not, there's an additional step:
14
+ *
15
+ * context.redirect_to("controller_name/action_name");
16
+ *
17
+ * where *controller_name* is the short name of the controller to start at,
18
+ * and *action_name* is the action to fire within that controller.
19
+ *
20
+ * Note that the specified redirect path must be registered in the route set.
21
+ *
22
+ * Jax will automatically initialize and maintain a WebGL rendering bridge,
23
+ * and WebGL methods can be called directly on this context by prefixing
24
+ * the name of the method with "gl". For example:
25
+ *
26
+ * context.glClear(GL_COLOR_BIT | GL_DEPTH_BUFFER_BIT);
27
+ *
28
+ **/
29
+ Jax.Context = (function() {
30
+ function setupContext(self) {
31
+ try { self.gl = self.canvas.getContext(WEBGL_CONTEXT_NAME, WEBGL_CONTEXT_OPTIONS); } catch(e) { }
32
+ if (!self.gl) throw new Error("WebGL could not be initialized!");
33
+ }
34
+
35
+ function startRendering(self) {
36
+ function render() {
37
+ if (self.current_view) {
38
+ reloadMatrices(self);
39
+ self.glViewport(0, 0, self.canvas.width, self.canvas.height);
40
+ self.current_view.render();
41
+ self.render_interval = requestAnimFrame(render, self.canvas);
42
+ }
43
+ else {
44
+ clearTimeout(self.render_interval);
45
+ self.render_interval = null;
46
+ }
47
+ }
48
+
49
+ self.render_interval = setTimeout(render, Jax.render_speed);
50
+ }
51
+
52
+ function stopRendering(self) {
53
+ clearTimeout(self.render_interval);
54
+ }
55
+
56
+ function startUpdating(self) {
57
+ function updateFunc() {
58
+ if (!self.lastUpdate) self.lastUpdate = new Date();
59
+ var now = new Date();
60
+ var timechange = (now - self.lastUpdate) / 1000.0;
61
+ self.lastUpdate = now;
62
+
63
+ self.update(timechange);
64
+ self.update_interval = setTimeout(updateFunc, Jax.update_speed);
65
+ }
66
+ updateFunc();
67
+ }
68
+
69
+ function stopUpdating(self) {
70
+ clearTimeout(self.update_interval);
71
+ }
72
+
73
+ function setupView(self, view) {
74
+ view.context = self;
75
+ view.world = self.world;
76
+ view.player = self.player;
77
+ for (var i in self) {
78
+ if (i.indexOf("gl") == 0) {
79
+ /* it's a WebGL method */
80
+ view[i] = eval("(function() { return this.context."+i+".apply(this.context, arguments); })");
81
+ }
82
+ }
83
+ /* TODO we should set up helpers, etc. here too */
84
+ }
85
+
86
+ function reloadMatrices(self) {
87
+ self.matrix_stack.reset(); // reset depth
88
+ self.matrix_stack.loadModelMatrix(Jax.IDENTITY_MATRIX);
89
+ self.matrix_stack.loadViewMatrix(self.player.camera.getModelViewMatrix());
90
+ self.matrix_stack.loadProjectionMatrix(self.player.camera.getProjectionMatrix());
91
+ }
92
+
93
+ var klass = Jax.Class.create({
94
+ initialize: function(canvas) {
95
+ if (typeof(canvas) == "string") canvas = document.getElementById(canvas);
96
+ if (!canvas) throw new Error("Can't initialize a WebGL context without a canvas!");
97
+ this.id = ++Jax.Context.identifier;
98
+ this.canvas = canvas;
99
+ setupContext(this);
100
+ this.setupEventListeners();
101
+ this.render_interval = null;
102
+ this.glClearColor(0.0, 0.0, 0.0, 1.0);
103
+ this.glClearDepth(1.0);
104
+ this.glEnable(GL_DEPTH_TEST);
105
+ this.glDepthFunc(GL_LEQUAL);
106
+ this.glEnable(GL_BLEND);
107
+ this.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
108
+ this.checkForRenderErrors();
109
+ this.world = new Jax.World(this);
110
+ this.player = {camera: new Jax.Camera()};
111
+ this.player.camera.perspective({width:canvas.width, height:canvas.height});
112
+ this.matrix_stack = new Jax.MatrixStack();
113
+ this.current_pass = Jax.Scene.AMBIENT_PASS;
114
+
115
+ startUpdating(this);
116
+ if (Jax.routes.isRouted("/"))
117
+ this.redirectTo("/");
118
+ },
119
+
120
+ hasStencil: function() {
121
+ return !!this.gl.stencil;
122
+ },
123
+
124
+ /**
125
+ * Jax.Context#redirectTo(path) -> Controller
126
+ * - path (String): the path to redirect to
127
+ *
128
+ * Redirects to the specified route, and then returns the Jax.Controller that
129
+ * was just redirected to. The act of redirecting will dispose of the current
130
+ * World, so be prepared to initialize a new scene.
131
+ **/
132
+ redirectTo: function(path) {
133
+ stopRendering(this);
134
+
135
+ this.world.dispose();
136
+ this.player.camera.reset();
137
+ /* yes, this is necessary. If the routing fails, controller must be null to prevent #update with a new world. */
138
+ this.current_controller = this.current_view = null;
139
+ this.current_controller = Jax.routes.dispatch(path, this);
140
+ if (!this.current_controller.view_key)
141
+ throw new Error("Controller '"+this.current_controller.getControllerName()+"' did not produce a renderable result");
142
+ this.current_view = Jax.views.find(this.current_controller.view_key);
143
+
144
+ setupView(this, this.current_view);
145
+ if (!this.isRendering()) startRendering(this);
146
+
147
+ return this.current_controller;
148
+ },
149
+
150
+ update: function(timechange) {
151
+ if (this.current_controller && this.current_controller.update)
152
+ this.current_controller.update(timechange);
153
+ this.world.update(timechange);
154
+ },
155
+
156
+ /**
157
+ * Jax.Context#isRendering() -> Boolean
158
+ * Returns true if this Jax.Context currently has a render interval set.
159
+ * This will be false by default if there is no root route; otherwise
160
+ * it will be true. It is also enabled automatically upon the first
161
+ * valid redirect.
162
+ **/
163
+ isRendering: function() {
164
+ return this.render_interval != null;
165
+ },
166
+
167
+ /**
168
+ * Jax.Context#dispose() -> undefined
169
+ *
170
+ * Permanently disposes of this context, freeing the resources it is using.
171
+ * This stops actions from running, closes any open rendering contexts, and
172
+ * clears all other timeouts and intervals.
173
+ *
174
+ * A Jax.Context cannot be used once it is disposed.
175
+ **/
176
+ dispose: function() {
177
+ this.disposed = true;
178
+ stopRendering(this);
179
+ stopUpdating(this);
180
+ },
181
+
182
+ /**
183
+ * Jax.Context#isDisposed() -> Boolean
184
+ * Returns true if this context has been disposed.
185
+ **/
186
+ isDisposed: function() {
187
+ return !!this.disposed;
188
+ },
189
+
190
+ pushMatrix: function(yield_to) {
191
+ this.matrix_stack.push();
192
+ yield_to();
193
+ this.matrix_stack.pop();
194
+ },
195
+
196
+ /**
197
+ * Jax.Context#getViewMatrix() -> mat4
198
+ * Returns the view matrix. See Jax.MatrixStack#getViewMatrix for details.
199
+ **/
200
+ getViewMatrix: function() { return this.matrix_stack.getViewMatrix(); },
201
+
202
+ /**
203
+ * Jax.Context#getInverseViewMatrix() -> mat4
204
+ * Returns the inverse view matrix. See Jax.MatrixStack#getInverseViewMatrix for details.
205
+ **/
206
+ getInverseViewMatrix: function() { return this.matrix_stack.getInverseViewMatrix(); },
207
+
208
+ /**
209
+ * Jax.Context#getFrustum() -> Jax.Scene.Frustum
210
+ * Returns the frustum for the player's camera. Equivalent to calling
211
+ *
212
+ * context.player.camera.getFrustum()
213
+ *
214
+ * Note that changes to the matrix via #multMatrix will not be represented
215
+ * in this Jax.Scene.Frustum.
216
+ **/
217
+ getFrustum: function() { return this.player.camera.frustum; },
218
+
219
+ checkForRenderErrors: function() {
220
+ /* Error checking is slow, so don't do it in production mode */
221
+ if (Jax.environment == "production") return;
222
+
223
+ var error = this.glGetError();
224
+ if (error != GL_NO_ERROR)
225
+ {
226
+ var str = "GL error in "+this.canvas.id+": "+error;
227
+ error = new Error(str);
228
+ var message = error;
229
+ if (error.stack)
230
+ {
231
+ var stack = error.stack.split("\n");
232
+ stack.shift();
233
+ message += "\n\n"+stack.join("\n");
234
+ }
235
+
236
+ throw error;
237
+ }
238
+ },
239
+
240
+ handleRenderError: function(method_name, args, err) {
241
+ throw err;
242
+ }
243
+ });
244
+
245
+ /* set up matrix stack delegation */
246
+ klass.delegate(/^(get|load|mult)(.*)Matrix$/).into("matrix_stack");
247
+
248
+ return klass;
249
+ })();
250
+
251
+ Jax.Context.identifier = 0;
252
+ Jax.Context.addMethods(GL_METHODS);
253
+ Jax.Context.addMethods(Jax.EVENT_METHODS);
@@ -0,0 +1,157 @@
1
+ /**
2
+ * class Jax.Controller
3
+ * Controllers are a major component of the Jax framework, because they are in
4
+ * charge of receiving input from the user, setting up a scene, tearing it down,
5
+ * and deciding when is the right time to transition to a different controller.
6
+ *
7
+ * Controllers need to be either registered with Jax.routes or invoked using
8
+ * Jax.Controller.invoke(). They are not intended to be instantiated directly,
9
+ * so you should avoid doing this in your code and instead rely on the route set.
10
+ *
11
+ * Methods added to controllers are called actions. You can name actions whatever
12
+ * you want, but some action names serve special purposes. They are as follows:
13
+ *
14
+ * * *index* - called when the action name is omitted from a route.
15
+ * * *destroy* - called when leaving the current controller.
16
+ * * *mouse_clicked* - called when the mouse is clicked within the canvas.
17
+ * * *mouse_entered* - called when the mouse enters the canvas.
18
+ * * *mouse_exited* - called when the mouse exits the canvas.
19
+ * * *mouse_moved* - called when the mouse is moved, unless a button is pressed.
20
+ * * *mouse_dragged* - called when the mouse is moved while a button is pressed.
21
+ * * *mouse_pressed* - called when a mouse button has been pressed.
22
+ * * *mouse_released* - called when a mouse button has been released.
23
+ * * *mouse_clicked* - called when a mouse button has been clicked.
24
+ * * *key_pressed* - called when a keyboard button has been pressed.
25
+ * * *key_released* - called when a keyboard button has been released.
26
+ * * *key_typed* - called when a keyboard button has been typed.
27
+ * * *update* - called (approximately) every 60 milliseconds for as long
28
+ * as a controller is active. Time difference in seconds is passed as an arguments.
29
+ *
30
+ * Example:
31
+ *
32
+ * var WelcomeController = Jax.Controller.Create("welcome", ApplicationController, {
33
+ * index: function() {
34
+ * // ...
35
+ * },
36
+ *
37
+ * mouse_clicked: function(event) {
38
+ * // ...
39
+ * },
40
+ *
41
+ * update: function(timechange) {
42
+ * // it's been [timechange] seconds since last update
43
+ * }
44
+ * });
45
+ *
46
+ * With the exception of event actions, which will be fired every time an event occurs,
47
+ * controller actions are only triggered once for a given controller unless they
48
+ * explicitly trigger other actions by calling them directly. They differ from their
49
+ * corresponding views (see Jax.View) in this way, as a view is rendered many times
50
+ * -- up to a target rate of 60 passes per second.
51
+ **/
52
+ (function() {
53
+ var protected_instance_method_names = [
54
+ 'initialize', 'toString', 'getControllerName', 'constructor', 'isKindOf', 'fireAction',
55
+ 'eraseResult'
56
+ ];
57
+
58
+ function is_protected(method_name) {
59
+ for (var i = 0; i < protected_instance_method_names.length; i++)
60
+ if (protected_instance_method_names[i] == method_name)
61
+ return true;
62
+ return false;
63
+ }
64
+
65
+ Jax.Controller = (function() {
66
+ function setViewKey(self) {
67
+ self.view_key = self.getControllerName()+"/"+self.action_name;
68
+ self.rendered_or_redirected = true;
69
+ }
70
+
71
+ return Jax.Class.create({
72
+ fireAction: function(action_name) {
73
+ this.eraseResult();
74
+ this.action_name = action_name;
75
+
76
+ if (this[action_name])
77
+ this[action_name].call(this, []);
78
+ else throw new Error("Call to missing action: '"+action_name+"' in controller '"+this.getControllerName()+"'");
79
+
80
+ if (!this.rendered_or_redirected)
81
+ setViewKey(this);
82
+ },
83
+
84
+ eraseResult: function() {
85
+ this.rendered_or_redirected = false;
86
+ this.view_key = null;
87
+ }
88
+ });
89
+ })();
90
+
91
+ var controller_class_methods = {
92
+ invoke: function(action_name, context) {
93
+ var instance = new this();
94
+ instance.context = context;
95
+ instance.world = context && context.world;
96
+ instance.player = context && context.player;
97
+ instance.fireAction(action_name);
98
+ return instance;
99
+ }
100
+ };
101
+
102
+ /**
103
+ * Jax.Controller.create(controllerName, methods) -> Class
104
+ * Jax.Controller.create(controllerName, superclass, methods) -> Class
105
+ * - controllerName (String): the short name of this controller
106
+ * - superclass (Class): a parent class to inherit from
107
+ * - methods (Object): a set of methods to be added to the Class
108
+ *
109
+ * The controllerName must be the short name of the controller, as represented
110
+ * in Jax.RouteSet. An example controller name for a WelcomeController would be
111
+ * "welcome".
112
+ *
113
+ * If superclass is not given, Jax.Controller is used as the superclass instead.
114
+ *
115
+ * The methods object follows the same structure as Prototype.
116
+ *
117
+ * Example:
118
+ *
119
+ * var WelcomeController = Jax.Controller.Create("welcome", ApplicationController, {
120
+ * index: function() {
121
+ * // ...
122
+ * },
123
+ *
124
+ * mouse_clicked: function(event) {
125
+ * // ...
126
+ * }
127
+ * });
128
+ **/
129
+ Jax.Controller.create = function(controller_name, superclass, inner) {
130
+ if (typeof(controller_name) != "string")
131
+ {
132
+ inner = superclass;
133
+ superclass = controller_name;
134
+ controller_name = "generic";
135
+ }
136
+
137
+ var klass;
138
+ if (inner) klass = Jax.Class.create(superclass, inner);
139
+ else klass = Jax.Class.create(Jax.Controller, superclass);
140
+
141
+ Object.extend(klass, controller_class_methods);
142
+ Object.extend(klass, { getControllerName: function() { return controller_name; } });
143
+ klass.addMethods({getControllerName: function() { return controller_name; } });
144
+
145
+ // we already know the controller name and all its actions, so may as well
146
+ // set up routing here.
147
+ for (var method_name in klass.prototype)
148
+ {
149
+ if (!is_protected(method_name)) {
150
+ // it's not a protected name, so treat it as an action
151
+ Jax.routes.map(controller_name+"/"+method_name, klass, method_name);
152
+ }
153
+ }
154
+
155
+ return klass;
156
+ };
157
+ })();