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
data/src/jax/core.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
//= require "vendor/ejs"
|
|
2
|
+
//= require "vendor/glMatrix"
|
|
3
|
+
//= require "prototype/class"
|
|
4
|
+
//= require "core/math"
|
|
5
|
+
//= require "core/util"
|
|
6
|
+
//= require "core/matrix_stack"
|
|
7
|
+
|
|
8
|
+
// a global debugAssert method that will do nothing in production, and fail if expr is false
|
|
9
|
+
// in any other run mode. If msg is given, an error with that message is raised. Otherwise,
|
|
10
|
+
// a more generic error is raised.
|
|
11
|
+
window.debugAssert = function(expr, msg) {
|
|
12
|
+
if (Jax.environment != "production" && !expr)
|
|
13
|
+
{
|
|
14
|
+
var error = new Error(msg || "debugAssert failed");
|
|
15
|
+
if (error.stack) error = new Error((msg || "debugAssert failed")+"\n\n"+error.stack);
|
|
16
|
+
throw error;
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
// If glMatrixArrayType isn't simply Array, then most browsers (FF, Chrome) have a pretty
|
|
21
|
+
// crappy implementation of toString() that actually tells you nothing about the array's
|
|
22
|
+
// contents. This makes the #toString method a little more Array-like.
|
|
23
|
+
//
|
|
24
|
+
// Ex: "[Float32Array: -100,-100,-100]"
|
|
25
|
+
if (glMatrixArrayType.prototype.toString != Array.prototype.toString) {
|
|
26
|
+
glMatrixArrayType.prototype.toString = function() {
|
|
27
|
+
var s = "["+glMatrixArrayType.name+": ";
|
|
28
|
+
var d = false;
|
|
29
|
+
for (var i in this) {
|
|
30
|
+
if (parseInt(i) == i) {
|
|
31
|
+
if (d) s += ",";
|
|
32
|
+
s += this[i];
|
|
33
|
+
d = true;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
s += "]";
|
|
37
|
+
return s;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// If an epsilon isn't defined, define it. This is used for fuzzy equality with floats,
|
|
2
|
+
// because of floating point imprecision.
|
|
3
|
+
Math.EPSILON = Math.EPSILON || 0.00001;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Math
|
|
7
|
+
* Defines math-related helper functions.
|
|
8
|
+
**/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Math.radToDeg(rad) -> Number
|
|
12
|
+
* Helper to convert radians to degrees.
|
|
13
|
+
**/
|
|
14
|
+
Math.radToDeg = Math.radToDeg || function(rad) {
|
|
15
|
+
return rad * 180.0 / Math.PI;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Math.radToDeg(rad) -> Number
|
|
20
|
+
* Helper to convert degrees to radians.
|
|
21
|
+
**/
|
|
22
|
+
Math.degToRad = Math.degToRad || function(deg) {
|
|
23
|
+
return deg * Math.PI / 180.0;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Math.equalish(a, b) -> Boolean
|
|
28
|
+
* Arguments can be either scalar or vector, but must be of the same type.
|
|
29
|
+
* Returns true if the arguments are "equal enough" after accounting for floating-point
|
|
30
|
+
* precision loss. Returns false otherwise.
|
|
31
|
+
**/
|
|
32
|
+
Math.equalish = Math.equalish || function(a, b) {
|
|
33
|
+
if (!a.length && !b.length)
|
|
34
|
+
return Math.abs(a - b) <= Math.EPSILON;
|
|
35
|
+
|
|
36
|
+
if (a.length != b.length) return false;
|
|
37
|
+
for (var i = 0; i < a.length; i++)
|
|
38
|
+
if (Math.abs(a[i] - b[i]) > Math.EPSILON) return false;
|
|
39
|
+
return true;
|
|
40
|
+
};
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
//= require "../vendor/glMatrix"
|
|
2
|
+
//= require "../prototype/class"
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Jax.IDENTITY_MATRIX
|
|
6
|
+
* A cache of the identity matrix so that we're not constantly allocating identities.
|
|
7
|
+
**/
|
|
8
|
+
Jax.IDENTITY_MATRIX = mat4.identity(mat4.create());
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* class Jax.MatrixStack
|
|
12
|
+
*
|
|
13
|
+
* A matrix stack, obviously. Every Jax.Context allocates its own matrix stack, so you probably
|
|
14
|
+
* shouldn't have to instantiate this directly. Calls to methods of the same name on Jax.Context
|
|
15
|
+
* are delegated into its own matrix stack, so you're really calling these methods.
|
|
16
|
+
*
|
|
17
|
+
* Note that for performance reasons, whenever you call get[Some]Matrix(), the matrix instance
|
|
18
|
+
* itself is returned instead of a copy of the instance. That gives you the power to make changes
|
|
19
|
+
* directly to the matrix, instead of doing them via the stack. For instance, instead of calling
|
|
20
|
+
* Jax.MatrixStack#loadMatrix(), you could just as easily call mat4#set() using one of the
|
|
21
|
+
* matrices here as an argument. However, in doing so you will lose the auto-updating of other
|
|
22
|
+
* matrices, so you must be very careful about how you modify matrices.
|
|
23
|
+
*
|
|
24
|
+
* For example, it would be very easy to use mat4.multiply() to change the model matrix. In doing
|
|
25
|
+
* so, the inverse model matrix would no longer be accurate. This could lead to very
|
|
26
|
+
* difficult-to-debug situations.
|
|
27
|
+
*
|
|
28
|
+
* When in doubt, it is _strongly_ recommended to use the various matrix methods found in
|
|
29
|
+
* Jax.MatrixStack to modify the matrices here. This will keep all related matrices up-to-date.
|
|
30
|
+
**/
|
|
31
|
+
Jax.MatrixStack = (function() {
|
|
32
|
+
var MODEL = 1, VIEW = 2, PROJECTION = 3;
|
|
33
|
+
|
|
34
|
+
function updateMVP(self) {
|
|
35
|
+
mat4.multiply(self.getProjectionMatrix(), self.getModelViewMatrix(), self.getModelViewProjectionMatrix());
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function updateModelView(self) {
|
|
39
|
+
mat4.multiply(self.getInverseViewMatrix(), self.getModelMatrix(), self.getModelViewMatrix());
|
|
40
|
+
mat4.inverse(self.getModelViewMatrix(), self.getInverseModelViewMatrix());
|
|
41
|
+
updateMVP(self);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function updateNormal(self) {
|
|
45
|
+
mat4.toMat3(self.getInverseModelViewMatrix(), self.getNormalMatrix());
|
|
46
|
+
mat3.transpose(self.getNormalMatrix());
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function mMatrixUpdated(self) {
|
|
50
|
+
mat4.inverse(self.getModelMatrix(), self.getInverseModelMatrix());
|
|
51
|
+
updateModelView(self);
|
|
52
|
+
updateNormal(self);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function vMatrixUpdated(self) {
|
|
56
|
+
mat4.inverse(self.getViewMatrix(), self.getInverseViewMatrix());
|
|
57
|
+
updateModelView(self);
|
|
58
|
+
updateNormal(self);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function pMatrixUpdated(self) {
|
|
62
|
+
mat4.inverse(self.getProjectionMatrix(), self.getInverseProjectionMatrix());
|
|
63
|
+
updateMVP(self);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function loadMatrix(self, which, values) {
|
|
67
|
+
switch(which) {
|
|
68
|
+
case MODEL:
|
|
69
|
+
mat4.set(values, self.getModelMatrix());
|
|
70
|
+
mMatrixUpdated(self);
|
|
71
|
+
break;
|
|
72
|
+
case VIEW:
|
|
73
|
+
mat4.set(values, self.getViewMatrix());
|
|
74
|
+
vMatrixUpdated(self);
|
|
75
|
+
break;
|
|
76
|
+
case PROJECTION:
|
|
77
|
+
mat4.set(values, self.getProjectionMatrix());
|
|
78
|
+
pMatrixUpdated(self);
|
|
79
|
+
break;
|
|
80
|
+
default: throw new Error("programming error: matrix ID not understood: "+which);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function multMatrix(self, which, values) {
|
|
85
|
+
switch(which) {
|
|
86
|
+
case MODEL:
|
|
87
|
+
mat4.multiply(self.getModelMatrix(), values, self.getModelMatrix());
|
|
88
|
+
mMatrixUpdated(self);
|
|
89
|
+
break;
|
|
90
|
+
case VIEW:
|
|
91
|
+
mat4.multiply(self.getViewMatrix(), values, self.getViewMatrix());
|
|
92
|
+
vMatrixUpdated(self);
|
|
93
|
+
break;
|
|
94
|
+
case PROJECTION:
|
|
95
|
+
mat4.multiply(self.getProjectionMatrix(), values, self.getProjectionMatrix());
|
|
96
|
+
pMatrixUpdated(self);
|
|
97
|
+
break;
|
|
98
|
+
default: throw new Error("programming error: matrix ID not understood: "+which);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/*
|
|
103
|
+
iterates through each matrix stack in self.matrices and pushes a new matrix onto the stack.
|
|
104
|
+
If the new matrix level already has a matrix, it is used; otherwise, a new one is allocated.
|
|
105
|
+
Then, the current level's matrix values are copied into the next level's matrix.
|
|
106
|
+
*/
|
|
107
|
+
function pushMatrix(self) {
|
|
108
|
+
var current;
|
|
109
|
+
var stack;
|
|
110
|
+
var current_depth = self.depth;
|
|
111
|
+
var type;
|
|
112
|
+
|
|
113
|
+
self.depth++;
|
|
114
|
+
for (var i in self.matrices) {
|
|
115
|
+
stack = self.matrices[i];
|
|
116
|
+
current = stack[current_depth];
|
|
117
|
+
type = (current.length == 9 ? mat3 : mat4);
|
|
118
|
+
stack[self.depth] = stack[self.depth] || type.create();
|
|
119
|
+
type.set(current, stack[self.depth]);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return Jax.Class.create({
|
|
124
|
+
/**
|
|
125
|
+
* Jax.MatrixStack#push() -> Jax.MatrixStack
|
|
126
|
+
*
|
|
127
|
+
* Saves the state of all current matrices, so that further operations won't affect them directly.
|
|
128
|
+
* If another set of matrices already exist, they are used; otherwise, a new set is allocated.
|
|
129
|
+
* After a new set of matrices has been secured, all current values are copied into the new set.
|
|
130
|
+
*
|
|
131
|
+
* See also Jax.MatrixStack#pop()
|
|
132
|
+
**/
|
|
133
|
+
push: function() { pushMatrix(this); },
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Reverts back to an earlier matrix stack, effectively undoing any changes that have been made
|
|
137
|
+
* since the most recent call to Jax.MatrixStack#push().
|
|
138
|
+
**/
|
|
139
|
+
pop: function() { this.depth--; },
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Jax.MatrixStack#reset() -> Jax.MatrixStack
|
|
143
|
+
*
|
|
144
|
+
* Resets the stack depth to zero, effectively undoing all calls to #push().
|
|
145
|
+
**/
|
|
146
|
+
reset: function() { this.depth = 0; },
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Jax.MatrixStack#loadModelMatrix(matr) -> Jax.MatrixStack
|
|
150
|
+
* - matr (mat4): the new matrix values
|
|
151
|
+
* Replaces the current model matrix with the specified one.
|
|
152
|
+
* Updates the inverse model matrix, the modelview matrix, the inverse modelview matrix and the normal matrix.
|
|
153
|
+
**/
|
|
154
|
+
loadModelMatrix: function(values) { loadMatrix(this, MODEL, values); return this; },
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Jax.MatrixStack#loadViewMatrix(matr) -> Jax.MatrixStack
|
|
158
|
+
* - matr (mat4): the new matrix values
|
|
159
|
+
* Replaces the current view matrix with the specified one.
|
|
160
|
+
* Updates the inverse view matrix, the modelview matrix, the inverse modelview matrix and the normal matrix.
|
|
161
|
+
**/
|
|
162
|
+
loadViewMatrix: function(values) { loadMatrix(this, VIEW, values); return this; },
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Jax.MatrixStack#loadProjectionMatrix(matr) -> Jax.MatrixStack
|
|
166
|
+
* - matr (mat4): the new matrix values
|
|
167
|
+
* Replaces the current projection matrix with the specified one.
|
|
168
|
+
* Updates the inverse projection matrix.
|
|
169
|
+
**/
|
|
170
|
+
loadProjectionMatrix: function(values) { loadMatrix(this, PROJECTION, values); return this; },
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Jax.MatrixStack#multModelMatrix(matr) -> Jax.MatrixStack
|
|
174
|
+
* - matr (mat4): the matrix values
|
|
175
|
+
* Multiplies the current model matrix with the specified one.
|
|
176
|
+
* Updates the inverse model matrix, the modelview matrix, the inverse modelview matrix and the normal matrix.
|
|
177
|
+
**/
|
|
178
|
+
multModelMatrix: function(values) { multMatrix(this, MODEL, values); return this; },
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Jax.MatrixStack#multViewMatrix(matr) -> Jax.MatrixStack
|
|
182
|
+
* - matr (mat4): the matrix values
|
|
183
|
+
* Multiplies the current view matrix with the specified one.
|
|
184
|
+
* Updates the inverse view matrix, the modelview matrix, the inverse modelview matrix and the normal matrix.
|
|
185
|
+
**/
|
|
186
|
+
multViewMatrix: function(values) { multMatrix(this, VIEW, values); return this; },
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Jax.MatrixStack#multProjectionMatrix(matr) -> Jax.MatrixStack
|
|
190
|
+
* - matr (mat4): the matrix values
|
|
191
|
+
* Multiplies the current projection matrix with the specified one.
|
|
192
|
+
* Updates the inverse projection matrix.
|
|
193
|
+
**/
|
|
194
|
+
multProjectionMatrix: function(values) { multMatrix(this, PROJECTION, values); return this; },
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Jax.MatrixStack#getModelMatrix() -> mat4
|
|
198
|
+
*
|
|
199
|
+
* the local model transformation matrix. Most models will manipulate this matrix. Multiplying an object-space
|
|
200
|
+
* coordinate by this matrix will result in a world-space coordinate.
|
|
201
|
+
**/
|
|
202
|
+
getModelMatrix: function() { return this.matrices.model[this.depth]; },
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Jax.MatrixStack#getInverseModelMatrix() -> mat4
|
|
206
|
+
*
|
|
207
|
+
* the opposite of the local model transformation matrix. Multiplying a point in world space against this matrix
|
|
208
|
+
* will result in an object relative to the current object space.
|
|
209
|
+
**/
|
|
210
|
+
getInverseModelMatrix: function() { return this.matrices.inverse_model[this.depth]; },
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Jax.MatrixStack#getNormalMatrix() -> mat3
|
|
214
|
+
*
|
|
215
|
+
* the inverse transpose of the modelview matrix. See
|
|
216
|
+
* http://www.lighthouse3d.com/tutorials/glsl-tutorial/the-normal-matrix/
|
|
217
|
+
* for a good writeup of where and how this matrix is useful. Multiplying a 3D _directional_ (not _positional)
|
|
218
|
+
* vector against this matrix will result in a 3D _directional_ vector in eye space.
|
|
219
|
+
**/
|
|
220
|
+
getNormalMatrix: function() { return this.matrices.normal[this.depth]; },
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Jax.MatrixStack#getViewMatrix() -> mat4
|
|
224
|
+
*
|
|
225
|
+
* aka the camera matrix. Multiplying a point in eye space (e.g. relative to the camera) against the view matrix
|
|
226
|
+
* results in a point in world space.
|
|
227
|
+
**/
|
|
228
|
+
getViewMatrix: function() { return this.matrices.view[this.depth]; },
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Jax.MatrixStack#getInverseViewMatrix() -> mat4
|
|
232
|
+
*
|
|
233
|
+
* the opposite of the camera matrix. Multiplying a point in world space against this matrix
|
|
234
|
+
* will result in a point in eye space (relative to camera).
|
|
235
|
+
**/
|
|
236
|
+
getInverseViewMatrix: function() { return this.matrices.inverse_view[this.depth]; },
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Jax.MatrixStack#getModelViewMatrix() -> mat4
|
|
240
|
+
*
|
|
241
|
+
* the only matrix OpenGL actually cares about, the modelview matrix. A combination of both model and view
|
|
242
|
+
* matrices, equivalent to mat4.multiply(view, model). (OpenGL matrix operations are read from right-to-left.)
|
|
243
|
+
*
|
|
244
|
+
* Multiplying a point in object space by this matrix will effectively skip the world space transformation,
|
|
245
|
+
* resulting in a coordinate placed directly into eye space. This has the obvious advantage of being faster
|
|
246
|
+
* than performing the operation in two steps (model and then view).
|
|
247
|
+
**/
|
|
248
|
+
getModelViewMatrix: function() { return this.matrices.modelview[this.depth]; },
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Jax.MatrixStack#getInverseModelViewMatrix() -> mat4
|
|
252
|
+
*
|
|
253
|
+
* The opposite of the modelview matrix. Multiplying an eye-space coordinate by this matrix results in an
|
|
254
|
+
* object-space coordinate.
|
|
255
|
+
**/
|
|
256
|
+
getInverseModelViewMatrix: function() { return this.matrices.inverse_modelview[this.depth]; },
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Jax.MatrixStack#getProjectionMatrix() -> mat4
|
|
260
|
+
*
|
|
261
|
+
* aka the screen matrix. Multiplying a point in eye space against the projection matrix results in a 4D
|
|
262
|
+
* vector in clip space. Dividing clip coordinates (XYZ) by the 4th component (W) yields a 3D vector in
|
|
263
|
+
* normalized device coordinates, where all components are in the range [-1,1]. These points are ultimately
|
|
264
|
+
* multiplied by screen dimensions to find a pixel position.
|
|
265
|
+
**/
|
|
266
|
+
getProjectionMatrix: function() { return this.matrices.projection[this.depth]; },
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Jax.MatrixStack#getModelViewProjectionMatrix() -> mat4
|
|
270
|
+
*
|
|
271
|
+
* Returns the model, view and projection matrices combined into one.
|
|
272
|
+
**/
|
|
273
|
+
getModelViewProjectionMatrix: function() { return this.matrices.modelview_projection[this.depth]; },
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Jax.MatrixStack#getInverseProjectionMatrix() -> mat4
|
|
277
|
+
*
|
|
278
|
+
* the opposite of the projection matrix. Multiplying a 4D vector in normalized device coordinates by
|
|
279
|
+
* its 4th component will result in clip space coordinates. Multiplying these clip space coordinates by the inverse
|
|
280
|
+
* projection matrix will result in a point in eye space, relative to the camera.
|
|
281
|
+
**/
|
|
282
|
+
getInverseProjectionMatrix: function() { return this.matrices.inverse_projection[this.depth]; },
|
|
283
|
+
|
|
284
|
+
initialize: function() {
|
|
285
|
+
this.depth = 0;
|
|
286
|
+
|
|
287
|
+
this.matrices = {
|
|
288
|
+
/* matrix depth, essentially the array index representing the current level in the stack. */
|
|
289
|
+
model: [mat4.create()],
|
|
290
|
+
inverse_model: [mat4.create()],
|
|
291
|
+
normal: [mat3.create()],
|
|
292
|
+
view: [mat4.create()],
|
|
293
|
+
inverse_view: [mat4.create()],
|
|
294
|
+
modelview: [mat4.create()],
|
|
295
|
+
inverse_modelview: [mat4.create()],
|
|
296
|
+
projection: [mat4.create()],
|
|
297
|
+
inverse_projection: [mat4.create()],
|
|
298
|
+
modelview_projection: [mat4.create()]
|
|
299
|
+
};
|
|
300
|
+
|
|
301
|
+
this.loadModelMatrix(Jax.IDENTITY_MATRIX);
|
|
302
|
+
this.loadViewMatrix(Jax.IDENTITY_MATRIX);
|
|
303
|
+
this.loadProjectionMatrix(Jax.IDENTITY_MATRIX); // there's no known data about the viewport at this time.
|
|
304
|
+
}
|
|
305
|
+
});
|
|
306
|
+
})();
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Jax.Util
|
|
3
|
+
* Contains general-purpose utility and helper functions
|
|
4
|
+
**/
|
|
5
|
+
Jax.Util = {
|
|
6
|
+
/**
|
|
7
|
+
* Jax.Util.vectorize(object) -> vec3
|
|
8
|
+
* - object (Object): any Object
|
|
9
|
+
*
|
|
10
|
+
* Analyzes the input object and returns a vec3 based on its contents. Input can be any of the following:
|
|
11
|
+
* * a vec3
|
|
12
|
+
* * an array
|
|
13
|
+
* * an object with {x, y, z} properties
|
|
14
|
+
* * an object with {0, 1, 2} properties
|
|
15
|
+
* * a string delimited with any combination of commas, spaces and/or tab characters. Examples:
|
|
16
|
+
* "x,y,z"
|
|
17
|
+
* "x y z"
|
|
18
|
+
* "x, y, z"
|
|
19
|
+
* "x\ty\tz"
|
|
20
|
+
* "x, \ty, \tz"
|
|
21
|
+
**/
|
|
22
|
+
vectorize: function(data) {
|
|
23
|
+
if (data) {
|
|
24
|
+
var res = vec3.create();
|
|
25
|
+
if (typeof(data) == "string") {
|
|
26
|
+
var components = data.split(/[,\s]+/);
|
|
27
|
+
if (components.length >= 3) {
|
|
28
|
+
for (var i = 0; i < 3; i++)
|
|
29
|
+
res[i] = parseFloat(components[i]);
|
|
30
|
+
}
|
|
31
|
+
return res;
|
|
32
|
+
}
|
|
33
|
+
if (data.length && data.length >= 3) return vec3.set(data, res);
|
|
34
|
+
if ((res[0] = data.x) != undefined && (res[1] = data.y) != undefined && (res[2] = data.z) != undefined) return res;
|
|
35
|
+
if ((res[0] = data[0]) != undefined && (res[1] = data[1]) != undefined && (res[2] = data[2]) != undefined) return res;
|
|
36
|
+
}
|
|
37
|
+
throw new Error("Input argument for Jax.Util.vectorize not recognized: "+JSON.stringify(data));
|
|
38
|
+
},
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Jax.Util.colorize(object) -> vec4
|
|
42
|
+
* - object (Object): any Object
|
|
43
|
+
*
|
|
44
|
+
* Analyzes the input object and returns a 4-component color vector based on its contents. Input can be any of the
|
|
45
|
+
* following:
|
|
46
|
+
* * an array
|
|
47
|
+
* * an object with {r, g, b, a} properties
|
|
48
|
+
* * an object with {0, 1, 2, 3} properties
|
|
49
|
+
* * a string delimited with any combination of commas, spaces and/or tab characters. Examples:
|
|
50
|
+
* "r,g,b,a"
|
|
51
|
+
* "r g b a"
|
|
52
|
+
* "r, g, b, a"
|
|
53
|
+
* "r\tg\tb\ta"
|
|
54
|
+
* "r, \tg, \tb, \ta"
|
|
55
|
+
*
|
|
56
|
+
* In all cases, if the alpha component is omitted, it defaults to 1.0.
|
|
57
|
+
**/
|
|
58
|
+
colorize: function(data) {
|
|
59
|
+
if (data) {
|
|
60
|
+
var res = [0,0,0,0];
|
|
61
|
+
|
|
62
|
+
if (typeof(data) == "string") {
|
|
63
|
+
var components = data.split(/[,\s]+/);
|
|
64
|
+
if (components.length >= 3) {
|
|
65
|
+
for (var i = 0; i < 4; i++)
|
|
66
|
+
if (components.length <= i)
|
|
67
|
+
res[i] = 1.0;
|
|
68
|
+
else
|
|
69
|
+
res[i] = parseFloat(components[i]);
|
|
70
|
+
}
|
|
71
|
+
return res;
|
|
72
|
+
}
|
|
73
|
+
if (data.length && data.length >= 3) {
|
|
74
|
+
res[0] = data[0];
|
|
75
|
+
res[1] = data[1];
|
|
76
|
+
res[2] = data[2];
|
|
77
|
+
if ((res[3] = data[3]) == undefined) res[3] = 1.0;
|
|
78
|
+
else res[3] = 1.0;
|
|
79
|
+
return res;
|
|
80
|
+
}
|
|
81
|
+
if ((res[0] = data.r) != undefined && (res[1] = data.g) != undefined && (res[2] = data.b) != undefined) {
|
|
82
|
+
if ((res[3] = data.a) == undefined) res[3] = 1.0;
|
|
83
|
+
return res;
|
|
84
|
+
}
|
|
85
|
+
if ((res[0] = data.red) != undefined && (res[1] = data.green) != undefined && (res[2] = data.blue) != undefined) {
|
|
86
|
+
if ((res[3] = data.alpha) == undefined) res[3] = 1.0;
|
|
87
|
+
return res;
|
|
88
|
+
}
|
|
89
|
+
if ((res[0] = data[0]) != undefined && (res[1] = data[1]) != undefined && (res[2] = data[2]) != undefined) {
|
|
90
|
+
if ((res[3] = data[3]) == undefined) res[3] = 1.0;
|
|
91
|
+
return res;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
throw new Error("Input argument for Jax.Util.colorize not recognized: "+JSON.stringify(data));
|
|
95
|
+
},
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Jax.Util.properties(object) -> Array
|
|
99
|
+
* - object (Object): any Object
|
|
100
|
+
*
|
|
101
|
+
* Returns an array containing the names of all properties in the specified object.
|
|
102
|
+
**/
|
|
103
|
+
properties: function(object) {
|
|
104
|
+
var arr = [];
|
|
105
|
+
for (var i in object)
|
|
106
|
+
arr.push(i);
|
|
107
|
+
return arr;
|
|
108
|
+
},
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Jax.Util.merge(incoming, outgoing) -> outgoing
|
|
112
|
+
* Merges the two objects by copying all properties from _incoming_ into _outgoing_, replacing
|
|
113
|
+
* any properties that already exist. _outgoing_ will retain any properties that do not exist
|
|
114
|
+
* in _incoming_.
|
|
115
|
+
**/
|
|
116
|
+
merge: function(src, dst) {
|
|
117
|
+
if (!src) return;
|
|
118
|
+
var i, j, n;
|
|
119
|
+
|
|
120
|
+
function doComparison(i) {
|
|
121
|
+
if (src[i] == null) dst[i] = null;
|
|
122
|
+
else if (src[i].klass) dst[i] = src[i];
|
|
123
|
+
else if (Object.isArray(src[i])) Jax.Util.merge(src[i], dst[i] = dst[i] || []);
|
|
124
|
+
else if (typeof(src[i]) == "object") {
|
|
125
|
+
if (Object.isArray(dst[i])) {
|
|
126
|
+
n = {};
|
|
127
|
+
for (j = 0; j < dst[i].length; j++) n[j] = dst[i][j];
|
|
128
|
+
dst[i] = n;
|
|
129
|
+
}
|
|
130
|
+
Jax.Util.merge(src[i], dst[i] = dst[i] || {});
|
|
131
|
+
}
|
|
132
|
+
else dst[i] = src[i];
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
if (Object.isArray(src)) for (i = 0; i < src.length; i++) doComparison(i);
|
|
136
|
+
else for (i in src) doComparison(i);
|
|
137
|
+
|
|
138
|
+
return dst;
|
|
139
|
+
},
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Jax.Util.normalizeOptions(incoming, defaults) -> Object
|
|
143
|
+
* Receives incoming and formats it into a generic Object with a structure representing the given defaults.
|
|
144
|
+
* The returned object is always a brand-new object, to avoid polluting original incoming object.
|
|
145
|
+
* If the object contains a Jax.Class instance, that actual object is copied over. All other objects
|
|
146
|
+
* are cloned into brand-new objects.
|
|
147
|
+
**/
|
|
148
|
+
normalizeOptions: function(incoming, defaults) {
|
|
149
|
+
var result = {};
|
|
150
|
+
Jax.Util.merge(defaults, result);
|
|
151
|
+
Jax.Util.merge(incoming, result);
|
|
152
|
+
return result;
|
|
153
|
+
},
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Jax.Util.sizeofFormat(glEnum) -> Number
|
|
157
|
+
*
|
|
158
|
+
* Returns the byte size of an array consisting of this type of element.
|
|
159
|
+
*
|
|
160
|
+
* Example:
|
|
161
|
+
*
|
|
162
|
+
* Jax.Util.sizeofFormat(GL_RGB)
|
|
163
|
+
* //=> 3
|
|
164
|
+
*
|
|
165
|
+
* If this isn't a recognized format, it is passed off to Jax.Util.enumName and an error is thrown.
|
|
166
|
+
**/
|
|
167
|
+
sizeofFormat: function(glEnum) {
|
|
168
|
+
switch(glEnum) {
|
|
169
|
+
case GL_ALPHA: return 1; // alpha component only
|
|
170
|
+
case GL_LUMINANCE: return 1; // luminance component only
|
|
171
|
+
case GL_RGB: return 3; // RGB triplet
|
|
172
|
+
case GL_RGBA: return 4; // all 4 components
|
|
173
|
+
case GL_LUMINANCE_ALPHA: return 2; // luminance/alpha pair
|
|
174
|
+
}
|
|
175
|
+
throw new Error("Unrecognized format: "+Jax.Util.enumName(glEnum));
|
|
176
|
+
},
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Jax.Util.enumName(glEnum) -> String
|
|
180
|
+
* - glEnum (GLenum): a WebGL enumeration, presumably numeric.
|
|
181
|
+
*
|
|
182
|
+
* Returns the name of the enumeration prefixed with "GL_" that shares a value with the passed-in enum.
|
|
183
|
+
*
|
|
184
|
+
* If the enum can't be found (this happens sometimes when an enum crops up that isn't in the WebGL spec),
|
|
185
|
+
* then a string containing both the decimal and hexadecimal form of this enum is returned:
|
|
186
|
+
*
|
|
187
|
+
* "(unrecognized enum: 36059 [0x8cdb])"
|
|
188
|
+
*
|
|
189
|
+
* This is primarily for debugging and error reporting.
|
|
190
|
+
**/
|
|
191
|
+
enumName: function(glEnum) {
|
|
192
|
+
for (var i in window) {
|
|
193
|
+
if (i.indexOf("GL_") == 0 && window[i] == glEnum)
|
|
194
|
+
return i;
|
|
195
|
+
}
|
|
196
|
+
return "(unrecognized enum: "+glEnum+" [0x"+parseInt(glEnum).toString(16)+"])";
|
|
197
|
+
},
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Jax.Util.addRequestedHelpers(klass) -> Array
|
|
201
|
+
* - klass (Jax.Class): A class into which to mix the helpers.
|
|
202
|
+
*
|
|
203
|
+
* First, if +ApplicationHelper+ is defined, it is automatically mixed into the specified class.
|
|
204
|
+
*
|
|
205
|
+
* Then, the class is searched for a #helpers method; if it exists, it is expected to return an array of
|
|
206
|
+
* Helpers (created with +Jax.Helper.create({...})+ ). Each element in the array returned by #helpers is
|
|
207
|
+
* then mixed into the class.
|
|
208
|
+
*
|
|
209
|
+
* An array of all helpers that were just mixed into the target class is returned.
|
|
210
|
+
**/
|
|
211
|
+
addRequestedHelpers: function(klass) {
|
|
212
|
+
var helpers = [];
|
|
213
|
+
if (typeof(ApplicationHelper) != "undefined") {
|
|
214
|
+
helpers.push(ApplicationHelper);
|
|
215
|
+
klass.addMethods(ApplicationHelper);
|
|
216
|
+
}
|
|
217
|
+
if (klass.prototype.helpers) {
|
|
218
|
+
var helper_array = klass.prototype.helpers.call(klass);
|
|
219
|
+
for (var i = 0; i < helper_array.length; i++) {
|
|
220
|
+
helpers.push(helper_array[i]);
|
|
221
|
+
klass.addMethods(helper_array[i]);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return helpers;
|
|
225
|
+
}
|
|
226
|
+
};
|