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,1815 @@
1
+ /*
2
+ * glMatrix.js - High performance matrix and vector operations for WebGL
3
+ * version 0.9.5
4
+ */
5
+
6
+ /*
7
+ * Copyright (c) 2010 Brandon Jones
8
+ *
9
+ * This software is provided 'as-is', without any express or implied
10
+ * warranty. In no event will the authors be held liable for any damages
11
+ * arising from the use of this software.
12
+ *
13
+ * Permission is granted to anyone to use this software for any purpose,
14
+ * including commercial applications, and to alter it and redistribute it
15
+ * freely, subject to the following restrictions:
16
+ *
17
+ * 1. The origin of this software must not be misrepresented; you must not
18
+ * claim that you wrote the original software. If you use this software
19
+ * in a product, an acknowledgment in the product documentation would be
20
+ * appreciated but is not required.
21
+ *
22
+ * 2. Altered source versions must be plainly marked as such, and must not
23
+ * be misrepresented as being the original software.
24
+ *
25
+ * 3. This notice may not be removed or altered from any source
26
+ * distribution.
27
+ */
28
+
29
+ // Fallback for systems that don't support WebGL
30
+ if(typeof Float32Array != 'undefined') {
31
+ glMatrixArrayType = Float32Array;
32
+ } else if(typeof WebGLFloatArray != 'undefined') {
33
+ glMatrixArrayType = WebGLFloatArray; // This is officially deprecated and should dissapear in future revisions.
34
+ } else {
35
+ glMatrixArrayType = Array;
36
+ }
37
+
38
+ /*
39
+ * vec3 - 3 Dimensional Vector
40
+ */
41
+ var vec3 = {};
42
+
43
+ /*
44
+ * vec3.create
45
+ * Creates a new instance of a vec3 using the default array type
46
+ * Any javascript array containing at least 3 numeric elements can serve as a vec3
47
+ *
48
+ * Params:
49
+ * vec - Optional, vec3 containing values to initialize with
50
+ *
51
+ * Returns:
52
+ * New vec3
53
+ */
54
+ vec3.create = function(vec) {
55
+ var dest = new glMatrixArrayType(3);
56
+
57
+ if(vec) {
58
+ dest[0] = vec[0];
59
+ dest[1] = vec[1];
60
+ dest[2] = vec[2];
61
+ }
62
+
63
+ return dest;
64
+ };
65
+
66
+ /*
67
+ * vec3.set
68
+ * Copies the values of one vec3 to another
69
+ *
70
+ * Params:
71
+ * vec - vec3 containing values to copy
72
+ * dest - vec3 receiving copied values
73
+ *
74
+ * Returns:
75
+ * dest
76
+ */
77
+ vec3.set = function(vec, dest) {
78
+ dest[0] = vec[0];
79
+ dest[1] = vec[1];
80
+ dest[2] = vec[2];
81
+
82
+ return dest;
83
+ };
84
+
85
+ /*
86
+ * vec3.add
87
+ * Performs a vector addition
88
+ *
89
+ * Params:
90
+ * vec - vec3, first operand
91
+ * vec2 - vec3, second operand
92
+ * dest - Optional, vec3 receiving operation result. If not specified result is written to vec
93
+ *
94
+ * Returns:
95
+ * dest if specified, vec otherwise
96
+ */
97
+ vec3.add = function(vec, vec2, dest) {
98
+ if(!dest || vec == dest) {
99
+ vec[0] += vec2[0];
100
+ vec[1] += vec2[1];
101
+ vec[2] += vec2[2];
102
+ return vec;
103
+ }
104
+
105
+ dest[0] = vec[0] + vec2[0];
106
+ dest[1] = vec[1] + vec2[1];
107
+ dest[2] = vec[2] + vec2[2];
108
+ return dest;
109
+ };
110
+
111
+ /*
112
+ * vec3.subtract
113
+ * Performs a vector subtraction
114
+ *
115
+ * Params:
116
+ * vec - vec3, first operand
117
+ * vec2 - vec3, second operand
118
+ * dest - Optional, vec3 receiving operation result. If not specified result is written to vec
119
+ *
120
+ * Returns:
121
+ * dest if specified, vec otherwise
122
+ */
123
+ vec3.subtract = function(vec, vec2, dest) {
124
+ if(!dest || vec == dest) {
125
+ vec[0] -= vec2[0];
126
+ vec[1] -= vec2[1];
127
+ vec[2] -= vec2[2];
128
+ return vec;
129
+ }
130
+
131
+ dest[0] = vec[0] - vec2[0];
132
+ dest[1] = vec[1] - vec2[1];
133
+ dest[2] = vec[2] - vec2[2];
134
+ return dest;
135
+ };
136
+
137
+ /*
138
+ * vec3.negate
139
+ * Negates the components of a vec3
140
+ *
141
+ * Params:
142
+ * vec - vec3 to negate
143
+ * dest - Optional, vec3 receiving operation result. If not specified result is written to vec
144
+ *
145
+ * Returns:
146
+ * dest if specified, vec otherwise
147
+ */
148
+ vec3.negate = function(vec, dest) {
149
+ if(!dest) { dest = vec; }
150
+
151
+ dest[0] = -vec[0];
152
+ dest[1] = -vec[1];
153
+ dest[2] = -vec[2];
154
+ return dest;
155
+ };
156
+
157
+ /*
158
+ * vec3.scale
159
+ * Multiplies the components of a vec3 by a scalar value
160
+ *
161
+ * Params:
162
+ * vec - vec3 to scale
163
+ * val - Numeric value to scale by
164
+ * dest - Optional, vec3 receiving operation result. If not specified result is written to vec
165
+ *
166
+ * Returns:
167
+ * dest if specified, vec otherwise
168
+ */
169
+ vec3.scale = function(vec, val, dest) {
170
+ if(!dest || vec == dest) {
171
+ vec[0] *= val;
172
+ vec[1] *= val;
173
+ vec[2] *= val;
174
+ return vec;
175
+ }
176
+
177
+ dest[0] = vec[0]*val;
178
+ dest[1] = vec[1]*val;
179
+ dest[2] = vec[2]*val;
180
+ return dest;
181
+ };
182
+
183
+ /*
184
+ * vec3.normalize
185
+ * Generates a unit vector of the same direction as the provided vec3
186
+ * If vector length is 0, returns [0, 0, 0]
187
+ *
188
+ * Params:
189
+ * vec - vec3 to normalize
190
+ * dest - Optional, vec3 receiving operation result. If not specified result is written to vec
191
+ *
192
+ * Returns:
193
+ * dest if specified, vec otherwise
194
+ */
195
+ vec3.normalize = function(vec, dest) {
196
+ if(!dest) { dest = vec; }
197
+
198
+ var x = vec[0], y = vec[1], z = vec[2];
199
+ var len = Math.sqrt(x*x + y*y + z*z);
200
+
201
+ if (!len) {
202
+ dest[0] = 0;
203
+ dest[1] = 0;
204
+ dest[2] = 0;
205
+ return dest;
206
+ } else if (len == 1) {
207
+ dest[0] = x;
208
+ dest[1] = y;
209
+ dest[2] = z;
210
+ return dest;
211
+ }
212
+
213
+ len = 1 / len;
214
+ dest[0] = x*len;
215
+ dest[1] = y*len;
216
+ dest[2] = z*len;
217
+ return dest;
218
+ };
219
+
220
+ /*
221
+ * vec3.cross
222
+ * Generates the cross product of two vec3s
223
+ *
224
+ * Params:
225
+ * vec - vec3, first operand
226
+ * vec2 - vec3, second operand
227
+ * dest - Optional, vec3 receiving operation result. If not specified result is written to vec
228
+ *
229
+ * Returns:
230
+ * dest if specified, vec otherwise
231
+ */
232
+ vec3.cross = function(vec, vec2, dest){
233
+ if(!dest) { dest = vec; }
234
+
235
+ var x = vec[0], y = vec[1], z = vec[2];
236
+ var x2 = vec2[0], y2 = vec2[1], z2 = vec2[2];
237
+
238
+ dest[0] = y*z2 - z*y2;
239
+ dest[1] = z*x2 - x*z2;
240
+ dest[2] = x*y2 - y*x2;
241
+ return dest;
242
+ };
243
+
244
+ /*
245
+ * vec3.length
246
+ * Caclulates the length of a vec3
247
+ *
248
+ * Params:
249
+ * vec - vec3 to calculate length of
250
+ *
251
+ * Returns:
252
+ * Length of vec
253
+ */
254
+ vec3.length = function(vec){
255
+ var x = vec[0], y = vec[1], z = vec[2];
256
+ return Math.sqrt(x*x + y*y + z*z);
257
+ };
258
+
259
+ /*
260
+ * vec3.dot
261
+ * Caclulates the dot product of two vec3s
262
+ *
263
+ * Params:
264
+ * vec - vec3, first operand
265
+ * vec2 - vec3, second operand
266
+ *
267
+ * Returns:
268
+ * Dot product of vec and vec2
269
+ */
270
+ vec3.dot = function(vec, vec2){
271
+ return vec[0]*vec2[0] + vec[1]*vec2[1] + vec[2]*vec2[2];
272
+ };
273
+
274
+ /*
275
+ * vec3.direction
276
+ * Generates a unit vector pointing from one vector to another
277
+ *
278
+ * Params:
279
+ * vec - origin vec3
280
+ * vec2 - vec3 to point to
281
+ * dest - Optional, vec3 receiving operation result. If not specified result is written to vec
282
+ *
283
+ * Returns:
284
+ * dest if specified, vec otherwise
285
+ */
286
+ vec3.direction = function(vec, vec2, dest) {
287
+ if(!dest) { dest = vec; }
288
+
289
+ var x = vec[0] - vec2[0];
290
+ var y = vec[1] - vec2[1];
291
+ var z = vec[2] - vec2[2];
292
+
293
+ var len = Math.sqrt(x*x + y*y + z*z);
294
+ if (!len) {
295
+ dest[0] = 0;
296
+ dest[1] = 0;
297
+ dest[2] = 0;
298
+ return dest;
299
+ }
300
+
301
+ len = 1 / len;
302
+ dest[0] = x * len;
303
+ dest[1] = y * len;
304
+ dest[2] = z * len;
305
+ return dest;
306
+ };
307
+
308
+ /*
309
+ * vec3.lerp
310
+ * Performs a linear interpolation between two vec3
311
+ *
312
+ * Params:
313
+ * vec - vec3, first vector
314
+ * vec2 - vec3, second vector
315
+ * lerp - interpolation amount between the two inputs
316
+ * dest - Optional, vec3 receiving operation result. If not specified result is written to vec
317
+ *
318
+ * Returns:
319
+ * dest if specified, vec otherwise
320
+ */
321
+ vec3.lerp = function(vec, vec2, lerp, dest){
322
+ if(!dest) { dest = vec; }
323
+
324
+ dest[0] = vec[0] + lerp * (vec2[0] - vec[0]);
325
+ dest[1] = vec[1] + lerp * (vec2[1] - vec[1]);
326
+ dest[2] = vec[2] + lerp * (vec2[2] - vec[2]);
327
+
328
+ return dest;
329
+ }
330
+
331
+ /*
332
+ * vec3.str
333
+ * Returns a string representation of a vector
334
+ *
335
+ * Params:
336
+ * vec - vec3 to represent as a string
337
+ *
338
+ * Returns:
339
+ * string representation of vec
340
+ */
341
+ vec3.str = function(vec) {
342
+ return '[' + vec[0] + ', ' + vec[1] + ', ' + vec[2] + ']';
343
+ };
344
+
345
+ /*
346
+ * mat3 - 3x3 Matrix
347
+ */
348
+ var mat3 = {};
349
+
350
+ /*
351
+ * mat3.create
352
+ * Creates a new instance of a mat3 using the default array type
353
+ * Any javascript array containing at least 9 numeric elements can serve as a mat3
354
+ *
355
+ * Params:
356
+ * mat - Optional, mat3 containing values to initialize with
357
+ *
358
+ * Returns:
359
+ * New mat3
360
+ */
361
+ mat3.create = function(mat) {
362
+ var dest = new glMatrixArrayType(9);
363
+
364
+ if(mat) {
365
+ dest[0] = mat[0];
366
+ dest[1] = mat[1];
367
+ dest[2] = mat[2];
368
+ dest[3] = mat[3];
369
+ dest[4] = mat[4];
370
+ dest[5] = mat[5];
371
+ dest[6] = mat[6];
372
+ dest[7] = mat[7];
373
+ dest[8] = mat[8];
374
+ dest[9] = mat[9];
375
+ }
376
+
377
+ return dest;
378
+ };
379
+
380
+ /*
381
+ * mat3.set
382
+ * Copies the values of one mat3 to another
383
+ *
384
+ * Params:
385
+ * mat - mat3 containing values to copy
386
+ * dest - mat3 receiving copied values
387
+ *
388
+ * Returns:
389
+ * dest
390
+ */
391
+ mat3.set = function(mat, dest) {
392
+ dest[0] = mat[0];
393
+ dest[1] = mat[1];
394
+ dest[2] = mat[2];
395
+ dest[3] = mat[3];
396
+ dest[4] = mat[4];
397
+ dest[5] = mat[5];
398
+ dest[6] = mat[6];
399
+ dest[7] = mat[7];
400
+ dest[8] = mat[8];
401
+ return dest;
402
+ };
403
+
404
+ /*
405
+ * mat3.identity
406
+ * Sets a mat3 to an identity matrix
407
+ *
408
+ * Params:
409
+ * dest - mat3 to set
410
+ *
411
+ * Returns:
412
+ * dest
413
+ */
414
+ mat3.identity = function(dest) {
415
+ dest[0] = 1;
416
+ dest[1] = 0;
417
+ dest[2] = 0;
418
+ dest[3] = 0;
419
+ dest[4] = 1;
420
+ dest[5] = 0;
421
+ dest[6] = 0;
422
+ dest[7] = 0;
423
+ dest[8] = 1;
424
+ return dest;
425
+ };
426
+
427
+ /*
428
+ * mat4.transpose
429
+ * Transposes a mat3 (flips the values over the diagonal)
430
+ *
431
+ * Params:
432
+ * mat - mat3 to transpose
433
+ * dest - Optional, mat3 receiving transposed values. If not specified result is written to mat
434
+ *
435
+ * Returns:
436
+ * dest is specified, mat otherwise
437
+ */
438
+ mat3.transpose = function(mat, dest) {
439
+ // If we are transposing ourselves we can skip a few steps but have to cache some values
440
+ if(!dest || mat == dest) {
441
+ var a01 = mat[1], a02 = mat[2];
442
+ var a12 = mat[5];
443
+
444
+ mat[1] = mat[3];
445
+ mat[2] = mat[6];
446
+ mat[3] = a01;
447
+ mat[5] = mat[7];
448
+ mat[6] = a02;
449
+ mat[7] = a12;
450
+ return mat;
451
+ }
452
+
453
+ dest[0] = mat[0];
454
+ dest[1] = mat[3];
455
+ dest[2] = mat[6];
456
+ dest[3] = mat[1];
457
+ dest[4] = mat[4];
458
+ dest[5] = mat[7];
459
+ dest[6] = mat[2];
460
+ dest[7] = mat[5];
461
+ dest[8] = mat[8];
462
+ return dest;
463
+ };
464
+
465
+ /*
466
+ * mat3.toMat4
467
+ * Copies the elements of a mat3 into the upper 3x3 elements of a mat4
468
+ *
469
+ * Params:
470
+ * mat - mat3 containing values to copy
471
+ * dest - Optional, mat4 receiving copied values
472
+ *
473
+ * Returns:
474
+ * dest if specified, a new mat4 otherwise
475
+ */
476
+ mat3.toMat4 = function(mat, dest) {
477
+ if(!dest) { dest = mat4.create(); }
478
+
479
+ dest[0] = mat[0];
480
+ dest[1] = mat[1];
481
+ dest[2] = mat[2];
482
+ dest[3] = 0;
483
+
484
+ dest[4] = mat[3];
485
+ dest[5] = mat[4];
486
+ dest[6] = mat[5];
487
+ dest[7] = 0;
488
+
489
+ dest[8] = mat[6];
490
+ dest[9] = mat[7];
491
+ dest[10] = mat[8];
492
+ dest[11] = 0;
493
+
494
+ dest[12] = 0;
495
+ dest[13] = 0;
496
+ dest[14] = 0;
497
+ dest[15] = 1;
498
+
499
+ return dest;
500
+ }
501
+
502
+ /*
503
+ * mat3.str
504
+ * Returns a string representation of a mat3
505
+ *
506
+ * Params:
507
+ * mat - mat3 to represent as a string
508
+ *
509
+ * Returns:
510
+ * string representation of mat
511
+ */
512
+ mat3.str = function(mat) {
513
+ return '[' + mat[0] + ', ' + mat[1] + ', ' + mat[2] +
514
+ ', ' + mat[3] + ', '+ mat[4] + ', ' + mat[5] +
515
+ ', ' + mat[6] + ', ' + mat[7] + ', '+ mat[8] + ']';
516
+ };
517
+
518
+ /*
519
+ * mat4 - 4x4 Matrix
520
+ */
521
+ var mat4 = {};
522
+
523
+ /*
524
+ * mat4.create
525
+ * Creates a new instance of a mat4 using the default array type
526
+ * Any javascript array containing at least 16 numeric elements can serve as a mat4
527
+ *
528
+ * Params:
529
+ * mat - Optional, mat4 containing values to initialize with
530
+ *
531
+ * Returns:
532
+ * New mat4
533
+ */
534
+ mat4.create = function(mat) {
535
+ var dest = new glMatrixArrayType(16);
536
+
537
+ if(mat) {
538
+ dest[0] = mat[0];
539
+ dest[1] = mat[1];
540
+ dest[2] = mat[2];
541
+ dest[3] = mat[3];
542
+ dest[4] = mat[4];
543
+ dest[5] = mat[5];
544
+ dest[6] = mat[6];
545
+ dest[7] = mat[7];
546
+ dest[8] = mat[8];
547
+ dest[9] = mat[9];
548
+ dest[10] = mat[10];
549
+ dest[11] = mat[11];
550
+ dest[12] = mat[12];
551
+ dest[13] = mat[13];
552
+ dest[14] = mat[14];
553
+ dest[15] = mat[15];
554
+ }
555
+
556
+ return dest;
557
+ };
558
+
559
+ /*
560
+ * mat4.set
561
+ * Copies the values of one mat4 to another
562
+ *
563
+ * Params:
564
+ * mat - mat4 containing values to copy
565
+ * dest - mat4 receiving copied values
566
+ *
567
+ * Returns:
568
+ * dest
569
+ */
570
+ mat4.set = function(mat, dest) {
571
+ dest[0] = mat[0];
572
+ dest[1] = mat[1];
573
+ dest[2] = mat[2];
574
+ dest[3] = mat[3];
575
+ dest[4] = mat[4];
576
+ dest[5] = mat[5];
577
+ dest[6] = mat[6];
578
+ dest[7] = mat[7];
579
+ dest[8] = mat[8];
580
+ dest[9] = mat[9];
581
+ dest[10] = mat[10];
582
+ dest[11] = mat[11];
583
+ dest[12] = mat[12];
584
+ dest[13] = mat[13];
585
+ dest[14] = mat[14];
586
+ dest[15] = mat[15];
587
+ return dest;
588
+ };
589
+
590
+ /*
591
+ * mat4.identity
592
+ * Sets a mat4 to an identity matrix
593
+ *
594
+ * Params:
595
+ * dest - mat4 to set
596
+ *
597
+ * Returns:
598
+ * dest
599
+ */
600
+ mat4.identity = function(dest) {
601
+ dest[0] = 1;
602
+ dest[1] = 0;
603
+ dest[2] = 0;
604
+ dest[3] = 0;
605
+ dest[4] = 0;
606
+ dest[5] = 1;
607
+ dest[6] = 0;
608
+ dest[7] = 0;
609
+ dest[8] = 0;
610
+ dest[9] = 0;
611
+ dest[10] = 1;
612
+ dest[11] = 0;
613
+ dest[12] = 0;
614
+ dest[13] = 0;
615
+ dest[14] = 0;
616
+ dest[15] = 1;
617
+ return dest;
618
+ };
619
+
620
+ /*
621
+ * mat4.transpose
622
+ * Transposes a mat4 (flips the values over the diagonal)
623
+ *
624
+ * Params:
625
+ * mat - mat4 to transpose
626
+ * dest - Optional, mat4 receiving transposed values. If not specified result is written to mat
627
+ *
628
+ * Returns:
629
+ * dest is specified, mat otherwise
630
+ */
631
+ mat4.transpose = function(mat, dest) {
632
+ // If we are transposing ourselves we can skip a few steps but have to cache some values
633
+ if(!dest || mat == dest) {
634
+ var a01 = mat[1], a02 = mat[2], a03 = mat[3];
635
+ var a12 = mat[6], a13 = mat[7];
636
+ var a23 = mat[11];
637
+
638
+ mat[1] = mat[4];
639
+ mat[2] = mat[8];
640
+ mat[3] = mat[12];
641
+ mat[4] = a01;
642
+ mat[6] = mat[9];
643
+ mat[7] = mat[13];
644
+ mat[8] = a02;
645
+ mat[9] = a12;
646
+ mat[11] = mat[14];
647
+ mat[12] = a03;
648
+ mat[13] = a13;
649
+ mat[14] = a23;
650
+ return mat;
651
+ }
652
+
653
+ dest[0] = mat[0];
654
+ dest[1] = mat[4];
655
+ dest[2] = mat[8];
656
+ dest[3] = mat[12];
657
+ dest[4] = mat[1];
658
+ dest[5] = mat[5];
659
+ dest[6] = mat[9];
660
+ dest[7] = mat[13];
661
+ dest[8] = mat[2];
662
+ dest[9] = mat[6];
663
+ dest[10] = mat[10];
664
+ dest[11] = mat[14];
665
+ dest[12] = mat[3];
666
+ dest[13] = mat[7];
667
+ dest[14] = mat[11];
668
+ dest[15] = mat[15];
669
+ return dest;
670
+ };
671
+
672
+ /*
673
+ * mat4.determinant
674
+ * Calculates the determinant of a mat4
675
+ *
676
+ * Params:
677
+ * mat - mat4 to calculate determinant of
678
+ *
679
+ * Returns:
680
+ * determinant of mat
681
+ */
682
+ mat4.determinant = function(mat) {
683
+ // Cache the matrix values (makes for huge speed increases!)
684
+ var a00 = mat[0], a01 = mat[1], a02 = mat[2], a03 = mat[3];
685
+ var a10 = mat[4], a11 = mat[5], a12 = mat[6], a13 = mat[7];
686
+ var a20 = mat[8], a21 = mat[9], a22 = mat[10], a23 = mat[11];
687
+ var a30 = mat[12], a31 = mat[13], a32 = mat[14], a33 = mat[15];
688
+
689
+ return a30*a21*a12*a03 - a20*a31*a12*a03 - a30*a11*a22*a03 + a10*a31*a22*a03 +
690
+ a20*a11*a32*a03 - a10*a21*a32*a03 - a30*a21*a02*a13 + a20*a31*a02*a13 +
691
+ a30*a01*a22*a13 - a00*a31*a22*a13 - a20*a01*a32*a13 + a00*a21*a32*a13 +
692
+ a30*a11*a02*a23 - a10*a31*a02*a23 - a30*a01*a12*a23 + a00*a31*a12*a23 +
693
+ a10*a01*a32*a23 - a00*a11*a32*a23 - a20*a11*a02*a33 + a10*a21*a02*a33 +
694
+ a20*a01*a12*a33 - a00*a21*a12*a33 - a10*a01*a22*a33 + a00*a11*a22*a33;
695
+ };
696
+
697
+ /*
698
+ * mat4.inverse
699
+ * Calculates the inverse matrix of a mat4
700
+ *
701
+ * Params:
702
+ * mat - mat4 to calculate inverse of
703
+ * dest - Optional, mat4 receiving inverse matrix. If not specified result is written to mat
704
+ *
705
+ * Returns:
706
+ * dest is specified, mat otherwise
707
+ */
708
+ mat4.inverse = function(mat, dest) {
709
+ if(!dest) { dest = mat; }
710
+
711
+ // Cache the matrix values (makes for huge speed increases!)
712
+ var a00 = mat[0], a01 = mat[1], a02 = mat[2], a03 = mat[3];
713
+ var a10 = mat[4], a11 = mat[5], a12 = mat[6], a13 = mat[7];
714
+ var a20 = mat[8], a21 = mat[9], a22 = mat[10], a23 = mat[11];
715
+ var a30 = mat[12], a31 = mat[13], a32 = mat[14], a33 = mat[15];
716
+
717
+ var b00 = a00*a11 - a01*a10;
718
+ var b01 = a00*a12 - a02*a10;
719
+ var b02 = a00*a13 - a03*a10;
720
+ var b03 = a01*a12 - a02*a11;
721
+ var b04 = a01*a13 - a03*a11;
722
+ var b05 = a02*a13 - a03*a12;
723
+ var b06 = a20*a31 - a21*a30;
724
+ var b07 = a20*a32 - a22*a30;
725
+ var b08 = a20*a33 - a23*a30;
726
+ var b09 = a21*a32 - a22*a31;
727
+ var b10 = a21*a33 - a23*a31;
728
+ var b11 = a22*a33 - a23*a32;
729
+
730
+ // Calculate the determinant (inlined to avoid double-caching)
731
+ var invDet = 1/(b00*b11 - b01*b10 + b02*b09 + b03*b08 - b04*b07 + b05*b06);
732
+
733
+ dest[0] = (a11*b11 - a12*b10 + a13*b09)*invDet;
734
+ dest[1] = (-a01*b11 + a02*b10 - a03*b09)*invDet;
735
+ dest[2] = (a31*b05 - a32*b04 + a33*b03)*invDet;
736
+ dest[3] = (-a21*b05 + a22*b04 - a23*b03)*invDet;
737
+ dest[4] = (-a10*b11 + a12*b08 - a13*b07)*invDet;
738
+ dest[5] = (a00*b11 - a02*b08 + a03*b07)*invDet;
739
+ dest[6] = (-a30*b05 + a32*b02 - a33*b01)*invDet;
740
+ dest[7] = (a20*b05 - a22*b02 + a23*b01)*invDet;
741
+ dest[8] = (a10*b10 - a11*b08 + a13*b06)*invDet;
742
+ dest[9] = (-a00*b10 + a01*b08 - a03*b06)*invDet;
743
+ dest[10] = (a30*b04 - a31*b02 + a33*b00)*invDet;
744
+ dest[11] = (-a20*b04 + a21*b02 - a23*b00)*invDet;
745
+ dest[12] = (-a10*b09 + a11*b07 - a12*b06)*invDet;
746
+ dest[13] = (a00*b09 - a01*b07 + a02*b06)*invDet;
747
+ dest[14] = (-a30*b03 + a31*b01 - a32*b00)*invDet;
748
+ dest[15] = (a20*b03 - a21*b01 + a22*b00)*invDet;
749
+
750
+ return dest;
751
+ };
752
+
753
+ /*
754
+ * mat4.toRotationMat
755
+ * Copies the upper 3x3 elements of a mat4 into another mat4
756
+ *
757
+ * Params:
758
+ * mat - mat4 containing values to copy
759
+ * dest - Optional, mat4 receiving copied values
760
+ *
761
+ * Returns:
762
+ * dest is specified, a new mat4 otherwise
763
+ */
764
+ mat4.toRotationMat = function(mat, dest) {
765
+ if(!dest) { dest = mat4.create(); }
766
+
767
+ dest[0] = mat[0];
768
+ dest[1] = mat[1];
769
+ dest[2] = mat[2];
770
+ dest[3] = mat[3];
771
+ dest[4] = mat[4];
772
+ dest[5] = mat[5];
773
+ dest[6] = mat[6];
774
+ dest[7] = mat[7];
775
+ dest[8] = mat[8];
776
+ dest[9] = mat[9];
777
+ dest[10] = mat[10];
778
+ dest[11] = mat[11];
779
+ dest[12] = 0;
780
+ dest[13] = 0;
781
+ dest[14] = 0;
782
+ dest[15] = 1;
783
+
784
+ return dest;
785
+ };
786
+
787
+ /*
788
+ * mat4.toMat3
789
+ * Copies the upper 3x3 elements of a mat4 into a mat3
790
+ *
791
+ * Params:
792
+ * mat - mat4 containing values to copy
793
+ * dest - Optional, mat3 receiving copied values
794
+ *
795
+ * Returns:
796
+ * dest is specified, a new mat3 otherwise
797
+ */
798
+ mat4.toMat3 = function(mat, dest) {
799
+ if(!dest) { dest = mat3.create(); }
800
+
801
+ dest[0] = mat[0];
802
+ dest[1] = mat[1];
803
+ dest[2] = mat[2];
804
+ dest[3] = mat[4];
805
+ dest[4] = mat[5];
806
+ dest[5] = mat[6];
807
+ dest[6] = mat[8];
808
+ dest[7] = mat[9];
809
+ dest[8] = mat[10];
810
+
811
+ return dest;
812
+ };
813
+
814
+ /*
815
+ * mat4.toInverseMat3
816
+ * Calculates the inverse of the upper 3x3 elements of a mat4 and copies the result into a mat3
817
+ * The resulting matrix is useful for calculating transformed normals
818
+ *
819
+ * Params:
820
+ * mat - mat4 containing values to invert and copy
821
+ * dest - Optional, mat3 receiving values
822
+ *
823
+ * Returns:
824
+ * dest is specified, a new mat3 otherwise
825
+ */
826
+ mat4.toInverseMat3 = function(mat, dest) {
827
+ // Cache the matrix values (makes for huge speed increases!)
828
+ var a00 = mat[0], a01 = mat[1], a02 = mat[2];
829
+ var a10 = mat[4], a11 = mat[5], a12 = mat[6];
830
+ var a20 = mat[8], a21 = mat[9], a22 = mat[10];
831
+
832
+ var b01 = a22*a11-a12*a21;
833
+ var b11 = -a22*a10+a12*a20;
834
+ var b21 = a21*a10-a11*a20;
835
+
836
+ var d = a00*b01 + a01*b11 + a02*b21;
837
+ if (!d) { return null; }
838
+ var id = 1/d;
839
+
840
+ if(!dest) { dest = mat3.create(); }
841
+
842
+ dest[0] = b01*id;
843
+ dest[1] = (-a22*a01 + a02*a21)*id;
844
+ dest[2] = (a12*a01 - a02*a11)*id;
845
+ dest[3] = b11*id;
846
+ dest[4] = (a22*a00 - a02*a20)*id;
847
+ dest[5] = (-a12*a00 + a02*a10)*id;
848
+ dest[6] = b21*id;
849
+ dest[7] = (-a21*a00 + a01*a20)*id;
850
+ dest[8] = (a11*a00 - a01*a10)*id;
851
+
852
+ return dest;
853
+ };
854
+
855
+ /*
856
+ * mat4.multiply
857
+ * Performs a matrix multiplication
858
+ *
859
+ * Params:
860
+ * mat - mat4, first operand
861
+ * mat2 - mat4, second operand
862
+ * dest - Optional, mat4 receiving operation result. If not specified result is written to mat
863
+ *
864
+ * Returns:
865
+ * dest if specified, mat otherwise
866
+ */
867
+ mat4.multiply = function(mat, mat2, dest) {
868
+ if(!dest) { dest = mat }
869
+
870
+ // Cache the matrix values (makes for huge speed increases!)
871
+ var a00 = mat[0], a01 = mat[1], a02 = mat[2], a03 = mat[3];
872
+ var a10 = mat[4], a11 = mat[5], a12 = mat[6], a13 = mat[7];
873
+ var a20 = mat[8], a21 = mat[9], a22 = mat[10], a23 = mat[11];
874
+ var a30 = mat[12], a31 = mat[13], a32 = mat[14], a33 = mat[15];
875
+
876
+ var b00 = mat2[0], b01 = mat2[1], b02 = mat2[2], b03 = mat2[3];
877
+ var b10 = mat2[4], b11 = mat2[5], b12 = mat2[6], b13 = mat2[7];
878
+ var b20 = mat2[8], b21 = mat2[9], b22 = mat2[10], b23 = mat2[11];
879
+ var b30 = mat2[12], b31 = mat2[13], b32 = mat2[14], b33 = mat2[15];
880
+
881
+ dest[0] = b00*a00 + b01*a10 + b02*a20 + b03*a30;
882
+ dest[1] = b00*a01 + b01*a11 + b02*a21 + b03*a31;
883
+ dest[2] = b00*a02 + b01*a12 + b02*a22 + b03*a32;
884
+ dest[3] = b00*a03 + b01*a13 + b02*a23 + b03*a33;
885
+ dest[4] = b10*a00 + b11*a10 + b12*a20 + b13*a30;
886
+ dest[5] = b10*a01 + b11*a11 + b12*a21 + b13*a31;
887
+ dest[6] = b10*a02 + b11*a12 + b12*a22 + b13*a32;
888
+ dest[7] = b10*a03 + b11*a13 + b12*a23 + b13*a33;
889
+ dest[8] = b20*a00 + b21*a10 + b22*a20 + b23*a30;
890
+ dest[9] = b20*a01 + b21*a11 + b22*a21 + b23*a31;
891
+ dest[10] = b20*a02 + b21*a12 + b22*a22 + b23*a32;
892
+ dest[11] = b20*a03 + b21*a13 + b22*a23 + b23*a33;
893
+ dest[12] = b30*a00 + b31*a10 + b32*a20 + b33*a30;
894
+ dest[13] = b30*a01 + b31*a11 + b32*a21 + b33*a31;
895
+ dest[14] = b30*a02 + b31*a12 + b32*a22 + b33*a32;
896
+ dest[15] = b30*a03 + b31*a13 + b32*a23 + b33*a33;
897
+
898
+ return dest;
899
+ };
900
+
901
+ /*
902
+ * mat4.multiplyVec3
903
+ * Transforms a vec3 with the given matrix
904
+ * 4th vector component is implicitly '1'
905
+ *
906
+ * Params:
907
+ * mat - mat4 to transform the vector with
908
+ * vec - vec3 to transform
909
+ * dest - Optional, vec3 receiving operation result. If not specified result is written to vec
910
+ *
911
+ * Returns:
912
+ * dest if specified, vec otherwise
913
+ */
914
+ mat4.multiplyVec3 = function(mat, vec, dest) {
915
+ if(!dest) { dest = vec }
916
+
917
+ var x = vec[0], y = vec[1], z = vec[2];
918
+
919
+ dest[0] = mat[0]*x + mat[4]*y + mat[8]*z + mat[12];
920
+ dest[1] = mat[1]*x + mat[5]*y + mat[9]*z + mat[13];
921
+ dest[2] = mat[2]*x + mat[6]*y + mat[10]*z + mat[14];
922
+
923
+ return dest;
924
+ };
925
+
926
+ /*
927
+ * mat4.multiplyVec4
928
+ * Transforms a vec4 with the given matrix
929
+ *
930
+ * Params:
931
+ * mat - mat4 to transform the vector with
932
+ * vec - vec4 to transform
933
+ * dest - Optional, vec4 receiving operation result. If not specified result is written to vec
934
+ *
935
+ * Returns:
936
+ * dest if specified, vec otherwise
937
+ */
938
+ mat4.multiplyVec4 = function(mat, vec, dest) {
939
+ if(!dest) { dest = vec }
940
+
941
+ var x = vec[0], y = vec[1], z = vec[2], w = vec[3];
942
+
943
+ dest[0] = mat[0]*x + mat[4]*y + mat[8]*z + mat[12]*w;
944
+ dest[1] = mat[1]*x + mat[5]*y + mat[9]*z + mat[13]*w;
945
+ dest[2] = mat[2]*x + mat[6]*y + mat[10]*z + mat[14]*w;
946
+ dest[3] = mat[3]*x + mat[7]*y + mat[11]*z + mat[15]*w;
947
+
948
+ return dest;
949
+ };
950
+
951
+ /*
952
+ * mat4.translate
953
+ * Translates a matrix by the given vector
954
+ *
955
+ * Params:
956
+ * mat - mat4 to translate
957
+ * vec - vec3 specifying the translation
958
+ * dest - Optional, mat4 receiving operation result. If not specified result is written to mat
959
+ *
960
+ * Returns:
961
+ * dest if specified, mat otherwise
962
+ */
963
+ mat4.translate = function(mat, vec, dest) {
964
+ var x = vec[0], y = vec[1], z = vec[2];
965
+
966
+ if(!dest || mat == dest) {
967
+ mat[12] = mat[0]*x + mat[4]*y + mat[8]*z + mat[12];
968
+ mat[13] = mat[1]*x + mat[5]*y + mat[9]*z + mat[13];
969
+ mat[14] = mat[2]*x + mat[6]*y + mat[10]*z + mat[14];
970
+ mat[15] = mat[3]*x + mat[7]*y + mat[11]*z + mat[15];
971
+ return mat;
972
+ }
973
+
974
+ var a00 = mat[0], a01 = mat[1], a02 = mat[2], a03 = mat[3];
975
+ var a10 = mat[4], a11 = mat[5], a12 = mat[6], a13 = mat[7];
976
+ var a20 = mat[8], a21 = mat[9], a22 = mat[10], a23 = mat[11];
977
+
978
+ dest[0] = a00;
979
+ dest[1] = a01;
980
+ dest[2] = a02;
981
+ dest[3] = a03;
982
+ dest[4] = a10;
983
+ dest[5] = a11;
984
+ dest[6] = a12;
985
+ dest[7] = a13;
986
+ dest[8] = a20;
987
+ dest[9] = a21;
988
+ dest[10] = a22;
989
+ dest[11] = a23;
990
+
991
+ dest[12] = a00*x + a10*y + a20*z + mat[12];
992
+ dest[13] = a01*x + a11*y + a21*z + mat[13];
993
+ dest[14] = a02*x + a12*y + a22*z + mat[14];
994
+ dest[15] = a03*x + a13*y + a23*z + mat[15];
995
+ return dest;
996
+ };
997
+
998
+ /*
999
+ * mat4.scale
1000
+ * Scales a matrix by the given vector
1001
+ *
1002
+ * Params:
1003
+ * mat - mat4 to scale
1004
+ * vec - vec3 specifying the scale for each axis
1005
+ * dest - Optional, mat4 receiving operation result. If not specified result is written to mat
1006
+ *
1007
+ * Returns:
1008
+ * dest if specified, mat otherwise
1009
+ */
1010
+ mat4.scale = function(mat, vec, dest) {
1011
+ var x = vec[0], y = vec[1], z = vec[2];
1012
+
1013
+ if(!dest || mat == dest) {
1014
+ mat[0] *= x;
1015
+ mat[1] *= x;
1016
+ mat[2] *= x;
1017
+ mat[3] *= x;
1018
+ mat[4] *= y;
1019
+ mat[5] *= y;
1020
+ mat[6] *= y;
1021
+ mat[7] *= y;
1022
+ mat[8] *= z;
1023
+ mat[9] *= z;
1024
+ mat[10] *= z;
1025
+ mat[11] *= z;
1026
+ return mat;
1027
+ }
1028
+
1029
+ dest[0] = mat[0]*x;
1030
+ dest[1] = mat[1]*x;
1031
+ dest[2] = mat[2]*x;
1032
+ dest[3] = mat[3]*x;
1033
+ dest[4] = mat[4]*y;
1034
+ dest[5] = mat[5]*y;
1035
+ dest[6] = mat[6]*y;
1036
+ dest[7] = mat[7]*y;
1037
+ dest[8] = mat[8]*z;
1038
+ dest[9] = mat[9]*z;
1039
+ dest[10] = mat[10]*z;
1040
+ dest[11] = mat[11]*z;
1041
+ dest[12] = mat[12];
1042
+ dest[13] = mat[13];
1043
+ dest[14] = mat[14];
1044
+ dest[15] = mat[15];
1045
+ return dest;
1046
+ };
1047
+
1048
+ /*
1049
+ * mat4.rotate
1050
+ * Rotates a matrix by the given angle around the specified axis
1051
+ * If rotating around a primary axis (X,Y,Z) one of the specialized rotation functions should be used instead for performance
1052
+ *
1053
+ * Params:
1054
+ * mat - mat4 to rotate
1055
+ * angle - angle (in radians) to rotate
1056
+ * axis - vec3 representing the axis to rotate around
1057
+ * dest - Optional, mat4 receiving operation result. If not specified result is written to mat
1058
+ *
1059
+ * Returns:
1060
+ * dest if specified, mat otherwise
1061
+ */
1062
+ mat4.rotate = function(mat, angle, axis, dest) {
1063
+ var x = axis[0], y = axis[1], z = axis[2];
1064
+ var len = Math.sqrt(x*x + y*y + z*z);
1065
+ if (!len) { return null; }
1066
+ if (len != 1) {
1067
+ len = 1 / len;
1068
+ x *= len;
1069
+ y *= len;
1070
+ z *= len;
1071
+ }
1072
+
1073
+ var s = Math.sin(angle);
1074
+ var c = Math.cos(angle);
1075
+ var t = 1-c;
1076
+
1077
+ // Cache the matrix values (makes for huge speed increases!)
1078
+ var a00 = mat[0], a01 = mat[1], a02 = mat[2], a03 = mat[3];
1079
+ var a10 = mat[4], a11 = mat[5], a12 = mat[6], a13 = mat[7];
1080
+ var a20 = mat[8], a21 = mat[9], a22 = mat[10], a23 = mat[11];
1081
+
1082
+ // Construct the elements of the rotation matrix
1083
+ var b00 = x*x*t + c, b01 = y*x*t + z*s, b02 = z*x*t - y*s;
1084
+ var b10 = x*y*t - z*s, b11 = y*y*t + c, b12 = z*y*t + x*s;
1085
+ var b20 = x*z*t + y*s, b21 = y*z*t - x*s, b22 = z*z*t + c;
1086
+
1087
+ if(!dest) {
1088
+ dest = mat
1089
+ } else if(mat != dest) { // If the source and destination differ, copy the unchanged last row
1090
+ dest[12] = mat[12];
1091
+ dest[13] = mat[13];
1092
+ dest[14] = mat[14];
1093
+ dest[15] = mat[15];
1094
+ }
1095
+
1096
+ // Perform rotation-specific matrix multiplication
1097
+ dest[0] = a00*b00 + a10*b01 + a20*b02;
1098
+ dest[1] = a01*b00 + a11*b01 + a21*b02;
1099
+ dest[2] = a02*b00 + a12*b01 + a22*b02;
1100
+ dest[3] = a03*b00 + a13*b01 + a23*b02;
1101
+
1102
+ dest[4] = a00*b10 + a10*b11 + a20*b12;
1103
+ dest[5] = a01*b10 + a11*b11 + a21*b12;
1104
+ dest[6] = a02*b10 + a12*b11 + a22*b12;
1105
+ dest[7] = a03*b10 + a13*b11 + a23*b12;
1106
+
1107
+ dest[8] = a00*b20 + a10*b21 + a20*b22;
1108
+ dest[9] = a01*b20 + a11*b21 + a21*b22;
1109
+ dest[10] = a02*b20 + a12*b21 + a22*b22;
1110
+ dest[11] = a03*b20 + a13*b21 + a23*b22;
1111
+ return dest;
1112
+ };
1113
+
1114
+ /*
1115
+ * mat4.rotateX
1116
+ * Rotates a matrix by the given angle around the X axis
1117
+ *
1118
+ * Params:
1119
+ * mat - mat4 to rotate
1120
+ * angle - angle (in radians) to rotate
1121
+ * dest - Optional, mat4 receiving operation result. If not specified result is written to mat
1122
+ *
1123
+ * Returns:
1124
+ * dest if specified, mat otherwise
1125
+ */
1126
+ mat4.rotateX = function(mat, angle, dest) {
1127
+ var s = Math.sin(angle);
1128
+ var c = Math.cos(angle);
1129
+
1130
+ // Cache the matrix values (makes for huge speed increases!)
1131
+ var a10 = mat[4], a11 = mat[5], a12 = mat[6], a13 = mat[7];
1132
+ var a20 = mat[8], a21 = mat[9], a22 = mat[10], a23 = mat[11];
1133
+
1134
+ if(!dest) {
1135
+ dest = mat
1136
+ } else if(mat != dest) { // If the source and destination differ, copy the unchanged rows
1137
+ dest[0] = mat[0];
1138
+ dest[1] = mat[1];
1139
+ dest[2] = mat[2];
1140
+ dest[3] = mat[3];
1141
+
1142
+ dest[12] = mat[12];
1143
+ dest[13] = mat[13];
1144
+ dest[14] = mat[14];
1145
+ dest[15] = mat[15];
1146
+ }
1147
+
1148
+ // Perform axis-specific matrix multiplication
1149
+ dest[4] = a10*c + a20*s;
1150
+ dest[5] = a11*c + a21*s;
1151
+ dest[6] = a12*c + a22*s;
1152
+ dest[7] = a13*c + a23*s;
1153
+
1154
+ dest[8] = a10*-s + a20*c;
1155
+ dest[9] = a11*-s + a21*c;
1156
+ dest[10] = a12*-s + a22*c;
1157
+ dest[11] = a13*-s + a23*c;
1158
+ return dest;
1159
+ };
1160
+
1161
+ /*
1162
+ * mat4.rotateY
1163
+ * Rotates a matrix by the given angle around the Y axis
1164
+ *
1165
+ * Params:
1166
+ * mat - mat4 to rotate
1167
+ * angle - angle (in radians) to rotate
1168
+ * dest - Optional, mat4 receiving operation result. If not specified result is written to mat
1169
+ *
1170
+ * Returns:
1171
+ * dest if specified, mat otherwise
1172
+ */
1173
+ mat4.rotateY = function(mat, angle, dest) {
1174
+ var s = Math.sin(angle);
1175
+ var c = Math.cos(angle);
1176
+
1177
+ // Cache the matrix values (makes for huge speed increases!)
1178
+ var a00 = mat[0], a01 = mat[1], a02 = mat[2], a03 = mat[3];
1179
+ var a20 = mat[8], a21 = mat[9], a22 = mat[10], a23 = mat[11];
1180
+
1181
+ if(!dest) {
1182
+ dest = mat
1183
+ } else if(mat != dest) { // If the source and destination differ, copy the unchanged rows
1184
+ dest[4] = mat[4];
1185
+ dest[5] = mat[5];
1186
+ dest[6] = mat[6];
1187
+ dest[7] = mat[7];
1188
+
1189
+ dest[12] = mat[12];
1190
+ dest[13] = mat[13];
1191
+ dest[14] = mat[14];
1192
+ dest[15] = mat[15];
1193
+ }
1194
+
1195
+ // Perform axis-specific matrix multiplication
1196
+ dest[0] = a00*c + a20*-s;
1197
+ dest[1] = a01*c + a21*-s;
1198
+ dest[2] = a02*c + a22*-s;
1199
+ dest[3] = a03*c + a23*-s;
1200
+
1201
+ dest[8] = a00*s + a20*c;
1202
+ dest[9] = a01*s + a21*c;
1203
+ dest[10] = a02*s + a22*c;
1204
+ dest[11] = a03*s + a23*c;
1205
+ return dest;
1206
+ };
1207
+
1208
+ /*
1209
+ * mat4.rotateZ
1210
+ * Rotates a matrix by the given angle around the Z axis
1211
+ *
1212
+ * Params:
1213
+ * mat - mat4 to rotate
1214
+ * angle - angle (in radians) to rotate
1215
+ * dest - Optional, mat4 receiving operation result. If not specified result is written to mat
1216
+ *
1217
+ * Returns:
1218
+ * dest if specified, mat otherwise
1219
+ */
1220
+ mat4.rotateZ = function(mat, angle, dest) {
1221
+ var s = Math.sin(angle);
1222
+ var c = Math.cos(angle);
1223
+
1224
+ // Cache the matrix values (makes for huge speed increases!)
1225
+ var a00 = mat[0], a01 = mat[1], a02 = mat[2], a03 = mat[3];
1226
+ var a10 = mat[4], a11 = mat[5], a12 = mat[6], a13 = mat[7];
1227
+
1228
+ if(!dest) {
1229
+ dest = mat
1230
+ } else if(mat != dest) { // If the source and destination differ, copy the unchanged last row
1231
+ dest[8] = mat[8];
1232
+ dest[9] = mat[9];
1233
+ dest[10] = mat[10];
1234
+ dest[11] = mat[11];
1235
+
1236
+ dest[12] = mat[12];
1237
+ dest[13] = mat[13];
1238
+ dest[14] = mat[14];
1239
+ dest[15] = mat[15];
1240
+ }
1241
+
1242
+ // Perform axis-specific matrix multiplication
1243
+ dest[0] = a00*c + a10*s;
1244
+ dest[1] = a01*c + a11*s;
1245
+ dest[2] = a02*c + a12*s;
1246
+ dest[3] = a03*c + a13*s;
1247
+
1248
+ dest[4] = a00*-s + a10*c;
1249
+ dest[5] = a01*-s + a11*c;
1250
+ dest[6] = a02*-s + a12*c;
1251
+ dest[7] = a03*-s + a13*c;
1252
+
1253
+ return dest;
1254
+ };
1255
+
1256
+ /*
1257
+ * mat4.frustum
1258
+ * Generates a frustum matrix with the given bounds
1259
+ *
1260
+ * Params:
1261
+ * left, right - scalar, left and right bounds of the frustum
1262
+ * bottom, top - scalar, bottom and top bounds of the frustum
1263
+ * near, far - scalar, near and far bounds of the frustum
1264
+ * dest - Optional, mat4 frustum matrix will be written into
1265
+ *
1266
+ * Returns:
1267
+ * dest if specified, a new mat4 otherwise
1268
+ */
1269
+ mat4.frustum = function(left, right, bottom, top, near, far, dest) {
1270
+ if(!dest) { dest = mat4.create(); }
1271
+ var rl = (right - left);
1272
+ var tb = (top - bottom);
1273
+ var fn = (far - near);
1274
+ dest[0] = (near*2) / rl;
1275
+ dest[1] = 0;
1276
+ dest[2] = 0;
1277
+ dest[3] = 0;
1278
+ dest[4] = 0;
1279
+ dest[5] = (near*2) / tb;
1280
+ dest[6] = 0;
1281
+ dest[7] = 0;
1282
+ dest[8] = (right + left) / rl;
1283
+ dest[9] = (top + bottom) / tb;
1284
+ dest[10] = -(far + near) / fn;
1285
+ dest[11] = -1;
1286
+ dest[12] = 0;
1287
+ dest[13] = 0;
1288
+ dest[14] = -(far*near*2) / fn;
1289
+ dest[15] = 0;
1290
+ return dest;
1291
+ };
1292
+
1293
+ /*
1294
+ * mat4.perspective
1295
+ * Generates a perspective projection matrix with the given bounds
1296
+ *
1297
+ * Params:
1298
+ * fovy - scalar, vertical field of view
1299
+ * aspect - scalar, aspect ratio. typically viewport width/height
1300
+ * near, far - scalar, near and far bounds of the frustum
1301
+ * dest - Optional, mat4 frustum matrix will be written into
1302
+ *
1303
+ * Returns:
1304
+ * dest if specified, a new mat4 otherwise
1305
+ */
1306
+ mat4.perspective = function(fovy, aspect, near, far, dest) {
1307
+ var top = near*Math.tan(fovy*Math.PI / 360.0);
1308
+ var right = top*aspect;
1309
+ return mat4.frustum(-right, right, -top, top, near, far, dest);
1310
+ };
1311
+
1312
+ /*
1313
+ * mat4.ortho
1314
+ * Generates a orthogonal projection matrix with the given bounds
1315
+ *
1316
+ * Params:
1317
+ * left, right - scalar, left and right bounds of the frustum
1318
+ * bottom, top - scalar, bottom and top bounds of the frustum
1319
+ * near, far - scalar, near and far bounds of the frustum
1320
+ * dest - Optional, mat4 frustum matrix will be written into
1321
+ *
1322
+ * Returns:
1323
+ * dest if specified, a new mat4 otherwise
1324
+ */
1325
+ mat4.ortho = function(left, right, bottom, top, near, far, dest) {
1326
+ if(!dest) { dest = mat4.create(); }
1327
+ var rl = (right - left);
1328
+ var tb = (top - bottom);
1329
+ var fn = (far - near);
1330
+ dest[0] = 2 / rl;
1331
+ dest[1] = 0;
1332
+ dest[2] = 0;
1333
+ dest[3] = 0;
1334
+ dest[4] = 0;
1335
+ dest[5] = 2 / tb;
1336
+ dest[6] = 0;
1337
+ dest[7] = 0;
1338
+ dest[8] = 0;
1339
+ dest[9] = 0;
1340
+ dest[10] = -2 / fn;
1341
+ dest[11] = 0;
1342
+ dest[12] = -(left + right) / rl;
1343
+ dest[13] = -(top + bottom) / tb;
1344
+ dest[14] = -(far + near) / fn;
1345
+ dest[15] = 1;
1346
+ return dest;
1347
+ };
1348
+
1349
+ /*
1350
+ * mat4.ortho
1351
+ * Generates a look-at matrix with the given eye position, focal point, and up axis
1352
+ *
1353
+ * Params:
1354
+ * eye - vec3, position of the viewer
1355
+ * center - vec3, point the viewer is looking at
1356
+ * up - vec3 pointing "up"
1357
+ * dest - Optional, mat4 frustum matrix will be written into
1358
+ *
1359
+ * Returns:
1360
+ * dest if specified, a new mat4 otherwise
1361
+ */
1362
+ mat4.lookAt = function(eye, center, up, dest) {
1363
+ if(!dest) { dest = mat4.create(); }
1364
+
1365
+ var eyex = eye[0],
1366
+ eyey = eye[1],
1367
+ eyez = eye[2],
1368
+ upx = up[0],
1369
+ upy = up[1],
1370
+ upz = up[2],
1371
+ centerx = center[0],
1372
+ centery = center[1],
1373
+ centerz = center[2];
1374
+
1375
+ if (eyex == centerx && eyey == centery && eyez == centerz) {
1376
+ return mat4.identity(dest);
1377
+ }
1378
+
1379
+ var z0,z1,z2,x0,x1,x2,y0,y1,y2,len;
1380
+
1381
+ //vec3.direction(eye, center, z);
1382
+ z0 = eyex - center[0];
1383
+ z1 = eyey - center[1];
1384
+ z2 = eyez - center[2];
1385
+
1386
+ // normalize (no check needed for 0 because of early return)
1387
+ len = 1/Math.sqrt(z0*z0 + z1*z1 + z2*z2);
1388
+ z0 *= len;
1389
+ z1 *= len;
1390
+ z2 *= len;
1391
+
1392
+ //vec3.normalize(vec3.cross(up, z, x));
1393
+ x0 = upy*z2 - upz*z1;
1394
+ x1 = upz*z0 - upx*z2;
1395
+ x2 = upx*z1 - upy*z0;
1396
+ len = Math.sqrt(x0*x0 + x1*x1 + x2*x2);
1397
+ if (!len) {
1398
+ x0 = 0;
1399
+ x1 = 0;
1400
+ x2 = 0;
1401
+ } else {
1402
+ len = 1/len;
1403
+ x0 *= len;
1404
+ x1 *= len;
1405
+ x2 *= len;
1406
+ };
1407
+
1408
+ //vec3.normalize(vec3.cross(z, x, y));
1409
+ y0 = z1*x2 - z2*x1;
1410
+ y1 = z2*x0 - z0*x2;
1411
+ y2 = z0*x1 - z1*x0;
1412
+
1413
+ len = Math.sqrt(y0*y0 + y1*y1 + y2*y2);
1414
+ if (!len) {
1415
+ y0 = 0;
1416
+ y1 = 0;
1417
+ y2 = 0;
1418
+ } else {
1419
+ len = 1/len;
1420
+ y0 *= len;
1421
+ y1 *= len;
1422
+ y2 *= len;
1423
+ }
1424
+
1425
+ dest[0] = x0;
1426
+ dest[1] = y0;
1427
+ dest[2] = z0;
1428
+ dest[3] = 0;
1429
+ dest[4] = x1;
1430
+ dest[5] = y1;
1431
+ dest[6] = z1;
1432
+ dest[7] = 0;
1433
+ dest[8] = x2;
1434
+ dest[9] = y2;
1435
+ dest[10] = z2;
1436
+ dest[11] = 0;
1437
+ dest[12] = -(x0*eyex + x1*eyey + x2*eyez);
1438
+ dest[13] = -(y0*eyex + y1*eyey + y2*eyez);
1439
+ dest[14] = -(z0*eyex + z1*eyey + z2*eyez);
1440
+ dest[15] = 1;
1441
+
1442
+ return dest;
1443
+ };
1444
+
1445
+ /*
1446
+ * mat4.str
1447
+ * Returns a string representation of a mat4
1448
+ *
1449
+ * Params:
1450
+ * mat - mat4 to represent as a string
1451
+ *
1452
+ * Returns:
1453
+ * string representation of mat
1454
+ */
1455
+ mat4.str = function(mat) {
1456
+ return '[' + mat[0] + ', ' + mat[1] + ', ' + mat[2] + ', ' + mat[3] +
1457
+ ', '+ mat[4] + ', ' + mat[5] + ', ' + mat[6] + ', ' + mat[7] +
1458
+ ', '+ mat[8] + ', ' + mat[9] + ', ' + mat[10] + ', ' + mat[11] +
1459
+ ', '+ mat[12] + ', ' + mat[13] + ', ' + mat[14] + ', ' + mat[15] + ']';
1460
+ };
1461
+
1462
+ /*
1463
+ * quat4 - Quaternions
1464
+ */
1465
+ quat4 = {};
1466
+
1467
+ /*
1468
+ * quat4.create
1469
+ * Creates a new instance of a quat4 using the default array type
1470
+ * Any javascript array containing at least 4 numeric elements can serve as a quat4
1471
+ *
1472
+ * Params:
1473
+ * quat - Optional, quat4 containing values to initialize with
1474
+ *
1475
+ * Returns:
1476
+ * New quat4
1477
+ */
1478
+ quat4.create = function(quat) {
1479
+ var dest = new glMatrixArrayType(4);
1480
+
1481
+ if(quat) {
1482
+ dest[0] = quat[0];
1483
+ dest[1] = quat[1];
1484
+ dest[2] = quat[2];
1485
+ dest[3] = quat[3];
1486
+ }
1487
+
1488
+ return dest;
1489
+ };
1490
+
1491
+ /*
1492
+ * quat4.set
1493
+ * Copies the values of one quat4 to another
1494
+ *
1495
+ * Params:
1496
+ * quat - quat4 containing values to copy
1497
+ * dest - quat4 receiving copied values
1498
+ *
1499
+ * Returns:
1500
+ * dest
1501
+ */
1502
+ quat4.set = function(quat, dest) {
1503
+ dest[0] = quat[0];
1504
+ dest[1] = quat[1];
1505
+ dest[2] = quat[2];
1506
+ dest[3] = quat[3];
1507
+
1508
+ return dest;
1509
+ };
1510
+
1511
+ /*
1512
+ * quat4.calculateW
1513
+ * Calculates the W component of a quat4 from the X, Y, and Z components.
1514
+ * Assumes that quaternion is 1 unit in length.
1515
+ * Any existing W component will be ignored.
1516
+ *
1517
+ * Params:
1518
+ * quat - quat4 to calculate W component of
1519
+ * dest - Optional, quat4 receiving calculated values. If not specified result is written to quat
1520
+ *
1521
+ * Returns:
1522
+ * dest if specified, quat otherwise
1523
+ */
1524
+ quat4.calculateW = function(quat, dest) {
1525
+ var x = quat[0], y = quat[1], z = quat[2];
1526
+
1527
+ if(!dest || quat == dest) {
1528
+ quat[3] = -Math.sqrt(Math.abs(1.0 - x*x - y*y - z*z));
1529
+ return quat;
1530
+ }
1531
+ dest[0] = x;
1532
+ dest[1] = y;
1533
+ dest[2] = z;
1534
+ dest[3] = -Math.sqrt(Math.abs(1.0 - x*x - y*y - z*z));
1535
+ return dest;
1536
+ }
1537
+
1538
+ /*
1539
+ * quat4.inverse
1540
+ * Calculates the inverse of a quat4
1541
+ *
1542
+ * Params:
1543
+ * quat - quat4 to calculate inverse of
1544
+ * dest - Optional, quat4 receiving inverse values. If not specified result is written to quat
1545
+ *
1546
+ * Returns:
1547
+ * dest if specified, quat otherwise
1548
+ */
1549
+ quat4.inverse = function(quat, dest) {
1550
+ if(!dest || quat == dest) {
1551
+ quat[0] *= 1;
1552
+ quat[1] *= 1;
1553
+ quat[2] *= 1;
1554
+ return quat;
1555
+ }
1556
+ dest[0] = -quat[0];
1557
+ dest[1] = -quat[1];
1558
+ dest[2] = -quat[2];
1559
+ dest[3] = quat[3];
1560
+ return dest;
1561
+ }
1562
+
1563
+ /*
1564
+ * quat4.length
1565
+ * Calculates the length of a quat4
1566
+ *
1567
+ * Params:
1568
+ * quat - quat4 to calculate length of
1569
+ *
1570
+ * Returns:
1571
+ * Length of quat
1572
+ */
1573
+ quat4.length = function(quat) {
1574
+ var x = quat[0], y = quat[1], z = quat[2], w = quat[3];
1575
+ return Math.sqrt(x*x + y*y + z*z + w*w);
1576
+ }
1577
+
1578
+ /*
1579
+ * quat4.normalize
1580
+ * Generates a unit quaternion of the same direction as the provided quat4
1581
+ * If quaternion length is 0, returns [0, 0, 0, 0]
1582
+ *
1583
+ * Params:
1584
+ * quat - quat4 to normalize
1585
+ * dest - Optional, quat4 receiving operation result. If not specified result is written to quat
1586
+ *
1587
+ * Returns:
1588
+ * dest if specified, quat otherwise
1589
+ */
1590
+ quat4.normalize = function(quat, dest) {
1591
+ if(!dest) { dest = quat; }
1592
+
1593
+ var x = quat[0], y = quat[1], z = quat[2], w = quat[3];
1594
+ var len = Math.sqrt(x*x + y*y + z*z + w*w);
1595
+ if(len == 0) {
1596
+ dest[0] = 0;
1597
+ dest[1] = 0;
1598
+ dest[2] = 0;
1599
+ dest[3] = 0;
1600
+ return dest;
1601
+ }
1602
+ len = 1/len;
1603
+ dest[0] = x * len;
1604
+ dest[1] = y * len;
1605
+ dest[2] = z * len;
1606
+ dest[3] = w * len;
1607
+
1608
+ return dest;
1609
+ }
1610
+
1611
+ /*
1612
+ * quat4.multiply
1613
+ * Performs a quaternion multiplication
1614
+ *
1615
+ * Params:
1616
+ * quat - quat4, first operand
1617
+ * quat2 - quat4, second operand
1618
+ * dest - Optional, quat4 receiving operation result. If not specified result is written to quat
1619
+ *
1620
+ * Returns:
1621
+ * dest if specified, quat otherwise
1622
+ */
1623
+ quat4.multiply = function(quat, quat2, dest) {
1624
+ if(!dest) { dest = quat; }
1625
+
1626
+ var qax = quat[0], qay = quat[1], qaz = quat[2], qaw = quat[3];
1627
+ var qbx = quat2[0], qby = quat2[1], qbz = quat2[2], qbw = quat2[3];
1628
+
1629
+ dest[0] = qax*qbw + qaw*qbx + qay*qbz - qaz*qby;
1630
+ dest[1] = qay*qbw + qaw*qby + qaz*qbx - qax*qbz;
1631
+ dest[2] = qaz*qbw + qaw*qbz + qax*qby - qay*qbx;
1632
+ dest[3] = qaw*qbw - qax*qbx - qay*qby - qaz*qbz;
1633
+
1634
+ return dest;
1635
+ }
1636
+
1637
+ /*
1638
+ * quat4.multiplyVec3
1639
+ * Transforms a vec3 with the given quaternion
1640
+ *
1641
+ * Params:
1642
+ * quat - quat4 to transform the vector with
1643
+ * vec - vec3 to transform
1644
+ * dest - Optional, vec3 receiving operation result. If not specified result is written to vec
1645
+ *
1646
+ * Returns:
1647
+ * dest if specified, vec otherwise
1648
+ */
1649
+ quat4.multiplyVec3 = function(quat, vec, dest) {
1650
+ if(!dest) { dest = vec; }
1651
+
1652
+ var x = vec[0], y = vec[1], z = vec[2];
1653
+ var qx = quat[0], qy = quat[1], qz = quat[2], qw = quat[3];
1654
+
1655
+ // calculate quat * vec
1656
+ var ix = qw*x + qy*z - qz*y;
1657
+ var iy = qw*y + qz*x - qx*z;
1658
+ var iz = qw*z + qx*y - qy*x;
1659
+ var iw = -qx*x - qy*y - qz*z;
1660
+
1661
+ // calculate result * inverse quat
1662
+ dest[0] = ix*qw + iw*-qx + iy*-qz - iz*-qy;
1663
+ dest[1] = iy*qw + iw*-qy + iz*-qx - ix*-qz;
1664
+ dest[2] = iz*qw + iw*-qz + ix*-qy - iy*-qx;
1665
+
1666
+ return dest;
1667
+ }
1668
+
1669
+ /*
1670
+ * quat4.toMat3
1671
+ * Calculates a 3x3 matrix from the given quat4
1672
+ *
1673
+ * Params:
1674
+ * quat - quat4 to create matrix from
1675
+ * dest - Optional, mat3 receiving operation result
1676
+ *
1677
+ * Returns:
1678
+ * dest if specified, a new mat3 otherwise
1679
+ */
1680
+ quat4.toMat3 = function(quat, dest) {
1681
+ if(!dest) { dest = mat3.create(); }
1682
+
1683
+ var x = quat[0], y = quat[1], z = quat[2], w = quat[3];
1684
+
1685
+ var x2 = x + x;
1686
+ var y2 = y + y;
1687
+ var z2 = z + z;
1688
+
1689
+ var xx = x*x2;
1690
+ var xy = x*y2;
1691
+ var xz = x*z2;
1692
+
1693
+ var yy = y*y2;
1694
+ var yz = y*z2;
1695
+ var zz = z*z2;
1696
+
1697
+ var wx = w*x2;
1698
+ var wy = w*y2;
1699
+ var wz = w*z2;
1700
+
1701
+ dest[0] = 1 - (yy + zz);
1702
+ dest[1] = xy - wz;
1703
+ dest[2] = xz + wy;
1704
+
1705
+ dest[3] = xy + wz;
1706
+ dest[4] = 1 - (xx + zz);
1707
+ dest[5] = yz - wx;
1708
+
1709
+ dest[6] = xz - wy;
1710
+ dest[7] = yz + wx;
1711
+ dest[8] = 1 - (xx + yy);
1712
+
1713
+ return dest;
1714
+ }
1715
+
1716
+ /*
1717
+ * quat4.toMat4
1718
+ * Calculates a 4x4 matrix from the given quat4
1719
+ *
1720
+ * Params:
1721
+ * quat - quat4 to create matrix from
1722
+ * dest - Optional, mat4 receiving operation result
1723
+ *
1724
+ * Returns:
1725
+ * dest if specified, a new mat4 otherwise
1726
+ */
1727
+ quat4.toMat4 = function(quat, dest) {
1728
+ if(!dest) { dest = mat4.create(); }
1729
+
1730
+ var x = quat[0], y = quat[1], z = quat[2], w = quat[3];
1731
+
1732
+ var x2 = x + x;
1733
+ var y2 = y + y;
1734
+ var z2 = z + z;
1735
+
1736
+ var xx = x*x2;
1737
+ var xy = x*y2;
1738
+ var xz = x*z2;
1739
+
1740
+ var yy = y*y2;
1741
+ var yz = y*z2;
1742
+ var zz = z*z2;
1743
+
1744
+ var wx = w*x2;
1745
+ var wy = w*y2;
1746
+ var wz = w*z2;
1747
+
1748
+ dest[0] = 1 - (yy + zz);
1749
+ dest[1] = xy - wz;
1750
+ dest[2] = xz + wy;
1751
+ dest[3] = 0;
1752
+
1753
+ dest[4] = xy + wz;
1754
+ dest[5] = 1 - (xx + zz);
1755
+ dest[6] = yz - wx;
1756
+ dest[7] = 0;
1757
+
1758
+ dest[8] = xz - wy;
1759
+ dest[9] = yz + wx;
1760
+ dest[10] = 1 - (xx + yy);
1761
+ dest[11] = 0;
1762
+
1763
+ dest[12] = 0;
1764
+ dest[13] = 0;
1765
+ dest[14] = 0;
1766
+ dest[15] = 1;
1767
+
1768
+ return dest;
1769
+ }
1770
+
1771
+ /*
1772
+ * quat4.slerp
1773
+ * Performs a spherical linear interpolation between two quat4
1774
+ *
1775
+ * Params:
1776
+ * quat - quat4, first quaternion
1777
+ * quat2 - quat4, second quaternion
1778
+ * lerp - interpolation amount between the two inputs
1779
+ * dest - Optional, quat4 receiving operation result. If not specified result is written to quat
1780
+ *
1781
+ * Returns:
1782
+ * dest if specified, quat otherwise
1783
+ */
1784
+ quat4.slerp = function(quat, quat2, lerp, dest) {
1785
+ if(!dest) { dest = quat; }
1786
+
1787
+ var eps_lerp = lerp;
1788
+
1789
+ var dot = quat[0]*quat2[0] + quat[1]*quat2[1] + quat[2]*quat2[2] + quat[3]*quat2[3];
1790
+ if (dot < 0.0) {
1791
+ eps_lerp = -1.0 * lerp;
1792
+ }
1793
+
1794
+ dest[0] = 1.0 - lerp * quat[0] + eps_lerp * quat2[0];
1795
+ dest[1] = 1.0 - lerp * quat[1] + eps_lerp * quat2[1];
1796
+ dest[2] = 1.0 - lerp * quat[2] + eps_lerp * quat2[2];
1797
+ dest[3] = 1.0 - lerp * quat[3] + eps_lerp * quat2[3];
1798
+
1799
+ return dest;
1800
+ }
1801
+
1802
+ /*
1803
+ * quat4.str
1804
+ * Returns a string representation of a quaternion
1805
+ *
1806
+ * Params:
1807
+ * quat - quat4 to represent as a string
1808
+ *
1809
+ * Returns:
1810
+ * string representation of quat
1811
+ */
1812
+ quat4.str = function(quat) {
1813
+ return '[' + quat[0] + ', ' + quat[1] + ', ' + quat[2] + ', ' + quat[3] + ']';
1814
+ }
1815
+