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,6 @@
1
+ Jax.Core = {};
2
+
3
+ //= require "core/face"
4
+ //= require "core/edge"
5
+ //= require "core/buffer"
6
+ //= require "core/framebuffer"
@@ -0,0 +1,161 @@
1
+ /**
2
+ * class Jax.Buffer
3
+ *
4
+ * Root class of all WebGL buffer objects.
5
+ *
6
+ * Wrapper to manage JS and GL buffer (array) types. Automates context juggling by requiring the context to generate the
7
+ * buffer for as an argument to #bind. If the context doesn't have a corresponding GL buffer for this data, it will be
8
+ * created. Calling #refresh will regenerate the buffer data for all contexts.
9
+ *
10
+ **/
11
+ Jax.Buffer = (function() {
12
+ function each_gl_buffer(self, func)
13
+ {
14
+ for (var id in self.gl)
15
+ func(self.gl[id].context, self.gl[id].buffer);
16
+ }
17
+
18
+ return Jax.Class.create({
19
+ initialize: function(bufferType, classType, drawType, jsarr, itemSize) {
20
+ if (jsarr.length == 0) throw new Error("No elements in array to be buffered!");
21
+ if (!itemSize) throw new Error("Expected an itemSize - how many JS array elements represent a single buffered element?");
22
+ this.classType = classType;
23
+ this.itemSize = itemSize;
24
+ this.js = jsarr;
25
+ this.gl = {};
26
+ this.numItems = this.length = jsarr.length / itemSize;
27
+ this.bufferType = bufferType;
28
+ this.drawType = drawType;
29
+ },
30
+
31
+ refresh: function() {
32
+ var self = this;
33
+ if (self.classTypeInstance)
34
+ for (var i = 0; i < self.js.length; i++)
35
+ self.classTypeInstance[i] = self.js[i];
36
+ else
37
+ self.classTypeInstance = new self.classType(self.js);
38
+
39
+ self.numItems = self.length = self.js.length / self.itemSize;
40
+ if (!self.gl) return;
41
+
42
+ each_gl_buffer(self, function(context, buffer) {
43
+ buffer.numItems = buffer.length = self.js.length;
44
+ context.glBindBuffer(self.bufferType, buffer);
45
+ context.glBufferData(self.bufferType, self.classTypeInstance, self.drawType);
46
+ });
47
+ },
48
+
49
+ dispose: function() {
50
+ var self = this;
51
+ each_gl_buffer(this, function(context, buffer) {
52
+ context.glDeleteBuffer(buffer);
53
+ self.gl[context.id] = null;
54
+ });
55
+ self.gl = {};
56
+ },
57
+
58
+ isDisposed: function() { return !this.gl; },
59
+
60
+ bind: function(context) { context.glBindBuffer(this.bufferType, this.getGLBuffer(context)); },
61
+
62
+ getGLBuffer: function(context)
63
+ {
64
+ if (!context || typeof(context.id) == "undefined")
65
+ throw new Error("Cannot build a buffer without a context!");
66
+
67
+ if (!this.gl[context.id])
68
+ {
69
+ var buffer = context.glCreateBuffer();
70
+ buffer.itemSize = this.itemSize;
71
+ this.gl[context.id] = {context:context,buffer:buffer};
72
+ this.refresh();
73
+ }
74
+ return this.gl[context.id].buffer;
75
+ }
76
+ });
77
+ })();
78
+
79
+ /**
80
+ * class Jax.ElementArrayBuffer < Jax.Buffer
81
+ *
82
+ * A generic Int16 Array. Initialized with a standard JavaScript Array argument.
83
+ * Its item size is 1, so each element in the array represents a separate datum,
84
+ *
85
+ * This type of buffer is commonly used for vertex indices, etc.
86
+ *
87
+ * Example:
88
+ * var buf = new Jax.ElementArrayBuffer([...]);
89
+ **/
90
+ Jax.ElementArrayBuffer = Jax.Class.create(Jax.Buffer, {
91
+ initialize: function($super, jsarr) {
92
+ $super(GL_ELEMENT_ARRAY_BUFFER, Uint16Array, GL_STREAM_DRAW, jsarr, 1);
93
+ }
94
+ });
95
+
96
+ /**
97
+ * class Jax.FloatArrayBuffer < Jax.Buffer
98
+ *
99
+ * A generic Float Array. Initialized with a standard JavaScript Array argument,
100
+ * and an item size. As the item size represents how many array elements represent
101
+ * a single datum, the array must be divisible by this number.
102
+ *
103
+ * Unless you're implementing something Jax does not support by default, you're
104
+ * most likely looking for one of the subclasses of Jax.FloatArrayBuffer.
105
+ *
106
+ * Example:
107
+ * var buf = new Jax.FloatArrayBuffer([...], 3);
108
+ **/
109
+ Jax.FloatArrayBuffer = Jax.Class.create(Jax.Buffer, {
110
+ initialize: function($super, jsarr, itemSize) {
111
+ $super(GL_ARRAY_BUFFER, Float32Array, GL_STATIC_DRAW, jsarr, itemSize);
112
+ }
113
+ });
114
+
115
+ /**
116
+ * class Jax.VertexBuffer < Jax.FloatArrayBuffer
117
+ *
118
+ * Initialized with a standard JavaScript Array argument.
119
+ *
120
+ * Example:
121
+ * var buf = new Jax.VertexBuffer([...]);
122
+ **/
123
+ Jax.VertexBuffer = Jax.Class.create(Jax.FloatArrayBuffer, {
124
+ initialize: function($super, jsarr) { $super(jsarr, 3); }
125
+ });
126
+
127
+ /**
128
+ * class Jax.ColorBuffer < Jax.FloatArrayBuffer
129
+ *
130
+ * Initialized with a standard JavaScript Array argument.
131
+ *
132
+ * Example:
133
+ * var buf = new Jax.ColorBuffer([...]);
134
+ **/
135
+ Jax.ColorBuffer = Jax.Class.create(Jax.FloatArrayBuffer, {
136
+ initialize: function($super, jsarr) { $super(jsarr, 4); }
137
+ });
138
+
139
+ /**
140
+ * class Jax.TextureCoordsBuffer < Jax.FloatArrayBuffer
141
+ *
142
+ * Initialized with a standard JavaScript Array argument.
143
+ *
144
+ * Example:
145
+ * var buf = new Jax.TextureCoordsBuffer([...]);
146
+ **/
147
+ Jax.TextureCoordsBuffer = Jax.Class.create(Jax.FloatArrayBuffer, {
148
+ initialize: function($super, jsarr) { $super(jsarr, 2); }
149
+ });
150
+
151
+ /**
152
+ * class Jax.NormalBuffer < Jax.FloatArrayBuffer
153
+ *
154
+ * Initialized with a standard JavaScript Array argument.
155
+ *
156
+ * Example:
157
+ * var buf = new Jax.NormalBuffer([...]);
158
+ **/
159
+ Jax.NormalBuffer = Jax.Class.create(Jax.FloatArrayBuffer, {
160
+ initialize: function($super, jsarr) { $super(jsarr, 3); }
161
+ });
@@ -0,0 +1,6 @@
1
+ Jax.Core.Edge = Jax.Class.create({
2
+ initialize: function() {
3
+ this.faceIndices = [];
4
+ this.vertexIndices = [];
5
+ }
6
+ });
@@ -0,0 +1,25 @@
1
+ Jax.Events = (function() {
2
+ return {
3
+ Methods: {
4
+ getEventListeners: function(name) {
5
+ this.event_listeners = this.event_listeners || {};
6
+ return this.event_listeners[name] = this.event_listeners[name] || [];
7
+ },
8
+
9
+ addEventListener: function(name, callback) {
10
+ this.getEventListeners(name).push(callback);
11
+ return this.getEventListeners(name).length - 1;
12
+ },
13
+
14
+ removeEventListener: function(name, index) {
15
+ this.getEventListeners(name).splice(index, 1);
16
+ },
17
+
18
+ fireEvent: function(name, event_object) {
19
+ var listeners = this.getEventListeners(name);
20
+ for (var i = 0; i < listeners.length; i++)
21
+ listeners[i].call(this, event_object);
22
+ }
23
+ }
24
+ };
25
+ })();
@@ -0,0 +1,8 @@
1
+ Jax.Core.Face = Jax.Class.create({
2
+ initialize: function(vertexIndices) {
3
+ if (arguments.length > 1)
4
+ this.vertexIndices = vec3.create(arguments);
5
+ else if (vertexIndices)
6
+ this.vertexIndices = vec3.create(vertexIndices);
7
+ }
8
+ });
@@ -0,0 +1,206 @@
1
+ Jax.Framebuffer = (function() {
2
+ function build(context, self) {
3
+ var handle = context.glCreateFramebuffer();
4
+ var width = self.options.width, height = self.options.height;
5
+
6
+ self.setHandle(context, handle);
7
+ context.glBindFramebuffer(GL_FRAMEBUFFER, handle);
8
+
9
+ // depth and stencil attachment
10
+ if (self.options.depth && self.options.stencil) {
11
+ handle.depthstencilbuffer = context.glCreateRenderbuffer();
12
+ context.glBindRenderbuffer(GL_RENDERBUFFER, handle.depthstencilbuffer);
13
+ context.glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_STENCIL, width, height);
14
+ context.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, handle.depthstencilbuffer);
15
+ context.glBindRenderbuffer(GL_RENDERBUFFER, null);
16
+ }
17
+
18
+ // depth attachment
19
+ if (self.options.depth && !self.options.stencil) {
20
+ handle.depthbuffer = context.glCreateRenderbuffer();
21
+ context.glBindRenderbuffer(GL_RENDERBUFFER, handle.depthbuffer);
22
+ context.glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width, height);
23
+ context.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, handle.depthbuffer);
24
+ context.glBindRenderbuffer(GL_RENDERBUFFER, null);
25
+ }
26
+
27
+ // stencil attachment
28
+ if (self.options.stencil && !self.options.depth) {
29
+ handle.stencilbuffer = context.glCreateRenderbuffer();
30
+ context.glBindRenderbuffer(GL_RENDERBUFFER, handle.stencilbuffer);
31
+ context.glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, width, height);
32
+ context.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, handle.stencilbuffer);
33
+ context.glBindRenderbuffer(GL_RENDERBUFFER, null);
34
+ }
35
+
36
+ // texture attachments
37
+ handle.textures = [];
38
+ var attachment = GL_COLOR_ATTACHMENT0;
39
+ for (var i = 0; i < self.options.colors.length; i++) {
40
+ var format = self.options.colors[i];
41
+ var texture_options = {
42
+ format:GL_RGBA,
43
+ width:width,
44
+ height:height,
45
+ min_filter:GL_LINEAR,
46
+ mag_filter:GL_LINEAR,
47
+ wrap_s:GL_CLAMP_TO_EDGE,
48
+ wrap_t:GL_CLAMP_TO_EDGE,
49
+ generate_mipmap:false
50
+ };
51
+ if (typeof(format) != "number") { texture_options = Jax.Util.normalizeOptions(format, texture_options); }
52
+ else { texture_options.format = format; }
53
+ handle.textures[i] = new Jax.Texture(texture_options);
54
+
55
+ if (handle.textures[i].getTarget() == GL_TEXTURE_2D)
56
+ context.glFramebufferTexture2D(GL_FRAMEBUFFER, attachment, GL_TEXTURE_2D, handle.textures[i].getHandle(context), 0);
57
+ else
58
+ context.glFramebufferTexture2D(GL_FRAMEBUFFER, attachment, GL_TEXTURE_CUBE_MAP_POSITIVE_X,
59
+ handle.textures[i].getHandle(context), 0);
60
+
61
+ attachment++;
62
+ }
63
+
64
+ checkStatus(context, self);
65
+ }
66
+
67
+ function checkStatus(context, self) {
68
+ var status = context.glCheckFramebufferStatus(GL_FRAMEBUFFER);
69
+ self.unbind(context);
70
+ switch(status) {
71
+ case GL_FRAMEBUFFER_COMPLETE:
72
+ // success!
73
+ break;
74
+ case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
75
+ throw new Error("Jax.Framebuffer: one or more attachments is incomplete. (GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT)");
76
+ case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
77
+ throw new Error("Jax.Framebuffer: there are no images attached to the framebuffer. (GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT)");
78
+ case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS:
79
+ throw new Error("Jax.Framebuffer: all attachments must have the same dimensions. (GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS)");
80
+ case GL_FRAMEBUFFER_UNSUPPORTED:
81
+ throw new Error("Jax.Framebuffer: the requested framebuffer layout is unsupported on this hardware. (GL_FRAMEBUFFER_UNSUPPORTED)");
82
+ case (window['GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER'] || 0x8cdb):
83
+ // a cryptic error that is not in the WebGL spec. Took me way too long to figure this out and I'm still not
84
+ // sure why it happens...
85
+ // but it seems to crop up primarily when no textures are attached.
86
+ // from opengl (not webgl) spec: The value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT must not be NONE for any
87
+ // color attachment point(s) named by DRAW_BUFFER.
88
+ throw new Error("Jax.Framebuffer: make sure the framebuffer has at least 1 texture attachment. (GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER)");
89
+ default:
90
+ var which;
91
+ for (which in context.gl)
92
+ if (context.gl[which] == status)
93
+ throw new Error("Jax.Framebuffer: an unknown error occurred. ("+status+" - "+which+")");
94
+ throw new Error("Jax.Framebuffer: an unknown error occurred. ("+status+")");
95
+ }
96
+ }
97
+
98
+ return Jax.Class.create({
99
+ /**
100
+ * new Jax.Framebuffer([options])
101
+ * - options (Object): a generic object containing the following optional properties:
102
+ *
103
+ * * colors: an array of color formats such as GL_RGBA, GL_RGB, etc. The _colors_ array may
104
+ * be empty if no color attachments are needed. Defaults to [GL_RGBA] unless _color_
105
+ * is specified.
106
+ *
107
+ * Alternatively, an options object can be used. This object will be passed into
108
+ * Jax.Texture().
109
+ *
110
+ * * color: optionally, in place of a colors array, a single color format as above. If both
111
+ * _color_ and _colors_ are specified, _color_ is simply added to the _colors_ array.
112
+ * * depth: true if a depth attachment is required, false otherwise.
113
+ * * stencil: true if a stencil attachment is required, false otherwise.
114
+ * * width: the width of the render and color buffers. All render and color buffers for a given
115
+ * framebuffer must have the same width. Defaults to 2048.
116
+ * * height: the height of the render and color buffers. All render and color buffers for a given
117
+ * framebuffer must have the same height. Defaults to 2048.
118
+ *
119
+ **/
120
+ initialize: function(options) {
121
+ var defaults = {
122
+ depth: false,
123
+ stencil: false,
124
+ width:512,
125
+ height:512
126
+ };
127
+ if (!(options && (options.color || options.colors))) defaults.colors = [GL_RGBA];
128
+
129
+ this.handles = {};
130
+ this.options = options = Jax.Util.normalizeOptions(options, defaults);
131
+ if (options.color != undefined) {
132
+ if (options.colors != undefined) options.colors.push(options.color);
133
+ else options.colors = [options.color];
134
+ delete options.color;
135
+ }
136
+ },
137
+
138
+ /**
139
+ * Jax.Framebuffer#cubeFace(context, texIndex, faceEnum[, callback]) -> Jax.Framebuffer
140
+ * - context (Jax.Context): a Jax context
141
+ * - texIndex (number): the index of the cube map texture
142
+ * - faceEnum (enum): the cube map face to bind
143
+ * - callback (function): an optional callback. If given, the framebuffer will be automatically unbound
144
+ * after the callback returns. Otherwise, the framebuffer will remain bound.
145
+ *
146
+ * For cube map framebuffers only, this will bind the specified cube map face to its color buffer position.
147
+ * The faceEnum can be any of the following face enums:
148
+ *
149
+ * 0: GL_TEXTURE_CUBE_MAP_POSITIVE_X
150
+ * 1: GL_TEXTURE_CUBE_MAP_NEGATIVE_X
151
+ * 2: GL_TEXTURE_CUBE_MAP_POSITIVE_Y
152
+ * 3: GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
153
+ * 4: GL_TEXTURE_CUBE_MAP_POSITIVE_Z
154
+ * 5: GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
155
+ *
156
+ * Example:
157
+ *
158
+ * fb.bindCubeFace(context, 0, GL_TEXTURE_CUBE_MAP_POSITIVE_X, function() {
159
+ * // render to +X cube face
160
+ * });
161
+ * fb.bindCubeFace(context, 0, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, function() {
162
+ * // render to -Z cube face
163
+ * });
164
+ **/
165
+ bindCubeFace: function(context, texIndex, faceEnum, callback) {
166
+ if (!this.getHandle(context)) build(context, this);
167
+ var texture = this.getHandle(context).textures[texIndex];
168
+ if (texture.options.target != GL_TEXTURE_CUBE_MAP)
169
+ throw new Error("Texture at index "+texIndex+" is not a cube map!");
170
+
171
+ this.bind(context);
172
+ context.glFramebufferTexture2D(GL_FRAMEBUFFER, window['GL_COLOR_ATTACHMENT'+texIndex],
173
+ faceEnum, texture.getHandle(context), 0);
174
+
175
+ if (callback) {
176
+ callback();
177
+ this.unbind(context);
178
+ }
179
+ },
180
+
181
+ bind: function(context, callback) {
182
+ if (!this.getHandle(context)) build(context, this);
183
+ context.glBindFramebuffer(GL_FRAMEBUFFER, this.getHandle(context));
184
+
185
+
186
+ if (callback) {
187
+ callback.call(this);
188
+ this.unbind(context);
189
+ }
190
+ },
191
+
192
+ unbind: function(context) {
193
+ context.glBindFramebuffer(GL_FRAMEBUFFER, null);
194
+ },
195
+
196
+ viewport: function(context) {
197
+ context.glViewport(0,0,this.options.width,this.options.height);
198
+ },
199
+
200
+ getTextureBuffer: function(context, index) { return this.getHandle(context) && this.getHandle(context).textures[index]; },
201
+ getTextureBufferHandle: function(context, index) { return this.getTextureBuffer().getHandle(context); },
202
+
203
+ getHandle: function(context) { return this.handles[context.id]; },
204
+ setHandle: function(context, handle) { this.handles[context.id] = handle; }
205
+ });
206
+ })();
@@ -0,0 +1,375 @@
1
+ //= require "shader"
2
+
3
+ /**
4
+ * class Jax.Material
5
+ *
6
+ * Represents a single material, which has its own color, lighting and texture properties.
7
+ *
8
+ * Example:
9
+ *
10
+ * var material = new Jax.Material({ shininess: 1,
11
+ * diffuse: [0.8, 0.8, 0.8, 1.0],
12
+ * ambient: [0.8, 0.8, 0.8, 1.0],
13
+ * specular: [1.0, 1.0, 1.0, 1.0],
14
+ * emissive: [0.0, 0.0, 0.0, 1.0]
15
+ * });
16
+ *
17
+ * IMPORTANT: Note that shaders are no longer directly tied to a given Material. Instead, the shader
18
+ * should be specified as a property (or render option) of the mesh to be rendered. In most cases,
19
+ * however, the appropriate shader will be determined automatically by Jax.
20
+ **/
21
+ Jax.Material = (function() {
22
+ function updatePrevious(self) {
23
+ self.previous = self.previous || {subshaders:[]};
24
+ for (var i = 0; i < self.layers.length; i++)
25
+ self.previous.subshaders[i] = self.layers[i].getName();
26
+ }
27
+
28
+ function instantiate_layer(options) {
29
+ if (options.isKindOf && options.isKindOf(Jax.Material))
30
+ return options;
31
+ else {
32
+ if (options.type) {
33
+ var klass = Jax.Material[options.type];
34
+ if (!klass) throw new Error("Could not find material layer type: "+options.type);
35
+ delete options.type;
36
+ return new klass(options);
37
+ }
38
+ else
39
+ throw new Error("Could not create layer: property 'type' was missing!");
40
+ }
41
+ }
42
+
43
+ return Jax.Class.create({
44
+ initialize: function(options) {
45
+ options = Jax.Util.normalizeOptions(options, {
46
+ ambient: [1,1,1,1],
47
+ diffuse: [1,1,1,1],
48
+ specular:[1,1,1,1],
49
+ emissive: [0, 0, 0, 1.0],
50
+ shininess: 10,
51
+ default_shader: Jax.default_shader
52
+ });
53
+ options.ambient = Jax.Util.colorize(options.ambient);
54
+ options.diffuse = Jax.Util.colorize(options.diffuse);
55
+ options.specular = Jax.Util.colorize(options.specular);
56
+ options.emissive = Jax.Util.colorize(options.emissive);
57
+
58
+ for (var i in options) { this[i] = options[i]; }
59
+ this.option_properties = Jax.Util.properties(options);
60
+ this.protected_properties = ['name', 'shader', 'default_shader', 'shaders', 'layers'];
61
+
62
+ this.name = options.name || options.shader || options.default_shader;
63
+ this.shaders = {};
64
+ this.layers = [];
65
+
66
+ var tex;
67
+ if (options.texture) {
68
+ tex = new Jax.Texture(options.texture);
69
+ this.addTextureLayer(tex);
70
+ delete options.texture;
71
+ } else if (options.textures) {
72
+ for (i = 0; i < options.textures.length; i++) {
73
+ tex = new Jax.Texture(options.textures[i]);
74
+ this.addTextureLayer(tex);
75
+ }
76
+ delete options.textures;
77
+ }
78
+
79
+ if (options.layers) {
80
+ for (i = 0; i < options.layers.length; i++) {
81
+ this.addLayer(instantiate_layer(options.layers[i]));
82
+ }
83
+ }
84
+ },
85
+
86
+ getName: function() { return this.name; },
87
+
88
+ addTextureLayer: function(tex) {
89
+ var mat;
90
+ switch(tex.options.type) {
91
+ case Jax.NORMAL_MAP:
92
+ mat = new Jax.Material.NormalMap(tex);
93
+ break;
94
+ default:
95
+ mat = new Jax.Material.Texture(tex);
96
+ }
97
+ this.addLayer(mat);
98
+ },
99
+
100
+ addLayer: function(layer) {
101
+ if (!layer.option_properties) layer = instantiate_layer(layer);
102
+ this.layers.push(layer);
103
+
104
+ for (var i = 0; i < layer.option_properties.length; i++) {
105
+ var name = layer.option_properties[i];
106
+ if (this.protected_properties.indexOf(name) == -1 && this[name] == undefined) {
107
+ this[name] = layer[name];
108
+ }
109
+ }
110
+ },
111
+
112
+ /**
113
+ * Jax.Material#buildShader(name) -> Jax.Shader
114
+ *
115
+ * Forces a rebuild of the specified shader. If the shader doesn't exist, one will be instantiated.
116
+ * Note that this doesn't result in an immediate recompile (as that would require a Jax.Context).
117
+ * Instead, it schedules the rebuild for the next render pass, when the Jax.Context is readily
118
+ * available.
119
+ **/
120
+ buildShader: function() {
121
+ if (this.shaderChain)
122
+ this.shaderChain.removeAllShaders();
123
+ else
124
+ this.shaderChain = new Jax.ShaderChain(this.getName());
125
+
126
+ this.addShadersToChain(this.shaderChain);
127
+
128
+ return this.shaderChain;
129
+ },
130
+
131
+ addShadersToChain: function(chain) {
132
+ this.shader_variable_prefix = chain.addShader(this.getBaseShader());
133
+ for (var i = 0; i < this.layers.length; i++)
134
+ this.layers[i].addShadersToChain(chain);
135
+ },
136
+
137
+ getBaseShader: function() {
138
+ return (this.shader || this.default_shader);
139
+ },
140
+
141
+ /**
142
+ * Jax.Material#updateModifiedShaders() -> self
143
+ *
144
+ * If this Material has been modified, all shaders attached to it will be rebuilt.
145
+ **/
146
+ updateModifiedShaders: function() {
147
+ if (this.isChanged()) {
148
+ this.buildShader();
149
+ updatePrevious(this);
150
+ }
151
+ return this;
152
+ },
153
+
154
+ /**
155
+ * Jax.Material#prepareShader(name) -> Jax.Shader
156
+ *
157
+ * Prepares the specified shader for rendering. If this Material has been modified,
158
+ * then all related shaders are updated. The specified shader is either built or returned,
159
+ * depending on whether it has already been built.
160
+ **/
161
+ prepareShader: function() {
162
+ var shader;
163
+
164
+ if (this.shaderChain) shader = this.shaderChain;
165
+ else shader = this.buildShader();
166
+
167
+ this.updateModifiedShaders();
168
+ return shader;
169
+ },
170
+
171
+ setUniforms: function(context, mesh, options, uniforms) {},
172
+ setAttributes: function(context, mesh, options, attributes) { },
173
+
174
+ setShaderVariables: function(context, mesh, options, manifest) {
175
+ manifest.variable_prefix = this.shader_variable_prefix;
176
+
177
+ manifest.set({
178
+ mMatrix: context.getModelMatrix(),
179
+ vnMatrix: mat3.transpose(mat4.toMat3(context.getViewMatrix())),
180
+ ivMatrix: context.getInverseViewMatrix(),
181
+ vMatrix: context.getViewMatrix(),
182
+ mvMatrix: context.getModelViewMatrix(),
183
+ pMatrix: context.getProjectionMatrix(),
184
+ nMatrix: context.getNormalMatrix(),
185
+
186
+ PASS_TYPE: context.current_pass,
187
+
188
+ materialAmbient: this.ambient,
189
+ materialDiffuse: this.diffuse,
190
+ materialSpecular: this.specular,
191
+ materialShininess: this.shininess
192
+ });
193
+ manifest.set('VERTEX_POSITION', mesh.getVertexBuffer() || null);
194
+ manifest.set('VERTEX_COLOR', mesh.getColorBuffer() || null);
195
+ manifest.set('VERTEX_NORMAL', mesh.getNormalBuffer() || null);
196
+ manifest.set('VERTEX_TEXCOORDS', mesh.getTextureCoordsBuffer() || null);
197
+
198
+
199
+ this.setUniforms(context, mesh, options, manifest);
200
+ this.setAttributes(context, mesh, options, manifest);
201
+
202
+ for (var i = 0; i < this.layers.length; i++) {
203
+ manifest.variable_prefix = this.layers[i].shader_variable_prefix;
204
+ this.layers[i].setUniforms(context, mesh, options, manifest);
205
+ this.layers[i].setAttributes(context, mesh, options, manifest);
206
+ }
207
+ },
208
+
209
+ /**
210
+ * Jax.Material#render(context, mesh) -> undefined
211
+ * Renders the specified object to the specified context, using this material.
212
+ *
213
+ * This action will build and compile the shader for the given context if necessary.
214
+ **/
215
+ render: function(context, mesh, options) {
216
+ this.lights = context.world.lighting._lights;
217
+ this.light_count = context.world.lighting._lights.length;
218
+
219
+ try {
220
+ var shader = this.prepareShader(context);
221
+
222
+ shader.render(context, mesh, this, options);
223
+ } catch(error) {
224
+ if (error instanceof RangeError) {
225
+ // we've hit hardware limits. Back off a layer. If we are down to no layers, raise a coherent error.
226
+ if (this.layers.length > 0) {
227
+ this.adaptShaderToHardwareLimits(shader, error);
228
+ this.render(context, mesh, options);
229
+ }
230
+ else throw error;
231
+ }
232
+ else throw error;
233
+ }
234
+ },
235
+
236
+ adaptShaderToHardwareLimits: function(shader, error) {
237
+ function log(msg) {
238
+ if (window.console)
239
+ console.log(msg);
240
+ else
241
+ setTimeout(function() { throw new Error(msg); }, 1);
242
+ }
243
+
244
+ log("WARNING: Hardware limits reached for material '"+this.getName()+"'! (original message: "+error+")");
245
+
246
+ /*
247
+ choose which shader(s) to remove. We know off the bat that we can remove any shaders which would
248
+ push us over the threshold on their own (e.g. not combined with any except 'basic'), so let's remove
249
+ those first.
250
+ */
251
+
252
+ var map = shader.getPerShaderInputMap(this);
253
+
254
+ var uniformsRemaining = Jax.Shader.max_uniforms - map[this.getBaseShader()].uniforms.length;
255
+ var varyingsRemaining = Jax.Shader.max_varyings - map[this.getBaseShader()].varyings.length;
256
+ var attributesRemaining = Jax.Shader.max_attributes - map[this.getBaseShader()].attributes.length;
257
+
258
+ // we'll use these to determine if we *still* need to pop at the end.
259
+ var totalUniformsInUse = 0, totalVaryingsInUse = 0, totalAttributesInUse = 0;
260
+
261
+ for (var i = 0; i < this.layers.length; i++) {
262
+ var entry = map[this.layers[i].getBaseShader()];
263
+
264
+ if (entry.uniforms.length > uniformsRemaining || entry.varyings.length > varyingsRemaining ||
265
+ entry.attributes.length > attributesRemaining)
266
+ {
267
+ log("WARNING: Removing shader '"+this.layers[i].getName()+"' due to hardware limitations!");
268
+ this.layers.splice(i, 1);
269
+ i = 0;
270
+ } else {
271
+ totalUniformsInUse += entry.uniforms.length;
272
+ totalVaryingsInUse += entry.varyings.length;
273
+ totalAttributesInUse += entry.attributes.length;
274
+ }
275
+ }
276
+
277
+ if (totalUniformsInUse > uniformsRemaining || totalVaryingsInUse > varyingsRemaining ||
278
+ totalAttributesInUse > attributesRemaining)
279
+ {
280
+ log("WARNING: Removing shader '"+this.layers[this.layers.length-1].getName()+"' due to hardware limitations!");
281
+ this.layers.pop();
282
+ }
283
+ },
284
+
285
+ /**
286
+ * Jax.Material#isChanged() -> Boolean
287
+ * Returns true if this material's properties have been changed since
288
+ * the last time its internal shader was compiled.
289
+ **/
290
+ isChanged: function() {
291
+ if (!this.previous) return true;
292
+
293
+ if (this.previous.subshaders.length != this.layers.length) return true;
294
+
295
+ for (var i = 0; i < this.layers.length; i++)
296
+ if (this.previous.subshaders[i] != this.layers[i].getName())
297
+ return true;
298
+
299
+ return false;
300
+ }
301
+ });
302
+ })();
303
+
304
+ Jax.Material.instances = {};
305
+
306
+ /**
307
+ * Jax.Material.find(name) -> Jax.Material
308
+ * - name (String): the unique name of the material you're looking for
309
+ *
310
+ * Returns the instance of Jax.Material matching the specified name, or throws
311
+ * an error if the material can't be found.
312
+ **/
313
+ Jax.Material.find = function(name) {
314
+ var result;
315
+ if (result = Jax.Material.instances[name])
316
+ return result;
317
+ throw new Error("Material {material:'"+name+"'} could not be found.");
318
+ };
319
+
320
+ /**
321
+ * Jax.Material.create(name, options) -> Jax.Material
322
+ * - name (String): the unique name of this material
323
+ * - options (Object): a set of options to be passed to the material constructor
324
+ *
325
+ * Creates a material and adds it to the material registry. This way,
326
+ * the material can be later retrieved using:
327
+ *
328
+ * var matr = Jax.Material.find(name);
329
+ *
330
+ * Note that unlike instances of Jax.Model, specifying a name for a material that
331
+ * already exists will not raise an error. Instead, the previous material will be
332
+ * replaced with a new material constructed using the new options. This allows you
333
+ * to override Jax defaults like so:
334
+ *
335
+ * Jax.Material.create("default", {...});
336
+ *
337
+ **/
338
+ Jax.Material.create = function(name, options) {
339
+ options = Jax.Util.normalizeOptions(options, { name: name });
340
+
341
+ var klass = Jax.Material;
342
+ if (options.type) klass = klass[options.type];
343
+
344
+ if (!klass) throw new Error("Material type '"+options.type+"' not found!");
345
+ return Jax.Material.instances[name] = new klass(options);
346
+ };
347
+
348
+ /**
349
+ * Jax.Material.all() -> Array
350
+ *
351
+ * Returns an array containing the names of all Materials currently registered
352
+ * with Jax. Note that this does not include one-off materials created directly,
353
+ * for example, using "new Jax.Material()".
354
+ **/
355
+ Jax.Material.all = function() {
356
+ return Jax.Util.properties(Jax.Material.instances);
357
+ };
358
+
359
+ Jax.Material.addResources = function(resources) {
360
+ for (var i in resources) {
361
+ if (Jax.Material.instances[i]) throw new Error("Duplicate material resource ID: "+i);
362
+ Jax.Material.create(i, resources[i]);
363
+ }
364
+ };
365
+
366
+ //= require "../../../builtin/shaders/texture/material"
367
+ //= require "../../../builtin/shaders/normal_map/material"
368
+ //= require "../../../builtin/shaders/shadow_map/material"
369
+ //= require "../../../builtin/shaders/paraboloid-depthmap/material"
370
+ //= require "../../../builtin/shaders/fog/material"
371
+
372
+ Jax.Material.create("basic");
373
+ Jax.Material.create("default", {default_shader:'basic'});
374
+ Jax.Material.create("depthmap", {default_shader:"depthmap"});
375
+ Jax.Material.create("paraboloid-depthmap", {type:"DualParaboloid",default_shader:"paraboloid-depthmap"});