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.
- data/.gitignore +12 -0
- data/.gitmodules +3 -0
- data/.rvmrc +7 -0
- data/Gemfile +4 -0
- data/README.rdoc +32 -0
- data/Rakefile +144 -0
- data/bin/jax +11 -0
- data/builtin/shaders/basic/common.ejs +11 -0
- data/builtin/shaders/basic/fragment.ejs +5 -0
- data/builtin/shaders/basic/vertex.ejs +13 -0
- data/builtin/shaders/depthmap/common.ejs +1 -0
- data/builtin/shaders/depthmap/fragment.ejs +5 -0
- data/builtin/shaders/depthmap/vertex.ejs +7 -0
- data/builtin/shaders/fog/common.ejs +7 -0
- data/builtin/shaders/fog/fragment.ejs +23 -0
- data/builtin/shaders/fog/manifest.yml +12 -0
- data/builtin/shaders/fog/material.js +34 -0
- data/builtin/shaders/fog/vertex.ejs +10 -0
- data/builtin/shaders/functions/depth_map.ejs +24 -0
- data/builtin/shaders/functions/lights.ejs +155 -0
- data/builtin/shaders/lighting/common.ejs +5 -0
- data/builtin/shaders/lighting/fragment.ejs +34 -0
- data/builtin/shaders/lighting/manifest.yml +4 -0
- data/builtin/shaders/lighting/material.js +26 -0
- data/builtin/shaders/lighting/vertex.ejs +7 -0
- data/builtin/shaders/normal_map/common.ejs +12 -0
- data/builtin/shaders/normal_map/fragment.ejs +26 -0
- data/builtin/shaders/normal_map/manifest.yml +17 -0
- data/builtin/shaders/normal_map/material.js +16 -0
- data/builtin/shaders/normal_map/vertex.ejs +57 -0
- data/builtin/shaders/paraboloid-depthmap/common.ejs +6 -0
- data/builtin/shaders/paraboloid-depthmap/fragment.ejs +8 -0
- data/builtin/shaders/paraboloid-depthmap/material.js +15 -0
- data/builtin/shaders/paraboloid-depthmap/vertex.ejs +26 -0
- data/builtin/shaders/shadow_map/common.ejs +14 -0
- data/builtin/shaders/shadow_map/fragment.ejs +66 -0
- data/builtin/shaders/shadow_map/manifest.yml +1 -0
- data/builtin/shaders/shadow_map/material.js +26 -0
- data/builtin/shaders/shadow_map/vertex.ejs +46 -0
- data/builtin/shaders/texture/common.ejs +4 -0
- data/builtin/shaders/texture/fragment.ejs +11 -0
- data/builtin/shaders/texture/manifest.yml +17 -0
- data/builtin/shaders/texture/material.js +18 -0
- data/builtin/shaders/texture/vertex.ejs +9 -0
- data/guides/assets/images/book_icon.gif +0 -0
- data/guides/assets/images/bullet.gif +0 -0
- data/guides/assets/images/chapters_icon.gif +0 -0
- data/guides/assets/images/check_bullet.gif +0 -0
- data/guides/assets/images/credits_pic_blank.gif +0 -0
- data/guides/assets/images/edge_badge.png +0 -0
- data/guides/assets/images/feature_tile.gif +0 -0
- data/guides/assets/images/footer_tile.gif +0 -0
- data/guides/assets/images/getting_started/clean_passing_jasmine_suite.png +0 -0
- data/guides/assets/images/getting_started/rock.png +0 -0
- data/guides/assets/images/getting_started/rock_normal.png +0 -0
- data/guides/assets/images/grey_bullet.gif +0 -0
- data/guides/assets/images/header_backdrop.png +0 -0
- data/guides/assets/images/header_tile.gif +0 -0
- data/guides/assets/images/icons/README +5 -0
- data/guides/assets/images/icons/callouts/1.png +0 -0
- data/guides/assets/images/icons/callouts/10.png +0 -0
- data/guides/assets/images/icons/callouts/11.png +0 -0
- data/guides/assets/images/icons/callouts/12.png +0 -0
- data/guides/assets/images/icons/callouts/13.png +0 -0
- data/guides/assets/images/icons/callouts/14.png +0 -0
- data/guides/assets/images/icons/callouts/15.png +0 -0
- data/guides/assets/images/icons/callouts/2.png +0 -0
- data/guides/assets/images/icons/callouts/3.png +0 -0
- data/guides/assets/images/icons/callouts/4.png +0 -0
- data/guides/assets/images/icons/callouts/5.png +0 -0
- data/guides/assets/images/icons/callouts/6.png +0 -0
- data/guides/assets/images/icons/callouts/7.png +0 -0
- data/guides/assets/images/icons/callouts/8.png +0 -0
- data/guides/assets/images/icons/callouts/9.png +0 -0
- data/guides/assets/images/icons/caution.png +0 -0
- data/guides/assets/images/icons/example.png +0 -0
- data/guides/assets/images/icons/home.png +0 -0
- data/guides/assets/images/icons/important.png +0 -0
- data/guides/assets/images/icons/next.png +0 -0
- data/guides/assets/images/icons/note.png +0 -0
- data/guides/assets/images/icons/prev.png +0 -0
- data/guides/assets/images/icons/tip.png +0 -0
- data/guides/assets/images/icons/up.png +0 -0
- data/guides/assets/images/icons/warning.png +0 -0
- data/guides/assets/images/nav_arrow.gif +0 -0
- data/guides/assets/images/tab_grey.gif +0 -0
- data/guides/assets/images/tab_info.gif +0 -0
- data/guides/assets/images/tab_note.gif +0 -0
- data/guides/assets/images/tab_red.gif +0 -0
- data/guides/assets/images/tab_yellow.gif +0 -0
- data/guides/assets/images/tab_yellow.png +0 -0
- data/guides/assets/javascripts/guides.js +7 -0
- data/guides/assets/javascripts/syntaxhighlighter/shBrushAS3.js +59 -0
- data/guides/assets/javascripts/syntaxhighlighter/shBrushAppleScript.js +75 -0
- data/guides/assets/javascripts/syntaxhighlighter/shBrushBash.js +59 -0
- data/guides/assets/javascripts/syntaxhighlighter/shBrushCSharp.js +65 -0
- data/guides/assets/javascripts/syntaxhighlighter/shBrushColdFusion.js +100 -0
- data/guides/assets/javascripts/syntaxhighlighter/shBrushCpp.js +97 -0
- data/guides/assets/javascripts/syntaxhighlighter/shBrushCss.js +91 -0
- data/guides/assets/javascripts/syntaxhighlighter/shBrushDelphi.js +55 -0
- data/guides/assets/javascripts/syntaxhighlighter/shBrushDiff.js +41 -0
- data/guides/assets/javascripts/syntaxhighlighter/shBrushErlang.js +52 -0
- data/guides/assets/javascripts/syntaxhighlighter/shBrushGroovy.js +67 -0
- data/guides/assets/javascripts/syntaxhighlighter/shBrushJScript.js +52 -0
- data/guides/assets/javascripts/syntaxhighlighter/shBrushJava.js +57 -0
- data/guides/assets/javascripts/syntaxhighlighter/shBrushJavaFX.js +58 -0
- data/guides/assets/javascripts/syntaxhighlighter/shBrushPerl.js +72 -0
- data/guides/assets/javascripts/syntaxhighlighter/shBrushPhp.js +88 -0
- data/guides/assets/javascripts/syntaxhighlighter/shBrushPlain.js +33 -0
- data/guides/assets/javascripts/syntaxhighlighter/shBrushPowerShell.js +74 -0
- data/guides/assets/javascripts/syntaxhighlighter/shBrushPython.js +64 -0
- data/guides/assets/javascripts/syntaxhighlighter/shBrushRuby.js +55 -0
- data/guides/assets/javascripts/syntaxhighlighter/shBrushSass.js +94 -0
- data/guides/assets/javascripts/syntaxhighlighter/shBrushScala.js +51 -0
- data/guides/assets/javascripts/syntaxhighlighter/shBrushSql.js +66 -0
- data/guides/assets/javascripts/syntaxhighlighter/shBrushVb.js +56 -0
- data/guides/assets/javascripts/syntaxhighlighter/shBrushXml.js +69 -0
- data/guides/assets/javascripts/syntaxhighlighter/shCore.js +17 -0
- data/guides/assets/stylesheets/fixes.css +16 -0
- data/guides/assets/stylesheets/main.css +445 -0
- data/guides/assets/stylesheets/print.css +52 -0
- data/guides/assets/stylesheets/reset.css +43 -0
- data/guides/assets/stylesheets/style.css +13 -0
- data/guides/assets/stylesheets/syntaxhighlighter/shCore.css +226 -0
- data/guides/assets/stylesheets/syntaxhighlighter/shCoreDefault.css +328 -0
- data/guides/assets/stylesheets/syntaxhighlighter/shCoreDjango.css +331 -0
- data/guides/assets/stylesheets/syntaxhighlighter/shCoreEclipse.css +339 -0
- data/guides/assets/stylesheets/syntaxhighlighter/shCoreEmacs.css +324 -0
- data/guides/assets/stylesheets/syntaxhighlighter/shCoreFadeToGrey.css +328 -0
- data/guides/assets/stylesheets/syntaxhighlighter/shCoreMDUltra.css +324 -0
- data/guides/assets/stylesheets/syntaxhighlighter/shCoreMidnight.css +324 -0
- data/guides/assets/stylesheets/syntaxhighlighter/shCoreRDark.css +324 -0
- data/guides/assets/stylesheets/syntaxhighlighter/shThemeDefault.css +117 -0
- data/guides/assets/stylesheets/syntaxhighlighter/shThemeDjango.css +120 -0
- data/guides/assets/stylesheets/syntaxhighlighter/shThemeEclipse.css +128 -0
- data/guides/assets/stylesheets/syntaxhighlighter/shThemeEmacs.css +113 -0
- data/guides/assets/stylesheets/syntaxhighlighter/shThemeFadeToGrey.css +117 -0
- data/guides/assets/stylesheets/syntaxhighlighter/shThemeJaxGuides.css +116 -0
- data/guides/assets/stylesheets/syntaxhighlighter/shThemeMDUltra.css +113 -0
- data/guides/assets/stylesheets/syntaxhighlighter/shThemeMidnight.css +113 -0
- data/guides/assets/stylesheets/syntaxhighlighter/shThemeRDark.css +113 -0
- data/guides/jax_guides.rb +41 -0
- data/guides/jax_guides/common.rb +7 -0
- data/guides/jax_guides/generator.rb +287 -0
- data/guides/jax_guides/helpers.rb +29 -0
- data/guides/jax_guides/indexer.rb +69 -0
- data/guides/jax_guides/levenshtein.rb +31 -0
- data/guides/jax_guides/textile_extensions.rb +61 -0
- data/guides/source/getting_started.textile +1171 -0
- data/guides/source/index.html.erb +50 -0
- data/guides/source/layout.html.erb +158 -0
- data/guides/source/lighting.textile +5 -0
- data/guides/source/materials.textile +5 -0
- data/guides/source/shaders.textile +5 -0
- data/guides/source/testing.textile +5 -0
- data/guides/w3c_validator.rb +91 -0
- data/jax.gems +1 -0
- data/jax.gemspec +40 -0
- data/lib/jax.rb +28 -0
- data/lib/jax/application.rb +92 -0
- data/lib/jax/application/configuration.rb +27 -0
- data/lib/jax/generators/app.rb +17 -0
- data/lib/jax/generators/app/app_generator.rb +78 -0
- data/lib/jax/generators/app/templates/Gemfile.tt +3 -0
- data/lib/jax/generators/app/templates/Rakefile +6 -0
- data/lib/jax/generators/app/templates/app/controllers/application_controller.js.tt +5 -0
- data/lib/jax/generators/app/templates/app/helpers/application_helper.js.tt +3 -0
- data/lib/jax/generators/app/templates/app/models/.empty_directory +0 -0
- data/lib/jax/generators/app/templates/app/resources/.empty_directory +0 -0
- data/lib/jax/generators/app/templates/app/views/.empty_directory +0 -0
- data/lib/jax/generators/app/templates/config/application.rb.tt +6 -0
- data/lib/jax/generators/app/templates/config/boot.rb +13 -0
- data/lib/jax/generators/app/templates/config/routes.rb.tt +5 -0
- data/lib/jax/generators/app/templates/public/javascripts/jax.js +7561 -0
- data/lib/jax/generators/app/templates/public/webgl_not_supported.html +26 -0
- data/lib/jax/generators/app/templates/script/jax +7 -0
- data/lib/jax/generators/app/templates/spec/javascripts/controllers/application_controller_spec.js +11 -0
- data/lib/jax/generators/app/templates/spec/javascripts/helpers/application_helper_spec.js +12 -0
- data/lib/jax/generators/app/templates/spec/javascripts/support/jasmine.yml +90 -0
- data/lib/jax/generators/app/templates/spec/javascripts/support/jasmine_config.rb +23 -0
- data/lib/jax/generators/app/templates/spec/javascripts/support/jasmine_runner.rb +32 -0
- data/lib/jax/generators/app/templates/spec/javascripts/support/spec_helpers/jax_spec_helper.js +216 -0
- data/lib/jax/generators/app/templates/spec/javascripts/support/spec_layout.html.erb +63 -0
- data/lib/jax/generators/commands.rb +81 -0
- data/lib/jax/generators/controller/USAGE +9 -0
- data/lib/jax/generators/controller/controller_generator.rb +59 -0
- data/lib/jax/generators/controller/templates/controller_source.js.tt +16 -0
- data/lib/jax/generators/controller/templates/controller_test.js.tt +11 -0
- data/lib/jax/generators/controller/templates/helper.js.tt +3 -0
- data/lib/jax/generators/controller/templates/helper_test.js.tt +12 -0
- data/lib/jax/generators/controller/templates/view.js.tt +4 -0
- data/lib/jax/generators/light_source/USAGE +14 -0
- data/lib/jax/generators/light_source/light_source_generator.rb +47 -0
- data/lib/jax/generators/light_source/templates/light.yml.tt +39 -0
- data/lib/jax/generators/material/USAGE +29 -0
- data/lib/jax/generators/material/material_generator.rb +81 -0
- data/lib/jax/generators/material/templates/append.yml.tt +7 -0
- data/lib/jax/generators/material/templates/material.yml.tt +33 -0
- data/lib/jax/generators/model/USAGE +5 -0
- data/lib/jax/generators/model/model_generator.rb +42 -0
- data/lib/jax/generators/model/templates/model.js.tt +11 -0
- data/lib/jax/generators/model/templates/test.js.tt +11 -0
- data/lib/jax/generators/script_jax_loader.rb +32 -0
- data/lib/jax/monkeypatch/jasmine.rb +3 -0
- data/lib/jax/monkeypatch/jasmine/config.rb +21 -0
- data/lib/jax/monkeypatch/jasmine/server.rb +50 -0
- data/lib/jax/packager.rb +58 -0
- data/lib/jax/packager/sprockets_template.rb +49 -0
- data/lib/jax/resource_compiler.rb +50 -0
- data/lib/jax/routes.rb +61 -0
- data/lib/jax/shader.rb +158 -0
- data/lib/jax/tasks/rake.rb +34 -0
- data/lib/jax/version.rb +12 -0
- data/public/images/brickwall.jpg +0 -0
- data/public/images/jacks.jpg +0 -0
- data/public/images/normal_map.jpg +0 -0
- data/public/images/rock.png +0 -0
- data/public/images/rockNormal.png +0 -0
- data/public/images/rss.png +0 -0
- data/public/webgl_not_supported.html +26 -0
- data/spec/example_app/Gemfile +1 -0
- data/spec/example_app/Rakefile +15 -0
- data/spec/example_app/app/controllers/application_controller.js +5 -0
- data/spec/example_app/app/controllers/courthouse_controller.js +24 -0
- data/spec/example_app/app/controllers/lighting_controller.js +69 -0
- data/spec/example_app/app/controllers/shadows_controller.js +130 -0
- data/spec/example_app/app/controllers/textures_controller.js +52 -0
- data/spec/example_app/app/helpers/application_helper.js +3 -0
- data/spec/example_app/app/helpers/textures_helper.js +3 -0
- data/spec/example_app/app/models/character.js +23 -0
- data/spec/example_app/app/models/door.js +10 -0
- data/spec/example_app/app/models/scene.js +19 -0
- data/spec/example_app/app/resources/characters/judge.yml +3 -0
- data/spec/example_app/app/resources/doors/courthouse_door.yml +5 -0
- data/spec/example_app/app/resources/light_sources/directional_light.yml +13 -0
- data/spec/example_app/app/resources/light_sources/point_light.yml +31 -0
- data/spec/example_app/app/resources/light_sources/spot_light.yml +15 -0
- data/spec/example_app/app/resources/light_sources/sun.yml +7 -0
- data/spec/example_app/app/resources/light_sources/textures_point.yml +34 -0
- data/spec/example_app/app/resources/materials/bricks.yml +36 -0
- data/spec/example_app/app/resources/materials/lighting_with_shadows.yml +27 -0
- data/spec/example_app/app/resources/scenes/courthouse.yml +4 -0
- data/spec/example_app/app/views/courthouse/index.js +4 -0
- data/spec/example_app/app/views/lighting/index.js +4 -0
- data/spec/example_app/app/views/shadows/index.js +6 -0
- data/spec/example_app/app/views/textures/index.js +4 -0
- data/spec/example_app/config/application.rb +6 -0
- data/spec/example_app/config/boot.rb +13 -0
- data/spec/example_app/config/routes.rb +6 -0
- data/spec/example_app/public/images/185__normalmap.png +0 -0
- data/spec/example_app/public/images/face_norm.jpg +0 -0
- data/spec/example_app/public/images/rock.png +0 -0
- data/spec/example_app/public/images/rockNormal.png +0 -0
- data/spec/example_app/public/images/rss.png +0 -0
- data/spec/example_app/public/webgl_not_supported.html +26 -0
- data/spec/example_app/script/jax +7 -0
- data/spec/example_app/spec/javascripts/controllers/textures_controller_spec.js +11 -0
- data/spec/example_app/spec/javascripts/helpers/application_helper_spec.js +12 -0
- data/spec/example_app/spec/javascripts/resources/directional_light_spec.js +16 -0
- data/spec/example_app/spec/javascripts/resources/point_light_spec.js +17 -0
- data/spec/example_app/spec/javascripts/resources/spot_light_spec.js +18 -0
- data/spec/example_app/spec/javascripts/support/jasmine.yml +89 -0
- data/spec/example_app/spec/javascripts/support/jasmine_runner.rb +32 -0
- data/spec/example_app/spec/javascripts/support/spec_helpers/jax_spec_helper.js +93 -0
- data/spec/example_app/spec/javascripts/support/spec_layout.html.erb +84 -0
- data/spec/generators/app_generator_spec.rb +46 -0
- data/spec/generators/controller_generator_spec.rb +68 -0
- data/spec/generators/light_generator_spec.rb +51 -0
- data/spec/generators/material_generator_spec.rb +35 -0
- data/spec/generators/model_generator_spec.rb +43 -0
- data/spec/javascripts/Player.js +58 -0
- data/spec/javascripts/helpers/SpecHelper.js +216 -0
- data/spec/javascripts/jax/builtin/materials/core_materials_spec.js +41 -0
- data/spec/javascripts/jax/builtin/materials/dual_paraboloid_spec.js +37 -0
- data/spec/javascripts/jax/builtin/materials/fog_spec.js +19 -0
- data/spec/javascripts/jax/builtin/materials/lighting_spec.js +19 -0
- data/spec/javascripts/jax/builtin/materials/normal_map_spec.js +19 -0
- data/spec/javascripts/jax/builtin/materials/shadow_map_spec.js +19 -0
- data/spec/javascripts/jax/builtin/materials/texture_spec.js +19 -0
- data/spec/javascripts/jax/builtin/meshes/cube_spec.js +10 -0
- data/spec/javascripts/jax/builtin/meshes/plane_spec.js +8 -0
- data/spec/javascripts/jax/builtin/meshes/quad_spec.js +8 -0
- data/spec/javascripts/jax/builtin/meshes/sphere_spec.js +8 -0
- data/spec/javascripts/jax/builtin/meshes/teapot_spec.js +8 -0
- data/spec/javascripts/jax/builtin/meshes/torus_spec.js +8 -0
- data/spec/javascripts/jax/compatibility_spec.js +50 -0
- data/spec/javascripts/jax/context_spec.js +82 -0
- data/spec/javascripts/jax/controller_spec.js +145 -0
- data/spec/javascripts/jax/core/delegation_spec.js +48 -0
- data/spec/javascripts/jax/core/events_spec.js +17 -0
- data/spec/javascripts/jax/core/matrix_stack_spec.js +28 -0
- data/spec/javascripts/jax/core/utils_spec.js +256 -0
- data/spec/javascripts/jax/helper_spec.js +33 -0
- data/spec/javascripts/jax/model_spec.js +87 -0
- data/spec/javascripts/jax/optimizations/material_limitations_spec.js +87 -0
- data/spec/javascripts/jax/optimizations/shaders/basic_spec.js +68 -0
- data/spec/javascripts/jax/prototype/extensions_spec.js +34 -0
- data/spec/javascripts/jax/route_set_spec.js +67 -0
- data/spec/javascripts/jax/view_manager_spec.js +17 -0
- data/spec/javascripts/jax/webgl/camera_spec.js +159 -0
- data/spec/javascripts/jax/webgl/framebuffer_spec.js +46 -0
- data/spec/javascripts/jax/webgl/lighting_spec.js +61 -0
- data/spec/javascripts/jax/webgl/material_spec.js +118 -0
- data/spec/javascripts/jax/webgl/mesh_spec.js +86 -0
- data/spec/javascripts/jax/webgl/shader/manifest_spec.js +60 -0
- data/spec/javascripts/jax/webgl/shader_chain_spec.js +192 -0
- data/spec/javascripts/jax/webgl/shader_spec.js +276 -0
- data/spec/javascripts/jax/webgl/tangent_space_spec.js +142 -0
- data/spec/javascripts/jax/webgl/texture_spec.js +162 -0
- data/spec/javascripts/jax/webgl_spec.js +5 -0
- data/spec/javascripts/jax/world_spec.js +88 -0
- data/spec/javascripts/jax_spec.js +27 -0
- data/spec/javascripts/support/jasmine.yml +85 -0
- data/spec/javascripts/support/jasmine_runner.rb +32 -0
- data/spec/lib/jax/routes_spec.rb +24 -0
- data/spec/lib/jax/shader_spec.rb +57 -0
- data/spec/lib/jax/tasks/jax_rake_spec.rb +79 -0
- data/spec/spec_helper.rb +11 -0
- data/spec/support/file_exist_matcher.rb +23 -0
- data/spec/support/spec_shell.rb +97 -0
- data/src/jax.js +84 -0
- data/src/jax/anim_frame.js +47 -0
- data/src/jax/builtin/all.js +7 -0
- data/src/jax/builtin/meshes/cube.js +62 -0
- data/src/jax/builtin/meshes/plane.js +36 -0
- data/src/jax/builtin/meshes/quad.js +80 -0
- data/src/jax/builtin/meshes/sphere.js +46 -0
- data/src/jax/builtin/meshes/teapot.js +38 -0
- data/src/jax/builtin/meshes/torus.js +46 -0
- data/src/jax/compatibility.js +140 -0
- data/src/jax/context.js +253 -0
- data/src/jax/controller.js +157 -0
- data/src/jax/core.js +39 -0
- data/src/jax/core/math.js +40 -0
- data/src/jax/core/matrix_stack.js +306 -0
- data/src/jax/core/util.js +226 -0
- data/src/jax/events.js +179 -0
- data/src/jax/geometry.js +3 -0
- data/src/jax/geometry/plane.js +59 -0
- data/src/jax/helper.js +8 -0
- data/src/jax/model.js +163 -0
- data/src/jax/prototype/class.js +78 -0
- data/src/jax/prototype/core.js +112 -0
- data/src/jax/prototype/extensions.js +124 -0
- data/src/jax/route_set.js +125 -0
- data/src/jax/vendor/ejs.js +4 -0
- data/src/jax/vendor/glMatrix.js +3 -0
- data/src/jax/view.js +37 -0
- data/src/jax/view_manager.js +46 -0
- data/src/jax/webgl.js +98 -0
- data/src/jax/webgl/camera.js +526 -0
- data/src/jax/webgl/core.js +6 -0
- data/src/jax/webgl/core/buffer.js +161 -0
- data/src/jax/webgl/core/edge.js +6 -0
- data/src/jax/webgl/core/events.js +25 -0
- data/src/jax/webgl/core/face.js +8 -0
- data/src/jax/webgl/core/framebuffer.js +206 -0
- data/src/jax/webgl/material.js +375 -0
- data/src/jax/webgl/mesh.js +412 -0
- data/src/jax/webgl/scene.js +11 -0
- data/src/jax/webgl/scene/frustum.js +260 -0
- data/src/jax/webgl/scene/light_manager.js +112 -0
- data/src/jax/webgl/scene/light_source.js +248 -0
- data/src/jax/webgl/shader.js +282 -0
- data/src/jax/webgl/shader/delegator.js +13 -0
- data/src/jax/webgl/shader/delegator/attribute.js +53 -0
- data/src/jax/webgl/shader/delegator/uniform.js +71 -0
- data/src/jax/webgl/shader/manifest.js +64 -0
- data/src/jax/webgl/shader/program.js +140 -0
- data/src/jax/webgl/shader_chain.js +256 -0
- data/src/jax/webgl/texture.js +312 -0
- data/src/jax/webgl/world.js +119 -0
- data/vendor/ejs/.svn/all-wcprops +17 -0
- data/vendor/ejs/.svn/entries +114 -0
- data/vendor/ejs/.svn/text-base/Eratta.txt.svn-base +3 -0
- data/vendor/ejs/.svn/text-base/license.txt.svn-base +21 -0
- data/vendor/ejs/Eratta.txt +3 -0
- data/vendor/ejs/example/.svn/all-wcprops +29 -0
- data/vendor/ejs/example/.svn/entries +164 -0
- data/vendor/ejs/example/.svn/prop-base/ejs.gif.svn-base +5 -0
- data/vendor/ejs/example/.svn/text-base/demo.html.svn-base +54 -0
- data/vendor/ejs/example/.svn/text-base/ejs.gif.svn-base +0 -0
- data/vendor/ejs/example/.svn/text-base/example.css.svn-base +31 -0
- data/vendor/ejs/example/.svn/text-base/example.js.svn-base +88 -0
- data/vendor/ejs/example/demo.html +54 -0
- data/vendor/ejs/example/ejs.gif +0 -0
- data/vendor/ejs/example/example.css +31 -0
- data/vendor/ejs/example/example.js +88 -0
- data/vendor/ejs/lib/.svn/all-wcprops +11 -0
- data/vendor/ejs/lib/.svn/entries +62 -0
- data/vendor/ejs/lib/.svn/text-base/ejs_fulljslint.js.svn-base +3774 -0
- data/vendor/ejs/lib/ejs_fulljslint.js +3774 -0
- data/vendor/ejs/license.txt +21 -0
- data/vendor/ejs/script/.svn/all-wcprops +17 -0
- data/vendor/ejs/script/.svn/entries +96 -0
- data/vendor/ejs/script/.svn/prop-base/yuicompressor-2.2.4.jar.svn-base +5 -0
- data/vendor/ejs/script/.svn/text-base/production.bat.svn-base +4 -0
- data/vendor/ejs/script/.svn/text-base/yuicompressor-2.2.4.jar.svn-base +0 -0
- data/vendor/ejs/script/production.bat +4 -0
- data/vendor/ejs/script/yuicompressor-2.2.4.jar +0 -0
- data/vendor/ejs/src/.svn/all-wcprops +17 -0
- data/vendor/ejs/src/.svn/entries +96 -0
- data/vendor/ejs/src/.svn/text-base/ejs.js.svn-base +505 -0
- data/vendor/ejs/src/.svn/text-base/view.js.svn-base +200 -0
- data/vendor/ejs/src/ejs.js +505 -0
- data/vendor/ejs/src/view.js +200 -0
- data/vendor/ejs/test/.svn/all-wcprops +23 -0
- data/vendor/ejs/test/.svn/entries +139 -0
- data/vendor/ejs/test/.svn/text-base/index.html.svn-base +18 -0
- data/vendor/ejs/test/.svn/text-base/setup_test.html.svn-base +44 -0
- data/vendor/ejs/test/.svn/text-base/sidebar.html.svn-base +28 -0
- data/vendor/ejs/test/included/.svn/all-wcprops +23 -0
- data/vendor/ejs/test/included/.svn/entries +130 -0
- data/vendor/ejs/test/included/.svn/text-base/prototype.js.svn-base +4184 -0
- data/vendor/ejs/test/included/.svn/text-base/test.css.svn-base +44 -0
- data/vendor/ejs/test/included/.svn/text-base/unittest.js.svn-base +564 -0
- data/vendor/ejs/test/included/prototype.js +4184 -0
- data/vendor/ejs/test/included/test.css +44 -0
- data/vendor/ejs/test/included/unittest.js +564 -0
- data/vendor/ejs/test/index.html +18 -0
- data/vendor/ejs/test/setup_test.html +44 -0
- data/vendor/ejs/test/sidebar.html +28 -0
- data/vendor/ejs/test/templates/.svn/all-wcprops +11 -0
- data/vendor/ejs/test/templates/.svn/entries +62 -0
- data/vendor/ejs/test/templates/.svn/text-base/test.ejs.svn-base +3 -0
- data/vendor/ejs/test/templates/test.ejs +3 -0
- data/vendor/ejs/test/tests/.svn/all-wcprops +23 -0
- data/vendor/ejs/test/tests/.svn/entries +130 -0
- data/vendor/ejs/test/tests/.svn/text-base/rendering.js.svn-base +94 -0
- data/vendor/ejs/test/tests/.svn/text-base/templating.js.svn-base +43 -0
- data/vendor/ejs/test/tests/.svn/text-base/views.js.svn-base +100 -0
- data/vendor/ejs/test/tests/rendering.js +94 -0
- data/vendor/ejs/test/tests/templating.js +43 -0
- data/vendor/ejs/test/tests/views.js +100 -0
- data/vendor/glmatrix/benchmark/js/CanvasMatrix.js +722 -0
- data/vendor/glmatrix/benchmark/js/EWGL_math.js +742 -0
- data/vendor/glmatrix/benchmark/js/mjs.js +1230 -0
- data/vendor/glmatrix/benchmark/matrix_benchmark.html +419 -0
- data/vendor/glmatrix/glMatrix-min.js +32 -0
- data/vendor/glmatrix/glMatrix.js +1815 -0
- data/vendor/glmatrix/unit tests/glMatrix-test.js +74 -0
- data/vendor/glmatrix/unit tests/qunit.css +119 -0
- data/vendor/glmatrix/unit tests/qunit.js +1069 -0
- data/vendor/glmatrix/unit tests/test_glMatrix.html +21 -0
- data/vendor/yuicompressor-2.4.2.jar +0 -0
- metadata +748 -0
|
@@ -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,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,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"});
|