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/webgl.js
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/*
|
|
2
|
+
This file will set up WebGL constants as globals prefixed with GL_, and will add
|
|
3
|
+
a new global called GL_METHODS. This will later be used for method delegation
|
|
4
|
+
within Jax.Context.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
//= require "vendor/glMatrix"
|
|
8
|
+
|
|
9
|
+
window['WEBGL_CONTEXT_NAME'] = "experimental-webgl";
|
|
10
|
+
window['WEBGL_CONTEXT_OPTIONS'] = {stencil:true};
|
|
11
|
+
window['GL_METHODS'] = {};
|
|
12
|
+
|
|
13
|
+
(function() {
|
|
14
|
+
var canvas = document.createElement("canvas");
|
|
15
|
+
canvas.setAttribute("id", "temporary-internal-use");
|
|
16
|
+
canvas.style.display = "block";
|
|
17
|
+
|
|
18
|
+
var body = document.getElementsByTagName("body")[0], temporaryBody = false;
|
|
19
|
+
if (!body)
|
|
20
|
+
{
|
|
21
|
+
temporaryBody = true;
|
|
22
|
+
body = document.createElement("body");
|
|
23
|
+
document.getElementsByTagName("html")[0].appendChild(body);
|
|
24
|
+
}
|
|
25
|
+
body.appendChild(canvas);
|
|
26
|
+
|
|
27
|
+
try {
|
|
28
|
+
var gl = canvas.getContext(WEBGL_CONTEXT_NAME);
|
|
29
|
+
} catch(e) {
|
|
30
|
+
document.location.pathname = "/webgl_not_supported.html";
|
|
31
|
+
throw new Error("WebGL is disabled or is not supported by this browser!");
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (gl) {
|
|
35
|
+
for (var method_name in gl)
|
|
36
|
+
{
|
|
37
|
+
if (typeof(gl[method_name]) == "function")
|
|
38
|
+
{
|
|
39
|
+
var camelized_method_name = method_name.substring(1, method_name.length);
|
|
40
|
+
camelized_method_name = "gl" + method_name.substring(0, 1).toUpperCase() + camelized_method_name;
|
|
41
|
+
|
|
42
|
+
/* we'll add a layer here to check for render errors, only in development mode */
|
|
43
|
+
var func = "(function "+camelized_method_name+"() {"
|
|
44
|
+
+ " var result;"
|
|
45
|
+
+ " if ("+(method_name == 'getError')+" || Jax.environment == Jax.PRODUCTION)"
|
|
46
|
+
+ " result = this.gl."+method_name+".apply(this.gl, arguments);"
|
|
47
|
+
+ " else {"
|
|
48
|
+
+ " try { "
|
|
49
|
+
+ " result = this.gl."+method_name+".apply(this.gl, arguments);"
|
|
50
|
+
+ " this.checkForRenderErrors();"
|
|
51
|
+
+ " } catch(e) { "
|
|
52
|
+
+ " var args = [], i;"
|
|
53
|
+
+ " for (i = 0; i < arguments.length; i++) args.push(arguments[i]);"
|
|
54
|
+
+ " try { args = JSON.stringify(args); } catch(jsonErr) { args = args.toString(); }"
|
|
55
|
+
+ " if (!e.stack) e = new Error(e.toString());"
|
|
56
|
+
+ " alert(e+\"\\n\\n\"+e.stack);"
|
|
57
|
+
+ " this.handleRenderError('"+method_name+"', args, e);"
|
|
58
|
+
+ " }"
|
|
59
|
+
+ " }"
|
|
60
|
+
+ " return result;"
|
|
61
|
+
+ "})";
|
|
62
|
+
|
|
63
|
+
GL_METHODS[camelized_method_name] = eval("("+func+")");
|
|
64
|
+
}
|
|
65
|
+
else
|
|
66
|
+
{
|
|
67
|
+
/* define the GL enums globally so we don't need a context to reference them */
|
|
68
|
+
if (!/[a-z]/.test(method_name)) // no lowercase letters
|
|
69
|
+
window[('GL_'+method_name)] = gl[method_name];
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/* define some extra globals that the above didn't generate */
|
|
74
|
+
// window['GL_MAX_VERTEX_ATTRIBS'] = gl.getParameter(gl.MAX_VERTEX_ATTRIBS);
|
|
75
|
+
window['GL_DEPTH_COMPONENT'] = gl.DEPTH_COMPONENT || gl.DEPTH_COMPONENT16;
|
|
76
|
+
window['GL_TEXTURES'] = [];
|
|
77
|
+
for (i = 0; i < 32; i++) window['GL_TEXTURES'][i] = gl["TEXTURE"+i];
|
|
78
|
+
window['GL_MAX_ACTIVE_TEXTURES'] = gl.getParameter(gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/* import other webgl files */
|
|
82
|
+
/*
|
|
83
|
+
note that because of the positioning here, all files in the webgl/ subdirectory will have access to a
|
|
84
|
+
private, temporary 'gl' context which will be unloaded after they have been loaded into memory.
|
|
85
|
+
*/
|
|
86
|
+
//= require "webgl/shader_chain"
|
|
87
|
+
//= require "webgl/material"
|
|
88
|
+
//= require "webgl/mesh"
|
|
89
|
+
//= require "webgl/camera"
|
|
90
|
+
//= require "webgl/world"
|
|
91
|
+
//= require "webgl/texture"
|
|
92
|
+
|
|
93
|
+
/* clean up after ourselves */
|
|
94
|
+
if (temporaryBody)
|
|
95
|
+
body.parentNode.removeChild(body);
|
|
96
|
+
else
|
|
97
|
+
body.removeChild(canvas);
|
|
98
|
+
})();
|
|
@@ -0,0 +1,526 @@
|
|
|
1
|
+
//= require "core/events"
|
|
2
|
+
//= require "scene"
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* class Jax.Camera
|
|
6
|
+
**/
|
|
7
|
+
Jax.Camera = (function() {
|
|
8
|
+
// used in tandem with _tmp[], see below
|
|
9
|
+
var POSITION = 0, VIEW = 1, RIGHT = 2, UP = 3, FORWARD = 4, SIDE = 5;
|
|
10
|
+
|
|
11
|
+
/*
|
|
12
|
+
handles storing data in the private _vecbuf, which is used solely to prevent
|
|
13
|
+
unnecessary allocation of temporary vectors. Note that _vecbuf is used for many
|
|
14
|
+
operations and data persistence not guaranteed (read: improbable).
|
|
15
|
+
*/
|
|
16
|
+
function store(self, buftype) {
|
|
17
|
+
if (arguments.length == 2) {
|
|
18
|
+
// no x,y,z given -- find it
|
|
19
|
+
return storeVecBuf(self, buftype);
|
|
20
|
+
}
|
|
21
|
+
var buf = self._tmp[buftype];
|
|
22
|
+
buf[0] = arguments[2];
|
|
23
|
+
buf[1] = arguments[3];
|
|
24
|
+
buf[2] = arguments[4];
|
|
25
|
+
return buf;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function storeVecBuf(self, buftype) {
|
|
29
|
+
var world = self.matrices.mv;
|
|
30
|
+
|
|
31
|
+
var position = (self._tmp[POSITION]);
|
|
32
|
+
var result = (self._tmp[buftype]);
|
|
33
|
+
|
|
34
|
+
// position is 0,0,0 in eye space. Convert that to world space.
|
|
35
|
+
position[0] = position[1] = position[2] = 0;
|
|
36
|
+
mat4.multiplyVec3(world, position, position);
|
|
37
|
+
|
|
38
|
+
switch(buftype) {
|
|
39
|
+
case POSITION:
|
|
40
|
+
// we already have the position
|
|
41
|
+
return position;
|
|
42
|
+
break;
|
|
43
|
+
case VIEW:
|
|
44
|
+
// relative view vector is [0,0,-1] -- convert that to world coords
|
|
45
|
+
result[0] = result[1] = 0; result[2] = -1;
|
|
46
|
+
mat4.multiplyVec3(world, result, result);
|
|
47
|
+
vec3.direction(result, position, result);
|
|
48
|
+
break;
|
|
49
|
+
case RIGHT:
|
|
50
|
+
// relative right vector is [1,0,0] -- convert that to world coords
|
|
51
|
+
result[0] = 1; result[1] = result[2] = 0;
|
|
52
|
+
mat4.multiplyVec3(world, result, result);
|
|
53
|
+
vec3.direction(result, position, result);
|
|
54
|
+
break;
|
|
55
|
+
case UP:
|
|
56
|
+
// relative up vector is [0,1,0] -- convert that to world coords
|
|
57
|
+
result[1] = 1; result[0] = result[2] = 0;
|
|
58
|
+
mat4.multiplyVec3(world, result, result);
|
|
59
|
+
vec3.direction(result, position, result);
|
|
60
|
+
break;
|
|
61
|
+
default:
|
|
62
|
+
throw new Error("Unexpected buftype: "+buftype);
|
|
63
|
+
}
|
|
64
|
+
return result;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function matrixUpdated(self) {
|
|
68
|
+
// Callback fires whenever one of the camera's matrices has changed.
|
|
69
|
+
// We need to use this to update other variables like normal matrix, frustum, etc,
|
|
70
|
+
// but we don't actually update them here because the user may be making several
|
|
71
|
+
// changes to the camera in sequence (and those updates would be useless).
|
|
72
|
+
// Instead we'll mark them as out-of-date and let their respective getters do the
|
|
73
|
+
// work.
|
|
74
|
+
// update the normal matrix
|
|
75
|
+
self.normal_matrix_up_to_date = false;
|
|
76
|
+
self.frustum_up_to_date = false;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return Jax.Class.create({
|
|
80
|
+
initialize: function() {
|
|
81
|
+
/**
|
|
82
|
+
* Jax.Camera#projection -> Object
|
|
83
|
+
* This property is undefined until either #ortho() or #perspective() is called. After a projection matrix
|
|
84
|
+
* has been initialized, this object will contain various metadata about the projection matrix, such as
|
|
85
|
+
* the width and height of the viewport.
|
|
86
|
+
*
|
|
87
|
+
* For orthogonal projection matrices, it contains the following information:
|
|
88
|
+
* width, height, depth
|
|
89
|
+
* left, right
|
|
90
|
+
* top, bottom
|
|
91
|
+
* near, far
|
|
92
|
+
*
|
|
93
|
+
* For perspective projection matrices, it contains the following information:
|
|
94
|
+
* width, height
|
|
95
|
+
* near, far
|
|
96
|
+
* fov (in degrees)
|
|
97
|
+
*
|
|
98
|
+
* Note that this information is here for reference only; modifying it will in no way modify the projection
|
|
99
|
+
* matrix itself. (For that, you need to make another call to #ortho() or #perspective().) Therefore,
|
|
100
|
+
* changing this object's properties is not recommended because doing so would no longer accurately reflect
|
|
101
|
+
* the parameters of the real projection matrix.
|
|
102
|
+
*
|
|
103
|
+
* Subsequent calls to #perspective() or #ortho() will cause this object to be regenerated. Because of this,
|
|
104
|
+
* it is not recommended to store any persistent data in this object.
|
|
105
|
+
**/
|
|
106
|
+
|
|
107
|
+
/* used for temporary storage, just to avoid repeatedly allocating temporary vectors */
|
|
108
|
+
this._tmp = [ vec3.create(), vec3.create(), vec3.create(), vec3.create(), vec3.create(), vec3.create() ];
|
|
109
|
+
|
|
110
|
+
this.matrices = { mv: mat4.identity(mat4.create()), p : mat4.identity(mat4.create()), n : mat3.create() };
|
|
111
|
+
this.frustum = new Jax.Scene.Frustum(this.matrices.mv, this.matrices.p);
|
|
112
|
+
|
|
113
|
+
this.addEventListener('matrixUpdated', function() { matrixUpdated(this); });
|
|
114
|
+
this.reset();
|
|
115
|
+
},
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Jax.Camera#getFrustum() -> Jax.Scene.Frustum
|
|
119
|
+
* Returns the frustum for the camera. If the frustum is out of date, it will
|
|
120
|
+
* be refreshed.
|
|
121
|
+
**/
|
|
122
|
+
getFrustum: function() {
|
|
123
|
+
if (!this.frustum_up_to_date) this.frustum.update();
|
|
124
|
+
this.frustum_up_to_date = true;
|
|
125
|
+
return this.frustum;
|
|
126
|
+
},
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Jax.Camera#getPosition() -> vec3
|
|
130
|
+
* Returns the current world space position of this camera.
|
|
131
|
+
**/
|
|
132
|
+
getPosition: function() { return vec3.create(storeVecBuf(this, POSITION)); },
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Jax.Camera#getViewVector() -> vec3
|
|
136
|
+
* Returns the view vector relative to this camera.
|
|
137
|
+
**/
|
|
138
|
+
getViewVector: function() { return vec3.create(storeVecBuf(this, VIEW)); },
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Jax.Camera#getUpVector() -> vec3
|
|
142
|
+
* Returns the up vector relative to this camera.
|
|
143
|
+
**/
|
|
144
|
+
getUpVector: function() { return vec3.create(storeVecBuf(this, UP)); },
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Jax.Camera#getRightVector() -> vec3
|
|
148
|
+
* Returns the right vector relative to this camera.
|
|
149
|
+
**/
|
|
150
|
+
getRightVector:function() { return vec3.create(storeVecBuf(this, RIGHT)); },
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Jax.Camera#ortho(options) -> undefined
|
|
154
|
+
* - options (Object): the set of parameters used to calculate the projection matrix
|
|
155
|
+
*
|
|
156
|
+
* Sets up an orthographic projection matrix. Objects will not appear to shrink as they grow
|
|
157
|
+
* more distant from the camera in this mode. This mode is frequently used by high-precision
|
|
158
|
+
* tools such as modeling programs, and is commonly found in games when rendering UIs,
|
|
159
|
+
* crosshairs and the like.
|
|
160
|
+
*
|
|
161
|
+
* * _top_ - the topmost coordinate visible on the scren. Defaults to 1.
|
|
162
|
+
* * _left_ - the leftmost coordinate visible on the screen. Defaults to -1.
|
|
163
|
+
* * _right_ - the rightmost coordinate visible on the screen. Defaults to 1.
|
|
164
|
+
* * _bottom_ - the bottommost coordinate visible on the screen. Defaults to -1.
|
|
165
|
+
* * _near_ - the nearest coordinate visible. Defaults to 0.01.
|
|
166
|
+
* * _far_ the furthest coordinate visible. Defaults to 2000.
|
|
167
|
+
*
|
|
168
|
+
**/
|
|
169
|
+
ortho: function(options) {
|
|
170
|
+
if (typeof(options.left) == "undefined") options.left = -1;
|
|
171
|
+
if (typeof(options.right) == "undefined") options.right = 1;
|
|
172
|
+
if (typeof(options.top) == "undefined") options.top = 1;
|
|
173
|
+
if (typeof(options.bottom) == "undefined") options.bottom = -1;
|
|
174
|
+
if (typeof(options.far) == "undefined") options.far = 2000;
|
|
175
|
+
options.near = options.near || 0.01;
|
|
176
|
+
|
|
177
|
+
mat4.ortho(options.left, options.right, options.bottom, options.top, options.near, options.far, this.matrices.p);
|
|
178
|
+
this.projection = {
|
|
179
|
+
width: options.right - options.left,
|
|
180
|
+
height: options.top - options.bottom,
|
|
181
|
+
depth: options.near - options.far,
|
|
182
|
+
left: options.left,
|
|
183
|
+
right: options.right,
|
|
184
|
+
near: options.near,
|
|
185
|
+
far: options.far,
|
|
186
|
+
top: options.top,
|
|
187
|
+
bottom: options.bottom
|
|
188
|
+
};
|
|
189
|
+
this.fireEvent('matrixUpdated');
|
|
190
|
+
},
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Jax.Camera#setPosition(positionVector) -> undefined
|
|
194
|
+
* - positionVector (vec3): a vector representing the new position of the camera in world coordinates.
|
|
195
|
+
* Jax.Camera#setPosition(x, y, z) -> undefined
|
|
196
|
+
* - x (Number): the new X coordinate in world coordinates
|
|
197
|
+
* - y (Number): the new Y coordinate in world coordinates
|
|
198
|
+
* - z (Number): the new Z coordinate in world coordinates
|
|
199
|
+
*
|
|
200
|
+
* Sets the position of this camera.
|
|
201
|
+
**/
|
|
202
|
+
setPosition: function() {
|
|
203
|
+
var vec = vec3.create();
|
|
204
|
+
switch(arguments.length) {
|
|
205
|
+
case 1: vec3.set(arguments[0], vec); break;
|
|
206
|
+
case 3: vec3.set(arguments, vec); break;
|
|
207
|
+
default: throw new Error("Invalid arguments for Camera#setPosition");
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
this.orient(this.getViewVector(), this.getUpVector(), vec);
|
|
211
|
+
|
|
212
|
+
return this;
|
|
213
|
+
},
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Jax.Camera#setDirection(vector) -> Jax.Camera
|
|
217
|
+
* - vector (vec3): the new direction that the camera will be pointing,
|
|
218
|
+
* in world space
|
|
219
|
+
**/
|
|
220
|
+
setDirection: function(vector) {
|
|
221
|
+
return this.orient(vector);
|
|
222
|
+
},
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Jax.Camera#orient(viewVector, upVector[, positionVector]) -> Jax.Camera
|
|
226
|
+
* - viewVector (vec3): the new direction that the camera will be pointing
|
|
227
|
+
* - upVector (vec3): the new "up" direction perpendicular to the view
|
|
228
|
+
* - positionVector (vec3): optionally, a new position for the camera
|
|
229
|
+
* Jax.Camera#orient(vx, vy, vz, ux, uy, uz[, px, py, pz]) -> Jax.Camera
|
|
230
|
+
*
|
|
231
|
+
* Reorients this camera to be looking in the specified direction.
|
|
232
|
+
* Optionally, repositions this camera.
|
|
233
|
+
**/
|
|
234
|
+
orient: function(view, up) {
|
|
235
|
+
var pos;
|
|
236
|
+
|
|
237
|
+
switch(arguments.length) {
|
|
238
|
+
case 1:
|
|
239
|
+
view = store(this, VIEW, view[0], view[1], view[2]);
|
|
240
|
+
up = store(this, UP);
|
|
241
|
+
pos = store(this, POSITION);
|
|
242
|
+
break;
|
|
243
|
+
case 2:
|
|
244
|
+
view = store(this, VIEW, view[0], view[1], view[2]);
|
|
245
|
+
up = store(this, UP, up[0], up[1], up[2]);
|
|
246
|
+
pos = store(this, POSITION);
|
|
247
|
+
break;
|
|
248
|
+
case 3:
|
|
249
|
+
if (typeof(arguments[0]) == "number") {
|
|
250
|
+
view = store(this, VIEW, arguments[0], arguments[1], arguments[2]);
|
|
251
|
+
up = store(this, UP);
|
|
252
|
+
pos = store(this, POSITION);
|
|
253
|
+
} else {
|
|
254
|
+
view = store(this, VIEW, view[0], view[1], view[2]);
|
|
255
|
+
up = store(this, UP, up[0], up[1], up[2]);
|
|
256
|
+
pos = store(this, POSITION, arguments[2][0], arguments[2][1], arguments[2][2]);
|
|
257
|
+
}
|
|
258
|
+
break;
|
|
259
|
+
case 6:
|
|
260
|
+
view = store(this, VIEW, arguments[0], arguments[1], arguments[2]);
|
|
261
|
+
up = store(this, UP, arguments[3], arguments[4], arguments[5]);
|
|
262
|
+
pos = store(this, POSITION);
|
|
263
|
+
break;
|
|
264
|
+
case 9:
|
|
265
|
+
view = store(this, VIEW, arguments[0], arguments[1], arguments[2]);
|
|
266
|
+
up = store(this, UP, arguments[3], arguments[4], arguments[5]);
|
|
267
|
+
pos = store(this, POSITION, arguments[6], arguments[7], arguments[8]);
|
|
268
|
+
break;
|
|
269
|
+
default:
|
|
270
|
+
throw new Error("Unexpected arguments for Camera#orient");
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
vec3.add(pos,view,view);
|
|
274
|
+
this.lookAt(view, up, pos);
|
|
275
|
+
return this;
|
|
276
|
+
},
|
|
277
|
+
|
|
278
|
+
lookAt: function(point, up, pos) {
|
|
279
|
+
up = up || store(this, UP);
|
|
280
|
+
pos = pos || store(this, POSITION);
|
|
281
|
+
|
|
282
|
+
/*
|
|
283
|
+
I can't seem to get mat4.lookAt() to work as expected. I suspect that the forward vector is not
|
|
284
|
+
calculated properly, as it seems to reverse the operands. Dunno if this is a bug or a misunderstanding
|
|
285
|
+
in expectations, but either way I've decided not to use it, and adapted this code from:
|
|
286
|
+
GLH at http://www.opengl.org/wiki/GluLookAt_code
|
|
287
|
+
*/
|
|
288
|
+
var forward = this._tmp[FORWARD], side = this._tmp[SIDE];
|
|
289
|
+
var matrix2 = this.matrices.mv;
|
|
290
|
+
|
|
291
|
+
vec3.subtract(point, pos, forward);
|
|
292
|
+
|
|
293
|
+
// check whether up is parallel with view. If so, we can't possibly use up so
|
|
294
|
+
// we must recalculate up from the current side. We don't simply throw an error
|
|
295
|
+
// because the user may not be at fault. (Example: this.orient([0,-1,0]) infers
|
|
296
|
+
// the current up, which defaults to [0,1,0].)
|
|
297
|
+
var dot = vec3.dot(forward, up);
|
|
298
|
+
if (!isNaN(dot) && Math.abs(dot) > (1 - Math.EPSILON))
|
|
299
|
+
vec3.cross(store(this, RIGHT), forward, up);
|
|
300
|
+
|
|
301
|
+
vec3.normalize(forward);
|
|
302
|
+
// side = forward x up
|
|
303
|
+
vec3.cross(forward, up, side);
|
|
304
|
+
vec3.normalize(side);
|
|
305
|
+
// recompute up as: up = side x forward
|
|
306
|
+
vec3.cross(side, forward, up);
|
|
307
|
+
matrix2[0] = side[0];
|
|
308
|
+
matrix2[4] = side[1];
|
|
309
|
+
matrix2[8] = side[2];
|
|
310
|
+
matrix2[12]= 0;
|
|
311
|
+
matrix2[1] = up[0];
|
|
312
|
+
matrix2[5] = up[1];
|
|
313
|
+
matrix2[9] = up[2];
|
|
314
|
+
matrix2[13]= 0;
|
|
315
|
+
matrix2[2] = -forward[0];
|
|
316
|
+
matrix2[6] = -forward[1];
|
|
317
|
+
matrix2[10]= -forward[2];
|
|
318
|
+
matrix2[14]= 0.0;
|
|
319
|
+
matrix2[3] = matrix2[7] = matrix2[11] = 0;
|
|
320
|
+
matrix2[15] = 1;
|
|
321
|
+
mat4.translate(matrix2, vec3.negate(pos));
|
|
322
|
+
mat4.inverse(matrix2);
|
|
323
|
+
|
|
324
|
+
this.fireEvent('matrixUpdated');
|
|
325
|
+
},
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* Jax.Camera#perspective(options) -> undefined
|
|
329
|
+
* - options (Object): a generic object whose properties will be used to set up the
|
|
330
|
+
* projection matrix.
|
|
331
|
+
*
|
|
332
|
+
* Sets up a traditional perspective view for this camera. Objects will appear to be
|
|
333
|
+
* smaller as they get further away from the camera.
|
|
334
|
+
*
|
|
335
|
+
* Options include:
|
|
336
|
+
* * _width_ - the width of the camera, in pixels. Required.
|
|
337
|
+
* * _height_ - the height of the camera, in pixels. Required.
|
|
338
|
+
* * _fov_ - the angle of the field of view, in degrees. Default: 45
|
|
339
|
+
* * _near_ - the distance of the near plane from the camera's actual position. Objects
|
|
340
|
+
* closer to the camera than this will not be seen, even if they are technically in
|
|
341
|
+
* front of the camera itself. Default: 0.01
|
|
342
|
+
* * _far_ - the distance of the far plane from the camera's actual position. Objects
|
|
343
|
+
* further away from the camera than this won't be seen. Default: 2000
|
|
344
|
+
**/
|
|
345
|
+
perspective: function(options) {
|
|
346
|
+
options = options || {};
|
|
347
|
+
if (!options.width) throw new Error("Expected a screen width in Jax.Camera#perspective");
|
|
348
|
+
if (!options.height)throw new Error("Expected a screen height in Jax.Camera#perspective");
|
|
349
|
+
options.fov = options.fov || 45;
|
|
350
|
+
options.near = options.near || 0.01;
|
|
351
|
+
options.far = options.far || 2000;
|
|
352
|
+
|
|
353
|
+
var aspect_ratio = options.width / options.height;
|
|
354
|
+
mat4.perspective(options.fov, aspect_ratio, options.near, options.far, this.matrices.p);
|
|
355
|
+
this.projection = {
|
|
356
|
+
width: options.width, height: options.height,
|
|
357
|
+
near: options.near, far: options.far,
|
|
358
|
+
fov: options.fov
|
|
359
|
+
};
|
|
360
|
+
this.fireEvent('matrixUpdated');
|
|
361
|
+
},
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* Jax.Camera#getModelViewMatrix() -> mat4
|
|
365
|
+
*
|
|
366
|
+
* Returns the ModelView matrix. This matrix represents the camera's position and
|
|
367
|
+
* orientation in the world.
|
|
368
|
+
**/
|
|
369
|
+
getModelViewMatrix: function() { return this.matrices.mv; },
|
|
370
|
+
|
|
371
|
+
/**
|
|
372
|
+
* Jax.Camera#getProjectionMatrix() -> mat4
|
|
373
|
+
*
|
|
374
|
+
* Returns the projection matrix. This matrix represents the projection of the world
|
|
375
|
+
* onto a screen.
|
|
376
|
+
**/
|
|
377
|
+
getProjectionMatrix: function() { return this.matrices.p; },
|
|
378
|
+
|
|
379
|
+
/**
|
|
380
|
+
* Jax.Camera#getNormalMatrix() -> mat4
|
|
381
|
+
*
|
|
382
|
+
* Returns the normal matrix, which is defined as the transpose of the inverse of the
|
|
383
|
+
* ModelView matrix.
|
|
384
|
+
*
|
|
385
|
+
* This matrix is commonly used in lighting calculations.
|
|
386
|
+
**/
|
|
387
|
+
getNormalMatrix: function() {
|
|
388
|
+
if (!this.normal_matrix_up_to_date) {
|
|
389
|
+
mat4.toInverseMat3(this.getModelViewMatrix(), this.matrices.n);
|
|
390
|
+
mat3.transpose(this.matrices.n);
|
|
391
|
+
}
|
|
392
|
+
this.normal_matrix_up_to_date = true;
|
|
393
|
+
return this.matrices.n;
|
|
394
|
+
},
|
|
395
|
+
|
|
396
|
+
/**
|
|
397
|
+
* Jax.Camera#unproject(x, y[, z]) -> [[nearx, neary, nearz], [farx, fary, farz]]
|
|
398
|
+
* - x (Number): X coordinate in pixels
|
|
399
|
+
* - y (Number): Y coordinate in pixels
|
|
400
|
+
*
|
|
401
|
+
* Calculates a line segment in world space of the given pixel location. One end of the
|
|
402
|
+
* line segment represents the nearest world space point to which the pixel corresponds,
|
|
403
|
+
* while the other end of the line segment represents the farthest visible point, depending
|
|
404
|
+
* on the near and far planes of the projection matrix.
|
|
405
|
+
*
|
|
406
|
+
* You can also find a point at an arbitrary distance by passing a third argument representing
|
|
407
|
+
* the distance, Z, to travel from the near plane towards the far plane. Z should be a number
|
|
408
|
+
* between 0 and 1 (so think of it as a percentage). In this form, only one set of coordinates
|
|
409
|
+
* is returned: the actual world space position of the specified coordinate.
|
|
410
|
+
*
|
|
411
|
+
* This function was adapted from gluUnproject(), found at
|
|
412
|
+
* http://www.opengl.org/wiki/GluProject_and_gluUnProject_code
|
|
413
|
+
**/
|
|
414
|
+
unproject: function(winx, winy, winz) {
|
|
415
|
+
// winz is either 0 (near plane), 1 (far plane) or somewhere in between.
|
|
416
|
+
// if it's not given a value we'll produce coords for both.
|
|
417
|
+
if (typeof(winz) == "number") {
|
|
418
|
+
winx = parseFloat(winx);
|
|
419
|
+
winy = parseFloat(winy);
|
|
420
|
+
winz = parseFloat(winz);
|
|
421
|
+
|
|
422
|
+
var inf = [];
|
|
423
|
+
var mm = this.matrices.mv, pm = this.matrices.p;
|
|
424
|
+
var viewport = [0, 0, pm.width, pm.height];
|
|
425
|
+
|
|
426
|
+
//Calculation for inverting a matrix, compute projection x modelview; then compute the inverse
|
|
427
|
+
var m = mat4.set(mm, mat4.create());
|
|
428
|
+
|
|
429
|
+
mat4.inverse(m, m); // WHY do I have to do this? --see Jax.Context#reloadMatrices
|
|
430
|
+
mat4.multiply(pm, m, m);
|
|
431
|
+
mat4.inverse(m, m);
|
|
432
|
+
|
|
433
|
+
// Transformation of normalized coordinates between -1 and 1
|
|
434
|
+
inf[0]=(winx-viewport[0])/viewport[2]*2.0-1.0;
|
|
435
|
+
inf[1]=(winy-viewport[1])/viewport[3]*2.0-1.0;
|
|
436
|
+
inf[2]=2.0*winz-1.0;
|
|
437
|
+
inf[3]=1.0;
|
|
438
|
+
|
|
439
|
+
//Objects coordinates
|
|
440
|
+
var out = vec3.create();
|
|
441
|
+
mat4.multiplyVec4(m, inf, out);
|
|
442
|
+
if(out[3]==0.0)
|
|
443
|
+
return null;
|
|
444
|
+
|
|
445
|
+
out[3]=1.0/out[3];
|
|
446
|
+
return [out[0]*out[3], out[1]*out[3], out[2]*out[3]];
|
|
447
|
+
}
|
|
448
|
+
else
|
|
449
|
+
return [this.unproject(winx, winy, 0), this.unproject(winx, winy, 1)];
|
|
450
|
+
},
|
|
451
|
+
|
|
452
|
+
/**
|
|
453
|
+
* Jax.Camera#rotate(amount, x, y, z) -> rotated camera
|
|
454
|
+
* - amount (Number): amount to rotate, in radians
|
|
455
|
+
* - x (Number): X coordinate of the axis around which to rotate
|
|
456
|
+
* - y (Number): Y coordinate of the axis around which to rotate
|
|
457
|
+
* - z (Number): Z coordinate of the axis around which to rotate
|
|
458
|
+
* Jax.Camera.rotate(amount, vector) -> rotated camera
|
|
459
|
+
* - amount (Number): amount to rotate, in radians
|
|
460
|
+
* - vector (vec3): vector form of the axis around which to rotate
|
|
461
|
+
*
|
|
462
|
+
* Rotates the camera by the specified amount around some axis.
|
|
463
|
+
**/
|
|
464
|
+
rotate: function() {
|
|
465
|
+
var amount = arguments[0];
|
|
466
|
+
var vec;
|
|
467
|
+
switch(arguments.length) {
|
|
468
|
+
case 2: vec = arguments[1]; break;
|
|
469
|
+
case 4: vec = this._tmp[0]; vec[0] = arguments[1]; vec[1] = arguments[2]; vec[2] = arguments[3]; break;
|
|
470
|
+
default: throw new Error("Invalid arguments");
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
if (vec[1] == 0 && vec[2] == 0) mat4.rotateX(this.matrices.mv, amount*vec[0], this.matrices.mv);
|
|
474
|
+
else if (vec[0] == 0 && vec[2] == 0) mat4.rotateY(this.matrices.mv, amount*vec[1], this.matrices.mv);
|
|
475
|
+
else if (vec[0] == 0 && vec[1] == 0) mat4.rotateZ(this.matrices.mv, amount*vec[2], this.matrices.mv);
|
|
476
|
+
else mat4.rotate (this.matrices.mv, amount, vec, this.matrices.mv);
|
|
477
|
+
|
|
478
|
+
this.fireEvent('matrixUpdated');
|
|
479
|
+
return this;
|
|
480
|
+
},
|
|
481
|
+
|
|
482
|
+
/**
|
|
483
|
+
* Jax.Camera#strafe(distance) -> the translated camera
|
|
484
|
+
* - distance (Number): the distance to move. If positive, the camera will move "right";
|
|
485
|
+
* if negative, the camera will move "left".
|
|
486
|
+
*
|
|
487
|
+
* Causes the camera to strafe, or move "sideways" along the right vector.
|
|
488
|
+
**/
|
|
489
|
+
strafe: function(distance) {
|
|
490
|
+
this._tmp[FORWARD][0] = 1;
|
|
491
|
+
this._tmp[FORWARD][1] = 0;
|
|
492
|
+
this._tmp[FORWARD][2] = 0;
|
|
493
|
+
this.move(distance, this._tmp[FORWARD]);
|
|
494
|
+
return this;
|
|
495
|
+
},
|
|
496
|
+
|
|
497
|
+
/**
|
|
498
|
+
* Jax.Camera#move(distance[, direction]) -> the translated camera
|
|
499
|
+
* - distance (Number): the distance to move. If positive, the camera will move "forward"
|
|
500
|
+
* along the direction vector; if negative, it will move "backward".
|
|
501
|
+
* - direction (vec3): the vector to move along. If not specified, this will default to
|
|
502
|
+
* the camera's view vector. That is, it will default to the direction
|
|
503
|
+
* the camera is pointing.
|
|
504
|
+
**/
|
|
505
|
+
move: function(distance, direction) {
|
|
506
|
+
if (!direction) {
|
|
507
|
+
direction = this._tmp[FORWARD];
|
|
508
|
+
direction[0] = 0;
|
|
509
|
+
direction[1] = 0;
|
|
510
|
+
direction[2] = -1;
|
|
511
|
+
}
|
|
512
|
+
mat4.translate(this.matrices.mv, vec3.scale(direction, distance), this.matrices.mv);
|
|
513
|
+
this.fireEvent('matrixUpdated');
|
|
514
|
+
return this;
|
|
515
|
+
},
|
|
516
|
+
|
|
517
|
+
/**
|
|
518
|
+
* Jax.Camera#reset() -> the reset camera
|
|
519
|
+
* Resets this camera by moving it back to the origin and pointing it along the negative
|
|
520
|
+
* Z axis with the up vector along the positive Y axis.
|
|
521
|
+
**/
|
|
522
|
+
reset: function() { this.lookAt([0,0,-1], [0,1,0], [0,0,0]); }
|
|
523
|
+
});
|
|
524
|
+
})();
|
|
525
|
+
|
|
526
|
+
Jax.Camera.addMethods(Jax.Events.Methods);
|