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,10 @@
1
+ describe("Cube", function() {
2
+ var cube;
3
+
4
+ beforeEach(function() { cube = new Jax.Mesh.Cube() });
5
+
6
+ it("should build successfully", function() {
7
+ var verts = [], colors = [], texes = [], norms = [];
8
+ cube.init(verts, colors, texes, norms);
9
+ });
10
+ });
@@ -0,0 +1,8 @@
1
+ describe("Jax.Mesh.Plane", function() {
2
+ var plane;
3
+
4
+ describe("with no options", function() {
5
+ beforeEach(function() { plane = new Jax.Mesh.Plane(); });
6
+ it("should initialize", function() { });
7
+ });
8
+ });
@@ -0,0 +1,8 @@
1
+ describe("Jax.Mesh.Quad", function() {
2
+ var quad;
3
+
4
+ describe("with no options", function() {
5
+ beforeEach(function() { quad = new Jax.Mesh.Quad(); });
6
+ it("should initialize", function() { });
7
+ });
8
+ });
@@ -0,0 +1,8 @@
1
+ describe("Jax.Mesh.Sphere", function() {
2
+ var sphere;
3
+
4
+ describe("with no options", function() {
5
+ beforeEach(function() { sphere = new Jax.Mesh.Sphere(); });
6
+ it("should initialize", function() { });
7
+ });
8
+ });
@@ -0,0 +1,8 @@
1
+ describe("Jax.Mesh.Teapot", function() {
2
+ var teapot;
3
+
4
+ describe("with no options", function() {
5
+ beforeEach(function() { teapot = new Jax.Mesh.Teapot(); });
6
+ it("should initialize", function() { });
7
+ });
8
+ });
@@ -0,0 +1,8 @@
1
+ describe("Jax.Mesh.Torus", function() {
2
+ var torus;
3
+
4
+ describe("with no options", function() {
5
+ beforeEach(function() { torus = new Jax.Mesh.Torus(); });
6
+ it("should initialize", function() { });
7
+ });
8
+ });
@@ -0,0 +1,50 @@
1
+ describe("LCD Compatibility tests", function() {
2
+ var context;
3
+ beforeEach(function() { context = new Jax.Context('canvas-element'); });
4
+ afterEach(function() { context.dispose(); });
5
+
6
+ /* these tests verify that different aspects of Jax can perform on lowest-common-denominator machines */
7
+
8
+ /*
9
+ From the GL ES SL spec, section 7.8:
10
+
11
+ //
12
+ // Implementation dependent constants. The example values below
13
+ // are the minimum values allowed for these maximums.
14
+ //
15
+
16
+ So, the "basic" shader must define no more than at most the above
17
+ uniforms, varyings, etc. -- or else the basic shader itself may
18
+ fail on some implementations!
19
+
20
+ Jax will dynamically step back from other shader chain elements,
21
+ but if the 'basic' shader exceeds these limits then Jax is out of
22
+ the running entirely on some processors -- not good!
23
+
24
+ TODO add some tests to validate 'basic' shader against the following:
25
+ const mediump int gl_MaxVertexTextureImageUnits = 0;
26
+ const mediump int gl_MaxCombinedTextureImageUnits = 8;
27
+ const mediump int gl_MaxTextureImageUnits = 8;
28
+ const mediump int gl_MaxDrawBuffers = 1;
29
+ */
30
+ describe("Basic shader", function() {
31
+ var matr, shader;
32
+ beforeEach(function() { matr = new Jax.Material(); shader = matr.prepareShader(); });
33
+
34
+ it("should not have more than 16 uniforms", function() {
35
+ // const mediump int gl_MaxVertexUniformVectors = 128;
36
+ // const mediump int gl_MaxFragmentUniformVectors = 16;
37
+ expect(shader.countUniforms(matr)).toBeLessThan(17);
38
+ });
39
+
40
+ it("should not have more than 8 varyings", function() {
41
+ // const mediump int gl_MaxVaryingVectors = 8;
42
+ expect(shader.countVaryings(matr)).toBeLessThan(9);
43
+ });
44
+
45
+ it("should not have more than 8 attribs", function() {
46
+ // const mediump int gl_MaxVertexAttribs = 8;
47
+ expect(shader.countAttributes(matr)).toBeLessThan(9);
48
+ });
49
+ });
50
+ });
@@ -0,0 +1,82 @@
1
+ describe("Jax.Canvas", function() {
2
+ var context;
3
+
4
+ describe("with no routes", function() {
5
+ beforeEach(function() {
6
+ Jax.routes.clear();
7
+ context = new Jax.Context(document.getElementById("canvas-element"));
8
+ });
9
+ afterEach(function() { context.dispose(); });
10
+
11
+ it("should keep a handle to canvas", function() {
12
+ expect(context.canvas.id).toEqual("canvas-element");
13
+ });
14
+
15
+ it("should not be rendering, because there's no root controller", function() {
16
+ expect(context.isRendering()).toBeFalsy();
17
+ });
18
+ });
19
+
20
+ describe("when redirecting", function() {
21
+ beforeEach(function() {
22
+ jasmine.Clock.useMock();
23
+
24
+ Jax.routes.clear();
25
+
26
+ Jax.views.push('one/index', function() { });
27
+ Jax.views.push('two/index', function() { });
28
+
29
+ var one = Jax.Controller.create("one", {index:function() {}});
30
+ var two = Jax.Controller.create("two", {
31
+ index:function() { this.world.addObject(new Jax.Model()); },
32
+ update: function(tc) { }
33
+ });
34
+
35
+ Jax.routes.map("/", one);
36
+ Jax.routes.map("two", two);
37
+
38
+ context = new Jax.Context(document.getElementById("canvas-element"));
39
+ });
40
+
41
+ afterEach(function() { context.dispose(); });
42
+
43
+ it("should dispose the world", function() {
44
+ spyOn(context.world, 'dispose').andCallThrough();
45
+ context.redirectTo("two");
46
+ expect(context.world.dispose).toHaveBeenCalled();
47
+ });
48
+
49
+ it("to a bad route should stop execution of current controller", function() {
50
+ context.redirectTo("two");
51
+ var two_instance = context.current_controller;
52
+
53
+ jasmine.Clock.tick(Jax.update_speed+1);
54
+ expect(function() { context.redirectTo("invalid"); }).toThrow("Route not recognized: 'invalid'");
55
+ expect(context.world.objects.length).toEqual(0);
56
+
57
+ spyOn(two_instance, "update"); // notice we can't do this earlier because it *does* get called above
58
+ jasmine.Clock.tick(Jax.update_speed+1);
59
+ expect(two_instance.update).not.toHaveBeenCalled();
60
+ });
61
+ });
62
+
63
+ describe("with routes", function() {
64
+ var controller;
65
+ var action_called = 0, view_called = 0;
66
+
67
+ beforeEach(function() {
68
+ Jax.routes.clear();
69
+ Jax.routes.root(Jax.Controller.create("welcome", {index: function() { action_called++; }}), "index");
70
+ Jax.views.push("welcome/index", function() {
71
+ this.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
72
+ view_called++;
73
+ });
74
+ context = new Jax.Context(document.getElementById("canvas-element"));
75
+ });
76
+ afterEach(function() { context.dispose(); });
77
+
78
+ it("should be rendering, because there's a controller", function() {
79
+ expect(context.isRendering()).toBeTruthy();
80
+ });
81
+ });
82
+ });
@@ -0,0 +1,145 @@
1
+ describe("Jax.Controller", function() {
2
+ var klass;
3
+ var instance;
4
+
5
+ describe("with an update method", function() {
6
+ var context;
7
+
8
+ beforeEach(function() {
9
+ klass = Jax.Controller.create("welcome", { index: function() { }, update: function(tc) { } });
10
+ Jax.views.push("welcome/index", function() { });
11
+ Jax.routes.map("welcome", klass);
12
+ context = new Jax.Context(document.getElementById('canvas-element'));
13
+ instance = context.redirectTo("welcome");
14
+ spyOn(instance, 'update');
15
+ });
16
+
17
+ it("should be called when the context is updated", function() {
18
+ /*
19
+ we can't really register a callback to setTimeout and check that it was called automatically,
20
+ so we'll have to simulate it by calling Context#update() directly.
21
+ */
22
+ context.update();
23
+ expect(instance.update).toHaveBeenCalled();
24
+ });
25
+ });
26
+
27
+ describe("which does not render or redirect", function() {
28
+ beforeEach(function() {
29
+ klass = Jax.Controller.create("welcome", { index: function() { } });
30
+ instance = new klass();
31
+ });
32
+
33
+ it("should produce the view named after the controller and action names", function() {
34
+ instance.fireAction("index");
35
+ expect(instance.view_key).toEqual("welcome/index");
36
+ });
37
+
38
+ it("should map the route automatically", function() {
39
+ expect(function() { Jax.routes.recognize_route("welcome/index") }).not.toThrow();
40
+ });
41
+ });
42
+
43
+ describe("with event actions", function() {
44
+ var evt;
45
+
46
+ function doMouseEvent(type) {
47
+ /* MouseEvents - click, mousedown, mousemove, mouseout, mouseover, mouseup */
48
+ /* initMouseEvent - type, bubbles, cancelable, windowObject, detail, screenX, screenY, clientX, clientY, ctrlKey,
49
+ * altKey, shiftKey, metaKey, button, relatedTarget */
50
+ evt = document.createEvent('MouseEvents');
51
+ evt.initMouseEvent(type, true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 0, null);
52
+ document.getElementById('canvas-element').dispatchEvent(evt);
53
+ }
54
+
55
+ function doKeyEvent(type) {
56
+ /* UIEvents - DOMActivate, DOMFocusIn, DOMFocusOut */
57
+ /* KeyEvents / UIEvents - keydown, keypress, keyup */
58
+ /* initUIEvent - type, bubbles, cancelable windowObject, detail */
59
+ if (window.KeyEvent && !KeyEvent.fake) {
60
+ evt = document.createEvent('KeyEvents');
61
+ // type, bubbles, cancelable, windowObject, ctrlKey, altKey, shiftKey, metaKey, keyCode, charCode
62
+ evt.initKeyEvent(type, true, true, window, false, false, false, false, 13, 0);
63
+ } else {
64
+ evt = document.createEvent('UIEvents');
65
+ evt.initUIEvent(type, true, true, window, 1);
66
+ evt.keyCode = 13;
67
+ }
68
+ document.getElementById('canvas-element').dispatchEvent(evt);
69
+ }
70
+
71
+ var context;
72
+
73
+ beforeEach(function() {
74
+ var methods = {
75
+ mouse_clicked: function(evt) { },
76
+ mouse_moved: function(evt) { },
77
+ mouse_dragged: function(evt) { },
78
+ mouse_pressed: function(evt) { },
79
+ mouse_exited: function(evt) { },
80
+ mouse_entered: function(evt) { },
81
+ mouse_released: function(evt) { },
82
+ key_typed: function(evt) { },
83
+ key_pressed: function(evt) { },
84
+ key_released: function(evt) { }
85
+ };
86
+ klass.addMethods(methods);
87
+ expect(instance).toHaveMethod("mouse_clicked"); // verify methods were added
88
+ for (var method_name in methods) spyOn(instance, method_name);
89
+ Jax.routes.clear();
90
+ context = new Jax.Context(document.getElementById("canvas-element"));
91
+ context.current_controller = instance;
92
+ });
93
+ afterEach(function() { context.dispose(); });
94
+
95
+ it("should dispatch key pressed events", function() {
96
+ doKeyEvent('keypress');
97
+ expect(instance.key_typed).toHaveBeenCalled();
98
+ });
99
+
100
+ it("should dispatch key released events", function() {
101
+ doKeyEvent('keyup');
102
+ expect(instance.key_released).toHaveBeenCalled();
103
+ });
104
+
105
+ it("should dispatch key down events", function() {
106
+ doKeyEvent('keydown');
107
+ expect(instance.key_pressed).toHaveBeenCalled();
108
+ });
109
+
110
+ it("should dispatch mouse released events", function() {
111
+ doMouseEvent('mouseup');
112
+ expect(instance.mouse_released).toHaveBeenCalled();
113
+ });
114
+ it("should dispatch mouse entered events", function() {
115
+ doMouseEvent('mouseout');
116
+ expect(instance.mouse_exited).toHaveBeenCalled();
117
+ });
118
+ it("should dispatch mouse exited events", function() {
119
+ doMouseEvent('mouseover');
120
+ expect(instance.mouse_entered).toHaveBeenCalled();
121
+ });
122
+
123
+ it("should dispatch mouse pressed events", function() {
124
+ doMouseEvent('mousedown');
125
+ expect(instance.mouse_pressed).toHaveBeenCalled();
126
+ });
127
+
128
+ it("should dispatch mouse dragged events", function() {
129
+ doMouseEvent('mousedown');
130
+ doMouseEvent('mousemove');
131
+ doMouseEvent('mouseup');
132
+ expect(instance.mouse_dragged).toHaveBeenCalled();
133
+ });
134
+
135
+ it("should dispatch mouse moved events", function() {
136
+ doMouseEvent('mousemove');
137
+ expect(instance.mouse_moved).toHaveBeenCalled();
138
+ });
139
+
140
+ it("should dispatch mouse clicked events", function() {
141
+ doMouseEvent('click');
142
+ expect(instance.mouse_clicked).toHaveBeenCalled();
143
+ });
144
+ });
145
+ });
@@ -0,0 +1,48 @@
1
+ describe("Delegation", function() {
2
+ /* see src/jax/prototype/extensions.js */
3
+ var klass;
4
+
5
+ beforeEach(function() { klass = Jax.Class.create({initialize:function(){this.matrix_stack=new Jax.MatrixStack();}}); });
6
+
7
+ it("should delegate via string", function() {
8
+ klass.delegate("getProjectionMatrix", "loadModelMatrix").into("matrix_stack");
9
+
10
+ var src = new klass();
11
+ spyOn(src.matrix_stack, 'getProjectionMatrix');
12
+ spyOn(src.matrix_stack, 'loadModelMatrix');
13
+
14
+ src.getProjectionMatrix();
15
+ src.loadModelMatrix(mat4.create());
16
+
17
+ expect(src.matrix_stack.getProjectionMatrix).toHaveBeenCalled();
18
+ expect(src.matrix_stack.loadModelMatrix).toHaveBeenCalled();
19
+ });
20
+
21
+ it("should delegate via regexp with explicit klass", function() {
22
+ klass.delegate(/^(get|load|mult)(.*)Matrix$/).into("matrix_stack", Jax.MatrixStack);
23
+
24
+ var src = new klass();
25
+ spyOn(src.matrix_stack, 'getProjectionMatrix');
26
+ spyOn(src.matrix_stack, 'loadModelMatrix');
27
+
28
+ src.getProjectionMatrix();
29
+ src.loadModelMatrix(mat4.create());
30
+
31
+ expect(src.matrix_stack.getProjectionMatrix).toHaveBeenCalled();
32
+ expect(src.matrix_stack.loadModelMatrix).toHaveBeenCalled();
33
+ });
34
+
35
+ it("should delegate via regexp without explicit klass", function() {
36
+ klass.delegate(/^(get|load|mult)(.*)Matrix$/).into("matrix_stack");
37
+
38
+ var src = new klass();
39
+ spyOn(src.matrix_stack, 'getProjectionMatrix');
40
+ spyOn(src.matrix_stack, 'loadModelMatrix');
41
+
42
+ src.getProjectionMatrix();
43
+ src.loadModelMatrix(mat4.create());
44
+
45
+ expect(src.matrix_stack.getProjectionMatrix).toHaveBeenCalled();
46
+ expect(src.matrix_stack.loadModelMatrix).toHaveBeenCalled();
47
+ });
48
+ });
@@ -0,0 +1,17 @@
1
+ describe("Jax.Events", function() {
2
+ describe("Methods", function() {
3
+ var instance;
4
+ beforeEach(function() {
5
+ var klass = Jax.Class.create({});
6
+ klass.addMethods(Jax.Events.Methods);
7
+ instance = new klass();
8
+ });
9
+
10
+ it("should pass events to listeners", function() {
11
+ var result = false;
12
+ instance.addEventListener('evt', function(evt) { result = evt; });
13
+ instance.fireEvent('evt', 1);
14
+ expect(result).toBeTruthy();
15
+ });
16
+ });
17
+ });
@@ -0,0 +1,28 @@
1
+ describe("Jax.MatrixStack", function() {
2
+ var stack;
3
+
4
+ beforeEach(function() { stack = new Jax.MatrixStack(); });
5
+
6
+ it('should return a model matrix', function() { expect(stack.getModelMatrix()).not.toBeUndefined(); });
7
+ it('should return a view matrix', function() { expect(stack.getViewMatrix()).not.toBeUndefined(); });
8
+ it('should return a proj matrix', function() { expect(stack.getProjectionMatrix()).not.toBeUndefined(); });
9
+
10
+ describe("with a pushed matrix", function() {
11
+ beforeEach(function() { stack.push(); });
12
+
13
+ it('should return a model matrix', function() { expect(stack.getModelMatrix()).not.toBeUndefined(); });
14
+ it('should return a view matrix', function() { expect(stack.getViewMatrix()).not.toBeUndefined(); });
15
+ it('should return a proj matrix', function() { expect(stack.getProjectionMatrix()).not.toBeUndefined(); });
16
+
17
+ describe("translate", function() {
18
+ beforeEach(function() { stack.loadViewMatrix(mat4.translate(Jax.IDENTITY_MATRIX, [1,1,1], mat4.create())); });
19
+
20
+ it("should not be an identity matrix", function() { expect(stack.getViewMatrix()).not.toEqualMatrix(Jax.IDENTITY_MATRIX); });
21
+
22
+ it("should produce coords relative to eye", function() {
23
+ var vec = mat4.multiplyVec3(stack.getInverseViewMatrix(), [0,0,0]);
24
+ expect(vec).toEqualVector([-1,-1,-1]);
25
+ });
26
+ });
27
+ });
28
+ });
@@ -0,0 +1,256 @@
1
+ describe("Jax.Util", function() {
2
+ describe("vectorize", function() {
3
+ var data;
4
+
5
+ describe("with object with names", function() {
6
+ beforeEach(function() { data = {x:1,y:2,z:3}; });
7
+ it("should produce a vector", function() { expect(Jax.Util.vectorize(data)).toEqualVector([1,2,3]); });
8
+ });
9
+
10
+ describe("with string", function() {
11
+ describe("comma delimited", function() {
12
+ beforeEach(function() { data = "1,2,3"; });
13
+ it("should produce a vector", function() { expect(Jax.Util.vectorize(data)).toEqualVector([1,2,3]); });
14
+ });
15
+ describe("space delimited", function() {
16
+ beforeEach(function() { data = "1 2 3"; });
17
+ it("should produce a vector", function() { expect(Jax.Util.vectorize(data)).toEqualVector([1,2,3]); });
18
+ });
19
+ describe("comma-and-space delimited", function() {
20
+ beforeEach(function() { data = "1, 2, 3"; });
21
+ it("should produce a vector", function() { expect(Jax.Util.vectorize(data)).toEqualVector([1,2,3]); });
22
+ });
23
+ describe("tab delimited", function() {
24
+ beforeEach(function() { data = "1\t2\t3"; });
25
+ it("should produce a vector", function() { expect(Jax.Util.vectorize(data)).toEqualVector([1,2,3]); });
26
+ });
27
+ describe("comma-space-tab delimited", function() {
28
+ beforeEach(function() { data = "1, \t2, \t3"; });
29
+ it("should produce a vector", function() { expect(Jax.Util.vectorize(data)).toEqualVector([1,2,3]); });
30
+ });
31
+ });
32
+
33
+ describe("colorize", function() {
34
+ var data;
35
+
36
+ describe("with object with short names", function() {
37
+ beforeEach(function() { data = {r:1,g:2,b:3,a:4}; });
38
+ it("should produce a color", function() { expect(Jax.Util.colorize(data)).toEqualVector([1,2,3,4]); });
39
+ });
40
+
41
+ describe("with object with long names", function() {
42
+ beforeEach(function() { data = {red:1,green:2,blue:3,alpha:4}; });
43
+ it("should produce a color", function() { expect(Jax.Util.colorize(data)).toEqualVector([1,2,3,4]); });
44
+ });
45
+
46
+ describe("with string", function() {
47
+ describe("comma delimited", function() {
48
+ beforeEach(function() { data = "1,2,3,4"; });
49
+ it("should produce a color", function() { expect(Jax.Util.colorize(data)).toEqualVector([1,2,3,4]); });
50
+ });
51
+ describe("space delimited", function() {
52
+ beforeEach(function() { data = "1 2 3 4"; });
53
+ it("should produce a color", function() { expect(Jax.Util.colorize(data)).toEqualVector([1,2,3,4]); });
54
+ });
55
+ describe("comma-and-space delimited", function() {
56
+ beforeEach(function() { data = "1, 2, 3, 4"; });
57
+ it("should produce a color", function() { expect(Jax.Util.colorize(data)).toEqualVector([1,2,3,4]); });
58
+ });
59
+ describe("tab delimited", function() {
60
+ beforeEach(function() { data = "1\t2\t3\t4"; });
61
+ it("should produce a color", function() { expect(Jax.Util.colorize(data)).toEqualVector([1,2,3,4]); });
62
+ });
63
+ describe("comma-space-tab delimited", function() {
64
+ beforeEach(function() { data = "1, \t2, \t3, \t4"; });
65
+ it("should produce a color", function() { expect(Jax.Util.colorize(data)).toEqualVector([1,2,3,4]); });
66
+ });
67
+ });
68
+
69
+ describe("with object with short names and no alpha", function() {
70
+ beforeEach(function() { data = {r:1,g:2,b:3}; });
71
+ it("should produce a color", function() { expect(Jax.Util.colorize(data)).toEqualVector([1,2,3,1]); });
72
+ });
73
+
74
+ describe("with object with long names and no alpha", function() {
75
+ beforeEach(function() { data = {red:1,green:2,blue:3}; });
76
+ it("should produce a color", function() { expect(Jax.Util.colorize(data)).toEqualVector([1,2,3,1]); });
77
+ });
78
+
79
+ describe("with string", function() {
80
+ describe("comma delimited and no alpha", function() {
81
+ beforeEach(function() { data = "1,2,3"; });
82
+ it("should produce a color", function() { expect(Jax.Util.colorize(data)).toEqualVector([1,2,3,1]); });
83
+ });
84
+ describe("space delimited and no alpha", function() {
85
+ beforeEach(function() { data = "1 2 3"; });
86
+ it("should produce a color", function() { expect(Jax.Util.colorize(data)).toEqualVector([1,2,3,1]); });
87
+ });
88
+ describe("comma-and-space delimited and no alpha", function() {
89
+ beforeEach(function() { data = "1, 2, 3"; });
90
+ it("should produce a color", function() { expect(Jax.Util.colorize(data)).toEqualVector([1,2,3,1]); });
91
+ });
92
+ describe("tab delimited and no alpha", function() {
93
+ beforeEach(function() { data = "1\t2\t3"; });
94
+ it("should produce a color", function() { expect(Jax.Util.colorize(data)).toEqualVector([1,2,3,1]); });
95
+ });
96
+ describe("comma-space-tab delimited and no alpha", function() {
97
+ beforeEach(function() { data = "1, \t2, \t3"; });
98
+ it("should produce a color", function() { expect(Jax.Util.colorize(data)).toEqualVector([1,2,3,1]); });
99
+ });
100
+ });
101
+ });
102
+
103
+ describe("with object with indices", function() {
104
+ beforeEach(function() { data = {0:1,1:2,2:3}; });
105
+ it("should produce a vector", function() { expect(Jax.Util.vectorize(data)).toEqualVector([1,2,3]); });
106
+ });
107
+
108
+ describe("with a vector", function() {
109
+ beforeEach(function() { data = [1,2,3]; });
110
+ it("should produce a vector", function() { expect(Jax.Util.vectorize(data)).toEqualVector([1,2,3]); });
111
+ it("should not return itself", function() { expect(Jax.Util.vectorize(data)).not.toEqual(data); });
112
+ });
113
+ });
114
+
115
+ describe("properties", function() {
116
+ var src;
117
+ beforeEach(function() { src = { prop1: 1, prop2: 2 }; });
118
+ it("should return property names", function() {
119
+ expect(Jax.Util.properties(src)).toEqual(['prop1', 'prop2']);
120
+ });
121
+ });
122
+
123
+ describe("merge", function() {
124
+ var src, dst;
125
+ describe("with a source with null attributes and destination with existing attributes of same name", function() {
126
+ beforeEach(function() { src = {i:null}; dst = {i:5}; Jax.Util.merge(src,dst); });
127
+
128
+ it("should copy null attributes", function() {
129
+ expect(dst.i).toBeNull();
130
+ });
131
+ });
132
+ });
133
+
134
+ describe("sizeofFormat", function() {
135
+ it("should return size of ALPHA", function() { expect(Jax.Util.sizeofFormat(GL_ALPHA)).toEqual(1); });
136
+ it("should return size of LUMINANCE", function() { expect(Jax.Util.sizeofFormat(GL_LUMINANCE)).toEqual(1); });
137
+ it("should return size of RGB", function() { expect(Jax.Util.sizeofFormat(GL_RGB)).toEqual(3); });
138
+ it("should return size of RGBA", function() { expect(Jax.Util.sizeofFormat(GL_RGBA)).toEqual(4); });
139
+ it("should return size of LUMINANCE_ALPHA", function() { expect(Jax.Util.sizeofFormat(GL_LUMINANCE_ALPHA)).toEqual(2); });
140
+ it("should fail", function() { expect(function(){Jax.Util.sizeofFormat(-12345);}).toThrow(); });
141
+ });
142
+
143
+ describe("enumName", function() {
144
+ it("should work", function() {
145
+ expect(Jax.Util.enumName(GL_TEXTURE_2D)).toEqual("GL_TEXTURE_2D");
146
+ });
147
+
148
+ describe("failure", function() {
149
+ it("should contain the decimal form", function() {
150
+ expect(Jax.Util.enumName(36059)).toMatch(/36059/);
151
+ });
152
+
153
+ it("should contain the hex form", function() {
154
+ expect(Jax.Util.enumName(36059)).toMatch(/0x8cdb/);
155
+ });
156
+ });
157
+ });
158
+
159
+ describe("normalizeOptions", function() {
160
+ var normalized;
161
+ describe("with a missing default array", function() {
162
+ var arr = [1,2,3];
163
+ beforeEach(function() { normalized = Jax.Util.normalizeOptions(null, {def:arr}); });
164
+
165
+ it("should copy the default array", function() {
166
+ expect(normalized.def.length).toEqual(arr.length);
167
+ for (var i = 0; i < arr.length; i++)
168
+ expect(normalized.def[i]).toEqual(arr[i]);
169
+ });
170
+ });
171
+
172
+ describe("with only 1 argument", function() {
173
+ it("should clone the argument", function() {
174
+ expect(Jax.Util.normalizeOptions({i:1}).i).toEqual(1);
175
+ });
176
+ });
177
+
178
+ describe("with a gen object left and array right", function() {
179
+ beforeEach(function() { normalized = Jax.Util.normalizeOptions({p:{"x":20,"y":40,"z":60}}, {p:[1,2,3]}); });
180
+ it("should merge both into a gen object", function() {
181
+ expect(Object.isArray(normalized.p)).toBeFalsy();
182
+
183
+ expect(normalized.p.x).toEqual(20);
184
+ expect(normalized.p.y).toEqual(40);
185
+ expect(normalized.p.z).toEqual(60);
186
+ expect(normalized.p[0]).toEqual(1);
187
+ expect(normalized.p[1]).toEqual(2);
188
+ expect(normalized.p[2]).toEqual(3);
189
+ });
190
+ });
191
+
192
+ describe("with a function value that defaults to null", function() {
193
+ beforeEach(function() { normalized = Jax.Util.normalizeOptions({onload:function(){}}, {onload:null}); });
194
+
195
+ it("should assign the function value", function() {
196
+ expect(typeof(normalized.onload)).toEqual("function");
197
+ });
198
+ });
199
+
200
+ describe("with a missing value that defaults to null", function() {
201
+ beforeEach(function() { normalized = Jax.Util.normalizeOptions({}, {onload:null}); });
202
+
203
+ it("should assign the default value", function() {
204
+ expect(normalized.onload).toBeNull();
205
+ });
206
+ });
207
+
208
+ describe("given a klass value", function() {
209
+ beforeEach(function() { normalized = Jax.Util.normalizeOptions({k:new (Jax.Class.create({}))}, {}); });
210
+
211
+ it("should be an instance of that klass", function() {
212
+ expect(normalized.k.klass).not.toBeUndefined();
213
+ expect(normalized.k).toBeKindOf(normalized.k.klass);
214
+ });
215
+ });
216
+
217
+ describe("given values that are not in defaults", function() {
218
+ beforeEach(function() { normalized = Jax.Util.normalizeOptions({m:8,n:{o:9,p:0}}, {i:1,j:{k:2,l:3}}); });
219
+
220
+ it("should contain defaults", function() {
221
+ expect(normalized.i).toEqual(1);
222
+ expect(normalized.j.k).toEqual(2);
223
+ expect(normalized.j.l).toEqual(3);
224
+ });
225
+
226
+ it("should contain customs", function() {
227
+ expect(normalized.m).toEqual(8);
228
+ expect(normalized.n.o).toEqual(9);
229
+ expect(normalized.n.p).toEqual(0);
230
+ });
231
+ });
232
+
233
+ describe("given values that override defaults", function() {
234
+ beforeEach(function() { normalized = Jax.Util.normalizeOptions({i:8,j:{k:9,l:0}}, {i:1,j:{k:2,l:3}}); });
235
+
236
+ it("should copy overrides", function() {
237
+ expect(normalized.i).toEqual(8);
238
+ expect(normalized.j.k).toEqual(9);
239
+ expect(normalized.j.l).toEqual(0);
240
+ });
241
+ });
242
+
243
+ describe("given undefined", function() {
244
+ beforeEach(function() { normalized = Jax.Util.normalizeOptions(undefined, {i:1,j:{k:2,l:3}}); });
245
+
246
+ it("should copy defaults", function() {
247
+ expect(normalized.i).toEqual(1);
248
+ });
249
+
250
+ it("should copy nested defaults", function() {
251
+ expect(normalized.j.k).toEqual(2);
252
+ expect(normalized.j.l).toEqual(3);
253
+ })
254
+ });
255
+ });
256
+ });