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,100 @@
1
+ JMVCTest = {
2
+ APPLICATION_NAME : 'EJS',
3
+ TEST_DESCRIPTION : 'This tests templating',
4
+ perform_test : function() {
5
+ new Test.Unit.Runner({
6
+
7
+ setup: function() {
8
+ this.view = new EJS.Helpers({});
9
+ this.animals = ['sloth', 'bear', 'monkey'];
10
+ },
11
+ teardown: function() {
12
+ },
13
+ test_link_to: function() { with(this) {
14
+ assertEqual( "<a href='/something/here' >hello world</a>",
15
+ this.view.link_to('hello world', '/something/here' ) )
16
+
17
+ var compiled = new EJS({text: "<%= link_to('hello world', '/something/here' ) %>"}).render({}) ;
18
+ assertEqual("<a href='/something/here' >hello world</a>", compiled)
19
+ }},
20
+ test_date_tag: function() { with(this) {
21
+ var date = new Date(2007,10,20,1,1,1,1)
22
+ assertEqual( "<select id=\'Installation[date][year]\' value=\'2007\' name=\'Installation[date][year]\' ><option value=\'1992\' >1992</option><option value=\'1993\' >1993</option><option value=\'1994\' >1994</option><option value=\'1995\' >1995</option><option value=\'1996\' >1996</option><option value=\'1997\' >1997</option><option value=\'1998\' >1998</option><option value=\'1999\' >1999</option><option value=\'2000\' >2000</option><option value=\'2001\' >2001</option><option value=\'2002\' >2002</option><option value=\'2003\' >2003</option><option value=\'2004\' >2004</option><option value=\'2005\' >2005</option><option value=\'2006\' >2006</option><option value=\'2007\' selected=\'selected\' >2007</option><option value=\'2008\' >2008</option><option value=\'2009\' >2009</option><option value=\'2010\' >2010</option><option value=\'2011\' >2011</option><option value=\'2012\' >2012</option><option value=\'2013\' >2013</option><option value=\'2014\' >2014</option><option value=\'2015\' >2015</option><option value=\'2016\' >2016</option><option value=\'2017\' >2017</option><option value=\'2018\' >2018</option><option value=\'2019\' >2019</option><option value=\'2020\' >2020</option><option value=\'2021\' >2021</option></select><select id=\'Installation[date][month]\' value=\'10\' name=\'Installation[date][month]\' ><option value=\'0\' >January</option><option value=\'1\' >February</option><option value=\'2\' >March</option><option value=\'3\' >April</option><option value=\'4\' >May</option><option value=\'5\' >June</option><option value=\'6\' >July</option><option value=\'7\' >August</option><option value=\'8\' >September</option><option value=\'9\' >October</option><option value=\'10\' selected=\'selected\' >November</option><option value=\'11\' >December</option></select><select id=\'Installation[date][day]\' value=\'20\' name=\'Installation[date][day]\' ><option value=\'1\' >1</option><option value=\'2\' >2</option><option value=\'3\' >3</option><option value=\'4\' >4</option><option value=\'5\' >5</option><option value=\'6\' >6</option><option value=\'7\' >7</option><option value=\'8\' >8</option><option value=\'9\' >9</option><option value=\'10\' >10</option><option value=\'11\' >11</option><option value=\'12\' >12</option><option value=\'13\' >13</option><option value=\'14\' >14</option><option value=\'15\' >15</option><option value=\'16\' >16</option><option value=\'17\' >17</option><option value=\'18\' >18</option><option value=\'19\' >19</option><option value=\'20\' selected=\'selected\' >20</option><option value=\'21\' >21</option><option value=\'22\' >22</option><option value=\'23\' >23</option><option value=\'24\' >24</option><option value=\'25\' >25</option><option value=\'26\' >26</option><option value=\'27\' >27</option><option value=\'28\' >28</option><option value=\'29\' >29</option><option value=\'30\' >30</option><option value=\'31\' >31</option></select>",
23
+ this.view.date_tag('Installation[date]', date) )
24
+ }},
25
+ test_form_tag: function() { with(this) {
26
+ assertEqual( "<form action=\'/myaction\' >",
27
+ this.view.form_tag('/myaction') )
28
+ }},
29
+ test_end_form_tag: function() { with(this) {
30
+ assertEqual( "</form>",
31
+ this.view.form_tag_end() )
32
+ }},
33
+ test_hidden_field_tag: function() { with(this) {
34
+ assertEqual( "<input id=\'something[interesting]\' value=\'5\' type=\'hidden\' name=\'something[interesting]\' />",
35
+ this.view.hidden_field_tag('something[interesting]', 5) )
36
+ }},
37
+ test_input_field_tag: function() { with(this) {
38
+ assertEqual( "<input id='something[interesting]' value='5' type='text' name='something[interesting]' />",
39
+ this.view.input_field_tag('something[interesting]', 5) )
40
+ }},
41
+ test_current_page : function(){with (this){
42
+ assert( this.view.is_current_page(window.location.href) );
43
+ assert( this.view.is_current_page(window.location.pathname) );
44
+ assertEqual(false, this.view.is_current_page('juptierit.com') );
45
+ }},
46
+ test_submit_link_to : function(){with (this){
47
+
48
+ assertEqual( "<input onclick='window.location=\"/new/location\";return false;' value='holla' type='submit' >",
49
+ this.view.submit_link_to('holla', '/new/location') )
50
+ }},
51
+ test_link_to_unless : function(){with (this){
52
+ assertEqual( "<a href='/reply' >Reply</a>", this.view.link_to_unless(false, 'Reply', '/reply' ) )
53
+ assertEqual( "Reply", this.view.link_to_unless(true, 'Reply', '/reply' ) )
54
+ }},
55
+ test_link_to_if : function(){with (this){
56
+ assertEqual( "<a href='/reply' >Reply</a>", this.view.link_to_if(true, 'Reply', '/reply' ) )
57
+ assertEqual( "Reply", this.view.link_to_if(false, 'Reply', '/reply' ) )
58
+ }},
59
+ test_link_to_unless_current : function(){with (this){
60
+ assertEqual( "<a href='/reply' >Reply</a>", this.view.link_to_unless_current('Reply', '/reply' ) )
61
+ assertEqual( "Reply", this.view.link_to_unless_current('Reply', window.location.pathname ) )
62
+ }},
63
+ test_password_field_tag : function(){with (this){
64
+ assertEqual( "<input id='something[interesting]' value='5' type='password' name='something[interesting]' />",
65
+ this.view.password_field_tag('something[interesting]', 5) )
66
+ }},
67
+ test_password_field_tag : function(){with (this){
68
+ assertEqual( "<input id='something[interesting]' value='5' type='password' name='something[interesting]' />",
69
+ this.view.password_field_tag('something[interesting]', 5) )
70
+ }},
71
+ test_select_tag : function(){with (this){
72
+ var choices = [ {value: 1, text: 'First Choice' },
73
+ {value: 2, text: 'Second Choice'},
74
+ {value: '3', text: 'Third Choice'} ]
75
+ assertEqual( "<select id='mySelectElement' value='2' name='mySelectElement' ><option value='1' >First Choice</option><option value='2' selected='selected' >Second Choice</option><option value='3' >Third Choice</option></select>",
76
+ this.view.select_tag('mySelectElement', 2, choices) )
77
+ }},
78
+ test_text_area_tag : function(){with (this){
79
+ assertEqual( "<textarea id='task[description]' name='task[description]' cols='50' rows='4' >Here is some text.\nA new line.</textarea>",
80
+ this.view.text_area_tag('task[description]', 'Here is some text.\nA new line.') )
81
+ }},
82
+ test_text_field_tag : function(){with (this){
83
+ assertEqual( "<input id='something[interesting]' value='5' type='text' name='something[interesting]' />",
84
+ this.view.text_field_tag('something[interesting]', 5) )
85
+ }},
86
+ test_text_img_tag : function(){with (this){
87
+ assertEqual( "<img src='/some.png' alt='something' />",
88
+ this.view.img_tag('/some.png', 'something') )
89
+ }},
90
+ test_submit_tag : function(){with (this){
91
+ assertEqual( "<input type=\'submit\' value=\'Submit\' />",
92
+ this.view.submit_tag('Submit') )
93
+ }}
94
+
95
+
96
+ //error
97
+
98
+ }, "testlog");
99
+ }
100
+ }
@@ -0,0 +1,94 @@
1
+ JMVCTest = {
2
+ APPLICATION_NAME : 'EJS',
3
+ TEST_DESCRIPTION : 'This tests ejs',
4
+ perform_test : function() {
5
+ new Test.Unit.Runner({
6
+
7
+ setup: function() {
8
+ this.animals = ['sloth', 'bear', 'monkey']
9
+ this.square_brackets = "<ul>[% this.animals.each(function(animal){%]" +
10
+ "<li>[%= animal %]</li>" +
11
+ "[%});%]</ul>"
12
+ this.square_brackets_no_this = "<ul>[% animals.each(function(animal){%]" +
13
+ "<li>[%= animal %]</li>" +
14
+ "[%});%]</ul>"
15
+ this.angle_brackets_no_this = "<ul><% animals.each(function(animal){%>" +
16
+ "<li><%= animal %></li>" +
17
+ "<%});%></ul>";
18
+ },
19
+ teardown: function() {
20
+ },
21
+ test_render_with_left_bracket: function() { with(this) {
22
+ var compiled = new EJS({text: this.square_brackets, type: '['}).render({animals: this.animals})
23
+ assertEqual("<ul><li>sloth</li><li>bear</li><li>monkey</li></ul>", compiled)
24
+ }},
25
+ test_render_with_process: function() { with(this) {
26
+ var compiled = new EJS({text: this.square_brackets_no_this, type: '['}).render({animals: this.animals}) ;
27
+ assertEqual("<ul><li>sloth</li><li>bear</li><li>monkey</li></ul>", compiled)
28
+ }},
29
+ test_render_with_carrot: function() { with(this) {
30
+ var compiled = new EJS({text: this.angle_brackets_no_this}).render({animals: this.animals}) ;
31
+
32
+ assertEqual("<ul><li>sloth</li><li>bear</li><li>monkey</li></ul>", compiled)
33
+ }},
34
+ test_update : function() { with(this) {
35
+ var compiled = new EJS({text: this.angle_brackets_no_this}).update( 'update_me', {animals: this.animals} );
36
+ assertEqual("<ul><li>sloth</li><li>bear</li><li>monkey</li></ul>", document.getElementById('update_me').innerHTML.toLowerCase().replace(/\r\n/g, '') )
37
+ }},
38
+ test_render_with_double: function() { with(this) {
39
+ var text = "<%% replace_me %>"+
40
+ "<ul><% animals.each(function(animal){%>" +
41
+ "<li><%= animal %></li>" +
42
+ "<%});%></ul>";
43
+ var compiled = new EJS({text: text}).render({animals: this.animals}) ;
44
+ assertEqual("<% replace_me %><ul><li>sloth</li><li>bear</li><li>monkey</li></ul>", compiled)
45
+ }},
46
+ test_render_with_comment: function() { with(this) {
47
+
48
+ var text = "<%# replace_me %>"+
49
+ "<ul><% animals.each(function(animal){%>" +
50
+ "<li><%= animal %></li>" +
51
+ "<%});%></ul>";
52
+ var compiled = new EJS({text: text}).render({animals: this.animals}) ;
53
+ assertEqual("<ul><li>sloth</li><li>bear</li><li>monkey</li></ul>", compiled)
54
+ }},
55
+ test_render_with_double_equal: function() { with(this) {
56
+ var text = "<%%= replace_me %>"+
57
+ "<ul><% animals.each(function(animal){%>" +
58
+ "<li><%= animal %></li>" +
59
+ "<%});%></ul>";
60
+ var compiled = new EJS({text: text}).render({animals: this.animals}) ;
61
+ assertEqual("<%= replace_me %><ul><li>sloth</li><li>bear</li><li>monkey</li></ul>", compiled)
62
+ }},
63
+ test_error_forgot_opening_carrot: function() { with(this) {
64
+
65
+ var text = "<ul><% animals.each(function(animal){%>" +
66
+ "<li> animal %></li>" +
67
+ "<%});%></ul>";
68
+ var compiled = new EJS({text: text}).render({animals: this.animals}) ;
69
+ assertEqual("<ul><li> animal %></li><li> animal %></li><li> animal %></li></ul>", compiled)
70
+ }},
71
+ test_with_elements : function(){with(this){
72
+ var compiled = new EJS({element: 'test_template'}).render({animals: this.animals}) ;
73
+ assertEqual("<ul>\n\t<li>sloth</li>\n\n\t<li>bear</li>\n\n\t<li>monkey</li>\n</ul>", compiled)
74
+
75
+ var compiled = new EJS({element: document.getElementById('test_template') }).render({animals: this.animals}) ;
76
+ assertEqual("<ul>\n\t<li>sloth</li>\n\n\t<li>bear</li>\n\n\t<li>monkey</li>\n</ul>", compiled)
77
+
78
+ }},
79
+ test_error_forgot_closing_carrot: function() { with(this) {
80
+
81
+ var text = "<ul><% animals.each(function(animal){%>\n" +
82
+ "<li><% animal %</li>\n" +
83
+ "<%});%></ul>";
84
+ try{
85
+ var compiled = new EJS({text: text}) ;
86
+ assert(false,'An error should have been reported')
87
+ }catch(e){
88
+ assertEqual(2, e.lineNumber)
89
+ }
90
+ }}
91
+
92
+ }, "testlog");
93
+ }
94
+ }
@@ -0,0 +1,43 @@
1
+ JMVCTest = {
2
+ APPLICATION_NAME : 'EJS',
3
+ TEST_DESCRIPTION : 'This tests templating',
4
+ perform_test : function() {
5
+ new Test.Unit.Runner({
6
+
7
+ setup: function() {
8
+ this.animals = ['sloth', 'bear', 'monkey']
9
+ },
10
+ teardown: function() {
11
+ },
12
+ test_find_and_process: function() { with(this) {
13
+ var result = new EJS({url: 'templates/test.ejs'}).render({animals: this.animals}) ;
14
+ assertEqual("<ul>\n<li>sloth</li>\n\n<li>bear</li>\n\n<li>monkey</li>\n</ul>", result)
15
+
16
+ }},
17
+ test_caching: function() { with(this) {
18
+ // create a basic template to insert
19
+ var ejs = "<%% replace_me %>"+
20
+ "<ul><% animals.each(function(animal){%>" +
21
+ "<li><%= animal %></li>" +
22
+ "<%});%></ul>";
23
+
24
+ EJS.update('templates/test.ejs', new EJS({text: ejs}) )
25
+
26
+ var result = new EJS({url: 'templates/test.ejs'}).render({animals: this.animals}) ;
27
+ assertEqual("<% replace_me %><ul><li>sloth</li><li>bear</li><li>monkey</li></ul>", result)
28
+ }},
29
+ test_template_not_found : function() { with(this) {
30
+ try{
31
+ new EJS({url: 'templates/test_not_found.ejs'}) ;
32
+ assert(false, 'an error should have happened')
33
+ }catch(e){
34
+ assert(true)
35
+ }
36
+
37
+ }}
38
+
39
+ //error
40
+
41
+ }, "testlog");
42
+ }
43
+ }
@@ -0,0 +1,100 @@
1
+ JMVCTest = {
2
+ APPLICATION_NAME : 'EJS',
3
+ TEST_DESCRIPTION : 'This tests templating',
4
+ perform_test : function() {
5
+ new Test.Unit.Runner({
6
+
7
+ setup: function() {
8
+ this.view = new EJS.Helpers({});
9
+ this.animals = ['sloth', 'bear', 'monkey'];
10
+ },
11
+ teardown: function() {
12
+ },
13
+ test_link_to: function() { with(this) {
14
+ assertEqual( "<a href='/something/here' >hello world</a>",
15
+ this.view.link_to('hello world', '/something/here' ) )
16
+
17
+ var compiled = new EJS({text: "<%= link_to('hello world', '/something/here' ) %>"}).render({}) ;
18
+ assertEqual("<a href='/something/here' >hello world</a>", compiled)
19
+ }},
20
+ test_date_tag: function() { with(this) {
21
+ var date = new Date(2007,10,20,1,1,1,1)
22
+ assertEqual( "<select id=\'Installation[date][year]\' value=\'2007\' name=\'Installation[date][year]\' ><option value=\'1992\' >1992</option><option value=\'1993\' >1993</option><option value=\'1994\' >1994</option><option value=\'1995\' >1995</option><option value=\'1996\' >1996</option><option value=\'1997\' >1997</option><option value=\'1998\' >1998</option><option value=\'1999\' >1999</option><option value=\'2000\' >2000</option><option value=\'2001\' >2001</option><option value=\'2002\' >2002</option><option value=\'2003\' >2003</option><option value=\'2004\' >2004</option><option value=\'2005\' >2005</option><option value=\'2006\' >2006</option><option value=\'2007\' selected=\'selected\' >2007</option><option value=\'2008\' >2008</option><option value=\'2009\' >2009</option><option value=\'2010\' >2010</option><option value=\'2011\' >2011</option><option value=\'2012\' >2012</option><option value=\'2013\' >2013</option><option value=\'2014\' >2014</option><option value=\'2015\' >2015</option><option value=\'2016\' >2016</option><option value=\'2017\' >2017</option><option value=\'2018\' >2018</option><option value=\'2019\' >2019</option><option value=\'2020\' >2020</option><option value=\'2021\' >2021</option></select><select id=\'Installation[date][month]\' value=\'10\' name=\'Installation[date][month]\' ><option value=\'0\' >January</option><option value=\'1\' >February</option><option value=\'2\' >March</option><option value=\'3\' >April</option><option value=\'4\' >May</option><option value=\'5\' >June</option><option value=\'6\' >July</option><option value=\'7\' >August</option><option value=\'8\' >September</option><option value=\'9\' >October</option><option value=\'10\' selected=\'selected\' >November</option><option value=\'11\' >December</option></select><select id=\'Installation[date][day]\' value=\'20\' name=\'Installation[date][day]\' ><option value=\'1\' >1</option><option value=\'2\' >2</option><option value=\'3\' >3</option><option value=\'4\' >4</option><option value=\'5\' >5</option><option value=\'6\' >6</option><option value=\'7\' >7</option><option value=\'8\' >8</option><option value=\'9\' >9</option><option value=\'10\' >10</option><option value=\'11\' >11</option><option value=\'12\' >12</option><option value=\'13\' >13</option><option value=\'14\' >14</option><option value=\'15\' >15</option><option value=\'16\' >16</option><option value=\'17\' >17</option><option value=\'18\' >18</option><option value=\'19\' >19</option><option value=\'20\' selected=\'selected\' >20</option><option value=\'21\' >21</option><option value=\'22\' >22</option><option value=\'23\' >23</option><option value=\'24\' >24</option><option value=\'25\' >25</option><option value=\'26\' >26</option><option value=\'27\' >27</option><option value=\'28\' >28</option><option value=\'29\' >29</option><option value=\'30\' >30</option><option value=\'31\' >31</option></select>",
23
+ this.view.date_tag('Installation[date]', date) )
24
+ }},
25
+ test_form_tag: function() { with(this) {
26
+ assertEqual( "<form action=\'/myaction\' >",
27
+ this.view.form_tag('/myaction') )
28
+ }},
29
+ test_end_form_tag: function() { with(this) {
30
+ assertEqual( "</form>",
31
+ this.view.form_tag_end() )
32
+ }},
33
+ test_hidden_field_tag: function() { with(this) {
34
+ assertEqual( "<input id=\'something[interesting]\' value=\'5\' type=\'hidden\' name=\'something[interesting]\' />",
35
+ this.view.hidden_field_tag('something[interesting]', 5) )
36
+ }},
37
+ test_input_field_tag: function() { with(this) {
38
+ assertEqual( "<input id='something[interesting]' value='5' type='text' name='something[interesting]' />",
39
+ this.view.input_field_tag('something[interesting]', 5) )
40
+ }},
41
+ test_current_page : function(){with (this){
42
+ assert( this.view.is_current_page(window.location.href) );
43
+ assert( this.view.is_current_page(window.location.pathname) );
44
+ assertEqual(false, this.view.is_current_page('juptierit.com') );
45
+ }},
46
+ test_submit_link_to : function(){with (this){
47
+
48
+ assertEqual( "<input onclick='window.location=\"/new/location\";return false;' value='holla' type='submit' >",
49
+ this.view.submit_link_to('holla', '/new/location') )
50
+ }},
51
+ test_link_to_unless : function(){with (this){
52
+ assertEqual( "<a href='/reply' >Reply</a>", this.view.link_to_unless(false, 'Reply', '/reply' ) )
53
+ assertEqual( "Reply", this.view.link_to_unless(true, 'Reply', '/reply' ) )
54
+ }},
55
+ test_link_to_if : function(){with (this){
56
+ assertEqual( "<a href='/reply' >Reply</a>", this.view.link_to_if(true, 'Reply', '/reply' ) )
57
+ assertEqual( "Reply", this.view.link_to_if(false, 'Reply', '/reply' ) )
58
+ }},
59
+ test_link_to_unless_current : function(){with (this){
60
+ assertEqual( "<a href='/reply' >Reply</a>", this.view.link_to_unless_current('Reply', '/reply' ) )
61
+ assertEqual( "Reply", this.view.link_to_unless_current('Reply', window.location.pathname ) )
62
+ }},
63
+ test_password_field_tag : function(){with (this){
64
+ assertEqual( "<input id='something[interesting]' value='5' type='password' name='something[interesting]' />",
65
+ this.view.password_field_tag('something[interesting]', 5) )
66
+ }},
67
+ test_password_field_tag : function(){with (this){
68
+ assertEqual( "<input id='something[interesting]' value='5' type='password' name='something[interesting]' />",
69
+ this.view.password_field_tag('something[interesting]', 5) )
70
+ }},
71
+ test_select_tag : function(){with (this){
72
+ var choices = [ {value: 1, text: 'First Choice' },
73
+ {value: 2, text: 'Second Choice'},
74
+ {value: '3', text: 'Third Choice'} ]
75
+ assertEqual( "<select id='mySelectElement' value='2' name='mySelectElement' ><option value='1' >First Choice</option><option value='2' selected='selected' >Second Choice</option><option value='3' >Third Choice</option></select>",
76
+ this.view.select_tag('mySelectElement', 2, choices) )
77
+ }},
78
+ test_text_area_tag : function(){with (this){
79
+ assertEqual( "<textarea id='task[description]' name='task[description]' cols='50' rows='4' >Here is some text.\nA new line.</textarea>",
80
+ this.view.text_area_tag('task[description]', 'Here is some text.\nA new line.') )
81
+ }},
82
+ test_text_field_tag : function(){with (this){
83
+ assertEqual( "<input id='something[interesting]' value='5' type='text' name='something[interesting]' />",
84
+ this.view.text_field_tag('something[interesting]', 5) )
85
+ }},
86
+ test_text_img_tag : function(){with (this){
87
+ assertEqual( "<img src='/some.png' alt='something' />",
88
+ this.view.img_tag('/some.png', 'something') )
89
+ }},
90
+ test_submit_tag : function(){with (this){
91
+ assertEqual( "<input type=\'submit\' value=\'Submit\' />",
92
+ this.view.submit_tag('Submit') )
93
+ }}
94
+
95
+
96
+ //error
97
+
98
+ }, "testlog");
99
+ }
100
+ }
@@ -0,0 +1,722 @@
1
+ /*
2
+ * Copyright (C) 2009 Apple Inc. All Rights Reserved.
3
+ *
4
+ * Redistribution and use in source and binary forms, with or without
5
+ * modification, are permitted provided that the following conditions
6
+ * are met:
7
+ * 1. Redistributions of source code must retain the above copyright
8
+ * notice, this list of conditions and the following disclaimer.
9
+ * 2. Redistributions in binary form must reproduce the above copyright
10
+ * notice, this list of conditions and the following disclaimer in the
11
+ * documentation and/or other materials provided with the distribution.
12
+ *
13
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24
+ */
25
+ /*
26
+ CanvasMatrix4 class
27
+
28
+ This class implements a 4x4 matrix. It has functions which
29
+ duplicate the functionality of the OpenGL matrix stack and
30
+ glut functions.
31
+
32
+ IDL:
33
+
34
+ [
35
+ Constructor(in CanvasMatrix4 matrix), // copy passed matrix into new CanvasMatrix4
36
+ Constructor(in sequence<float> array) // create new CanvasMatrix4 with 16 floats (row major)
37
+ Constructor() // create new CanvasMatrix4 with identity matrix
38
+ ]
39
+ interface CanvasMatrix4 {
40
+ attribute float m11;
41
+ attribute float m12;
42
+ attribute float m13;
43
+ attribute float m14;
44
+ attribute float m21;
45
+ attribute float m22;
46
+ attribute float m23;
47
+ attribute float m24;
48
+ attribute float m31;
49
+ attribute float m32;
50
+ attribute float m33;
51
+ attribute float m34;
52
+ attribute float m41;
53
+ attribute float m42;
54
+ attribute float m43;
55
+ attribute float m44;
56
+
57
+ void load(in CanvasMatrix4 matrix); // copy the values from the passed matrix
58
+ void load(in sequence<float> array); // copy 16 floats into the matrix
59
+ sequence<float> getAsArray(); // return the matrix as an array of 16 floats
60
+ WebGLFloatArray getAsCanvasFloatArray(); // return the matrix as a WebGLFloatArray with 16 values
61
+ void makeIdentity(); // replace the matrix with identity
62
+ void transpose(); // replace the matrix with its transpose
63
+ void invert(); // replace the matrix with its inverse
64
+
65
+ void translate(in float x, in float y, in float z); // multiply the matrix by passed translation values on the right
66
+ void scale(in float x, in float y, in float z); // multiply the matrix by passed scale values on the right
67
+ void rotate(in float angle, // multiply the matrix by passed rotation values on the right
68
+ in float x, in float y, in float z); // (angle is in degrees)
69
+ void multRight(in CanvasMatrix matrix); // multiply the matrix by the passed matrix on the right
70
+ void multLeft(in CanvasMatrix matrix); // multiply the matrix by the passed matrix on the left
71
+ void ortho(in float left, in float right, // multiply the matrix by the passed ortho values on the right
72
+ in float bottom, in float top,
73
+ in float near, in float far);
74
+ void frustum(in float left, in float right, // multiply the matrix by the passed frustum values on the right
75
+ in float bottom, in float top,
76
+ in float near, in float far);
77
+ void perspective(in float fovy, in float aspect, // multiply the matrix by the passed perspective values on the right
78
+ in float zNear, in float zFar);
79
+ void lookat(in float eyex, in float eyey, in float eyez, // multiply the matrix by the passed lookat
80
+ in float ctrx, in float ctry, in float ctrz, // values on the right
81
+ in float upx, in float upy, in float upz);
82
+ }
83
+ */
84
+
85
+ CanvasMatrix4 = function(m)
86
+ {
87
+ if (typeof m == 'object') {
88
+ if ("length" in m && m.length >= 16) {
89
+ this.load(m[0], m[1], m[2], m[3], m[4], m[5], m[6], m[7], m[8], m[9], m[10], m[11], m[12], m[13], m[14], m[15]);
90
+ return;
91
+ }
92
+ else if (m instanceof CanvasMatrix4) {
93
+ this.load(m);
94
+ return;
95
+ }
96
+ }
97
+ this.makeIdentity();
98
+ }
99
+
100
+ CanvasMatrix4.prototype.load = function()
101
+ {
102
+ if (arguments.length == 1 && typeof arguments[0] == 'object') {
103
+ var matrix = arguments[0];
104
+
105
+ if ("length" in matrix && matrix.length == 16) {
106
+ this.m11 = matrix[0];
107
+ this.m12 = matrix[1];
108
+ this.m13 = matrix[2];
109
+ this.m14 = matrix[3];
110
+
111
+ this.m21 = matrix[4];
112
+ this.m22 = matrix[5];
113
+ this.m23 = matrix[6];
114
+ this.m24 = matrix[7];
115
+
116
+ this.m31 = matrix[8];
117
+ this.m32 = matrix[9];
118
+ this.m33 = matrix[10];
119
+ this.m34 = matrix[11];
120
+
121
+ this.m41 = matrix[12];
122
+ this.m42 = matrix[13];
123
+ this.m43 = matrix[14];
124
+ this.m44 = matrix[15];
125
+ return;
126
+ }
127
+
128
+ if (arguments[0] instanceof CanvasMatrix4) {
129
+
130
+ this.m11 = matrix.m11;
131
+ this.m12 = matrix.m12;
132
+ this.m13 = matrix.m13;
133
+ this.m14 = matrix.m14;
134
+
135
+ this.m21 = matrix.m21;
136
+ this.m22 = matrix.m22;
137
+ this.m23 = matrix.m23;
138
+ this.m24 = matrix.m24;
139
+
140
+ this.m31 = matrix.m31;
141
+ this.m32 = matrix.m32;
142
+ this.m33 = matrix.m33;
143
+ this.m34 = matrix.m34;
144
+
145
+ this.m41 = matrix.m41;
146
+ this.m42 = matrix.m42;
147
+ this.m43 = matrix.m43;
148
+ this.m44 = matrix.m44;
149
+ return;
150
+ }
151
+ }
152
+
153
+ this.makeIdentity();
154
+ }
155
+
156
+ CanvasMatrix4.prototype.getAsArray = function()
157
+ {
158
+ return [
159
+ this.m11, this.m12, this.m13, this.m14,
160
+ this.m21, this.m22, this.m23, this.m24,
161
+ this.m31, this.m32, this.m33, this.m34,
162
+ this.m41, this.m42, this.m43, this.m44
163
+ ];
164
+ }
165
+
166
+ CanvasMatrix4.prototype.getAsWebGLFloatArray = function()
167
+ {
168
+ return new WebGLFloatArray(this.getAsArray());
169
+ }
170
+
171
+ CanvasMatrix4.prototype.makeIdentity = function()
172
+ {
173
+ this.m11 = 1;
174
+ this.m12 = 0;
175
+ this.m13 = 0;
176
+ this.m14 = 0;
177
+
178
+ this.m21 = 0;
179
+ this.m22 = 1;
180
+ this.m23 = 0;
181
+ this.m24 = 0;
182
+
183
+ this.m31 = 0;
184
+ this.m32 = 0;
185
+ this.m33 = 1;
186
+ this.m34 = 0;
187
+
188
+ this.m41 = 0;
189
+ this.m42 = 0;
190
+ this.m43 = 0;
191
+ this.m44 = 1;
192
+ }
193
+
194
+ CanvasMatrix4.prototype.transpose = function()
195
+ {
196
+ var tmp = this.m12;
197
+ this.m12 = this.m21;
198
+ this.m21 = tmp;
199
+
200
+ tmp = this.m13;
201
+ this.m13 = this.m31;
202
+ this.m31 = tmp;
203
+
204
+ tmp = this.m14;
205
+ this.m14 = this.m41;
206
+ this.m41 = tmp;
207
+
208
+ tmp = this.m23;
209
+ this.m23 = this.m32;
210
+ this.m32 = tmp;
211
+
212
+ tmp = this.m24;
213
+ this.m24 = this.m42;
214
+ this.m42 = tmp;
215
+
216
+ tmp = this.m34;
217
+ this.m34 = this.m43;
218
+ this.m43 = tmp;
219
+ }
220
+
221
+ CanvasMatrix4.prototype.invert = function()
222
+ {
223
+ // Calculate the 4x4 determinant
224
+ // If the determinant is zero,
225
+ // then the inverse matrix is not unique.
226
+ var det = this._determinant4x4();
227
+
228
+ if (Math.abs(det) < 1e-8)
229
+ return null;
230
+
231
+ this._makeAdjoint();
232
+
233
+ // Scale the adjoint matrix to get the inverse
234
+ this.m11 /= det;
235
+ this.m12 /= det;
236
+ this.m13 /= det;
237
+ this.m14 /= det;
238
+
239
+ this.m21 /= det;
240
+ this.m22 /= det;
241
+ this.m23 /= det;
242
+ this.m24 /= det;
243
+
244
+ this.m31 /= det;
245
+ this.m32 /= det;
246
+ this.m33 /= det;
247
+ this.m34 /= det;
248
+
249
+ this.m41 /= det;
250
+ this.m42 /= det;
251
+ this.m43 /= det;
252
+ this.m44 /= det;
253
+ }
254
+
255
+ CanvasMatrix4.prototype.translate = function(x,y,z)
256
+ {
257
+ if (x == undefined)
258
+ x = 0;
259
+ if (y == undefined)
260
+ y = 0;
261
+ if (z == undefined)
262
+ z = 0;
263
+
264
+ var matrix = new CanvasMatrix4();
265
+ matrix.m41 = x;
266
+ matrix.m42 = y;
267
+ matrix.m43 = z;
268
+
269
+ this.multRight(matrix);
270
+ }
271
+
272
+ CanvasMatrix4.prototype.scale = function(x,y,z)
273
+ {
274
+ if (x == undefined)
275
+ x = 1;
276
+ if (z == undefined) {
277
+ if (y == undefined) {
278
+ y = x;
279
+ z = x;
280
+ }
281
+ else
282
+ z = 1;
283
+ }
284
+ else if (y == undefined)
285
+ y = x;
286
+
287
+ var matrix = new CanvasMatrix4();
288
+ matrix.m11 = x;
289
+ matrix.m22 = y;
290
+ matrix.m33 = z;
291
+
292
+ this.multRight(matrix);
293
+ }
294
+
295
+ CanvasMatrix4.prototype.rotate = function(angle,x,y,z)
296
+ {
297
+ // angles are in degrees. Switch to radians
298
+ angle = angle / 180 * Math.PI;
299
+
300
+ angle /= 2;
301
+ var sinA = Math.sin(angle);
302
+ var cosA = Math.cos(angle);
303
+ var sinA2 = sinA * sinA;
304
+
305
+ // normalize
306
+ var length = Math.sqrt(x * x + y * y + z * z);
307
+ if (length == 0) {
308
+ // bad vector, just use something reasonable
309
+ x = 0;
310
+ y = 0;
311
+ z = 1;
312
+ } else if (length != 1) {
313
+ x /= length;
314
+ y /= length;
315
+ z /= length;
316
+ }
317
+
318
+ var mat = new CanvasMatrix4();
319
+
320
+ // optimize case where axis is along major axis
321
+ if (x == 1 && y == 0 && z == 0) {
322
+ mat.m11 = 1;
323
+ mat.m12 = 0;
324
+ mat.m13 = 0;
325
+ mat.m21 = 0;
326
+ mat.m22 = 1 - 2 * sinA2;
327
+ mat.m23 = 2 * sinA * cosA;
328
+ mat.m31 = 0;
329
+ mat.m32 = -2 * sinA * cosA;
330
+ mat.m33 = 1 - 2 * sinA2;
331
+ mat.m14 = mat.m24 = mat.m34 = 0;
332
+ mat.m41 = mat.m42 = mat.m43 = 0;
333
+ mat.m44 = 1;
334
+ } else if (x == 0 && y == 1 && z == 0) {
335
+ mat.m11 = 1 - 2 * sinA2;
336
+ mat.m12 = 0;
337
+ mat.m13 = -2 * sinA * cosA;
338
+ mat.m21 = 0;
339
+ mat.m22 = 1;
340
+ mat.m23 = 0;
341
+ mat.m31 = 2 * sinA * cosA;
342
+ mat.m32 = 0;
343
+ mat.m33 = 1 - 2 * sinA2;
344
+ mat.m14 = mat.m24 = mat.m34 = 0;
345
+ mat.m41 = mat.m42 = mat.m43 = 0;
346
+ mat.m44 = 1;
347
+ } else if (x == 0 && y == 0 && z == 1) {
348
+ mat.m11 = 1 - 2 * sinA2;
349
+ mat.m12 = 2 * sinA * cosA;
350
+ mat.m13 = 0;
351
+ mat.m21 = -2 * sinA * cosA;
352
+ mat.m22 = 1 - 2 * sinA2;
353
+ mat.m23 = 0;
354
+ mat.m31 = 0;
355
+ mat.m32 = 0;
356
+ mat.m33 = 1;
357
+ mat.m14 = mat.m24 = mat.m34 = 0;
358
+ mat.m41 = mat.m42 = mat.m43 = 0;
359
+ mat.m44 = 1;
360
+ } else {
361
+ var x2 = x*x;
362
+ var y2 = y*y;
363
+ var z2 = z*z;
364
+
365
+ mat.m11 = 1 - 2 * (y2 + z2) * sinA2;
366
+ mat.m12 = 2 * (x * y * sinA2 + z * sinA * cosA);
367
+ mat.m13 = 2 * (x * z * sinA2 - y * sinA * cosA);
368
+ mat.m21 = 2 * (y * x * sinA2 - z * sinA * cosA);
369
+ mat.m22 = 1 - 2 * (z2 + x2) * sinA2;
370
+ mat.m23 = 2 * (y * z * sinA2 + x * sinA * cosA);
371
+ mat.m31 = 2 * (z * x * sinA2 + y * sinA * cosA);
372
+ mat.m32 = 2 * (z * y * sinA2 - x * sinA * cosA);
373
+ mat.m33 = 1 - 2 * (x2 + y2) * sinA2;
374
+ mat.m14 = mat.m24 = mat.m34 = 0;
375
+ mat.m41 = mat.m42 = mat.m43 = 0;
376
+ mat.m44 = 1;
377
+ }
378
+ this.multRight(mat);
379
+ }
380
+
381
+ CanvasMatrix4.prototype.multRight = function(mat)
382
+ {
383
+ var m11 = (this.m11 * mat.m11 + this.m12 * mat.m21
384
+ + this.m13 * mat.m31 + this.m14 * mat.m41);
385
+ var m12 = (this.m11 * mat.m12 + this.m12 * mat.m22
386
+ + this.m13 * mat.m32 + this.m14 * mat.m42);
387
+ var m13 = (this.m11 * mat.m13 + this.m12 * mat.m23
388
+ + this.m13 * mat.m33 + this.m14 * mat.m43);
389
+ var m14 = (this.m11 * mat.m14 + this.m12 * mat.m24
390
+ + this.m13 * mat.m34 + this.m14 * mat.m44);
391
+
392
+ var m21 = (this.m21 * mat.m11 + this.m22 * mat.m21
393
+ + this.m23 * mat.m31 + this.m24 * mat.m41);
394
+ var m22 = (this.m21 * mat.m12 + this.m22 * mat.m22
395
+ + this.m23 * mat.m32 + this.m24 * mat.m42);
396
+ var m23 = (this.m21 * mat.m13 + this.m22 * mat.m23
397
+ + this.m23 * mat.m33 + this.m24 * mat.m43);
398
+ var m24 = (this.m21 * mat.m14 + this.m22 * mat.m24
399
+ + this.m23 * mat.m34 + this.m24 * mat.m44);
400
+
401
+ var m31 = (this.m31 * mat.m11 + this.m32 * mat.m21
402
+ + this.m33 * mat.m31 + this.m34 * mat.m41);
403
+ var m32 = (this.m31 * mat.m12 + this.m32 * mat.m22
404
+ + this.m33 * mat.m32 + this.m34 * mat.m42);
405
+ var m33 = (this.m31 * mat.m13 + this.m32 * mat.m23
406
+ + this.m33 * mat.m33 + this.m34 * mat.m43);
407
+ var m34 = (this.m31 * mat.m14 + this.m32 * mat.m24
408
+ + this.m33 * mat.m34 + this.m34 * mat.m44);
409
+
410
+ var m41 = (this.m41 * mat.m11 + this.m42 * mat.m21
411
+ + this.m43 * mat.m31 + this.m44 * mat.m41);
412
+ var m42 = (this.m41 * mat.m12 + this.m42 * mat.m22
413
+ + this.m43 * mat.m32 + this.m44 * mat.m42);
414
+ var m43 = (this.m41 * mat.m13 + this.m42 * mat.m23
415
+ + this.m43 * mat.m33 + this.m44 * mat.m43);
416
+ var m44 = (this.m41 * mat.m14 + this.m42 * mat.m24
417
+ + this.m43 * mat.m34 + this.m44 * mat.m44);
418
+
419
+ this.m11 = m11;
420
+ this.m12 = m12;
421
+ this.m13 = m13;
422
+ this.m14 = m14;
423
+
424
+ this.m21 = m21;
425
+ this.m22 = m22;
426
+ this.m23 = m23;
427
+ this.m24 = m24;
428
+
429
+ this.m31 = m31;
430
+ this.m32 = m32;
431
+ this.m33 = m33;
432
+ this.m34 = m34;
433
+
434
+ this.m41 = m41;
435
+ this.m42 = m42;
436
+ this.m43 = m43;
437
+ this.m44 = m44;
438
+ }
439
+
440
+ CanvasMatrix4.prototype.multLeft = function(mat)
441
+ {
442
+ var m11 = (mat.m11 * this.m11 + mat.m12 * this.m21
443
+ + mat.m13 * this.m31 + mat.m14 * this.m41);
444
+ var m12 = (mat.m11 * this.m12 + mat.m12 * this.m22
445
+ + mat.m13 * this.m32 + mat.m14 * this.m42);
446
+ var m13 = (mat.m11 * this.m13 + mat.m12 * this.m23
447
+ + mat.m13 * this.m33 + mat.m14 * this.m43);
448
+ var m14 = (mat.m11 * this.m14 + mat.m12 * this.m24
449
+ + mat.m13 * this.m34 + mat.m14 * this.m44);
450
+
451
+ var m21 = (mat.m21 * this.m11 + mat.m22 * this.m21
452
+ + mat.m23 * this.m31 + mat.m24 * this.m41);
453
+ var m22 = (mat.m21 * this.m12 + mat.m22 * this.m22
454
+ + mat.m23 * this.m32 + mat.m24 * this.m42);
455
+ var m23 = (mat.m21 * this.m13 + mat.m22 * this.m23
456
+ + mat.m23 * this.m33 + mat.m24 * this.m43);
457
+ var m24 = (mat.m21 * this.m14 + mat.m22 * this.m24
458
+ + mat.m23 * this.m34 + mat.m24 * this.m44);
459
+
460
+ var m31 = (mat.m31 * this.m11 + mat.m32 * this.m21
461
+ + mat.m33 * this.m31 + mat.m34 * this.m41);
462
+ var m32 = (mat.m31 * this.m12 + mat.m32 * this.m22
463
+ + mat.m33 * this.m32 + mat.m34 * this.m42);
464
+ var m33 = (mat.m31 * this.m13 + mat.m32 * this.m23
465
+ + mat.m33 * this.m33 + mat.m34 * this.m43);
466
+ var m34 = (mat.m31 * this.m14 + mat.m32 * this.m24
467
+ + mat.m33 * this.m34 + mat.m34 * this.m44);
468
+
469
+ var m41 = (mat.m41 * this.m11 + mat.m42 * this.m21
470
+ + mat.m43 * this.m31 + mat.m44 * this.m41);
471
+ var m42 = (mat.m41 * this.m12 + mat.m42 * this.m22
472
+ + mat.m43 * this.m32 + mat.m44 * this.m42);
473
+ var m43 = (mat.m41 * this.m13 + mat.m42 * this.m23
474
+ + mat.m43 * this.m33 + mat.m44 * this.m43);
475
+ var m44 = (mat.m41 * this.m14 + mat.m42 * this.m24
476
+ + mat.m43 * this.m34 + mat.m44 * this.m44);
477
+
478
+ this.m11 = m11;
479
+ this.m12 = m12;
480
+ this.m13 = m13;
481
+ this.m14 = m14;
482
+
483
+ this.m21 = m21;
484
+ this.m22 = m22;
485
+ this.m23 = m23;
486
+ this.m24 = m24;
487
+
488
+ this.m31 = m31;
489
+ this.m32 = m32;
490
+ this.m33 = m33;
491
+ this.m34 = m34;
492
+
493
+ this.m41 = m41;
494
+ this.m42 = m42;
495
+ this.m43 = m43;
496
+ this.m44 = m44;
497
+ }
498
+
499
+ CanvasMatrix4.prototype.ortho = function(left, right, bottom, top, near, far)
500
+ {
501
+ var tx = (left + right) / (left - right);
502
+ var ty = (top + bottom) / (top - bottom);
503
+ var tz = (far + near) / (far - near);
504
+
505
+ var matrix = new CanvasMatrix4();
506
+ matrix.m11 = 2 / (left - right);
507
+ matrix.m12 = 0;
508
+ matrix.m13 = 0;
509
+ matrix.m14 = 0;
510
+ matrix.m21 = 0;
511
+ matrix.m22 = 2 / (top - bottom);
512
+ matrix.m23 = 0;
513
+ matrix.m24 = 0;
514
+ matrix.m31 = 0;
515
+ matrix.m32 = 0;
516
+ matrix.m33 = -2 / (far - near);
517
+ matrix.m34 = 0;
518
+ matrix.m41 = tx;
519
+ matrix.m42 = ty;
520
+ matrix.m43 = tz;
521
+ matrix.m44 = 1;
522
+
523
+ this.multRight(matrix);
524
+ }
525
+
526
+ CanvasMatrix4.prototype.frustum = function(left, right, bottom, top, near, far)
527
+ {
528
+ var matrix = new CanvasMatrix4();
529
+ var A = (right + left) / (right - left);
530
+ var B = (top + bottom) / (top - bottom);
531
+ var C = -(far + near) / (far - near);
532
+ var D = -(2 * far * near) / (far - near);
533
+
534
+ matrix.m11 = (2 * near) / (right - left);
535
+ matrix.m12 = 0;
536
+ matrix.m13 = 0;
537
+ matrix.m14 = 0;
538
+
539
+ matrix.m21 = 0;
540
+ matrix.m22 = 2 * near / (top - bottom);
541
+ matrix.m23 = 0;
542
+ matrix.m24 = 0;
543
+
544
+ matrix.m31 = A;
545
+ matrix.m32 = B;
546
+ matrix.m33 = C;
547
+ matrix.m34 = -1;
548
+
549
+ matrix.m41 = 0;
550
+ matrix.m42 = 0;
551
+ matrix.m43 = D;
552
+ matrix.m44 = 0;
553
+
554
+ this.multRight(matrix);
555
+ }
556
+
557
+ CanvasMatrix4.prototype.perspective = function(fovy, aspect, zNear, zFar)
558
+ {
559
+ var top = Math.tan(fovy * Math.PI / 360) * zNear;
560
+ var bottom = -top;
561
+ var left = aspect * bottom;
562
+ var right = aspect * top;
563
+ this.frustum(left, right, bottom, top, zNear, zFar);
564
+ }
565
+
566
+ CanvasMatrix4.prototype.lookat = function(eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz)
567
+ {
568
+ var matrix = new CanvasMatrix4();
569
+
570
+ // Make rotation matrix
571
+
572
+ // Z vector
573
+ var zx = eyex - centerx;
574
+ var zy = eyey - centery;
575
+ var zz = eyez - centerz;
576
+ var mag = Math.sqrt(zx * zx + zy * zy + zz * zz);
577
+ if (mag) {
578
+ zx /= mag;
579
+ zy /= mag;
580
+ zz /= mag;
581
+ }
582
+
583
+ // Y vector
584
+ var yx = upx;
585
+ var yy = upy;
586
+ var yz = upz;
587
+
588
+ // X vector = Y cross Z
589
+ xx = yy * zz - yz * zy;
590
+ xy = -yx * zz + yz * zx;
591
+ xz = yx * zy - yy * zx;
592
+
593
+ // Recompute Y = Z cross X
594
+ yx = zy * xz - zz * xy;
595
+ yy = -zx * xz + zz * xx;
596
+ yx = zx * xy - zy * xx;
597
+
598
+ // cross product gives area of parallelogram, which is < 1.0 for
599
+ // non-perpendicular unit-length vectors; so normalize x, y here
600
+
601
+ mag = Math.sqrt(xx * xx + xy * xy + xz * xz);
602
+ if (mag) {
603
+ xx /= mag;
604
+ xy /= mag;
605
+ xz /= mag;
606
+ }
607
+
608
+ mag = Math.sqrt(yx * yx + yy * yy + yz * yz);
609
+ if (mag) {
610
+ yx /= mag;
611
+ yy /= mag;
612
+ yz /= mag;
613
+ }
614
+
615
+ matrix.m11 = xx;
616
+ matrix.m12 = xy;
617
+ matrix.m13 = xz;
618
+ matrix.m14 = 0;
619
+
620
+ matrix.m21 = yx;
621
+ matrix.m22 = yy;
622
+ matrix.m23 = yz;
623
+ matrix.m24 = 0;
624
+
625
+ matrix.m31 = zx;
626
+ matrix.m32 = zy;
627
+ matrix.m33 = zz;
628
+ matrix.m34 = 0;
629
+
630
+ matrix.m41 = 0;
631
+ matrix.m42 = 0;
632
+ matrix.m43 = 0;
633
+ matrix.m44 = 1;
634
+ matrix.translate(-eyex, -eyey, -eyez);
635
+
636
+ this.multRight(matrix);
637
+ }
638
+
639
+ // Support functions
640
+ CanvasMatrix4.prototype._determinant2x2 = function(a, b, c, d)
641
+ {
642
+ return a * d - b * c;
643
+ }
644
+
645
+ CanvasMatrix4.prototype._determinant3x3 = function(a1, a2, a3, b1, b2, b3, c1, c2, c3)
646
+ {
647
+ return a1 * this._determinant2x2(b2, b3, c2, c3)
648
+ - b1 * this._determinant2x2(a2, a3, c2, c3)
649
+ + c1 * this._determinant2x2(a2, a3, b2, b3);
650
+ }
651
+
652
+ CanvasMatrix4.prototype._determinant4x4 = function()
653
+ {
654
+ var a1 = this.m11;
655
+ var b1 = this.m12;
656
+ var c1 = this.m13;
657
+ var d1 = this.m14;
658
+
659
+ var a2 = this.m21;
660
+ var b2 = this.m22;
661
+ var c2 = this.m23;
662
+ var d2 = this.m24;
663
+
664
+ var a3 = this.m31;
665
+ var b3 = this.m32;
666
+ var c3 = this.m33;
667
+ var d3 = this.m34;
668
+
669
+ var a4 = this.m41;
670
+ var b4 = this.m42;
671
+ var c4 = this.m43;
672
+ var d4 = this.m44;
673
+
674
+ return a1 * this._determinant3x3(b2, b3, b4, c2, c3, c4, d2, d3, d4)
675
+ - b1 * this._determinant3x3(a2, a3, a4, c2, c3, c4, d2, d3, d4)
676
+ + c1 * this._determinant3x3(a2, a3, a4, b2, b3, b4, d2, d3, d4)
677
+ - d1 * this._determinant3x3(a2, a3, a4, b2, b3, b4, c2, c3, c4);
678
+ }
679
+
680
+ CanvasMatrix4.prototype._makeAdjoint = function()
681
+ {
682
+ var a1 = this.m11;
683
+ var b1 = this.m12;
684
+ var c1 = this.m13;
685
+ var d1 = this.m14;
686
+
687
+ var a2 = this.m21;
688
+ var b2 = this.m22;
689
+ var c2 = this.m23;
690
+ var d2 = this.m24;
691
+
692
+ var a3 = this.m31;
693
+ var b3 = this.m32;
694
+ var c3 = this.m33;
695
+ var d3 = this.m34;
696
+
697
+ var a4 = this.m41;
698
+ var b4 = this.m42;
699
+ var c4 = this.m43;
700
+ var d4 = this.m44;
701
+
702
+ // Row column labeling reversed since we transpose rows & columns
703
+ this.m11 = this._determinant3x3(b2, b3, b4, c2, c3, c4, d2, d3, d4);
704
+ this.m21 = - this._determinant3x3(a2, a3, a4, c2, c3, c4, d2, d3, d4);
705
+ this.m31 = this._determinant3x3(a2, a3, a4, b2, b3, b4, d2, d3, d4);
706
+ this.m41 = - this._determinant3x3(a2, a3, a4, b2, b3, b4, c2, c3, c4);
707
+
708
+ this.m12 = - this._determinant3x3(b1, b3, b4, c1, c3, c4, d1, d3, d4);
709
+ this.m22 = this._determinant3x3(a1, a3, a4, c1, c3, c4, d1, d3, d4);
710
+ this.m32 = - this._determinant3x3(a1, a3, a4, b1, b3, b4, d1, d3, d4);
711
+ this.m42 = this._determinant3x3(a1, a3, a4, b1, b3, b4, c1, c3, c4);
712
+
713
+ this.m13 = this._determinant3x3(b1, b2, b4, c1, c2, c4, d1, d2, d4);
714
+ this.m23 = - this._determinant3x3(a1, a2, a4, c1, c2, c4, d1, d2, d4);
715
+ this.m33 = this._determinant3x3(a1, a2, a4, b1, b2, b4, d1, d2, d4);
716
+ this.m43 = - this._determinant3x3(a1, a2, a4, b1, b2, b4, c1, c2, c4);
717
+
718
+ this.m14 = - this._determinant3x3(b1, b2, b3, c1, c2, c3, d1, d2, d3);
719
+ this.m24 = this._determinant3x3(a1, a2, a3, c1, c2, c3, d1, d2, d3);
720
+ this.m34 = - this._determinant3x3(a1, a2, a3, b1, b2, b3, d1, d2, d3);
721
+ this.m44 = this._determinant3x3(a1, a2, a3, b1, b2, b3, c1, c2, c3);
722
+ }