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,98 @@
1
+ /*
2
+ This file will set up WebGL constants as globals prefixed with GL_, and will add
3
+ a new global called GL_METHODS. This will later be used for method delegation
4
+ within Jax.Context.
5
+ */
6
+
7
+ //= require "vendor/glMatrix"
8
+
9
+ window['WEBGL_CONTEXT_NAME'] = "experimental-webgl";
10
+ window['WEBGL_CONTEXT_OPTIONS'] = {stencil:true};
11
+ window['GL_METHODS'] = {};
12
+
13
+ (function() {
14
+ var canvas = document.createElement("canvas");
15
+ canvas.setAttribute("id", "temporary-internal-use");
16
+ canvas.style.display = "block";
17
+
18
+ var body = document.getElementsByTagName("body")[0], temporaryBody = false;
19
+ if (!body)
20
+ {
21
+ temporaryBody = true;
22
+ body = document.createElement("body");
23
+ document.getElementsByTagName("html")[0].appendChild(body);
24
+ }
25
+ body.appendChild(canvas);
26
+
27
+ try {
28
+ var gl = canvas.getContext(WEBGL_CONTEXT_NAME);
29
+ } catch(e) {
30
+ document.location.pathname = "/webgl_not_supported.html";
31
+ throw new Error("WebGL is disabled or is not supported by this browser!");
32
+ }
33
+
34
+ if (gl) {
35
+ for (var method_name in gl)
36
+ {
37
+ if (typeof(gl[method_name]) == "function")
38
+ {
39
+ var camelized_method_name = method_name.substring(1, method_name.length);
40
+ camelized_method_name = "gl" + method_name.substring(0, 1).toUpperCase() + camelized_method_name;
41
+
42
+ /* we'll add a layer here to check for render errors, only in development mode */
43
+ var func = "(function "+camelized_method_name+"() {"
44
+ + " var result;"
45
+ + " if ("+(method_name == 'getError')+" || Jax.environment == Jax.PRODUCTION)"
46
+ + " result = this.gl."+method_name+".apply(this.gl, arguments);"
47
+ + " else {"
48
+ + " try { "
49
+ + " result = this.gl."+method_name+".apply(this.gl, arguments);"
50
+ + " this.checkForRenderErrors();"
51
+ + " } catch(e) { "
52
+ + " var args = [], i;"
53
+ + " for (i = 0; i < arguments.length; i++) args.push(arguments[i]);"
54
+ + " try { args = JSON.stringify(args); } catch(jsonErr) { args = args.toString(); }"
55
+ + " if (!e.stack) e = new Error(e.toString());"
56
+ + " alert(e+\"\\n\\n\"+e.stack);"
57
+ + " this.handleRenderError('"+method_name+"', args, e);"
58
+ + " }"
59
+ + " }"
60
+ + " return result;"
61
+ + "})";
62
+
63
+ GL_METHODS[camelized_method_name] = eval("("+func+")");
64
+ }
65
+ else
66
+ {
67
+ /* define the GL enums globally so we don't need a context to reference them */
68
+ if (!/[a-z]/.test(method_name)) // no lowercase letters
69
+ window[('GL_'+method_name)] = gl[method_name];
70
+ }
71
+ }
72
+
73
+ /* define some extra globals that the above didn't generate */
74
+ // window['GL_MAX_VERTEX_ATTRIBS'] = gl.getParameter(gl.MAX_VERTEX_ATTRIBS);
75
+ window['GL_DEPTH_COMPONENT'] = gl.DEPTH_COMPONENT || gl.DEPTH_COMPONENT16;
76
+ window['GL_TEXTURES'] = [];
77
+ for (i = 0; i < 32; i++) window['GL_TEXTURES'][i] = gl["TEXTURE"+i];
78
+ window['GL_MAX_ACTIVE_TEXTURES'] = gl.getParameter(gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS);
79
+ }
80
+
81
+ /* import other webgl files */
82
+ /*
83
+ note that because of the positioning here, all files in the webgl/ subdirectory will have access to a
84
+ private, temporary 'gl' context which will be unloaded after they have been loaded into memory.
85
+ */
86
+ //= require "webgl/shader_chain"
87
+ //= require "webgl/material"
88
+ //= require "webgl/mesh"
89
+ //= require "webgl/camera"
90
+ //= require "webgl/world"
91
+ //= require "webgl/texture"
92
+
93
+ /* clean up after ourselves */
94
+ if (temporaryBody)
95
+ body.parentNode.removeChild(body);
96
+ else
97
+ body.removeChild(canvas);
98
+ })();
@@ -0,0 +1,526 @@
1
+ //= require "core/events"
2
+ //= require "scene"
3
+
4
+ /**
5
+ * class Jax.Camera
6
+ **/
7
+ Jax.Camera = (function() {
8
+ // used in tandem with _tmp[], see below
9
+ var POSITION = 0, VIEW = 1, RIGHT = 2, UP = 3, FORWARD = 4, SIDE = 5;
10
+
11
+ /*
12
+ handles storing data in the private _vecbuf, which is used solely to prevent
13
+ unnecessary allocation of temporary vectors. Note that _vecbuf is used for many
14
+ operations and data persistence not guaranteed (read: improbable).
15
+ */
16
+ function store(self, buftype) {
17
+ if (arguments.length == 2) {
18
+ // no x,y,z given -- find it
19
+ return storeVecBuf(self, buftype);
20
+ }
21
+ var buf = self._tmp[buftype];
22
+ buf[0] = arguments[2];
23
+ buf[1] = arguments[3];
24
+ buf[2] = arguments[4];
25
+ return buf;
26
+ }
27
+
28
+ function storeVecBuf(self, buftype) {
29
+ var world = self.matrices.mv;
30
+
31
+ var position = (self._tmp[POSITION]);
32
+ var result = (self._tmp[buftype]);
33
+
34
+ // position is 0,0,0 in eye space. Convert that to world space.
35
+ position[0] = position[1] = position[2] = 0;
36
+ mat4.multiplyVec3(world, position, position);
37
+
38
+ switch(buftype) {
39
+ case POSITION:
40
+ // we already have the position
41
+ return position;
42
+ break;
43
+ case VIEW:
44
+ // relative view vector is [0,0,-1] -- convert that to world coords
45
+ result[0] = result[1] = 0; result[2] = -1;
46
+ mat4.multiplyVec3(world, result, result);
47
+ vec3.direction(result, position, result);
48
+ break;
49
+ case RIGHT:
50
+ // relative right vector is [1,0,0] -- convert that to world coords
51
+ result[0] = 1; result[1] = result[2] = 0;
52
+ mat4.multiplyVec3(world, result, result);
53
+ vec3.direction(result, position, result);
54
+ break;
55
+ case UP:
56
+ // relative up vector is [0,1,0] -- convert that to world coords
57
+ result[1] = 1; result[0] = result[2] = 0;
58
+ mat4.multiplyVec3(world, result, result);
59
+ vec3.direction(result, position, result);
60
+ break;
61
+ default:
62
+ throw new Error("Unexpected buftype: "+buftype);
63
+ }
64
+ return result;
65
+ }
66
+
67
+ function matrixUpdated(self) {
68
+ // Callback fires whenever one of the camera's matrices has changed.
69
+ // We need to use this to update other variables like normal matrix, frustum, etc,
70
+ // but we don't actually update them here because the user may be making several
71
+ // changes to the camera in sequence (and those updates would be useless).
72
+ // Instead we'll mark them as out-of-date and let their respective getters do the
73
+ // work.
74
+ // update the normal matrix
75
+ self.normal_matrix_up_to_date = false;
76
+ self.frustum_up_to_date = false;
77
+ }
78
+
79
+ return Jax.Class.create({
80
+ initialize: function() {
81
+ /**
82
+ * Jax.Camera#projection -> Object
83
+ * This property is undefined until either #ortho() or #perspective() is called. After a projection matrix
84
+ * has been initialized, this object will contain various metadata about the projection matrix, such as
85
+ * the width and height of the viewport.
86
+ *
87
+ * For orthogonal projection matrices, it contains the following information:
88
+ * width, height, depth
89
+ * left, right
90
+ * top, bottom
91
+ * near, far
92
+ *
93
+ * For perspective projection matrices, it contains the following information:
94
+ * width, height
95
+ * near, far
96
+ * fov (in degrees)
97
+ *
98
+ * Note that this information is here for reference only; modifying it will in no way modify the projection
99
+ * matrix itself. (For that, you need to make another call to #ortho() or #perspective().) Therefore,
100
+ * changing this object's properties is not recommended because doing so would no longer accurately reflect
101
+ * the parameters of the real projection matrix.
102
+ *
103
+ * Subsequent calls to #perspective() or #ortho() will cause this object to be regenerated. Because of this,
104
+ * it is not recommended to store any persistent data in this object.
105
+ **/
106
+
107
+ /* used for temporary storage, just to avoid repeatedly allocating temporary vectors */
108
+ this._tmp = [ vec3.create(), vec3.create(), vec3.create(), vec3.create(), vec3.create(), vec3.create() ];
109
+
110
+ this.matrices = { mv: mat4.identity(mat4.create()), p : mat4.identity(mat4.create()), n : mat3.create() };
111
+ this.frustum = new Jax.Scene.Frustum(this.matrices.mv, this.matrices.p);
112
+
113
+ this.addEventListener('matrixUpdated', function() { matrixUpdated(this); });
114
+ this.reset();
115
+ },
116
+
117
+ /**
118
+ * Jax.Camera#getFrustum() -> Jax.Scene.Frustum
119
+ * Returns the frustum for the camera. If the frustum is out of date, it will
120
+ * be refreshed.
121
+ **/
122
+ getFrustum: function() {
123
+ if (!this.frustum_up_to_date) this.frustum.update();
124
+ this.frustum_up_to_date = true;
125
+ return this.frustum;
126
+ },
127
+
128
+ /**
129
+ * Jax.Camera#getPosition() -> vec3
130
+ * Returns the current world space position of this camera.
131
+ **/
132
+ getPosition: function() { return vec3.create(storeVecBuf(this, POSITION)); },
133
+
134
+ /**
135
+ * Jax.Camera#getViewVector() -> vec3
136
+ * Returns the view vector relative to this camera.
137
+ **/
138
+ getViewVector: function() { return vec3.create(storeVecBuf(this, VIEW)); },
139
+
140
+ /**
141
+ * Jax.Camera#getUpVector() -> vec3
142
+ * Returns the up vector relative to this camera.
143
+ **/
144
+ getUpVector: function() { return vec3.create(storeVecBuf(this, UP)); },
145
+
146
+ /**
147
+ * Jax.Camera#getRightVector() -> vec3
148
+ * Returns the right vector relative to this camera.
149
+ **/
150
+ getRightVector:function() { return vec3.create(storeVecBuf(this, RIGHT)); },
151
+
152
+ /**
153
+ * Jax.Camera#ortho(options) -> undefined
154
+ * - options (Object): the set of parameters used to calculate the projection matrix
155
+ *
156
+ * Sets up an orthographic projection matrix. Objects will not appear to shrink as they grow
157
+ * more distant from the camera in this mode. This mode is frequently used by high-precision
158
+ * tools such as modeling programs, and is commonly found in games when rendering UIs,
159
+ * crosshairs and the like.
160
+ *
161
+ * * _top_ - the topmost coordinate visible on the scren. Defaults to 1.
162
+ * * _left_ - the leftmost coordinate visible on the screen. Defaults to -1.
163
+ * * _right_ - the rightmost coordinate visible on the screen. Defaults to 1.
164
+ * * _bottom_ - the bottommost coordinate visible on the screen. Defaults to -1.
165
+ * * _near_ - the nearest coordinate visible. Defaults to 0.01.
166
+ * * _far_ the furthest coordinate visible. Defaults to 2000.
167
+ *
168
+ **/
169
+ ortho: function(options) {
170
+ if (typeof(options.left) == "undefined") options.left = -1;
171
+ if (typeof(options.right) == "undefined") options.right = 1;
172
+ if (typeof(options.top) == "undefined") options.top = 1;
173
+ if (typeof(options.bottom) == "undefined") options.bottom = -1;
174
+ if (typeof(options.far) == "undefined") options.far = 2000;
175
+ options.near = options.near || 0.01;
176
+
177
+ mat4.ortho(options.left, options.right, options.bottom, options.top, options.near, options.far, this.matrices.p);
178
+ this.projection = {
179
+ width: options.right - options.left,
180
+ height: options.top - options.bottom,
181
+ depth: options.near - options.far,
182
+ left: options.left,
183
+ right: options.right,
184
+ near: options.near,
185
+ far: options.far,
186
+ top: options.top,
187
+ bottom: options.bottom
188
+ };
189
+ this.fireEvent('matrixUpdated');
190
+ },
191
+
192
+ /**
193
+ * Jax.Camera#setPosition(positionVector) -> undefined
194
+ * - positionVector (vec3): a vector representing the new position of the camera in world coordinates.
195
+ * Jax.Camera#setPosition(x, y, z) -> undefined
196
+ * - x (Number): the new X coordinate in world coordinates
197
+ * - y (Number): the new Y coordinate in world coordinates
198
+ * - z (Number): the new Z coordinate in world coordinates
199
+ *
200
+ * Sets the position of this camera.
201
+ **/
202
+ setPosition: function() {
203
+ var vec = vec3.create();
204
+ switch(arguments.length) {
205
+ case 1: vec3.set(arguments[0], vec); break;
206
+ case 3: vec3.set(arguments, vec); break;
207
+ default: throw new Error("Invalid arguments for Camera#setPosition");
208
+ }
209
+
210
+ this.orient(this.getViewVector(), this.getUpVector(), vec);
211
+
212
+ return this;
213
+ },
214
+
215
+ /**
216
+ * Jax.Camera#setDirection(vector) -> Jax.Camera
217
+ * - vector (vec3): the new direction that the camera will be pointing,
218
+ * in world space
219
+ **/
220
+ setDirection: function(vector) {
221
+ return this.orient(vector);
222
+ },
223
+
224
+ /**
225
+ * Jax.Camera#orient(viewVector, upVector[, positionVector]) -> Jax.Camera
226
+ * - viewVector (vec3): the new direction that the camera will be pointing
227
+ * - upVector (vec3): the new "up" direction perpendicular to the view
228
+ * - positionVector (vec3): optionally, a new position for the camera
229
+ * Jax.Camera#orient(vx, vy, vz, ux, uy, uz[, px, py, pz]) -> Jax.Camera
230
+ *
231
+ * Reorients this camera to be looking in the specified direction.
232
+ * Optionally, repositions this camera.
233
+ **/
234
+ orient: function(view, up) {
235
+ var pos;
236
+
237
+ switch(arguments.length) {
238
+ case 1:
239
+ view = store(this, VIEW, view[0], view[1], view[2]);
240
+ up = store(this, UP);
241
+ pos = store(this, POSITION);
242
+ break;
243
+ case 2:
244
+ view = store(this, VIEW, view[0], view[1], view[2]);
245
+ up = store(this, UP, up[0], up[1], up[2]);
246
+ pos = store(this, POSITION);
247
+ break;
248
+ case 3:
249
+ if (typeof(arguments[0]) == "number") {
250
+ view = store(this, VIEW, arguments[0], arguments[1], arguments[2]);
251
+ up = store(this, UP);
252
+ pos = store(this, POSITION);
253
+ } else {
254
+ view = store(this, VIEW, view[0], view[1], view[2]);
255
+ up = store(this, UP, up[0], up[1], up[2]);
256
+ pos = store(this, POSITION, arguments[2][0], arguments[2][1], arguments[2][2]);
257
+ }
258
+ break;
259
+ case 6:
260
+ view = store(this, VIEW, arguments[0], arguments[1], arguments[2]);
261
+ up = store(this, UP, arguments[3], arguments[4], arguments[5]);
262
+ pos = store(this, POSITION);
263
+ break;
264
+ case 9:
265
+ view = store(this, VIEW, arguments[0], arguments[1], arguments[2]);
266
+ up = store(this, UP, arguments[3], arguments[4], arguments[5]);
267
+ pos = store(this, POSITION, arguments[6], arguments[7], arguments[8]);
268
+ break;
269
+ default:
270
+ throw new Error("Unexpected arguments for Camera#orient");
271
+ }
272
+
273
+ vec3.add(pos,view,view);
274
+ this.lookAt(view, up, pos);
275
+ return this;
276
+ },
277
+
278
+ lookAt: function(point, up, pos) {
279
+ up = up || store(this, UP);
280
+ pos = pos || store(this, POSITION);
281
+
282
+ /*
283
+ I can't seem to get mat4.lookAt() to work as expected. I suspect that the forward vector is not
284
+ calculated properly, as it seems to reverse the operands. Dunno if this is a bug or a misunderstanding
285
+ in expectations, but either way I've decided not to use it, and adapted this code from:
286
+ GLH at http://www.opengl.org/wiki/GluLookAt_code
287
+ */
288
+ var forward = this._tmp[FORWARD], side = this._tmp[SIDE];
289
+ var matrix2 = this.matrices.mv;
290
+
291
+ vec3.subtract(point, pos, forward);
292
+
293
+ // check whether up is parallel with view. If so, we can't possibly use up so
294
+ // we must recalculate up from the current side. We don't simply throw an error
295
+ // because the user may not be at fault. (Example: this.orient([0,-1,0]) infers
296
+ // the current up, which defaults to [0,1,0].)
297
+ var dot = vec3.dot(forward, up);
298
+ if (!isNaN(dot) && Math.abs(dot) > (1 - Math.EPSILON))
299
+ vec3.cross(store(this, RIGHT), forward, up);
300
+
301
+ vec3.normalize(forward);
302
+ // side = forward x up
303
+ vec3.cross(forward, up, side);
304
+ vec3.normalize(side);
305
+ // recompute up as: up = side x forward
306
+ vec3.cross(side, forward, up);
307
+ matrix2[0] = side[0];
308
+ matrix2[4] = side[1];
309
+ matrix2[8] = side[2];
310
+ matrix2[12]= 0;
311
+ matrix2[1] = up[0];
312
+ matrix2[5] = up[1];
313
+ matrix2[9] = up[2];
314
+ matrix2[13]= 0;
315
+ matrix2[2] = -forward[0];
316
+ matrix2[6] = -forward[1];
317
+ matrix2[10]= -forward[2];
318
+ matrix2[14]= 0.0;
319
+ matrix2[3] = matrix2[7] = matrix2[11] = 0;
320
+ matrix2[15] = 1;
321
+ mat4.translate(matrix2, vec3.negate(pos));
322
+ mat4.inverse(matrix2);
323
+
324
+ this.fireEvent('matrixUpdated');
325
+ },
326
+
327
+ /**
328
+ * Jax.Camera#perspective(options) -> undefined
329
+ * - options (Object): a generic object whose properties will be used to set up the
330
+ * projection matrix.
331
+ *
332
+ * Sets up a traditional perspective view for this camera. Objects will appear to be
333
+ * smaller as they get further away from the camera.
334
+ *
335
+ * Options include:
336
+ * * _width_ - the width of the camera, in pixels. Required.
337
+ * * _height_ - the height of the camera, in pixels. Required.
338
+ * * _fov_ - the angle of the field of view, in degrees. Default: 45
339
+ * * _near_ - the distance of the near plane from the camera's actual position. Objects
340
+ * closer to the camera than this will not be seen, even if they are technically in
341
+ * front of the camera itself. Default: 0.01
342
+ * * _far_ - the distance of the far plane from the camera's actual position. Objects
343
+ * further away from the camera than this won't be seen. Default: 2000
344
+ **/
345
+ perspective: function(options) {
346
+ options = options || {};
347
+ if (!options.width) throw new Error("Expected a screen width in Jax.Camera#perspective");
348
+ if (!options.height)throw new Error("Expected a screen height in Jax.Camera#perspective");
349
+ options.fov = options.fov || 45;
350
+ options.near = options.near || 0.01;
351
+ options.far = options.far || 2000;
352
+
353
+ var aspect_ratio = options.width / options.height;
354
+ mat4.perspective(options.fov, aspect_ratio, options.near, options.far, this.matrices.p);
355
+ this.projection = {
356
+ width: options.width, height: options.height,
357
+ near: options.near, far: options.far,
358
+ fov: options.fov
359
+ };
360
+ this.fireEvent('matrixUpdated');
361
+ },
362
+
363
+ /**
364
+ * Jax.Camera#getModelViewMatrix() -> mat4
365
+ *
366
+ * Returns the ModelView matrix. This matrix represents the camera's position and
367
+ * orientation in the world.
368
+ **/
369
+ getModelViewMatrix: function() { return this.matrices.mv; },
370
+
371
+ /**
372
+ * Jax.Camera#getProjectionMatrix() -> mat4
373
+ *
374
+ * Returns the projection matrix. This matrix represents the projection of the world
375
+ * onto a screen.
376
+ **/
377
+ getProjectionMatrix: function() { return this.matrices.p; },
378
+
379
+ /**
380
+ * Jax.Camera#getNormalMatrix() -> mat4
381
+ *
382
+ * Returns the normal matrix, which is defined as the transpose of the inverse of the
383
+ * ModelView matrix.
384
+ *
385
+ * This matrix is commonly used in lighting calculations.
386
+ **/
387
+ getNormalMatrix: function() {
388
+ if (!this.normal_matrix_up_to_date) {
389
+ mat4.toInverseMat3(this.getModelViewMatrix(), this.matrices.n);
390
+ mat3.transpose(this.matrices.n);
391
+ }
392
+ this.normal_matrix_up_to_date = true;
393
+ return this.matrices.n;
394
+ },
395
+
396
+ /**
397
+ * Jax.Camera#unproject(x, y[, z]) -> [[nearx, neary, nearz], [farx, fary, farz]]
398
+ * - x (Number): X coordinate in pixels
399
+ * - y (Number): Y coordinate in pixels
400
+ *
401
+ * Calculates a line segment in world space of the given pixel location. One end of the
402
+ * line segment represents the nearest world space point to which the pixel corresponds,
403
+ * while the other end of the line segment represents the farthest visible point, depending
404
+ * on the near and far planes of the projection matrix.
405
+ *
406
+ * You can also find a point at an arbitrary distance by passing a third argument representing
407
+ * the distance, Z, to travel from the near plane towards the far plane. Z should be a number
408
+ * between 0 and 1 (so think of it as a percentage). In this form, only one set of coordinates
409
+ * is returned: the actual world space position of the specified coordinate.
410
+ *
411
+ * This function was adapted from gluUnproject(), found at
412
+ * http://www.opengl.org/wiki/GluProject_and_gluUnProject_code
413
+ **/
414
+ unproject: function(winx, winy, winz) {
415
+ // winz is either 0 (near plane), 1 (far plane) or somewhere in between.
416
+ // if it's not given a value we'll produce coords for both.
417
+ if (typeof(winz) == "number") {
418
+ winx = parseFloat(winx);
419
+ winy = parseFloat(winy);
420
+ winz = parseFloat(winz);
421
+
422
+ var inf = [];
423
+ var mm = this.matrices.mv, pm = this.matrices.p;
424
+ var viewport = [0, 0, pm.width, pm.height];
425
+
426
+ //Calculation for inverting a matrix, compute projection x modelview; then compute the inverse
427
+ var m = mat4.set(mm, mat4.create());
428
+
429
+ mat4.inverse(m, m); // WHY do I have to do this? --see Jax.Context#reloadMatrices
430
+ mat4.multiply(pm, m, m);
431
+ mat4.inverse(m, m);
432
+
433
+ // Transformation of normalized coordinates between -1 and 1
434
+ inf[0]=(winx-viewport[0])/viewport[2]*2.0-1.0;
435
+ inf[1]=(winy-viewport[1])/viewport[3]*2.0-1.0;
436
+ inf[2]=2.0*winz-1.0;
437
+ inf[3]=1.0;
438
+
439
+ //Objects coordinates
440
+ var out = vec3.create();
441
+ mat4.multiplyVec4(m, inf, out);
442
+ if(out[3]==0.0)
443
+ return null;
444
+
445
+ out[3]=1.0/out[3];
446
+ return [out[0]*out[3], out[1]*out[3], out[2]*out[3]];
447
+ }
448
+ else
449
+ return [this.unproject(winx, winy, 0), this.unproject(winx, winy, 1)];
450
+ },
451
+
452
+ /**
453
+ * Jax.Camera#rotate(amount, x, y, z) -> rotated camera
454
+ * - amount (Number): amount to rotate, in radians
455
+ * - x (Number): X coordinate of the axis around which to rotate
456
+ * - y (Number): Y coordinate of the axis around which to rotate
457
+ * - z (Number): Z coordinate of the axis around which to rotate
458
+ * Jax.Camera.rotate(amount, vector) -> rotated camera
459
+ * - amount (Number): amount to rotate, in radians
460
+ * - vector (vec3): vector form of the axis around which to rotate
461
+ *
462
+ * Rotates the camera by the specified amount around some axis.
463
+ **/
464
+ rotate: function() {
465
+ var amount = arguments[0];
466
+ var vec;
467
+ switch(arguments.length) {
468
+ case 2: vec = arguments[1]; break;
469
+ case 4: vec = this._tmp[0]; vec[0] = arguments[1]; vec[1] = arguments[2]; vec[2] = arguments[3]; break;
470
+ default: throw new Error("Invalid arguments");
471
+ }
472
+
473
+ if (vec[1] == 0 && vec[2] == 0) mat4.rotateX(this.matrices.mv, amount*vec[0], this.matrices.mv);
474
+ else if (vec[0] == 0 && vec[2] == 0) mat4.rotateY(this.matrices.mv, amount*vec[1], this.matrices.mv);
475
+ else if (vec[0] == 0 && vec[1] == 0) mat4.rotateZ(this.matrices.mv, amount*vec[2], this.matrices.mv);
476
+ else mat4.rotate (this.matrices.mv, amount, vec, this.matrices.mv);
477
+
478
+ this.fireEvent('matrixUpdated');
479
+ return this;
480
+ },
481
+
482
+ /**
483
+ * Jax.Camera#strafe(distance) -> the translated camera
484
+ * - distance (Number): the distance to move. If positive, the camera will move "right";
485
+ * if negative, the camera will move "left".
486
+ *
487
+ * Causes the camera to strafe, or move "sideways" along the right vector.
488
+ **/
489
+ strafe: function(distance) {
490
+ this._tmp[FORWARD][0] = 1;
491
+ this._tmp[FORWARD][1] = 0;
492
+ this._tmp[FORWARD][2] = 0;
493
+ this.move(distance, this._tmp[FORWARD]);
494
+ return this;
495
+ },
496
+
497
+ /**
498
+ * Jax.Camera#move(distance[, direction]) -> the translated camera
499
+ * - distance (Number): the distance to move. If positive, the camera will move "forward"
500
+ * along the direction vector; if negative, it will move "backward".
501
+ * - direction (vec3): the vector to move along. If not specified, this will default to
502
+ * the camera's view vector. That is, it will default to the direction
503
+ * the camera is pointing.
504
+ **/
505
+ move: function(distance, direction) {
506
+ if (!direction) {
507
+ direction = this._tmp[FORWARD];
508
+ direction[0] = 0;
509
+ direction[1] = 0;
510
+ direction[2] = -1;
511
+ }
512
+ mat4.translate(this.matrices.mv, vec3.scale(direction, distance), this.matrices.mv);
513
+ this.fireEvent('matrixUpdated');
514
+ return this;
515
+ },
516
+
517
+ /**
518
+ * Jax.Camera#reset() -> the reset camera
519
+ * Resets this camera by moving it back to the origin and pointing it along the negative
520
+ * Z axis with the up vector along the positive Y axis.
521
+ **/
522
+ reset: function() { this.lookAt([0,0,-1], [0,1,0], [0,0,0]); }
523
+ });
524
+ })();
525
+
526
+ Jax.Camera.addMethods(Jax.Events.Methods);