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,39 @@
1
+ //= require "vendor/ejs"
2
+ //= require "vendor/glMatrix"
3
+ //= require "prototype/class"
4
+ //= require "core/math"
5
+ //= require "core/util"
6
+ //= require "core/matrix_stack"
7
+
8
+ // a global debugAssert method that will do nothing in production, and fail if expr is false
9
+ // in any other run mode. If msg is given, an error with that message is raised. Otherwise,
10
+ // a more generic error is raised.
11
+ window.debugAssert = function(expr, msg) {
12
+ if (Jax.environment != "production" && !expr)
13
+ {
14
+ var error = new Error(msg || "debugAssert failed");
15
+ if (error.stack) error = new Error((msg || "debugAssert failed")+"\n\n"+error.stack);
16
+ throw error;
17
+ }
18
+ };
19
+
20
+ // If glMatrixArrayType isn't simply Array, then most browsers (FF, Chrome) have a pretty
21
+ // crappy implementation of toString() that actually tells you nothing about the array's
22
+ // contents. This makes the #toString method a little more Array-like.
23
+ //
24
+ // Ex: "[Float32Array: -100,-100,-100]"
25
+ if (glMatrixArrayType.prototype.toString != Array.prototype.toString) {
26
+ glMatrixArrayType.prototype.toString = function() {
27
+ var s = "["+glMatrixArrayType.name+": ";
28
+ var d = false;
29
+ for (var i in this) {
30
+ if (parseInt(i) == i) {
31
+ if (d) s += ",";
32
+ s += this[i];
33
+ d = true;
34
+ }
35
+ }
36
+ s += "]";
37
+ return s;
38
+ }
39
+ }
@@ -0,0 +1,40 @@
1
+ // If an epsilon isn't defined, define it. This is used for fuzzy equality with floats,
2
+ // because of floating point imprecision.
3
+ Math.EPSILON = Math.EPSILON || 0.00001;
4
+
5
+ /**
6
+ * Math
7
+ * Defines math-related helper functions.
8
+ **/
9
+
10
+ /**
11
+ * Math.radToDeg(rad) -> Number
12
+ * Helper to convert radians to degrees.
13
+ **/
14
+ Math.radToDeg = Math.radToDeg || function(rad) {
15
+ return rad * 180.0 / Math.PI;
16
+ };
17
+
18
+ /**
19
+ * Math.radToDeg(rad) -> Number
20
+ * Helper to convert degrees to radians.
21
+ **/
22
+ Math.degToRad = Math.degToRad || function(deg) {
23
+ return deg * Math.PI / 180.0;
24
+ };
25
+
26
+ /**
27
+ * Math.equalish(a, b) -> Boolean
28
+ * Arguments can be either scalar or vector, but must be of the same type.
29
+ * Returns true if the arguments are "equal enough" after accounting for floating-point
30
+ * precision loss. Returns false otherwise.
31
+ **/
32
+ Math.equalish = Math.equalish || function(a, b) {
33
+ if (!a.length && !b.length)
34
+ return Math.abs(a - b) <= Math.EPSILON;
35
+
36
+ if (a.length != b.length) return false;
37
+ for (var i = 0; i < a.length; i++)
38
+ if (Math.abs(a[i] - b[i]) > Math.EPSILON) return false;
39
+ return true;
40
+ };
@@ -0,0 +1,306 @@
1
+ //= require "../vendor/glMatrix"
2
+ //= require "../prototype/class"
3
+
4
+ /**
5
+ * Jax.IDENTITY_MATRIX
6
+ * A cache of the identity matrix so that we're not constantly allocating identities.
7
+ **/
8
+ Jax.IDENTITY_MATRIX = mat4.identity(mat4.create());
9
+
10
+ /**
11
+ * class Jax.MatrixStack
12
+ *
13
+ * A matrix stack, obviously. Every Jax.Context allocates its own matrix stack, so you probably
14
+ * shouldn't have to instantiate this directly. Calls to methods of the same name on Jax.Context
15
+ * are delegated into its own matrix stack, so you're really calling these methods.
16
+ *
17
+ * Note that for performance reasons, whenever you call get[Some]Matrix(), the matrix instance
18
+ * itself is returned instead of a copy of the instance. That gives you the power to make changes
19
+ * directly to the matrix, instead of doing them via the stack. For instance, instead of calling
20
+ * Jax.MatrixStack#loadMatrix(), you could just as easily call mat4#set() using one of the
21
+ * matrices here as an argument. However, in doing so you will lose the auto-updating of other
22
+ * matrices, so you must be very careful about how you modify matrices.
23
+ *
24
+ * For example, it would be very easy to use mat4.multiply() to change the model matrix. In doing
25
+ * so, the inverse model matrix would no longer be accurate. This could lead to very
26
+ * difficult-to-debug situations.
27
+ *
28
+ * When in doubt, it is _strongly_ recommended to use the various matrix methods found in
29
+ * Jax.MatrixStack to modify the matrices here. This will keep all related matrices up-to-date.
30
+ **/
31
+ Jax.MatrixStack = (function() {
32
+ var MODEL = 1, VIEW = 2, PROJECTION = 3;
33
+
34
+ function updateMVP(self) {
35
+ mat4.multiply(self.getProjectionMatrix(), self.getModelViewMatrix(), self.getModelViewProjectionMatrix());
36
+ }
37
+
38
+ function updateModelView(self) {
39
+ mat4.multiply(self.getInverseViewMatrix(), self.getModelMatrix(), self.getModelViewMatrix());
40
+ mat4.inverse(self.getModelViewMatrix(), self.getInverseModelViewMatrix());
41
+ updateMVP(self);
42
+ }
43
+
44
+ function updateNormal(self) {
45
+ mat4.toMat3(self.getInverseModelViewMatrix(), self.getNormalMatrix());
46
+ mat3.transpose(self.getNormalMatrix());
47
+ }
48
+
49
+ function mMatrixUpdated(self) {
50
+ mat4.inverse(self.getModelMatrix(), self.getInverseModelMatrix());
51
+ updateModelView(self);
52
+ updateNormal(self);
53
+ }
54
+
55
+ function vMatrixUpdated(self) {
56
+ mat4.inverse(self.getViewMatrix(), self.getInverseViewMatrix());
57
+ updateModelView(self);
58
+ updateNormal(self);
59
+ }
60
+
61
+ function pMatrixUpdated(self) {
62
+ mat4.inverse(self.getProjectionMatrix(), self.getInverseProjectionMatrix());
63
+ updateMVP(self);
64
+ }
65
+
66
+ function loadMatrix(self, which, values) {
67
+ switch(which) {
68
+ case MODEL:
69
+ mat4.set(values, self.getModelMatrix());
70
+ mMatrixUpdated(self);
71
+ break;
72
+ case VIEW:
73
+ mat4.set(values, self.getViewMatrix());
74
+ vMatrixUpdated(self);
75
+ break;
76
+ case PROJECTION:
77
+ mat4.set(values, self.getProjectionMatrix());
78
+ pMatrixUpdated(self);
79
+ break;
80
+ default: throw new Error("programming error: matrix ID not understood: "+which);
81
+ }
82
+ }
83
+
84
+ function multMatrix(self, which, values) {
85
+ switch(which) {
86
+ case MODEL:
87
+ mat4.multiply(self.getModelMatrix(), values, self.getModelMatrix());
88
+ mMatrixUpdated(self);
89
+ break;
90
+ case VIEW:
91
+ mat4.multiply(self.getViewMatrix(), values, self.getViewMatrix());
92
+ vMatrixUpdated(self);
93
+ break;
94
+ case PROJECTION:
95
+ mat4.multiply(self.getProjectionMatrix(), values, self.getProjectionMatrix());
96
+ pMatrixUpdated(self);
97
+ break;
98
+ default: throw new Error("programming error: matrix ID not understood: "+which);
99
+ }
100
+ }
101
+
102
+ /*
103
+ iterates through each matrix stack in self.matrices and pushes a new matrix onto the stack.
104
+ If the new matrix level already has a matrix, it is used; otherwise, a new one is allocated.
105
+ Then, the current level's matrix values are copied into the next level's matrix.
106
+ */
107
+ function pushMatrix(self) {
108
+ var current;
109
+ var stack;
110
+ var current_depth = self.depth;
111
+ var type;
112
+
113
+ self.depth++;
114
+ for (var i in self.matrices) {
115
+ stack = self.matrices[i];
116
+ current = stack[current_depth];
117
+ type = (current.length == 9 ? mat3 : mat4);
118
+ stack[self.depth] = stack[self.depth] || type.create();
119
+ type.set(current, stack[self.depth]);
120
+ }
121
+ }
122
+
123
+ return Jax.Class.create({
124
+ /**
125
+ * Jax.MatrixStack#push() -> Jax.MatrixStack
126
+ *
127
+ * Saves the state of all current matrices, so that further operations won't affect them directly.
128
+ * If another set of matrices already exist, they are used; otherwise, a new set is allocated.
129
+ * After a new set of matrices has been secured, all current values are copied into the new set.
130
+ *
131
+ * See also Jax.MatrixStack#pop()
132
+ **/
133
+ push: function() { pushMatrix(this); },
134
+
135
+ /**
136
+ * Reverts back to an earlier matrix stack, effectively undoing any changes that have been made
137
+ * since the most recent call to Jax.MatrixStack#push().
138
+ **/
139
+ pop: function() { this.depth--; },
140
+
141
+ /**
142
+ * Jax.MatrixStack#reset() -> Jax.MatrixStack
143
+ *
144
+ * Resets the stack depth to zero, effectively undoing all calls to #push().
145
+ **/
146
+ reset: function() { this.depth = 0; },
147
+
148
+ /**
149
+ * Jax.MatrixStack#loadModelMatrix(matr) -> Jax.MatrixStack
150
+ * - matr (mat4): the new matrix values
151
+ * Replaces the current model matrix with the specified one.
152
+ * Updates the inverse model matrix, the modelview matrix, the inverse modelview matrix and the normal matrix.
153
+ **/
154
+ loadModelMatrix: function(values) { loadMatrix(this, MODEL, values); return this; },
155
+
156
+ /**
157
+ * Jax.MatrixStack#loadViewMatrix(matr) -> Jax.MatrixStack
158
+ * - matr (mat4): the new matrix values
159
+ * Replaces the current view matrix with the specified one.
160
+ * Updates the inverse view matrix, the modelview matrix, the inverse modelview matrix and the normal matrix.
161
+ **/
162
+ loadViewMatrix: function(values) { loadMatrix(this, VIEW, values); return this; },
163
+
164
+ /**
165
+ * Jax.MatrixStack#loadProjectionMatrix(matr) -> Jax.MatrixStack
166
+ * - matr (mat4): the new matrix values
167
+ * Replaces the current projection matrix with the specified one.
168
+ * Updates the inverse projection matrix.
169
+ **/
170
+ loadProjectionMatrix: function(values) { loadMatrix(this, PROJECTION, values); return this; },
171
+
172
+ /**
173
+ * Jax.MatrixStack#multModelMatrix(matr) -> Jax.MatrixStack
174
+ * - matr (mat4): the matrix values
175
+ * Multiplies the current model matrix with the specified one.
176
+ * Updates the inverse model matrix, the modelview matrix, the inverse modelview matrix and the normal matrix.
177
+ **/
178
+ multModelMatrix: function(values) { multMatrix(this, MODEL, values); return this; },
179
+
180
+ /**
181
+ * Jax.MatrixStack#multViewMatrix(matr) -> Jax.MatrixStack
182
+ * - matr (mat4): the matrix values
183
+ * Multiplies the current view matrix with the specified one.
184
+ * Updates the inverse view matrix, the modelview matrix, the inverse modelview matrix and the normal matrix.
185
+ **/
186
+ multViewMatrix: function(values) { multMatrix(this, VIEW, values); return this; },
187
+
188
+ /**
189
+ * Jax.MatrixStack#multProjectionMatrix(matr) -> Jax.MatrixStack
190
+ * - matr (mat4): the matrix values
191
+ * Multiplies the current projection matrix with the specified one.
192
+ * Updates the inverse projection matrix.
193
+ **/
194
+ multProjectionMatrix: function(values) { multMatrix(this, PROJECTION, values); return this; },
195
+
196
+ /**
197
+ * Jax.MatrixStack#getModelMatrix() -> mat4
198
+ *
199
+ * the local model transformation matrix. Most models will manipulate this matrix. Multiplying an object-space
200
+ * coordinate by this matrix will result in a world-space coordinate.
201
+ **/
202
+ getModelMatrix: function() { return this.matrices.model[this.depth]; },
203
+
204
+ /**
205
+ * Jax.MatrixStack#getInverseModelMatrix() -> mat4
206
+ *
207
+ * the opposite of the local model transformation matrix. Multiplying a point in world space against this matrix
208
+ * will result in an object relative to the current object space.
209
+ **/
210
+ getInverseModelMatrix: function() { return this.matrices.inverse_model[this.depth]; },
211
+
212
+ /**
213
+ * Jax.MatrixStack#getNormalMatrix() -> mat3
214
+ *
215
+ * the inverse transpose of the modelview matrix. See
216
+ * http://www.lighthouse3d.com/tutorials/glsl-tutorial/the-normal-matrix/
217
+ * for a good writeup of where and how this matrix is useful. Multiplying a 3D _directional_ (not _positional)
218
+ * vector against this matrix will result in a 3D _directional_ vector in eye space.
219
+ **/
220
+ getNormalMatrix: function() { return this.matrices.normal[this.depth]; },
221
+
222
+ /**
223
+ * Jax.MatrixStack#getViewMatrix() -> mat4
224
+ *
225
+ * aka the camera matrix. Multiplying a point in eye space (e.g. relative to the camera) against the view matrix
226
+ * results in a point in world space.
227
+ **/
228
+ getViewMatrix: function() { return this.matrices.view[this.depth]; },
229
+
230
+ /**
231
+ * Jax.MatrixStack#getInverseViewMatrix() -> mat4
232
+ *
233
+ * the opposite of the camera matrix. Multiplying a point in world space against this matrix
234
+ * will result in a point in eye space (relative to camera).
235
+ **/
236
+ getInverseViewMatrix: function() { return this.matrices.inverse_view[this.depth]; },
237
+
238
+ /**
239
+ * Jax.MatrixStack#getModelViewMatrix() -> mat4
240
+ *
241
+ * the only matrix OpenGL actually cares about, the modelview matrix. A combination of both model and view
242
+ * matrices, equivalent to mat4.multiply(view, model). (OpenGL matrix operations are read from right-to-left.)
243
+ *
244
+ * Multiplying a point in object space by this matrix will effectively skip the world space transformation,
245
+ * resulting in a coordinate placed directly into eye space. This has the obvious advantage of being faster
246
+ * than performing the operation in two steps (model and then view).
247
+ **/
248
+ getModelViewMatrix: function() { return this.matrices.modelview[this.depth]; },
249
+
250
+ /**
251
+ * Jax.MatrixStack#getInverseModelViewMatrix() -> mat4
252
+ *
253
+ * The opposite of the modelview matrix. Multiplying an eye-space coordinate by this matrix results in an
254
+ * object-space coordinate.
255
+ **/
256
+ getInverseModelViewMatrix: function() { return this.matrices.inverse_modelview[this.depth]; },
257
+
258
+ /**
259
+ * Jax.MatrixStack#getProjectionMatrix() -> mat4
260
+ *
261
+ * aka the screen matrix. Multiplying a point in eye space against the projection matrix results in a 4D
262
+ * vector in clip space. Dividing clip coordinates (XYZ) by the 4th component (W) yields a 3D vector in
263
+ * normalized device coordinates, where all components are in the range [-1,1]. These points are ultimately
264
+ * multiplied by screen dimensions to find a pixel position.
265
+ **/
266
+ getProjectionMatrix: function() { return this.matrices.projection[this.depth]; },
267
+
268
+ /**
269
+ * Jax.MatrixStack#getModelViewProjectionMatrix() -> mat4
270
+ *
271
+ * Returns the model, view and projection matrices combined into one.
272
+ **/
273
+ getModelViewProjectionMatrix: function() { return this.matrices.modelview_projection[this.depth]; },
274
+
275
+ /**
276
+ * Jax.MatrixStack#getInverseProjectionMatrix() -> mat4
277
+ *
278
+ * the opposite of the projection matrix. Multiplying a 4D vector in normalized device coordinates by
279
+ * its 4th component will result in clip space coordinates. Multiplying these clip space coordinates by the inverse
280
+ * projection matrix will result in a point in eye space, relative to the camera.
281
+ **/
282
+ getInverseProjectionMatrix: function() { return this.matrices.inverse_projection[this.depth]; },
283
+
284
+ initialize: function() {
285
+ this.depth = 0;
286
+
287
+ this.matrices = {
288
+ /* matrix depth, essentially the array index representing the current level in the stack. */
289
+ model: [mat4.create()],
290
+ inverse_model: [mat4.create()],
291
+ normal: [mat3.create()],
292
+ view: [mat4.create()],
293
+ inverse_view: [mat4.create()],
294
+ modelview: [mat4.create()],
295
+ inverse_modelview: [mat4.create()],
296
+ projection: [mat4.create()],
297
+ inverse_projection: [mat4.create()],
298
+ modelview_projection: [mat4.create()]
299
+ };
300
+
301
+ this.loadModelMatrix(Jax.IDENTITY_MATRIX);
302
+ this.loadViewMatrix(Jax.IDENTITY_MATRIX);
303
+ this.loadProjectionMatrix(Jax.IDENTITY_MATRIX); // there's no known data about the viewport at this time.
304
+ }
305
+ });
306
+ })();
@@ -0,0 +1,226 @@
1
+ /**
2
+ * Jax.Util
3
+ * Contains general-purpose utility and helper functions
4
+ **/
5
+ Jax.Util = {
6
+ /**
7
+ * Jax.Util.vectorize(object) -> vec3
8
+ * - object (Object): any Object
9
+ *
10
+ * Analyzes the input object and returns a vec3 based on its contents. Input can be any of the following:
11
+ * * a vec3
12
+ * * an array
13
+ * * an object with {x, y, z} properties
14
+ * * an object with {0, 1, 2} properties
15
+ * * a string delimited with any combination of commas, spaces and/or tab characters. Examples:
16
+ * "x,y,z"
17
+ * "x y z"
18
+ * "x, y, z"
19
+ * "x\ty\tz"
20
+ * "x, \ty, \tz"
21
+ **/
22
+ vectorize: function(data) {
23
+ if (data) {
24
+ var res = vec3.create();
25
+ if (typeof(data) == "string") {
26
+ var components = data.split(/[,\s]+/);
27
+ if (components.length >= 3) {
28
+ for (var i = 0; i < 3; i++)
29
+ res[i] = parseFloat(components[i]);
30
+ }
31
+ return res;
32
+ }
33
+ if (data.length && data.length >= 3) return vec3.set(data, res);
34
+ if ((res[0] = data.x) != undefined && (res[1] = data.y) != undefined && (res[2] = data.z) != undefined) return res;
35
+ if ((res[0] = data[0]) != undefined && (res[1] = data[1]) != undefined && (res[2] = data[2]) != undefined) return res;
36
+ }
37
+ throw new Error("Input argument for Jax.Util.vectorize not recognized: "+JSON.stringify(data));
38
+ },
39
+
40
+ /**
41
+ * Jax.Util.colorize(object) -> vec4
42
+ * - object (Object): any Object
43
+ *
44
+ * Analyzes the input object and returns a 4-component color vector based on its contents. Input can be any of the
45
+ * following:
46
+ * * an array
47
+ * * an object with {r, g, b, a} properties
48
+ * * an object with {0, 1, 2, 3} properties
49
+ * * a string delimited with any combination of commas, spaces and/or tab characters. Examples:
50
+ * "r,g,b,a"
51
+ * "r g b a"
52
+ * "r, g, b, a"
53
+ * "r\tg\tb\ta"
54
+ * "r, \tg, \tb, \ta"
55
+ *
56
+ * In all cases, if the alpha component is omitted, it defaults to 1.0.
57
+ **/
58
+ colorize: function(data) {
59
+ if (data) {
60
+ var res = [0,0,0,0];
61
+
62
+ if (typeof(data) == "string") {
63
+ var components = data.split(/[,\s]+/);
64
+ if (components.length >= 3) {
65
+ for (var i = 0; i < 4; i++)
66
+ if (components.length <= i)
67
+ res[i] = 1.0;
68
+ else
69
+ res[i] = parseFloat(components[i]);
70
+ }
71
+ return res;
72
+ }
73
+ if (data.length && data.length >= 3) {
74
+ res[0] = data[0];
75
+ res[1] = data[1];
76
+ res[2] = data[2];
77
+ if ((res[3] = data[3]) == undefined) res[3] = 1.0;
78
+ else res[3] = 1.0;
79
+ return res;
80
+ }
81
+ if ((res[0] = data.r) != undefined && (res[1] = data.g) != undefined && (res[2] = data.b) != undefined) {
82
+ if ((res[3] = data.a) == undefined) res[3] = 1.0;
83
+ return res;
84
+ }
85
+ if ((res[0] = data.red) != undefined && (res[1] = data.green) != undefined && (res[2] = data.blue) != undefined) {
86
+ if ((res[3] = data.alpha) == undefined) res[3] = 1.0;
87
+ return res;
88
+ }
89
+ if ((res[0] = data[0]) != undefined && (res[1] = data[1]) != undefined && (res[2] = data[2]) != undefined) {
90
+ if ((res[3] = data[3]) == undefined) res[3] = 1.0;
91
+ return res;
92
+ }
93
+ }
94
+ throw new Error("Input argument for Jax.Util.colorize not recognized: "+JSON.stringify(data));
95
+ },
96
+
97
+ /**
98
+ * Jax.Util.properties(object) -> Array
99
+ * - object (Object): any Object
100
+ *
101
+ * Returns an array containing the names of all properties in the specified object.
102
+ **/
103
+ properties: function(object) {
104
+ var arr = [];
105
+ for (var i in object)
106
+ arr.push(i);
107
+ return arr;
108
+ },
109
+
110
+ /**
111
+ * Jax.Util.merge(incoming, outgoing) -> outgoing
112
+ * Merges the two objects by copying all properties from _incoming_ into _outgoing_, replacing
113
+ * any properties that already exist. _outgoing_ will retain any properties that do not exist
114
+ * in _incoming_.
115
+ **/
116
+ merge: function(src, dst) {
117
+ if (!src) return;
118
+ var i, j, n;
119
+
120
+ function doComparison(i) {
121
+ if (src[i] == null) dst[i] = null;
122
+ else if (src[i].klass) dst[i] = src[i];
123
+ else if (Object.isArray(src[i])) Jax.Util.merge(src[i], dst[i] = dst[i] || []);
124
+ else if (typeof(src[i]) == "object") {
125
+ if (Object.isArray(dst[i])) {
126
+ n = {};
127
+ for (j = 0; j < dst[i].length; j++) n[j] = dst[i][j];
128
+ dst[i] = n;
129
+ }
130
+ Jax.Util.merge(src[i], dst[i] = dst[i] || {});
131
+ }
132
+ else dst[i] = src[i];
133
+ }
134
+
135
+ if (Object.isArray(src)) for (i = 0; i < src.length; i++) doComparison(i);
136
+ else for (i in src) doComparison(i);
137
+
138
+ return dst;
139
+ },
140
+
141
+ /**
142
+ * Jax.Util.normalizeOptions(incoming, defaults) -> Object
143
+ * Receives incoming and formats it into a generic Object with a structure representing the given defaults.
144
+ * The returned object is always a brand-new object, to avoid polluting original incoming object.
145
+ * If the object contains a Jax.Class instance, that actual object is copied over. All other objects
146
+ * are cloned into brand-new objects.
147
+ **/
148
+ normalizeOptions: function(incoming, defaults) {
149
+ var result = {};
150
+ Jax.Util.merge(defaults, result);
151
+ Jax.Util.merge(incoming, result);
152
+ return result;
153
+ },
154
+
155
+ /**
156
+ * Jax.Util.sizeofFormat(glEnum) -> Number
157
+ *
158
+ * Returns the byte size of an array consisting of this type of element.
159
+ *
160
+ * Example:
161
+ *
162
+ * Jax.Util.sizeofFormat(GL_RGB)
163
+ * //=> 3
164
+ *
165
+ * If this isn't a recognized format, it is passed off to Jax.Util.enumName and an error is thrown.
166
+ **/
167
+ sizeofFormat: function(glEnum) {
168
+ switch(glEnum) {
169
+ case GL_ALPHA: return 1; // alpha component only
170
+ case GL_LUMINANCE: return 1; // luminance component only
171
+ case GL_RGB: return 3; // RGB triplet
172
+ case GL_RGBA: return 4; // all 4 components
173
+ case GL_LUMINANCE_ALPHA: return 2; // luminance/alpha pair
174
+ }
175
+ throw new Error("Unrecognized format: "+Jax.Util.enumName(glEnum));
176
+ },
177
+
178
+ /**
179
+ * Jax.Util.enumName(glEnum) -> String
180
+ * - glEnum (GLenum): a WebGL enumeration, presumably numeric.
181
+ *
182
+ * Returns the name of the enumeration prefixed with "GL_" that shares a value with the passed-in enum.
183
+ *
184
+ * If the enum can't be found (this happens sometimes when an enum crops up that isn't in the WebGL spec),
185
+ * then a string containing both the decimal and hexadecimal form of this enum is returned:
186
+ *
187
+ * "(unrecognized enum: 36059 [0x8cdb])"
188
+ *
189
+ * This is primarily for debugging and error reporting.
190
+ **/
191
+ enumName: function(glEnum) {
192
+ for (var i in window) {
193
+ if (i.indexOf("GL_") == 0 && window[i] == glEnum)
194
+ return i;
195
+ }
196
+ return "(unrecognized enum: "+glEnum+" [0x"+parseInt(glEnum).toString(16)+"])";
197
+ },
198
+
199
+ /**
200
+ * Jax.Util.addRequestedHelpers(klass) -> Array
201
+ * - klass (Jax.Class): A class into which to mix the helpers.
202
+ *
203
+ * First, if +ApplicationHelper+ is defined, it is automatically mixed into the specified class.
204
+ *
205
+ * Then, the class is searched for a #helpers method; if it exists, it is expected to return an array of
206
+ * Helpers (created with +Jax.Helper.create({...})+ ). Each element in the array returned by #helpers is
207
+ * then mixed into the class.
208
+ *
209
+ * An array of all helpers that were just mixed into the target class is returned.
210
+ **/
211
+ addRequestedHelpers: function(klass) {
212
+ var helpers = [];
213
+ if (typeof(ApplicationHelper) != "undefined") {
214
+ helpers.push(ApplicationHelper);
215
+ klass.addMethods(ApplicationHelper);
216
+ }
217
+ if (klass.prototype.helpers) {
218
+ var helper_array = klass.prototype.helpers.call(klass);
219
+ for (var i = 0; i < helper_array.length; i++) {
220
+ helpers.push(helper_array[i]);
221
+ klass.addMethods(helper_array[i]);
222
+ }
223
+ }
224
+ return helpers;
225
+ }
226
+ };