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,412 @@
1
+ //= require "core"
2
+
3
+ /**
4
+ * class Jax.Mesh
5
+ *
6
+ * Example:
7
+ *
8
+ * var mesh = new Jax.Mesh({
9
+ * init: function(vertices, colors, textureCoords, normals, indices) {
10
+ * // all of the arguments are arrays. If you don't intend to use one,
11
+ * // simply don't populate it with data. For instance, if your mesh
12
+ * // does not use vertex indices, don't add any data to the indices
13
+ * // array.
14
+ *
15
+ * // Colors will default to white if they are not populated.
16
+ *
17
+ * // A simple, red, opaque quad:
18
+ * vertices.push(-1, -1, 0); colors.push(1, 0, 0, 1);
19
+ * vertices.push(-1, 1, 0); colors.push(1, 0, 0, 1);
20
+ * vertices.push( 1, 1, 0); colors.push(1, 0, 0, 1);
21
+ * vertices.push( 1, -1, 0); colors.push(1, 0, 0, 1);
22
+ * }
23
+ * });
24
+ *
25
+ * You can also subclass Mesh directly:
26
+ *
27
+ * var Quad = Jax.Class.create(Jax.Mesh, {
28
+ * init: function(vertices, colors, textureCoords, normals, indices) {
29
+ * // ...
30
+ * }
31
+ * });
32
+ **/
33
+ Jax.Mesh = (function() {
34
+ function setColorCoords(self, count, color, coords) {
35
+ var i, j;
36
+ var num_colors = color.length;
37
+ if (num_colors > 4) throw new Error("Color should have at most 4 components");
38
+ for (i = 0; i < count*4; i += 4)
39
+ {
40
+ for (j = 0; j < num_colors; j++)
41
+ coords[i+j] = color[j];
42
+ for (j = num_colors; j < 4; j++) {
43
+ coords[i+j] = 1;
44
+ }
45
+ }
46
+ }
47
+
48
+ function makeTangentBuffer(self) {
49
+ var normals = self.getNormalBuffer();
50
+ var vertices = self.getVertexBuffer();
51
+ var texcoords = self.getTextureCoordsBuffer();
52
+ var indices = self.getIndexBuffer();
53
+ if (!normals || !vertices || !texcoords) return null;
54
+
55
+ var tangentBuffer = self.buffers.tangent_buffer;
56
+ normals = normals.js;
57
+ vertices = vertices.js;
58
+ texcoords = texcoords.js;
59
+ if (indices) indices = indices.js;
60
+
61
+ var tangents = tangentBuffer ? tangentBuffer.js : [];
62
+ var tan1 = [], tan2 = [], a;
63
+ var v1 = vec3.create(), v2 = vec3.create(), v3 = vec3.create();
64
+ var w1 = [], w2 = [], w3 = [];
65
+ var vertcount;
66
+ var x1, x2, y1, y2, z1, z2, s1, s2, t1, t2, r;
67
+ var dif = [];
68
+ var sdir = vec3.create(), tdir = vec3.create();
69
+
70
+ function setv(v, a) { v[0] = vertices[a*3]; v[1] = vertices[a*3+1]; v[2] = vertices[a*3+2]; }
71
+ function setw(w, a) { w[0] = texcoords[a*2]; w[1] = texcoords[a*2+1]; }
72
+ function sett1(a) { tan1[a] = tan1[a] || vec3.create(); vec3.add(tan1[a], sdir, tan1[a]); }
73
+ function sett2(a) { tan2[a] = tan2[a] || vec3.create(); vec3.add(tan2[a], tdir, tan2[a]); }
74
+ function findTangentVector(a1, a2, a3) {
75
+ if (indices) { a1 = indices[a1]; a2 = indices[a2]; a3 = indices[a3]; }
76
+
77
+ setv(v1, a1); setv(v2, a2); setv(v3, a3);
78
+ setw(w1, a1); setw(w2, a2); setw(w3, a3);
79
+ x1 = v2[0] - v1[0]; x2 = v3[0] - v1[0];
80
+ y1 = v2[1] - v1[1]; y2 = v3[1] - v1[1];
81
+ z1 = v2[2] - v1[2]; z2 = v3[2] - v1[2];
82
+ s1 = w2[0] - w1[0]; s2 = w3[0] - w1[0];
83
+ t1 = w2[1] - w1[1]; t2 = w3[1] - w1[1];
84
+ r = 1.0 / (s1 * t2 - s2 * t1);
85
+
86
+ sdir[0] = (t2 * x1 - t1 * x2) * r; sdir[1] = (t2 * y1 - t1 * y2) * r; sdir[2] = (t2 * z1 - t1 * z2) * r;
87
+ tdir[0] = (s1 * x2 - s2 * x1) * r; tdir[1] = (s1 * y2 - s2 * y1) * r; tdir[2] = (s1 * z2 - s2 * z1) * r;
88
+ if (isNaN(sdir[0]) || isNaN(sdir[1]) || isNaN(sdir[2]) ||
89
+ isNaN(tdir[0]) || isNaN(tdir[1]) || isNaN(tdir[2]) )
90
+ {
91
+ // this only seems to happen when dealing with degenerate triangles
92
+ // ...which seems to be fairly common. So, let's see what happens if
93
+ // we just set the offending vectors to zero.
94
+ sdir[0] = sdir[1] = sdir[2] = tdir[0] = tdir[1] = tdir[2] = 0;
95
+ }
96
+ sett1(a1); sett1(a2); sett1(a3);
97
+ sett2(a1); sett2(a2); sett2(a3);
98
+ }
99
+
100
+ vertcount = indices ? indices.length : normals.length / 3;
101
+ /* we need to pass the vertices into findTangentVector differently depending on draw mode */
102
+ switch(self.draw_mode) {
103
+ case GL_TRIANGLE_STRIP:
104
+ for (a = 2; a < vertcount; a += 2) {
105
+ findTangentVector(a-2, a-1, a);
106
+ findTangentVector(a, a-1, a+1);
107
+ }
108
+ break;
109
+ case GL_TRIANGLES:
110
+ for (a = 0; a < vertcount; a += 3)
111
+ findTangentVector(a, a+1, a+2);
112
+ break;
113
+ case GL_TRIANGLE_FAN:
114
+ for (a = 2; a < vertcount; a++)
115
+ findTangentVector(0, a-1, a);
116
+ break;
117
+ default:
118
+ throw new Error("Cannot calculate tangent space for draw mode: "+Jax.Util.enumName(self.draw_mode));
119
+ }
120
+
121
+ var normal = vec3.create();
122
+
123
+ // remove any tangents left over from earlier builds (this should be pretty rare)
124
+ while (tangents.length > vertcount) tangents.pop();
125
+
126
+ var b;
127
+ for (b = 0; b < vertcount; b++) {
128
+
129
+ if (indices) a = indices[b];
130
+ else a = b;
131
+
132
+ // Gram-Schmidt orthogonalize: (t - n * dot(n, t)).normalize()
133
+ normal[0] = normals[a*3]; normal[1] = normals[a*3+1]; normal[2] = normals[a*3+2];
134
+ vec3.scale(normal, vec3.dot(normal, tan1[a]), dif);
135
+ vec3.subtract(tan1[a], dif, dif);
136
+ vec3.normalize(dif);
137
+
138
+ tangents[a*4] = dif[0];
139
+ tangents[a*4+1] = dif[1];
140
+ tangents[a*4+2] = dif[2];
141
+ // calc handedness
142
+ tangents[a*4+3] = (vec3.dot(vec3.cross(normal, tan1[a]), tan2[a])) < 0.0 ? -1.0 : 1.0;
143
+ }
144
+
145
+ if (tangentBuffer)
146
+ self.buffers.tangent_buffer.refresh();
147
+ else
148
+ self.buffers.tangent_buffer = new Jax.NormalBuffer(tangents);
149
+ return self.buffers.tangent_buffer;
150
+ }
151
+
152
+ function findMaterial(name_or_instance) {
153
+ if (typeof(name_or_instance) == "string")
154
+ return Jax.Material.find(name_or_instance);
155
+ else if (name_or_instance.isKindOf && name_or_instance.isKindOf(Jax.Material))
156
+ return name_or_instance;
157
+
158
+ throw new Error("Material must be an instance of Jax.Material, or "+
159
+ "a string representing a material in the Jax material registry");
160
+ }
161
+
162
+ function calculateBounds(self, vertices) {
163
+ self.bounds = {left:null,right:null,top:null,bottom:null,front:null,back:null,width:null,height:null,depth:null};
164
+ var i, v;
165
+
166
+ for (i = 0; i < vertices.length; i++)
167
+ {
168
+ // x, i % 3 == 0
169
+ v = vertices[i];
170
+ if (self.bounds.left == null || v < self.bounds.left) self.bounds.left = v;
171
+ if (self.bounds.right == null || v > self.bounds.right) self.bounds.right = v;
172
+
173
+ // y, i % 3 == 1
174
+ v = vertices[++i];
175
+ if (self.bounds.bottom== null || v < self.bounds.bottom) self.bounds.bottom = v;
176
+ if (self.bounds.top == null || v > self.bounds.top) self.bounds.top = v;
177
+
178
+ // z, i % 3 == 2
179
+ v = vertices[++i];
180
+ if (self.bounds.front == null || v < self.bounds.front) self.bounds.front = v;
181
+ if (self.bounds.back == null || v > self.bounds.back) self.bounds.back = v;
182
+ }
183
+
184
+ self.bounds.width = self.bounds.right - self.bounds.left;
185
+ self.bounds.height= self.bounds.top - self.bounds.bottom;
186
+ self.bounds.depth = self.bounds.front - self.bounds.back;
187
+ }
188
+
189
+ function ensureBuilt(self) {
190
+ if (!self.isValid()) self.rebuild();
191
+ }
192
+
193
+ return Jax.Class.create({
194
+ initialize: function(options) {
195
+ this.buffers = {};
196
+
197
+ /**
198
+ * Jax.Mesh#material -> String | Jax.Material
199
+ * This property represents the material that will be used to render this mesh. If
200
+ * it is a string, Jax will find the material with this name in the material registry
201
+ * using:
202
+ *
203
+ * Jax.Material.find(...).
204
+ *
205
+ * If not specified, Jax.Mesh#default_material will be used instead.
206
+ **/
207
+
208
+ /**
209
+ * Jax.Mesh#default_material -> String | Jax.Material
210
+ * This property represents the material that will be used to render this mesh if #material
211
+ * isn't given a value and the render options don't override the material. If
212
+ * it is a string, Jax will find the material with this name in the material registry
213
+ * using:
214
+ *
215
+ * Jax.Material.find(...).
216
+ *
217
+ * This property can also be specified as a render option in order to specify a default
218
+ * for a particular pass.
219
+ **/
220
+ this.default_material = "default";
221
+
222
+ for (var i in options)
223
+ this[i] = options[i];
224
+
225
+ if (!this.draw_mode)
226
+ this.draw_mode = GL_TRIANGLES;
227
+ },
228
+
229
+ /**
230
+ * Jax.Mesh#dispose() -> undefined
231
+ * Frees the various buffers used by this mesh.
232
+ **/
233
+ dispose: function() {
234
+ while (this.faces && this.faces.length) this.faces.pop();
235
+ while (this.edges && this.edges.length) this.edges.pop();
236
+ for (var i in this.buffers) {
237
+ this.buffers[i].dispose();
238
+ delete this.buffers[i];
239
+ }
240
+ this.built = false;
241
+ },
242
+
243
+ /**
244
+ * Jax.Mesh#getFaceVertices(face) -> Array
245
+ * - face (Jax.Core.Face): the face whose vertices you wish to retrieve
246
+ *
247
+ * Returns the current vertex data for the specified face.
248
+ **/
249
+ getFaceVertices: function(face) {
250
+ return [
251
+ [this.getVertexBuffer().js[face.vertexIndices[0]*3+0],
252
+ this.getVertexBuffer().js[face.vertexIndices[0]*3+1],
253
+ this.getVertexBuffer().js[face.vertexIndices[0]*3+2]
254
+ ],
255
+ [this.getVertexBuffer().js[face.vertexIndices[1]*3+0],
256
+ this.getVertexBuffer().js[face.vertexIndices[1]*3+1],
257
+ this.getVertexBuffer().js[face.vertexIndices[1]*3+2]
258
+ ],
259
+ [this.getVertexBuffer().js[face.vertexIndices[2]*3+0],
260
+ this.getVertexBuffer().js[face.vertexIndices[2]*3+1],
261
+ this.getVertexBuffer().js[face.vertexIndices[2]*3+2]
262
+ ]
263
+ ];
264
+ },
265
+
266
+ /**
267
+ * Jax.Mesh#getEdgeVertices(edge) -> Array
268
+ * - edge (Jax.Core.Edge): the edge whose vertices you wish to retrieve
269
+ *
270
+ * Returns the current vertex data for the specified edge.
271
+ **/
272
+ getEdgeVertices: function(edge) {
273
+ return [
274
+ [this.getVertexBuffer().js[edge.vertexIndices[0]*3+0],
275
+ this.getVertexBuffer().js[edge.vertexIndices[0]*3+1],
276
+ this.getVertexBuffer().js[edge.vertexIndices[0]*3+2]
277
+ ],
278
+ [this.getVertexBuffer().js[edge.vertexIndices[1]*3+0],
279
+ this.getVertexBuffer().js[edge.vertexIndices[1]*3+1],
280
+ this.getVertexBuffer().js[edge.vertexIndices[1]*3+2]
281
+ ]
282
+ ];
283
+ },
284
+
285
+ /**
286
+ * Jax.Mesh#render(context[, options]) -> undefined
287
+ * - context (Jax.Context): the Jax context to render this object to
288
+ * - options (Object): a set of custom render options to override the defaults for this Mesh.
289
+ *
290
+ * Options include:
291
+ * * *draw_mode* : a GL rendering enum, such as GL_TRIANGLES or GL_LINE_STRIP.
292
+ * * *material* : an instance of Jax.Material, or the name of a registered Jax material, to override
293
+ * the material associated with this mesh.
294
+ **/
295
+ render: function(context, options) {
296
+ if (!this.isValid()) this.rebuild();
297
+ options = this.getNormalizedRenderOptions(options);
298
+ options.material.render(context, this, options);
299
+ },
300
+
301
+ getNormalizedRenderOptions: function(options) {
302
+ var result = Jax.Util.normalizeOptions(options, {
303
+ material: this.material,
304
+ default_material: this.default_material,
305
+ // default_shader: this.default_shader,
306
+ // shader: this.shader,
307
+ draw_mode: this.draw_mode || GL_TRIANGLES
308
+ });
309
+
310
+ if (!result.material) result.material = result.default_material;
311
+ // if (!result.shader) result.shader = result.default_shader;
312
+
313
+ result.material = findMaterial(result.material);
314
+
315
+ return result;
316
+ },
317
+
318
+ /**
319
+ * Jax.Mesh#getVertexBuffer() -> Jax.VertexBuffer
320
+ **/
321
+ getVertexBuffer: function() { ensureBuilt(this); return this.buffers.vertex_buffer; },
322
+ /**
323
+ * Jax.Mesh#getColorBuffer() -> Jax.ColorBuffer
324
+ **/
325
+ getColorBuffer: function() { ensureBuilt(this); return this.buffers.color_buffer; },
326
+ /**
327
+ * Jax.Mesh#getIndexBuffer() -> Jax.ElementArrayBuffer
328
+ **/
329
+ getIndexBuffer: function() { ensureBuilt(this); return this.buffers.index_buffer; },
330
+ /**
331
+ * Jax.Mesh#getNormalBuffer() -> Jax.NormalBuffer
332
+ **/
333
+ getNormalBuffer: function() { ensureBuilt(this); return this.buffers.normal_buffer; },
334
+ /**
335
+ * Jax.Mesh#getTextureCoordsBuffer() -> Jax.TextureCoordsBuffer
336
+ **/
337
+ getTextureCoordsBuffer: function() { ensureBuilt(this); return this.buffers.texture_coords; },
338
+ /**
339
+ * Jax.Mesh#getTangentBuffer() -> Jax.NormalBuffer
340
+ * Returns tangent normals for each normal in this Mesh. Used for normal / bump mapping.
341
+ **/
342
+ getTangentBuffer: function() {
343
+ if (this.buffers.tangent_buffer) return this.buffers.tangent_buffer;
344
+ return makeTangentBuffer(this);
345
+ },
346
+
347
+ /**
348
+ * Jax.Mesh#rebuildTangentBuffer() -> Jax.NormalBuffer
349
+ * Forces an immediate rebuild of the tangent buffer for this Mesh. Use this if you've changed
350
+ * the vertex, normal or texture information to update the tangent vectors. If this step is
351
+ * skipped, you'll notice strange artifacts when using bump mapping (because the tangents will
352
+ * be pointing in the wrong direction).
353
+ **/
354
+ rebuildTangentBuffer: function() {
355
+ return makeTangentBuffer(this);
356
+ },
357
+
358
+ /**
359
+ * Jax.Mesh#isValid() -> Boolean
360
+ *
361
+ * Returns true if this mesh is valid. If the mesh is invalid, it will be rebuilt during the next call to
362
+ * Jax.Mesh#render().
363
+ **/
364
+ isValid: function() { return !!this.built; },
365
+
366
+ /**
367
+ * Jax.Mesh#rebuild() -> undefined
368
+ *
369
+ * Forces Jax to rebuild this mesh immediately. This will dispose of any WebGL buffers
370
+ * and reinitialize them with a new call to this mesh's data init method. Note that this
371
+ * is a very expensive operation and is *usually not* what you want.
372
+ *
373
+ * If, for instance, you want to update the mesh with new vertex positions (say, for animation)
374
+ * then you'd be much better off doing something like this:
375
+ *
376
+ * var vbuf = mesh.getVertexBuffer();
377
+ * vbuf.js.clear();
378
+ * for (var i = 0; i < newVertexData.length; i++)
379
+ * vbuf.push(newVertexData[i]);
380
+ * vbuf.refresh();
381
+ *
382
+ **/
383
+ rebuild: function() {
384
+ this.dispose();
385
+
386
+ var vertices = [], colors = [], textureCoords = [], normals = [], indices = [];
387
+ if (this.init)
388
+ this.init(vertices, colors, textureCoords, normals, indices);
389
+
390
+ if (this.color)
391
+ setColorCoords(this, vertices.length / 3, this.color, colors);
392
+
393
+ if (colors.length == 0) // still no colors?? default to white
394
+ setColorCoords(this, vertices.length / 3, [1,1,1,1], colors);
395
+
396
+ if (vertices.length > 0)
397
+ {
398
+ this.buffers.vertex_buffer = new Jax.VertexBuffer(vertices);
399
+ calculateBounds(this, vertices);
400
+ }
401
+
402
+ if (colors.length > 0) this.buffers.color_buffer = new Jax.ColorBuffer(colors);
403
+ if (indices.length> 0) this.buffers.index_buffer = new Jax.ElementArrayBuffer(indices);
404
+ if (normals.length> 0) this.buffers.normal_buffer= new Jax.NormalBuffer(normals);
405
+ if (textureCoords.length > 0) this.buffers.texture_coords = new Jax.TextureCoordsBuffer(textureCoords);
406
+
407
+ this.built = true;
408
+
409
+ if (this.after_initialize) this.after_initialize();
410
+ }
411
+ });
412
+ })();
@@ -0,0 +1,11 @@
1
+ Jax.Scene = {};
2
+
3
+ /* used by some shaders to determine what kind of shading is to be done.
4
+ * This is stored in context.world.current_pass.
5
+ */
6
+ Jax.Scene.ILLUMINATION_PASS = 1;
7
+ Jax.Scene.AMBIENT_PASS = 2;
8
+ Jax.Scene.SHADOWMAP_PASS = 3;
9
+
10
+ //= require "scene/frustum"
11
+ //= require "scene/light_manager"
@@ -0,0 +1,260 @@
1
+ //= require "../../geometry"
2
+
3
+ Jax.Scene.Frustum = (function() {
4
+ var RIGHT = 0, LEFT = 1, BOTTOM = 2, TOP = 3, FAR = 4, NEAR = 5;
5
+ var OUTSIDE = Jax.Geometry.Plane.BACK, INTERSECT = Jax.Geometry.Plane.INTERSECT, INSIDE = Jax.Geometry.Plane.FRONT;
6
+
7
+ function extents(self)
8
+ {
9
+ /* TODO see how this can be combined with Camera#unproject */
10
+ function extent(x, y, z)
11
+ {
12
+ var inf = [];
13
+ var mm = self.mv, pm = self.p;
14
+
15
+ //Calculation for inverting a matrix, compute projection x modelview; then compute the inverse
16
+ var m = mat4.set(mm, mat4.create());
17
+
18
+ mat4.inverse(m, m); // WHY do I have to do this? --see Jax.Context#reloadMatrices
19
+ mat4.multiply(pm, m, m);
20
+ mat4.inverse(m, m);
21
+
22
+ // Transformation of normalized coordinates between -1 and 1
23
+ inf[0]=x;//*2.0-1.0; /* x*2-1 translates x from 0..1 to -1..1 */
24
+ inf[1]=y;//*2.0-1.0;
25
+ inf[2]=z;//*2.0-1.0;
26
+ inf[3]=1.0;
27
+
28
+ //Objects coordinates
29
+ var out = mat4.multiplyVec4(m, inf);
30
+ if(out[3]==0.0)
31
+ return [0,0,0];//null;
32
+
33
+ out[3]=1.0/out[3];
34
+ return [out[0]*out[3], out[1]*out[3], out[2]*out[3]];
35
+ }
36
+
37
+ var ntl = extent(-1,1,-1), ntr = extent(1,1,-1), nbl = extent(-1,-1,-1), nbr = extent(1,-1,-1),
38
+ ftl = extent(-1,1,1), ftr = extent(1,1,1), fbl = extent(-1,-1,1), fbr = extent(1,-1,1);
39
+
40
+ return {ntl:ntl, ntr:ntr, nbl:nbl, nbr:nbr, ftl:ftl, ftr:ftr, fbl:fbl, fbr:fbr};
41
+ }
42
+
43
+ function varcube(self, position, w, h, d)
44
+ {
45
+ if (!self.mv || !self.p) return INSIDE;
46
+ var p, c, c2 = 0, plane;
47
+
48
+ w = w / 2.0;
49
+ h = h / 2.0;
50
+ d = d / 2.0;
51
+
52
+ var xp = position[0]+w, xm=position[0]-w, yp=position[1]+h, ym=position[1]-h, zp=position[2]+d, zm=position[2]-d;
53
+
54
+ for (p in self.planes)
55
+ {
56
+ plane = self.planes[p];
57
+ c = 0;
58
+ if (plane.distance(xp, yp, zp) > 0) c++;
59
+ if (plane.distance(xm, yp, zp) > 0) c++;
60
+ if (plane.distance(xp, ym, zp) > 0) c++;
61
+ if (plane.distance(xm, ym, zp) > 0) c++;
62
+ if (plane.distance(xp, yp, zm) > 0) c++;
63
+ if (plane.distance(xm, yp, zm) > 0) c++;
64
+ if (plane.distance(xp, ym, zm) > 0) c++;
65
+ if (plane.distance(xm, ym, zm) > 0) c++;
66
+ if (c == 0) return OUTSIDE;
67
+ if (c == 8) c2++;
68
+ }
69
+
70
+ return (c2 == 6) ? INSIDE : INTERSECT;
71
+ }
72
+
73
+ function extractFrustum(self)
74
+ {
75
+ var frustum = self.planes;
76
+ var e = extents(self);
77
+
78
+ frustum[TOP].set(e.ntr, e.ntl, e.ftl);
79
+ frustum[BOTTOM].set(e.nbl,e.nbr,e.fbr);
80
+ frustum[LEFT].set(e.ntl,e.nbl,e.fbl);
81
+ frustum[RIGHT].set(e.nbr,e.ntr,e.fbr);
82
+ frustum[NEAR].set(e.ntl,e.ntr,e.nbr);
83
+ frustum[FAR].set(e.ftr,e.ftl,e.fbl);
84
+ }
85
+
86
+ var klass = Jax.Class.create({
87
+ initialize: function(modelview, projection) {
88
+ this.listeners = {update:[]};
89
+ this.callbacks = this.listeners;
90
+ this.planes = {};
91
+ for (var i = 0; i < 6; i++) this.planes[i] = new Jax.Geometry.Plane();
92
+ this.setMatrices(modelview, projection);
93
+ },
94
+
95
+ update: function() { if (this.mv && this.p) { extractFrustum(this); this.fireListeners('update'); } },
96
+ setModelviewMatrix: function(mv) { this.setMatrices(mv, this.p); },
97
+ setProjectionMatrix: function(p) { this.setMatrices(this.mv, p); },
98
+
99
+ setMatrices: function(mv, p) {
100
+ this.mv = mv;
101
+ this.p = p;
102
+ this.update();
103
+ },
104
+
105
+ point: function(point) {
106
+ if (!this.mv || !this.p) return INSIDE;
107
+ if (arguments.length == 3) point = [arguments[0], arguments[1], arguments[2]];
108
+
109
+ for(var i=0; i < 6; i++)
110
+ {
111
+ if (this.planes[i].distance(point) < 0)
112
+ return OUTSIDE;
113
+ }
114
+ return INSIDE;
115
+ },
116
+
117
+ sphere: function(center, radius)
118
+ {
119
+ if (!this.mv || !this.p) return INSIDE;
120
+ if (arguments.length == 4) { center = [arguments[0], arguments[1], arguments[2]]; radius = arguments[3]; }
121
+
122
+ var result = INSIDE, distance;
123
+ for (var i = 0; i < 6; i++)
124
+ {
125
+ distance = this.planes[i].distance(center);
126
+ if (distance < -radius) return OUTSIDE;
127
+ else if (distance < radius) result = INTERSECT;
128
+ }
129
+ return result;
130
+ },
131
+
132
+ /* Arguments can either be an array of indices, or a position array [x,y,z] followed by width, height and depth.
133
+ Examples:
134
+ var cube = new Cube(...);
135
+ frustum.cube(cube.getCorners());
136
+ frustub.cube(cube.orientation.getPosition(), 1);
137
+ frustub.cube(cube.orientation.getPosition(), 1, 2, 3);
138
+ */
139
+ cube: function(corners)
140
+ {
141
+ if (arguments.length == 2) { return varcube(this, arguments[0], arguments[1], arguments[1], arguments[1]); }
142
+ if (arguments.length == 4) { return varcube(this, arguments[0], arguments[1], arguments[2], arguments[3]); }
143
+
144
+ if (!this.mv || !this.p) return INSIDE;
145
+ if (arguments.length > 1) { corners = arguments; }
146
+ var p, c, c2 = 0, i, num_corners = corners.length, plane;
147
+ for (p in this.planes)
148
+ {
149
+ plane = this.planes[p];
150
+ c = 0;
151
+ for (i = 0; i < num_corners; i++)
152
+ if (plane.distance(corners[i]) > 0)
153
+ c++;
154
+ if (c == 0) return OUTSIDE;
155
+ if (c == num_corners) c2++;
156
+ }
157
+
158
+ return (c2 == 6) ? INSIDE : INTERSECT;
159
+ },
160
+
161
+ addUpdateListener: function(callback) { this.listeners.update.push(callback); },
162
+ sphereVisible: function(center, radius) { return this.sphere.apply(this, arguments) != OUTSIDE; },
163
+ pointVisible: function(center) { return this.point.apply(this, arguments) != OUTSIDE; },
164
+ cubeVisible: function(corners) { return this.cube.apply(this, arguments) != OUTSIDE; },
165
+
166
+ fireListeners: function(name) {
167
+ for (var i = 0; i < this.listeners[name].length; i++)
168
+ this.listeners[name][i]();
169
+ },
170
+
171
+ isValid: function() { return this.p && this.mv; },
172
+
173
+ getRenderable: function()
174
+ {
175
+ if (this.renderable) return this.renderable;
176
+
177
+ var renderable = this.renderable = new Jax.Model({mesh: new Jax.Mesh()});
178
+ renderable.upToDate = false;
179
+ var frustum = this;
180
+
181
+ function addVertices(e, vertices)
182
+ {
183
+ // near quad
184
+ vertices.push(e.ntl[0], e.ntl[1], e.ntl[2]);
185
+ vertices.push(e.ntr[0], e.ntr[1], e.ntr[2]);
186
+
187
+ vertices.push(e.ntr[0], e.ntr[1], e.ntr[2]);
188
+ vertices.push(e.nbr[0], e.nbr[1], e.nbr[2]);
189
+
190
+ vertices.push(e.nbr[0], e.nbr[1], e.nbr[2]);
191
+ vertices.push(e.nbl[0], e.nbl[1], e.nbl[2]);
192
+
193
+ vertices.push(e.nbl[0], e.nbl[1], e.nbl[2]);
194
+ vertices.push(e.ntl[0], e.ntl[1], e.ntl[2]);
195
+
196
+ // far quad
197
+ vertices.push(e.ftl[0], e.ftl[1], e.ftl[2]);
198
+ vertices.push(e.ftr[0], e.ftr[1], e.ftr[2]);
199
+
200
+ vertices.push(e.ftr[0], e.ftr[1], e.ftr[2]);
201
+ vertices.push(e.fbr[0], e.fbr[1], e.fbr[2]);
202
+
203
+ vertices.push(e.fbr[0], e.fbr[1], e.fbr[2]);
204
+ vertices.push(e.fbl[0], e.fbl[1], e.fbl[2]);
205
+
206
+ vertices.push(e.fbl[0], e.fbl[1], e.fbl[2]);
207
+ vertices.push(e.ftl[0], e.ftl[1], e.ftl[2]);
208
+
209
+ // left side
210
+ vertices.push(e.ntl[0], e.ntl[1], e.ntl[2]);
211
+ vertices.push(e.ftl[0], e.ftl[1], e.ftl[2]);
212
+
213
+ vertices.push(e.nbl[0], e.nbl[1], e.nbl[2]);
214
+ vertices.push(e.fbl[0], e.fbl[1], e.fbl[2]);
215
+
216
+ // right side
217
+ vertices.push(e.ntr[0], e.ntr[1], e.ntr[2]);
218
+ vertices.push(e.ftr[0], e.ftr[1], e.ftr[2]);
219
+
220
+ vertices.push(e.nbr[0], e.nbr[1], e.nbr[2]);
221
+ vertices.push(e.fbr[0], e.fbr[1], e.fbr[2]);
222
+ }
223
+
224
+ renderable.mesh.init = function(vertices, colors) {
225
+ this.draw_mode = GL_LINES;
226
+
227
+ for (var i = 0; i < 24; i++)
228
+ {
229
+ vertices.push(0,0,0);
230
+ colors.push(1,1,0,1);
231
+ }
232
+ };
233
+
234
+ renderable.update = null;
235
+
236
+ frustum.addUpdateListener(function() {
237
+ if (!frustum.isValid()) { return; }
238
+
239
+ renderable.upToDate = true;
240
+ var buf = renderable.mesh.getVertexBuffer();
241
+ if (!buf) return;
242
+ var vertices = buf.js;
243
+ vertices.clear();
244
+ var e = extents(frustum);//{ntl:ntl, ntr:ntr, nbl:nbl, nbr:nbr, ftl:ftl, ftr:ftr, fbl:fbl, fbr:fbr};
245
+
246
+ addVertices(e, vertices);
247
+
248
+ buf.refresh();
249
+ });
250
+
251
+ return renderable;
252
+ }
253
+ });
254
+
255
+ klass.INSIDE = INSIDE;
256
+ klass.OUTSIDE = OUTSIDE;
257
+ klass.INTERSECT = INTERSECT;
258
+
259
+ return klass;
260
+ })();