jax 0.0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (446) hide show
  1. data/.gitignore +12 -0
  2. data/.gitmodules +3 -0
  3. data/.rvmrc +7 -0
  4. data/Gemfile +4 -0
  5. data/README.rdoc +32 -0
  6. data/Rakefile +144 -0
  7. data/bin/jax +11 -0
  8. data/builtin/shaders/basic/common.ejs +11 -0
  9. data/builtin/shaders/basic/fragment.ejs +5 -0
  10. data/builtin/shaders/basic/vertex.ejs +13 -0
  11. data/builtin/shaders/depthmap/common.ejs +1 -0
  12. data/builtin/shaders/depthmap/fragment.ejs +5 -0
  13. data/builtin/shaders/depthmap/vertex.ejs +7 -0
  14. data/builtin/shaders/fog/common.ejs +7 -0
  15. data/builtin/shaders/fog/fragment.ejs +23 -0
  16. data/builtin/shaders/fog/manifest.yml +12 -0
  17. data/builtin/shaders/fog/material.js +34 -0
  18. data/builtin/shaders/fog/vertex.ejs +10 -0
  19. data/builtin/shaders/functions/depth_map.ejs +24 -0
  20. data/builtin/shaders/functions/lights.ejs +155 -0
  21. data/builtin/shaders/lighting/common.ejs +5 -0
  22. data/builtin/shaders/lighting/fragment.ejs +34 -0
  23. data/builtin/shaders/lighting/manifest.yml +4 -0
  24. data/builtin/shaders/lighting/material.js +26 -0
  25. data/builtin/shaders/lighting/vertex.ejs +7 -0
  26. data/builtin/shaders/normal_map/common.ejs +12 -0
  27. data/builtin/shaders/normal_map/fragment.ejs +26 -0
  28. data/builtin/shaders/normal_map/manifest.yml +17 -0
  29. data/builtin/shaders/normal_map/material.js +16 -0
  30. data/builtin/shaders/normal_map/vertex.ejs +57 -0
  31. data/builtin/shaders/paraboloid-depthmap/common.ejs +6 -0
  32. data/builtin/shaders/paraboloid-depthmap/fragment.ejs +8 -0
  33. data/builtin/shaders/paraboloid-depthmap/material.js +15 -0
  34. data/builtin/shaders/paraboloid-depthmap/vertex.ejs +26 -0
  35. data/builtin/shaders/shadow_map/common.ejs +14 -0
  36. data/builtin/shaders/shadow_map/fragment.ejs +66 -0
  37. data/builtin/shaders/shadow_map/manifest.yml +1 -0
  38. data/builtin/shaders/shadow_map/material.js +26 -0
  39. data/builtin/shaders/shadow_map/vertex.ejs +46 -0
  40. data/builtin/shaders/texture/common.ejs +4 -0
  41. data/builtin/shaders/texture/fragment.ejs +11 -0
  42. data/builtin/shaders/texture/manifest.yml +17 -0
  43. data/builtin/shaders/texture/material.js +18 -0
  44. data/builtin/shaders/texture/vertex.ejs +9 -0
  45. data/guides/assets/images/book_icon.gif +0 -0
  46. data/guides/assets/images/bullet.gif +0 -0
  47. data/guides/assets/images/chapters_icon.gif +0 -0
  48. data/guides/assets/images/check_bullet.gif +0 -0
  49. data/guides/assets/images/credits_pic_blank.gif +0 -0
  50. data/guides/assets/images/edge_badge.png +0 -0
  51. data/guides/assets/images/feature_tile.gif +0 -0
  52. data/guides/assets/images/footer_tile.gif +0 -0
  53. data/guides/assets/images/getting_started/clean_passing_jasmine_suite.png +0 -0
  54. data/guides/assets/images/getting_started/rock.png +0 -0
  55. data/guides/assets/images/getting_started/rock_normal.png +0 -0
  56. data/guides/assets/images/grey_bullet.gif +0 -0
  57. data/guides/assets/images/header_backdrop.png +0 -0
  58. data/guides/assets/images/header_tile.gif +0 -0
  59. data/guides/assets/images/icons/README +5 -0
  60. data/guides/assets/images/icons/callouts/1.png +0 -0
  61. data/guides/assets/images/icons/callouts/10.png +0 -0
  62. data/guides/assets/images/icons/callouts/11.png +0 -0
  63. data/guides/assets/images/icons/callouts/12.png +0 -0
  64. data/guides/assets/images/icons/callouts/13.png +0 -0
  65. data/guides/assets/images/icons/callouts/14.png +0 -0
  66. data/guides/assets/images/icons/callouts/15.png +0 -0
  67. data/guides/assets/images/icons/callouts/2.png +0 -0
  68. data/guides/assets/images/icons/callouts/3.png +0 -0
  69. data/guides/assets/images/icons/callouts/4.png +0 -0
  70. data/guides/assets/images/icons/callouts/5.png +0 -0
  71. data/guides/assets/images/icons/callouts/6.png +0 -0
  72. data/guides/assets/images/icons/callouts/7.png +0 -0
  73. data/guides/assets/images/icons/callouts/8.png +0 -0
  74. data/guides/assets/images/icons/callouts/9.png +0 -0
  75. data/guides/assets/images/icons/caution.png +0 -0
  76. data/guides/assets/images/icons/example.png +0 -0
  77. data/guides/assets/images/icons/home.png +0 -0
  78. data/guides/assets/images/icons/important.png +0 -0
  79. data/guides/assets/images/icons/next.png +0 -0
  80. data/guides/assets/images/icons/note.png +0 -0
  81. data/guides/assets/images/icons/prev.png +0 -0
  82. data/guides/assets/images/icons/tip.png +0 -0
  83. data/guides/assets/images/icons/up.png +0 -0
  84. data/guides/assets/images/icons/warning.png +0 -0
  85. data/guides/assets/images/nav_arrow.gif +0 -0
  86. data/guides/assets/images/tab_grey.gif +0 -0
  87. data/guides/assets/images/tab_info.gif +0 -0
  88. data/guides/assets/images/tab_note.gif +0 -0
  89. data/guides/assets/images/tab_red.gif +0 -0
  90. data/guides/assets/images/tab_yellow.gif +0 -0
  91. data/guides/assets/images/tab_yellow.png +0 -0
  92. data/guides/assets/javascripts/guides.js +7 -0
  93. data/guides/assets/javascripts/syntaxhighlighter/shBrushAS3.js +59 -0
  94. data/guides/assets/javascripts/syntaxhighlighter/shBrushAppleScript.js +75 -0
  95. data/guides/assets/javascripts/syntaxhighlighter/shBrushBash.js +59 -0
  96. data/guides/assets/javascripts/syntaxhighlighter/shBrushCSharp.js +65 -0
  97. data/guides/assets/javascripts/syntaxhighlighter/shBrushColdFusion.js +100 -0
  98. data/guides/assets/javascripts/syntaxhighlighter/shBrushCpp.js +97 -0
  99. data/guides/assets/javascripts/syntaxhighlighter/shBrushCss.js +91 -0
  100. data/guides/assets/javascripts/syntaxhighlighter/shBrushDelphi.js +55 -0
  101. data/guides/assets/javascripts/syntaxhighlighter/shBrushDiff.js +41 -0
  102. data/guides/assets/javascripts/syntaxhighlighter/shBrushErlang.js +52 -0
  103. data/guides/assets/javascripts/syntaxhighlighter/shBrushGroovy.js +67 -0
  104. data/guides/assets/javascripts/syntaxhighlighter/shBrushJScript.js +52 -0
  105. data/guides/assets/javascripts/syntaxhighlighter/shBrushJava.js +57 -0
  106. data/guides/assets/javascripts/syntaxhighlighter/shBrushJavaFX.js +58 -0
  107. data/guides/assets/javascripts/syntaxhighlighter/shBrushPerl.js +72 -0
  108. data/guides/assets/javascripts/syntaxhighlighter/shBrushPhp.js +88 -0
  109. data/guides/assets/javascripts/syntaxhighlighter/shBrushPlain.js +33 -0
  110. data/guides/assets/javascripts/syntaxhighlighter/shBrushPowerShell.js +74 -0
  111. data/guides/assets/javascripts/syntaxhighlighter/shBrushPython.js +64 -0
  112. data/guides/assets/javascripts/syntaxhighlighter/shBrushRuby.js +55 -0
  113. data/guides/assets/javascripts/syntaxhighlighter/shBrushSass.js +94 -0
  114. data/guides/assets/javascripts/syntaxhighlighter/shBrushScala.js +51 -0
  115. data/guides/assets/javascripts/syntaxhighlighter/shBrushSql.js +66 -0
  116. data/guides/assets/javascripts/syntaxhighlighter/shBrushVb.js +56 -0
  117. data/guides/assets/javascripts/syntaxhighlighter/shBrushXml.js +69 -0
  118. data/guides/assets/javascripts/syntaxhighlighter/shCore.js +17 -0
  119. data/guides/assets/stylesheets/fixes.css +16 -0
  120. data/guides/assets/stylesheets/main.css +445 -0
  121. data/guides/assets/stylesheets/print.css +52 -0
  122. data/guides/assets/stylesheets/reset.css +43 -0
  123. data/guides/assets/stylesheets/style.css +13 -0
  124. data/guides/assets/stylesheets/syntaxhighlighter/shCore.css +226 -0
  125. data/guides/assets/stylesheets/syntaxhighlighter/shCoreDefault.css +328 -0
  126. data/guides/assets/stylesheets/syntaxhighlighter/shCoreDjango.css +331 -0
  127. data/guides/assets/stylesheets/syntaxhighlighter/shCoreEclipse.css +339 -0
  128. data/guides/assets/stylesheets/syntaxhighlighter/shCoreEmacs.css +324 -0
  129. data/guides/assets/stylesheets/syntaxhighlighter/shCoreFadeToGrey.css +328 -0
  130. data/guides/assets/stylesheets/syntaxhighlighter/shCoreMDUltra.css +324 -0
  131. data/guides/assets/stylesheets/syntaxhighlighter/shCoreMidnight.css +324 -0
  132. data/guides/assets/stylesheets/syntaxhighlighter/shCoreRDark.css +324 -0
  133. data/guides/assets/stylesheets/syntaxhighlighter/shThemeDefault.css +117 -0
  134. data/guides/assets/stylesheets/syntaxhighlighter/shThemeDjango.css +120 -0
  135. data/guides/assets/stylesheets/syntaxhighlighter/shThemeEclipse.css +128 -0
  136. data/guides/assets/stylesheets/syntaxhighlighter/shThemeEmacs.css +113 -0
  137. data/guides/assets/stylesheets/syntaxhighlighter/shThemeFadeToGrey.css +117 -0
  138. data/guides/assets/stylesheets/syntaxhighlighter/shThemeJaxGuides.css +116 -0
  139. data/guides/assets/stylesheets/syntaxhighlighter/shThemeMDUltra.css +113 -0
  140. data/guides/assets/stylesheets/syntaxhighlighter/shThemeMidnight.css +113 -0
  141. data/guides/assets/stylesheets/syntaxhighlighter/shThemeRDark.css +113 -0
  142. data/guides/jax_guides.rb +41 -0
  143. data/guides/jax_guides/common.rb +7 -0
  144. data/guides/jax_guides/generator.rb +287 -0
  145. data/guides/jax_guides/helpers.rb +29 -0
  146. data/guides/jax_guides/indexer.rb +69 -0
  147. data/guides/jax_guides/levenshtein.rb +31 -0
  148. data/guides/jax_guides/textile_extensions.rb +61 -0
  149. data/guides/source/getting_started.textile +1171 -0
  150. data/guides/source/index.html.erb +50 -0
  151. data/guides/source/layout.html.erb +158 -0
  152. data/guides/source/lighting.textile +5 -0
  153. data/guides/source/materials.textile +5 -0
  154. data/guides/source/shaders.textile +5 -0
  155. data/guides/source/testing.textile +5 -0
  156. data/guides/w3c_validator.rb +91 -0
  157. data/jax.gems +1 -0
  158. data/jax.gemspec +40 -0
  159. data/lib/jax.rb +28 -0
  160. data/lib/jax/application.rb +92 -0
  161. data/lib/jax/application/configuration.rb +27 -0
  162. data/lib/jax/generators/app.rb +17 -0
  163. data/lib/jax/generators/app/app_generator.rb +78 -0
  164. data/lib/jax/generators/app/templates/Gemfile.tt +3 -0
  165. data/lib/jax/generators/app/templates/Rakefile +6 -0
  166. data/lib/jax/generators/app/templates/app/controllers/application_controller.js.tt +5 -0
  167. data/lib/jax/generators/app/templates/app/helpers/application_helper.js.tt +3 -0
  168. data/lib/jax/generators/app/templates/app/models/.empty_directory +0 -0
  169. data/lib/jax/generators/app/templates/app/resources/.empty_directory +0 -0
  170. data/lib/jax/generators/app/templates/app/views/.empty_directory +0 -0
  171. data/lib/jax/generators/app/templates/config/application.rb.tt +6 -0
  172. data/lib/jax/generators/app/templates/config/boot.rb +13 -0
  173. data/lib/jax/generators/app/templates/config/routes.rb.tt +5 -0
  174. data/lib/jax/generators/app/templates/public/javascripts/jax.js +7561 -0
  175. data/lib/jax/generators/app/templates/public/webgl_not_supported.html +26 -0
  176. data/lib/jax/generators/app/templates/script/jax +7 -0
  177. data/lib/jax/generators/app/templates/spec/javascripts/controllers/application_controller_spec.js +11 -0
  178. data/lib/jax/generators/app/templates/spec/javascripts/helpers/application_helper_spec.js +12 -0
  179. data/lib/jax/generators/app/templates/spec/javascripts/support/jasmine.yml +90 -0
  180. data/lib/jax/generators/app/templates/spec/javascripts/support/jasmine_config.rb +23 -0
  181. data/lib/jax/generators/app/templates/spec/javascripts/support/jasmine_runner.rb +32 -0
  182. data/lib/jax/generators/app/templates/spec/javascripts/support/spec_helpers/jax_spec_helper.js +216 -0
  183. data/lib/jax/generators/app/templates/spec/javascripts/support/spec_layout.html.erb +63 -0
  184. data/lib/jax/generators/commands.rb +81 -0
  185. data/lib/jax/generators/controller/USAGE +9 -0
  186. data/lib/jax/generators/controller/controller_generator.rb +59 -0
  187. data/lib/jax/generators/controller/templates/controller_source.js.tt +16 -0
  188. data/lib/jax/generators/controller/templates/controller_test.js.tt +11 -0
  189. data/lib/jax/generators/controller/templates/helper.js.tt +3 -0
  190. data/lib/jax/generators/controller/templates/helper_test.js.tt +12 -0
  191. data/lib/jax/generators/controller/templates/view.js.tt +4 -0
  192. data/lib/jax/generators/light_source/USAGE +14 -0
  193. data/lib/jax/generators/light_source/light_source_generator.rb +47 -0
  194. data/lib/jax/generators/light_source/templates/light.yml.tt +39 -0
  195. data/lib/jax/generators/material/USAGE +29 -0
  196. data/lib/jax/generators/material/material_generator.rb +81 -0
  197. data/lib/jax/generators/material/templates/append.yml.tt +7 -0
  198. data/lib/jax/generators/material/templates/material.yml.tt +33 -0
  199. data/lib/jax/generators/model/USAGE +5 -0
  200. data/lib/jax/generators/model/model_generator.rb +42 -0
  201. data/lib/jax/generators/model/templates/model.js.tt +11 -0
  202. data/lib/jax/generators/model/templates/test.js.tt +11 -0
  203. data/lib/jax/generators/script_jax_loader.rb +32 -0
  204. data/lib/jax/monkeypatch/jasmine.rb +3 -0
  205. data/lib/jax/monkeypatch/jasmine/config.rb +21 -0
  206. data/lib/jax/monkeypatch/jasmine/server.rb +50 -0
  207. data/lib/jax/packager.rb +58 -0
  208. data/lib/jax/packager/sprockets_template.rb +49 -0
  209. data/lib/jax/resource_compiler.rb +50 -0
  210. data/lib/jax/routes.rb +61 -0
  211. data/lib/jax/shader.rb +158 -0
  212. data/lib/jax/tasks/rake.rb +34 -0
  213. data/lib/jax/version.rb +12 -0
  214. data/public/images/brickwall.jpg +0 -0
  215. data/public/images/jacks.jpg +0 -0
  216. data/public/images/normal_map.jpg +0 -0
  217. data/public/images/rock.png +0 -0
  218. data/public/images/rockNormal.png +0 -0
  219. data/public/images/rss.png +0 -0
  220. data/public/webgl_not_supported.html +26 -0
  221. data/spec/example_app/Gemfile +1 -0
  222. data/spec/example_app/Rakefile +15 -0
  223. data/spec/example_app/app/controllers/application_controller.js +5 -0
  224. data/spec/example_app/app/controllers/courthouse_controller.js +24 -0
  225. data/spec/example_app/app/controllers/lighting_controller.js +69 -0
  226. data/spec/example_app/app/controllers/shadows_controller.js +130 -0
  227. data/spec/example_app/app/controllers/textures_controller.js +52 -0
  228. data/spec/example_app/app/helpers/application_helper.js +3 -0
  229. data/spec/example_app/app/helpers/textures_helper.js +3 -0
  230. data/spec/example_app/app/models/character.js +23 -0
  231. data/spec/example_app/app/models/door.js +10 -0
  232. data/spec/example_app/app/models/scene.js +19 -0
  233. data/spec/example_app/app/resources/characters/judge.yml +3 -0
  234. data/spec/example_app/app/resources/doors/courthouse_door.yml +5 -0
  235. data/spec/example_app/app/resources/light_sources/directional_light.yml +13 -0
  236. data/spec/example_app/app/resources/light_sources/point_light.yml +31 -0
  237. data/spec/example_app/app/resources/light_sources/spot_light.yml +15 -0
  238. data/spec/example_app/app/resources/light_sources/sun.yml +7 -0
  239. data/spec/example_app/app/resources/light_sources/textures_point.yml +34 -0
  240. data/spec/example_app/app/resources/materials/bricks.yml +36 -0
  241. data/spec/example_app/app/resources/materials/lighting_with_shadows.yml +27 -0
  242. data/spec/example_app/app/resources/scenes/courthouse.yml +4 -0
  243. data/spec/example_app/app/views/courthouse/index.js +4 -0
  244. data/spec/example_app/app/views/lighting/index.js +4 -0
  245. data/spec/example_app/app/views/shadows/index.js +6 -0
  246. data/spec/example_app/app/views/textures/index.js +4 -0
  247. data/spec/example_app/config/application.rb +6 -0
  248. data/spec/example_app/config/boot.rb +13 -0
  249. data/spec/example_app/config/routes.rb +6 -0
  250. data/spec/example_app/public/images/185__normalmap.png +0 -0
  251. data/spec/example_app/public/images/face_norm.jpg +0 -0
  252. data/spec/example_app/public/images/rock.png +0 -0
  253. data/spec/example_app/public/images/rockNormal.png +0 -0
  254. data/spec/example_app/public/images/rss.png +0 -0
  255. data/spec/example_app/public/webgl_not_supported.html +26 -0
  256. data/spec/example_app/script/jax +7 -0
  257. data/spec/example_app/spec/javascripts/controllers/textures_controller_spec.js +11 -0
  258. data/spec/example_app/spec/javascripts/helpers/application_helper_spec.js +12 -0
  259. data/spec/example_app/spec/javascripts/resources/directional_light_spec.js +16 -0
  260. data/spec/example_app/spec/javascripts/resources/point_light_spec.js +17 -0
  261. data/spec/example_app/spec/javascripts/resources/spot_light_spec.js +18 -0
  262. data/spec/example_app/spec/javascripts/support/jasmine.yml +89 -0
  263. data/spec/example_app/spec/javascripts/support/jasmine_runner.rb +32 -0
  264. data/spec/example_app/spec/javascripts/support/spec_helpers/jax_spec_helper.js +93 -0
  265. data/spec/example_app/spec/javascripts/support/spec_layout.html.erb +84 -0
  266. data/spec/generators/app_generator_spec.rb +46 -0
  267. data/spec/generators/controller_generator_spec.rb +68 -0
  268. data/spec/generators/light_generator_spec.rb +51 -0
  269. data/spec/generators/material_generator_spec.rb +35 -0
  270. data/spec/generators/model_generator_spec.rb +43 -0
  271. data/spec/javascripts/Player.js +58 -0
  272. data/spec/javascripts/helpers/SpecHelper.js +216 -0
  273. data/spec/javascripts/jax/builtin/materials/core_materials_spec.js +41 -0
  274. data/spec/javascripts/jax/builtin/materials/dual_paraboloid_spec.js +37 -0
  275. data/spec/javascripts/jax/builtin/materials/fog_spec.js +19 -0
  276. data/spec/javascripts/jax/builtin/materials/lighting_spec.js +19 -0
  277. data/spec/javascripts/jax/builtin/materials/normal_map_spec.js +19 -0
  278. data/spec/javascripts/jax/builtin/materials/shadow_map_spec.js +19 -0
  279. data/spec/javascripts/jax/builtin/materials/texture_spec.js +19 -0
  280. data/spec/javascripts/jax/builtin/meshes/cube_spec.js +10 -0
  281. data/spec/javascripts/jax/builtin/meshes/plane_spec.js +8 -0
  282. data/spec/javascripts/jax/builtin/meshes/quad_spec.js +8 -0
  283. data/spec/javascripts/jax/builtin/meshes/sphere_spec.js +8 -0
  284. data/spec/javascripts/jax/builtin/meshes/teapot_spec.js +8 -0
  285. data/spec/javascripts/jax/builtin/meshes/torus_spec.js +8 -0
  286. data/spec/javascripts/jax/compatibility_spec.js +50 -0
  287. data/spec/javascripts/jax/context_spec.js +82 -0
  288. data/spec/javascripts/jax/controller_spec.js +145 -0
  289. data/spec/javascripts/jax/core/delegation_spec.js +48 -0
  290. data/spec/javascripts/jax/core/events_spec.js +17 -0
  291. data/spec/javascripts/jax/core/matrix_stack_spec.js +28 -0
  292. data/spec/javascripts/jax/core/utils_spec.js +256 -0
  293. data/spec/javascripts/jax/helper_spec.js +33 -0
  294. data/spec/javascripts/jax/model_spec.js +87 -0
  295. data/spec/javascripts/jax/optimizations/material_limitations_spec.js +87 -0
  296. data/spec/javascripts/jax/optimizations/shaders/basic_spec.js +68 -0
  297. data/spec/javascripts/jax/prototype/extensions_spec.js +34 -0
  298. data/spec/javascripts/jax/route_set_spec.js +67 -0
  299. data/spec/javascripts/jax/view_manager_spec.js +17 -0
  300. data/spec/javascripts/jax/webgl/camera_spec.js +159 -0
  301. data/spec/javascripts/jax/webgl/framebuffer_spec.js +46 -0
  302. data/spec/javascripts/jax/webgl/lighting_spec.js +61 -0
  303. data/spec/javascripts/jax/webgl/material_spec.js +118 -0
  304. data/spec/javascripts/jax/webgl/mesh_spec.js +86 -0
  305. data/spec/javascripts/jax/webgl/shader/manifest_spec.js +60 -0
  306. data/spec/javascripts/jax/webgl/shader_chain_spec.js +192 -0
  307. data/spec/javascripts/jax/webgl/shader_spec.js +276 -0
  308. data/spec/javascripts/jax/webgl/tangent_space_spec.js +142 -0
  309. data/spec/javascripts/jax/webgl/texture_spec.js +162 -0
  310. data/spec/javascripts/jax/webgl_spec.js +5 -0
  311. data/spec/javascripts/jax/world_spec.js +88 -0
  312. data/spec/javascripts/jax_spec.js +27 -0
  313. data/spec/javascripts/support/jasmine.yml +85 -0
  314. data/spec/javascripts/support/jasmine_runner.rb +32 -0
  315. data/spec/lib/jax/routes_spec.rb +24 -0
  316. data/spec/lib/jax/shader_spec.rb +57 -0
  317. data/spec/lib/jax/tasks/jax_rake_spec.rb +79 -0
  318. data/spec/spec_helper.rb +11 -0
  319. data/spec/support/file_exist_matcher.rb +23 -0
  320. data/spec/support/spec_shell.rb +97 -0
  321. data/src/jax.js +84 -0
  322. data/src/jax/anim_frame.js +47 -0
  323. data/src/jax/builtin/all.js +7 -0
  324. data/src/jax/builtin/meshes/cube.js +62 -0
  325. data/src/jax/builtin/meshes/plane.js +36 -0
  326. data/src/jax/builtin/meshes/quad.js +80 -0
  327. data/src/jax/builtin/meshes/sphere.js +46 -0
  328. data/src/jax/builtin/meshes/teapot.js +38 -0
  329. data/src/jax/builtin/meshes/torus.js +46 -0
  330. data/src/jax/compatibility.js +140 -0
  331. data/src/jax/context.js +253 -0
  332. data/src/jax/controller.js +157 -0
  333. data/src/jax/core.js +39 -0
  334. data/src/jax/core/math.js +40 -0
  335. data/src/jax/core/matrix_stack.js +306 -0
  336. data/src/jax/core/util.js +226 -0
  337. data/src/jax/events.js +179 -0
  338. data/src/jax/geometry.js +3 -0
  339. data/src/jax/geometry/plane.js +59 -0
  340. data/src/jax/helper.js +8 -0
  341. data/src/jax/model.js +163 -0
  342. data/src/jax/prototype/class.js +78 -0
  343. data/src/jax/prototype/core.js +112 -0
  344. data/src/jax/prototype/extensions.js +124 -0
  345. data/src/jax/route_set.js +125 -0
  346. data/src/jax/vendor/ejs.js +4 -0
  347. data/src/jax/vendor/glMatrix.js +3 -0
  348. data/src/jax/view.js +37 -0
  349. data/src/jax/view_manager.js +46 -0
  350. data/src/jax/webgl.js +98 -0
  351. data/src/jax/webgl/camera.js +526 -0
  352. data/src/jax/webgl/core.js +6 -0
  353. data/src/jax/webgl/core/buffer.js +161 -0
  354. data/src/jax/webgl/core/edge.js +6 -0
  355. data/src/jax/webgl/core/events.js +25 -0
  356. data/src/jax/webgl/core/face.js +8 -0
  357. data/src/jax/webgl/core/framebuffer.js +206 -0
  358. data/src/jax/webgl/material.js +375 -0
  359. data/src/jax/webgl/mesh.js +412 -0
  360. data/src/jax/webgl/scene.js +11 -0
  361. data/src/jax/webgl/scene/frustum.js +260 -0
  362. data/src/jax/webgl/scene/light_manager.js +112 -0
  363. data/src/jax/webgl/scene/light_source.js +248 -0
  364. data/src/jax/webgl/shader.js +282 -0
  365. data/src/jax/webgl/shader/delegator.js +13 -0
  366. data/src/jax/webgl/shader/delegator/attribute.js +53 -0
  367. data/src/jax/webgl/shader/delegator/uniform.js +71 -0
  368. data/src/jax/webgl/shader/manifest.js +64 -0
  369. data/src/jax/webgl/shader/program.js +140 -0
  370. data/src/jax/webgl/shader_chain.js +256 -0
  371. data/src/jax/webgl/texture.js +312 -0
  372. data/src/jax/webgl/world.js +119 -0
  373. data/vendor/ejs/.svn/all-wcprops +17 -0
  374. data/vendor/ejs/.svn/entries +114 -0
  375. data/vendor/ejs/.svn/text-base/Eratta.txt.svn-base +3 -0
  376. data/vendor/ejs/.svn/text-base/license.txt.svn-base +21 -0
  377. data/vendor/ejs/Eratta.txt +3 -0
  378. data/vendor/ejs/example/.svn/all-wcprops +29 -0
  379. data/vendor/ejs/example/.svn/entries +164 -0
  380. data/vendor/ejs/example/.svn/prop-base/ejs.gif.svn-base +5 -0
  381. data/vendor/ejs/example/.svn/text-base/demo.html.svn-base +54 -0
  382. data/vendor/ejs/example/.svn/text-base/ejs.gif.svn-base +0 -0
  383. data/vendor/ejs/example/.svn/text-base/example.css.svn-base +31 -0
  384. data/vendor/ejs/example/.svn/text-base/example.js.svn-base +88 -0
  385. data/vendor/ejs/example/demo.html +54 -0
  386. data/vendor/ejs/example/ejs.gif +0 -0
  387. data/vendor/ejs/example/example.css +31 -0
  388. data/vendor/ejs/example/example.js +88 -0
  389. data/vendor/ejs/lib/.svn/all-wcprops +11 -0
  390. data/vendor/ejs/lib/.svn/entries +62 -0
  391. data/vendor/ejs/lib/.svn/text-base/ejs_fulljslint.js.svn-base +3774 -0
  392. data/vendor/ejs/lib/ejs_fulljslint.js +3774 -0
  393. data/vendor/ejs/license.txt +21 -0
  394. data/vendor/ejs/script/.svn/all-wcprops +17 -0
  395. data/vendor/ejs/script/.svn/entries +96 -0
  396. data/vendor/ejs/script/.svn/prop-base/yuicompressor-2.2.4.jar.svn-base +5 -0
  397. data/vendor/ejs/script/.svn/text-base/production.bat.svn-base +4 -0
  398. data/vendor/ejs/script/.svn/text-base/yuicompressor-2.2.4.jar.svn-base +0 -0
  399. data/vendor/ejs/script/production.bat +4 -0
  400. data/vendor/ejs/script/yuicompressor-2.2.4.jar +0 -0
  401. data/vendor/ejs/src/.svn/all-wcprops +17 -0
  402. data/vendor/ejs/src/.svn/entries +96 -0
  403. data/vendor/ejs/src/.svn/text-base/ejs.js.svn-base +505 -0
  404. data/vendor/ejs/src/.svn/text-base/view.js.svn-base +200 -0
  405. data/vendor/ejs/src/ejs.js +505 -0
  406. data/vendor/ejs/src/view.js +200 -0
  407. data/vendor/ejs/test/.svn/all-wcprops +23 -0
  408. data/vendor/ejs/test/.svn/entries +139 -0
  409. data/vendor/ejs/test/.svn/text-base/index.html.svn-base +18 -0
  410. data/vendor/ejs/test/.svn/text-base/setup_test.html.svn-base +44 -0
  411. data/vendor/ejs/test/.svn/text-base/sidebar.html.svn-base +28 -0
  412. data/vendor/ejs/test/included/.svn/all-wcprops +23 -0
  413. data/vendor/ejs/test/included/.svn/entries +130 -0
  414. data/vendor/ejs/test/included/.svn/text-base/prototype.js.svn-base +4184 -0
  415. data/vendor/ejs/test/included/.svn/text-base/test.css.svn-base +44 -0
  416. data/vendor/ejs/test/included/.svn/text-base/unittest.js.svn-base +564 -0
  417. data/vendor/ejs/test/included/prototype.js +4184 -0
  418. data/vendor/ejs/test/included/test.css +44 -0
  419. data/vendor/ejs/test/included/unittest.js +564 -0
  420. data/vendor/ejs/test/index.html +18 -0
  421. data/vendor/ejs/test/setup_test.html +44 -0
  422. data/vendor/ejs/test/sidebar.html +28 -0
  423. data/vendor/ejs/test/templates/.svn/all-wcprops +11 -0
  424. data/vendor/ejs/test/templates/.svn/entries +62 -0
  425. data/vendor/ejs/test/templates/.svn/text-base/test.ejs.svn-base +3 -0
  426. data/vendor/ejs/test/templates/test.ejs +3 -0
  427. data/vendor/ejs/test/tests/.svn/all-wcprops +23 -0
  428. data/vendor/ejs/test/tests/.svn/entries +130 -0
  429. data/vendor/ejs/test/tests/.svn/text-base/rendering.js.svn-base +94 -0
  430. data/vendor/ejs/test/tests/.svn/text-base/templating.js.svn-base +43 -0
  431. data/vendor/ejs/test/tests/.svn/text-base/views.js.svn-base +100 -0
  432. data/vendor/ejs/test/tests/rendering.js +94 -0
  433. data/vendor/ejs/test/tests/templating.js +43 -0
  434. data/vendor/ejs/test/tests/views.js +100 -0
  435. data/vendor/glmatrix/benchmark/js/CanvasMatrix.js +722 -0
  436. data/vendor/glmatrix/benchmark/js/EWGL_math.js +742 -0
  437. data/vendor/glmatrix/benchmark/js/mjs.js +1230 -0
  438. data/vendor/glmatrix/benchmark/matrix_benchmark.html +419 -0
  439. data/vendor/glmatrix/glMatrix-min.js +32 -0
  440. data/vendor/glmatrix/glMatrix.js +1815 -0
  441. data/vendor/glmatrix/unit tests/glMatrix-test.js +74 -0
  442. data/vendor/glmatrix/unit tests/qunit.css +119 -0
  443. data/vendor/glmatrix/unit tests/qunit.js +1069 -0
  444. data/vendor/glmatrix/unit tests/test_glMatrix.html +21 -0
  445. data/vendor/yuicompressor-2.4.2.jar +0 -0
  446. metadata +748 -0
@@ -0,0 +1,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
+