jax 0.0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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);