{"version":3,"sources":["webpack:///webpack/universalModuleDefinition?5ca6","webpack:///webpack/bootstrap 36bfba05a766b918d4b8?c32a","webpack:///./sources/OSG.js?2fae","webpack:///./sources/osgNameSpace.js?be6b","webpack:///./sources/osg/osg.js?5f1e","webpack:///./sources/osgAnimation/osgAnimation.js?f3c2","webpack:///./sources/osgDB/osgDB.js?e0e5","webpack:///./sources/osgGA/osgGA.js?412b","webpack:///./sources/osgUtil/osgUtil.js?34d3","webpack:///./sources/osgViewer/osgViewer.js?8fd4","webpack:///./sources/osgShader/osgShader.js?b710","webpack:///./sources/osgShadow/osgShadow.js?cf26","webpack:///external {\"root\":\"Hammer\",\"commonjs2\":\"hammerjs\",\"commonjs\":\"hammerjs\",\"amd\":\"hammer\"}?3be0","webpack:///./sources/version.js?26c9","webpack:///./sources/osg/BlendColor.js?226e","webpack:///./sources/osg/BlendFunc.js?4f17","webpack:///./sources/osg/BoundingBox.js?c5c6","webpack:///./sources/osg/BoundingSphere.js?2cd4","webpack:///./sources/osg/BufferArray.js?f10d","webpack:///./sources/osg/Camera.js?16ae","webpack:///./sources/osg/ColorMask.js?d204","webpack:///./sources/osg/ComputeBoundsVisitor.js?6dc4","webpack:///./sources/osg/ComputeMatrixFromNodePath.js?a6ea","webpack:///./sources/osg/CullFace.js?2d43","webpack:///./sources/osg/CullingSet.js?3a78","webpack:///./sources/osg/CullSettings.js?2ac1","webpack:///./sources/osg/CullStack.js?ea86","webpack:///./sources/osg/CullVisitor.js?06f9","webpack:///./sources/osg/Depth.js?c2bc","webpack:///./sources/osg/DrawArrayLengths.js?8b48","webpack:///./sources/osg/DrawArrays.js?5a3d","webpack:///./sources/osg/DrawElements.js?72c6","webpack:///./sources/osg/EllipsoidModel.js?2cfe","webpack:///./sources/osg/FrameBufferObject.js?86f8","webpack:///./sources/osg/FrameStamp.js?f575","webpack:///./sources/osg/Geometry.js?3676","webpack:///./sources/osg/GLObject.js?cd63","webpack:///./sources/osg/Image.js?7570","webpack:///./sources/osg/ImageStream.js?871d","webpack:///./sources/osg/KdTree.js?cc7a","webpack:///./sources/osg/KdTreeBuilder.js?dd33","webpack:///./sources/osg/Light.js?4b6f","webpack:///./sources/osg/LightSource.js?33d2","webpack:///./sources/osg/LineWidth.js?fc3d","webpack:///./sources/osg/Lod.js?4deb","webpack:///./sources/osg/Map.js?18b2","webpack:///./sources/osg/Material.js?dcef","webpack:///./sources/osg/Math.js?27a7","webpack:///./sources/osg/Matrix.js?2c9e","webpack:///./sources/osg/MatrixTransform.js?e1a2","webpack:///./sources/osg/Node.js?5164","webpack:///./sources/osg/NodeVisitor.js?df86","webpack:///./sources/osg/Notify.js?6771","webpack:///./sources/osg/Object.js?ad85","webpack:///./sources/osg/PagedLOD.js?c2b1","webpack:///./sources/osg/Polytope.js?f34e","webpack:///./sources/osg/Plane.js?7f8c","webpack:///./sources/osg/PrimitiveFunctor.js?a812","webpack:///./sources/osg/PrimitiveSet.js?faca","webpack:///./sources/osg/Program.js?3129","webpack:///./sources/osg/Projection.js?d5e4","webpack:///./sources/osg/Quat.js?9fda","webpack:///./sources/osg/RenderBin.js?15ff","webpack:///./sources/osg/RenderLeaf.js?4a05","webpack:///./sources/osg/RenderStage.js?2077","webpack:///./sources/osg/Shader.js?a11c","webpack:///./sources/osg/Shape.js?6663","webpack:///./sources/osg/Stack.js?f74b","webpack:///./sources/osg/State.js?3758","webpack:///./sources/osg/StateAttribute.js?2925","webpack:///./sources/osg/StateGraph.js?5001","webpack:///./sources/osg/StateSet.js?803f","webpack:///./sources/osg/Texture.js?d800","webpack:///./sources/osg/TextureCubeMap.js?0bc0","webpack:///./sources/osg/Transform.js?e477","webpack:///./sources/osg/TriangleIndexFunctor.js?8350","webpack:///./sources/osg/Uniform.js?b407","webpack:///./sources/osg/UpdateVisitor.js?6078","webpack:///./sources/osg/Utils.js?60f3","webpack:///./sources/osg/Vec2.js?7e56","webpack:///./sources/osg/Vec3.js?ba33","webpack:///./sources/osg/Vec4.js?e123","webpack:///./sources/osg/Viewport.js?1fde","webpack:///./sources/osgUtil/osgPool.js?5de5","webpack:///./sources/osg/TransformEnums.js?66b8","webpack:///./sources/osg/WebGLCaps.js?d22f","webpack:///./sources/osgGA/FirstPersonManipulator.js?094f","webpack:///./sources/osgGA/FirstPersonManipulatorMouseKeyboardController.js?766b","webpack:///./sources/osgGA/FirstPersonManipulatorOculusController.js?f7b1","webpack:///./sources/osgGA/FirstPersonManipulatorDeviceOrientationController.js?e25c","webpack:///./sources/osgGA/Manipulator.js?bf3e","webpack:///./sources/osgGA/OrbitManipulator.js?0aaa","webpack:///./sources/osgGA/OrbitManipulatorGamePadController.js?859f","webpack:///./sources/osgGA/OrbitManipulatorHammerController.js?6256","webpack:///./sources/osgGA/OrbitManipulatorLeapMotionController.js?c6d8","webpack:///./sources/osgGA/OrbitManipulatorMouseKeyboardController.js?e367","webpack:///./sources/osgGA/OrbitManipulatorDeviceOrientationController.js?622a","webpack:///./sources/osgGA/OrbitManipulatorOculusController.js?d4f9","webpack:///./sources/osgGA/SwitchManipulator.js?125a","webpack:///./sources/osgGA/OrbitManipulatorEnums.js?59a2","webpack:///./sources/osgAnimation/Animation.js?5e3e","webpack:///./sources/osgAnimation/AnimationUpdateCallback.js?d83e","webpack:///./sources/osgAnimation/BasicAnimationManager.js?0206","webpack:///./sources/osgAnimation/Channel.js?eb92","webpack:///./sources/osgAnimation/Easing.js?2a34","webpack:///./sources/osgAnimation/FloatLerpChannel.js?fc2a","webpack:///./sources/osgAnimation/FloatTarget.js?7974","webpack:///./sources/osgAnimation/Interpolator.js?ddee","webpack:///./sources/osgAnimation/Keyframe.js?be3a","webpack:///./sources/osgAnimation/LinkVisitor.js?5fd2","webpack:///./sources/osgAnimation/QuatLerpChannel.js?f216","webpack:///./sources/osgAnimation/QuatSlerpChannel.js?a1a8","webpack:///./sources/osgAnimation/QuatTarget.js?55d7","webpack:///./sources/osgAnimation/Sampler.js?3aa4","webpack:///./sources/osgAnimation/StackedQuaternion.js?5895","webpack:///./sources/osgAnimation/StackedRotateAxis.js?4876","webpack:///./sources/osgAnimation/StackedTranslate.js?8b2b","webpack:///./sources/osgAnimation/Target.js?5bed","webpack:///./sources/osgAnimation/UpdateMatrixTransform.js?2038","webpack:///./sources/osgAnimation/Vec3LerpChannel.js?73b4","webpack:///./sources/osgAnimation/Vec3Target.js?f71d","webpack:///./sources/osgDB/Input.js?c3b5","webpack:///./sources/osgDB/ReaderParser.js?9dbe","webpack:///./sources/osgUtil/Composer.js?edfe","webpack:///./sources/osgUtil/DisplayNormalVisitor.js?502c","webpack:///./sources/osgUtil/DisplayGeometryVisitor.js?8c46","webpack:///./sources/osgUtil/DisplayNodeGraphVisitor.js?3d62","webpack:///./sources/osgUtil/IntersectionVisitor.js?3c9e","webpack:///./sources/osgUtil/LineSegmentIntersector.js?1ff3","webpack:///./sources/osgUtil/NodeGizmo.js?a54a","webpack:///./sources/osgUtil/Oculus.js?3a6d","webpack:///./sources/osgUtil/ParameterVisitor.js?a434","webpack:///./sources/osgUtil/PolytopeIntersector.js?1565","webpack:///./sources/osgUtil/PolytopePrimitiveIntersector.js?86ce","webpack:///./sources/osgUtil/SphereIntersector.js?5f4f","webpack:///./sources/osgUtil/TangentSpaceGenerator.js?d7fd","webpack:///./sources/osgUtil/TriangleIntersector.js?2ea2","webpack:///./sources/osgUtil/WebVR.js?e411","webpack:///./sources/osgViewer/Renderer.js?6603","webpack:///./sources/osgViewer/View.js?4ab9","webpack:///./sources/osgViewer/Viewer.js?63cc","webpack:///./sources/osgViewer/eventProxy/EventProxy.js?d4e0","webpack:///./sources/osgShader/Compiler.js?55e0","webpack:///./sources/osgShader/ShaderGenerator.js?779a","webpack:///./sources/osgShader/ShaderGeneratorProxy.js?c7cb","webpack:///./sources/osgShader/ShaderProcessor.js?d94c","webpack:///./sources/osgShader/nodeFactory.js?9268","webpack:///./sources/osgShader/node.js?47fd","webpack:///./sources/osgShader/utils.js?0416","webpack:///./sources/osgShadow/ShadowAttribute.js?4375","webpack:///./sources/osgShadow/ShadowFrustumIntersection.js?dd1a","webpack:///./sources/osgShadow/ShadowMap.js?cbe7","webpack:///./sources/osgShadow/ShadowSettings.js?b1a0","webpack:///./sources/osgShadow/ShadowTechnique.js?e274","webpack:///./sources/osgShadow/ShadowTexture.js?6da8","webpack:///./sources/osgShadow/ShadowedScene.js?14d0","webpack:///./sources/osgWrappers/serializers/osg.js?5149","webpack:///./sources/osgWrappers/serializers/osgAnimation.js?1ea5","webpack:///external {\"root\":\"Q\",\"commonjs2\":\"q\",\"commonjs\":\"q\",\"amd\":\"q\"}?ff7a","webpack:///external {\"root\":\"Zlib\",\"commonjs2\":\"zlib\",\"commonjs\":\"zlib\",\"amd\":\"zlib\"}?6064","webpack:///external {\"root\":\"$\",\"commonjs2\":\"jquery\",\"commonjs\":\"jquery\",\"amd\":\"jquery\"}?92ed","webpack:///./sources/osg/Timer.js?60b9","webpack:///./sources/osg/KdTreeRayIntersector.js?fb52","webpack:///./sources/osg/KdTreeSphereIntersector.js?52bd","webpack:///./sources/osg/TextureManager.js?28ab","webpack:///./sources/osgDB/Options.js?50db","webpack:///./sources/osgUtil/GizmoGeometry.js?d03e","webpack:///./sources/osgUtil/TriangleSphereIntersector.js?61c8","webpack:///./sources/osg/Options.js?487c","webpack:///./sources/osgViewer/Scene.js?522b","webpack:///./sources/osgViewer/eventProxy/GamePad.js?04e6","webpack:///./sources/osgViewer/eventProxy/Hammer.js?b556","webpack:///./sources/osgViewer/eventProxy/LeapMotion.js?479c","webpack:///./sources/osgViewer/eventProxy/StandardMouseKeyboard.js?e842","webpack:///./sources/osgViewer/eventProxy/Oculus.js?f765","webpack:///./sources/osgViewer/eventProxy/DeviceOrientation.js?2bdd","webpack:///./sources/osg/Stats.js?0a0b","webpack:///./sources/osgViewer/CanvasStats.js?c6ee","webpack:///./sources/osgViewer/webgl-utils.js?1db6","webpack:///./sources/osgViewer/webgl-debug.js?dfe4","webpack:///./sources/osgShader/shaderLib.js?7535","webpack:///./sources/osgShadow/shaderLib.js?05e2","webpack:///./sources/osgShader/node/data.js?232c","webpack:///./sources/osgShader/node/textures.js?43ec","webpack:///./sources/osgShader/node/functions.js?048c","webpack:///./sources/osgShader/node/lights.js?b9c5","webpack:///./sources/osgShader/node/operations.js?c3b0","webpack:///./sources/osgShader/node/shadows.js?e194","webpack:///./sources/osgDB/DatabasePager.js?af5a","webpack:///external {\"root\":\"Leap\",\"commonjs2\":\"leapjs\",\"commonjs\":\"leapjs\",\"amd\":\"leap\"}?635e","webpack:///./sources/osgShader/node/Node.js?2872","webpack:///./sources/osgShader/node/functions.glsl?31e4","webpack:///./sources/osgShader/node/lights.glsl?2533","webpack:///./sources/osgShader/node/textures.glsl?6213","webpack:///./sources/osgShader/node/colorEncode.glsl?a3b4","webpack:///./sources/osgShadow/shaders/shadowsCastVert.glsl?2a85","webpack:///./sources/osgShadow/shaders/shadowsCastFrag.glsl?639d","webpack:///./sources/osgShadow/shaders/shadowsReceive.glsl?08fe","webpack:///./sources/osgShadow/shaders/shadowsReceiveMain.glsl?268e","webpack:///./sources/osgShadow/shaders/shadowLinearSoft.glsl?230a","webpack:///./sources/osgShadow/shaders/pcf.glsl?657c","webpack:///./sources/osgShadow/shaders/bandPCF.glsl?f38d","webpack:///./sources/osgShadow/shaders/tapPCF.glsl?cae4","webpack:///./sources/osgShadow/shaders/hash.glsl?2a62","webpack:///./sources/osgShadow/shaders/arrayPoisson.glsl?d438","webpack:///./sources/osgShadow/shaders/poissonPCF.glsl?cd67","webpack:///./sources/osgShadow/shaders/esm.glsl?8887","webpack:///./sources/osgShadow/shaders/vsm.glsl?c81f","webpack:///./sources/osgShadow/shaders/evsm.glsl?05f9"],"names":[],"mappings":";;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,O;ACVA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;;;;;;;;;;;;;iECtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,UAAS;AACT;;AAEA;AACA,EAAC;;;;;;;;iEClCD;AACA;AACA;AACA;AACA,EAAC;;;;;;;iECJD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA,EAAC;;;;;;;iECzOD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAC;;;;;;;iEClDD;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAC;;;;;;;iEChBD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,kCAAiC;;AAEjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,EAAC;;;;;;;iEC9DD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,EAAC;;;;;;;iECvDD;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,EAAC;;;;;;;iECfD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;AAGA;AACA;;;AAGA;AACA,EAAC;;;;;;;iEC9BD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA,EAAC;;;;;;;;;;;;;;;;;ACvBD,iD;;;;;;iECAA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC,gJ;;;;;;iECND;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA,EAAC;;;;;;;iEC1CD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA,EAAC;;;;;;;iEC5JD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA,EAAC;;;;;;;iECxJD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qCAAoC,OAAO;AAC3C,qEAAoE;AACpE,gDAA+C;AAC/C,iDAAgD;AAChD,iDAAgD;AAChD,iDAAgD;AAChD,qDAAoD;AACpD,qDAAoD;AACpD,qDAAoD;AACpD,iDAAgD;AAChD;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAC;;;;;;;iEC5LD;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAqC,uCAAuC;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA,EAAC;;;;;;;iECzID;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA,cAAa;;AAEb;AACA;AACA,cAAa;;AAEb;AACA;AACA,cAAa;;;AAGb;AACA;AACA,cAAa;;AAEb;AACA;AACA,cAAa;AACb;AACA;AACA,cAAa;AACb;AACA;AACA,cAAa;AACb;AACA;AACA,cAAa;;AAEb;AACA;AACA,cAAa;AACb;AACA;AACA,cAAa;;AAEb;AACA;AACA,cAAa;AACb;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA,cAAa;AACb;AACA;AACA,cAAa;;;AAGb;AACA;AACA,cAAa;;AAEb;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA,cAAa;AACb;AACA;AACA,cAAa;AACb;AACA;AACA,cAAa;;AAEb;AACA;AACA,cAAa;;AAEb;AACA;AACA,cAAa;AACb;AACA;AACA,cAAa;AACb;AACA;AACA,cAAa;AACb;AACA;AACA;AACA,cAAa;;AAEb;AACA;;AAEA;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA,kBAAiB,OAAO;AACxB;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;AACA;AACA;AACA;AACA,cAAa;;AAEb,UAAS;;AAET;;AAEA;AACA,EAAC;;;;;;;iECtND;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,UAAS;;AAET;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA,EAAC;;;;;;;iEC/CD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;;AAEA,kDAAiD;;AAEjD;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,UAAS;;AAET;;AAEA;;AAEA;AACA;AACA;;AAEA,cAAa;AACb;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;;AAGT;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA;;AAEA,MAAK;;AAEL;AACA,EAAC;;;;;;;iECxGD;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,2CAA0C,QAAQ;AAClD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,8CAA6C,OAAO;AACpD;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,EAAC;;;;;;;iEC7CD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA,EAAC;;;;;;;iEClDD;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;;AAEA;;AAEA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,EAAC;;;;;;;iEC9ED;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA;;AAEA;;AAEA;AACA,EAAC;;;;;;;iECtDD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;;AAGT;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAqC;;AAErC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;AACA;;;;AAIA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA,UAAS;;;;AAIT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA4B;AAC5B;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,UAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;;AAEA,UAAS;AACT;AACA;;AAEA;AACA;;AAEA;AACA,UAAS;AACT;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,EAAC;;;;;;;iECxUD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,UAAS;;;AAGT;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;;AAEA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA,iEAAgE,QAAQ;AACxE;AACA;AACA;;;AAGA,MAAK;;;;AAIL;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;;AAEA;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;;AAEA,UAAS;AACT;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA,cAAa;AACb;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,UAAS;AACT;AACA;AACA;AACA;;;;AAIA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;;AAGA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,MAAK;;AAEL;AACA,EAAC;;;;;;;iECjgBD;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA,EAAC;;;;;;;iECnED;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA8C,OAAO;AACrD;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,+CAA8C,OAAO;AACrD;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;AAEA;AACA,EAAC;;;;;;;iECrDD;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAC;;;;;;;iECvDD;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,EAAC;;;;;;;iEChFD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;AACT;;AAEA;AACA,EAAC;;;;;;;iEClJD;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAqC,uCAAuC;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,6DAA4D,OAAO;;AAEnE;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,0BAAyB;;AAEzB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,6CAA4C;AAC5C;AACA;;AAEA;;AAEA,kBAAiB;;AAEjB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,cAAa;AACb;AACA;AACA;AACA,MAAK;;AAEL;AACA,EAAC;;;;;;;iEC3KD;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAC;;;;;;;iEC5BD;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAwD,OAAO;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,uEAAsE;AACtE,wCAAuC;;AAEvC,iEAAgE,OAAO;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA0E;AAC1E,yDAAwD,QAAQ,EAAE;AAClE,8FAA6F;AAC7F;AACA,wEAAuE;AACvE;AACA,gEAA+D;AAC/D,wDAAuD,OAAO;AAC9D,qEAAoE;AACpE;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA,oDAAmD,OAAO;AAC1D;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAuD,SAAS;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;AACA,EAAC;;;;;;;iEC5KD;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;AAEA;;AAEA,EAAC;;;;;;;iECtBD;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,cAAa;AACb;AACA,cAAa;AACb;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,cAAa;AACb;AACA,cAAa;AACb;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iCAAgC,aAAa;AAC7C,qCAAoC,aAAa;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAK;;AAEL;;AAEA;AACA,EAAC;;;;;;;iECnLD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,yDAAwD;AACxD,UAAS;;AAET;AACA;;AAEA;;AAEA;AACA;AACA;AACA,cAAa;;AAEb;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB;;AAErB;AACA;;AAEA;AACA;;;AAGA,MAAK;;AAEL;;AAEA;AACA,EAAC;;;;;;;iECtED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,uCAAsC;AACtC,8BAA6B;AAC7B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAmC,kBAAkB;AACrD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,yBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,gCAA+B,iBAAiB;AAChD;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;;;AAGA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAiC,WAAW;AAC5C;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gCAA+B;AAC/B;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,UAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA,EAAC;;;;;;;iECtaD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,wCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA,EAAC;;;;;;;iECjCD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,cAAa;;AAEb;;AAEA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;;AAGT;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;;AAGT;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,UAAS;;AAET;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;AAGA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA,EAAC;;;;;;;iECvXD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;AACA,EAAC;;;;;;;iEC3BD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,MAAK;;AAEL;AACA,EAAC;;;;;;;ACvBD;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,yCAAwC,8BAA8B;AACtE;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,qCAAoC,iBAAiB;AACrD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;;AAET,MAAK;;AAEL;AACA;AACA,EAAC;;;;;;;iECrLD;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;;AAEA;AACA;AACA;AACA;AACA,8CAA6C,OAAO;AACpD;AACA;;AAEA;AACA;AACA;AACA,8CAA6C,OAAO;AACpD;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,EAAC;;;;;;;iECvED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;;;AAGT;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;;AAGT;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;;AAGT;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;;AAGT;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;;AAGT;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;;AAGT;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;;;AAIT;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;AAGA,MAAK;;AAEL;AACA,EAAC;;;;;;;iEC9HD;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,EAAC;;;;;;;iECjBD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA,6BAA4B,QAAQ;AACpC;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA,6BAA4B,QAAQ;AACpC;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA,oBAAmB,OAAO;AAC1B,oBAAmB,OAAO;AAC1B,oBAAmB,OAAO;AAC1B,oBAAmB,MAAM;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAS;AACT;AACA;AACA;AACA,cAAa;AACb;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAkC,SAAS;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA,mCAAkC,SAAS;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,6BAA4B,OAAO;AACnC;AACA;AACA,sBAAqB;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,mCAAkC;;AAElC;AACA;AACA;AACA;AACA;AACA,qDAAoD;AACpD,qDAAoD;AACpD,qDAAoD;AACpD;AACA,qDAAoD;AACpD,qDAAoD;AACpD,sDAAqD;AACrD;AACA;;AAEA;;AAEA;AACA;AACA;AACA,kBAAiB;;AAEjB;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,oCAAmC;;AAEnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,mDAAkD;AAClD,kBAAiB;;AAEjB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iCAAgC,OAAO;AACvC;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,cAAa;;AAEb;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,EAAC;;;;;;;iECz8CD;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;AACA;;AAEA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA;AACA,kBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA,UAAS;AACT,MAAK;AACL;;AAEA;AACA,EAAC;;;;;;;iEC1DD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,0DAAyD,OAAO;AAChE;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;;AAGT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA,uDAAsD,OAAO;AAC7D;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA,8EAA6E,OAAO;AACpF;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,sDAAqD,OAAO;AAC5D;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,kDAAiD,OAAO;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA,uDAAsD,OAAO;AAC7D;AACA;AACA;AACA,UAAS;;AAET;AACA,sDAAqD,OAAO;AAC5D;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;;AAGT;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,yBAAwB,OAAO;AAC/B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,yBAAwB,OAAO;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;;AAEA,6DAA4D,OAAO;AACnE;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA6D,OAAO;AACpE;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA6D,OAAO;AACpE;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;;AAEA,MAAK;AACL;;AAEA;AACA,EAAC;;;;;;;iECvVD;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;;AAGT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;AAEA;AACA,EAAC;;;;;;;iECxHD;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA,cAAa;AACb,qCAAoC;AACpC;AACA;AACA,uDAAsD,UAAU;AAChE,wEAAuE,UAAU;AACjF;AACA;;AAEA;AACA;AACA;AACA,6BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAmB,MAAM;AACzB,oBAAmB,QAAQ;AAC3B,oBAAmB,WAAW;AAC9B,oBAAmB,SAAS;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,gDAA+C;AAC/C;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,EAAC;;;;;;;iECrID;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA,cAAa;AACb;AACA;AACA,cAAa;AACb;AACA;AACA,cAAa;AACb;AACA;AACA;AACA,UAAS;AACT;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA,EAAC;;;;;;;AC7CD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,yCAAwC,8BAA8B;AACtE;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,qCAAoC,wBAAwB;AAC5D;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,8BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;;AAGT,MAAK;;AAEL;AACA;AACA,EAAC;;;;;;;iECvOD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;;AAGA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;;AAEA;;AAEA;AACA,8EAA6E;AAC7E,+EAA8E;AAC9E,8EAA6E;AAC7E,+EAA8E;AAC9E,8FAA6F;AAC7F,8FAA6F;AAC7F;AACA,UAAS;;;AAGT;AACA;AACA;AACA,4FAA2F;AAC3F,4FAA2F;AAC3F,4FAA2F;AAC3F,4FAA2F;AAC3F,4FAA2F;AAC3F,4FAA2F;AAC3F;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,yBAAwB,4BAA4B;AACpD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,yBAAwB,4BAA4B;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;;AAGT;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,6BAA4B,aAAa;AACzC;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;;AAGT;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;;;AAGT;AACA;AACA;;AAEA;AACA,6BAA4B,4BAA4B;AACxD;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;;AAEA;;AAEA,6BAA4B,qBAAqB;AACjD;AACA;AACA;AACA,iCAAgC,wCAAwC;AACxE;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,6BAA4B,4BAA4B;AACxD;AACA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;AACA;AACA;AACA,6DAA4D;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,6BAA4B,4BAA4B;AACxD;AACA;AACA,+DAA8D;AAC9D,uFAAsF;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;;AAEA;AACA;;AAEA,6BAA4B,4BAA4B;AACxD;AACA;AACA,iDAAgD;AAChD,sDAAqD;AACrD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;;AAEA;AACA;;AAEA,6BAA4B,4BAA4B;AACxD;AACA;AACA,iDAAgD;AAChD,sDAAqD;AACrD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;;AAEA;AACA;;AAEA,6BAA4B,4BAA4B;AACxD;AACA;AACA,iDAAgD;AAChD,sDAAqD;AACrD;AACA;AACA;AACA;AACA,UAAS;;;AAGT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;;AAEA;AACA;AACA,6BAA4B,4BAA4B;AACxD;AACA;AACA;AACA;AACA;AACA;;;;AAIA,MAAK;;AAEL;;AAEA;AACA,EAAC;;;;;;;iECnWD;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;;AAGT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAwD;AACxD,uDAAsD;AACtD;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,6BAA4B,qBAAqB;AACjD;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA,kBAAiB,OAAO;AACxB;AACA;AACA;AACA;;AAEA,UAAS;AACT;AACA;AACA;;;AAGA,MAAK;;AAEL;AACA,EAAC;;;;;;;ACxID;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAgD,EAAE;AAClD,oDAAmD,EAAE;AACrD,6DAA4D,EAAE;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iCAAgC,WAAW;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,iCAAgC,eAAe;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,iCAAgC,eAAe;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,iCAAgC,UAAU;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,iCAAgC,WAAW;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,0CAAyC,WAAW;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAAyC,WAAW;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,qCAAoC,mBAAmB;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,qCAAoC,uBAAuB;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,qCAAoC,uBAAuB;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,qCAAoC,UAAU;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,qCAAoC,mBAAmB;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,8CAA6C,WAAW;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,kDAAiD,WAAW;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,6BAA4B,kBAAkB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAC;;;;;;;iECzZD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAC;;;;;;;iECZD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAsC,uCAAuC;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,+CAA8C,OAAO;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,+CAA8C,OAAO;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA,EAAC;;;;;;;iECzOD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;AACA,EAAC;;;;;;;iECtBD;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,+CAA8C;AAC9C,8CAA6C;AAC7C;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;;AAGT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAC;;;;;;;iECjVD;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;;AAEA;AACA;;AAEA,6DAA4D,OAAO;AACnE;AACA,mDAAkD,OAAO;AACzD;AACA;AACA;AACA,sBAAqB;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;;;AAGT;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,UAAS;;;AAGT;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,UAAS;;;AAGT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;;AAEA;AACA;AACA,8CAA6C,OAAO;AACpD;AACA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;;AAGT;;AAEA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA,kEAAiE,WAAW;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA;;AAEA,kDAAiD,OAAO;AACxD;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,oBAAmB,eAAe;AAClC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,oBAAmB,eAAe;AAClC;AACA;AACA;AACA;AACA,UAAS;;;AAGT;;AAEA;AACA;AACA;AACA;;;AAGA;AACA,gDAA+C,QAAQ;AACvD;AACA;AACA;AACA;;;AAGA;AACA,mDAAkD,OAAO;;AAEzD;;AAEA,uDAAsD,QAAQ;;AAE9D;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA,EAAC;;;;;;;iEClRD;AACA;AACA;;AAEA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;AAGA;;AAEA;AACA,mEAAkE;AAClE,qGAAoG;AACpG,0EAAyE;;AAEzE;AACA,mEAAkE;AAClE,sFAAqF;AACrF,8FAA6F;AAC7F,iEAAgE;AAChE,4FAA2F;AAC3F,sCAAqC;AACrC;;AAEA;AACA,mEAAkE;AAClE,0EAAyE;AACzE,kFAAiF;AACjF,2DAA0D;AAC1D,gFAA+E;AAC/E,sCAAqC;AACrC;;AAEA;AACA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;;AAEA;AACA,mEAAkE;;AAElE;AACA,gFAA+E;AAC/E,wFAAuF;AACvF,4DAA2D;AAC3D,sFAAqF;;AAErF,4EAA2E;AAC3E;;AAEA;AACA,kFAAiF;AACjF,0FAAyF;AACzF,6DAA4D;AAC5D,wFAAuF;AACvF;;AAEA;AACA,sEAAqE;AACrE,8EAA6E;AAC7E,uDAAsD;AACtD,4EAA2E;AAC3E;;AAEA;AACA,kFAAiF;AACjF,0FAAyF;AACzF,6DAA4D;AAC5D,wFAAuF;AACvF;;AAEA;AACA,0EAAyE;AACzE,mFAAkF;AAClF,iEAAgE;AAChE,uDAAsD;AACtD,uDAAsD;AACtD,uDAAsD;;AAEtD,0EAAyE;AACzE,2EAA0E;;AAE1E,kFAAiF;AACjF,yDAAwD;AACxD,gFAA+E;AAC/E;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;AAGA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;;AAEA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA,UAAS;;AAET;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,sBAAqB;;AAErB;AACA;AACA;;AAEA,sBAAqB;;AAErB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,kBAAiB;;AAEjB;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA,UAAS;;AAET;;AAEA;;AAEA,EAAC;;;;;;;iECjPD;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA,4DAA2D,OAAO;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB,cAAa;AACb;AACA;AACA;AACA,kBAAiB;AACjB;AACA,UAAS;AACT;AACA,6DAA4D,OAAO;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB,cAAa;AACb;AACA;AACA;AACA,kBAAiB;AACjB;AACA,UAAS;;AAET;AACA;AACA,4DAA2D,OAAO;AAClE;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA,UAAS;;AAET;AACA,4DAA2D,OAAO;AAClE;AACA;;AAEA;;AAEA,6DAA4D,OAAO;AACnE;AACA;AACA,UAAS;;AAET;AACA;AACA,6DAA4D,OAAO;AACnE;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,sDAAqD,OAAO;AAC5D;AACA;;AAEA;AACA;;AAEA,yDAAwD;;AAExD;AACA;AACA;;AAEA,0BAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAK;;AAEL;;AAEA,EAAC;;;;;;;iEClPD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,4CAA2C,6BAA6B,8BAA8B,iBAAiB,wEAAwE;AAC/L,2CAA0C,kBAAkB,0CAA0C;;;AAGtG;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAqC,uCAAuC;AAC5E;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;AAGA;AACA;AACA,mCAAkC;AAClC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,6BAA4B,2BAA2B;AACvD;AACA;;AAEA;AACA;;AAEA;AACA;AACA,6BAA4B,sCAAsC;AAClE;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA,0DAAyD,OAAO;AAChE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA,EAAC;;;;;;;iECvJD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAA+C;AAC/C;AACA,gDAA+C;AAC/C,+CAA8C;AAC9C,uDAAsD;AACtD,wDAAuD;AACvD;AACA,iDAAgD;AAChD;AACA,6CAA4C;AAC5C,wFAAuF;AACvF,2BAA0B;AAC1B;AACA,2CAA0C;AAC1C,qDAAoD;AACpD,4CAA2C;AAC3C,2BAA0B;AAC1B;;AAEA;AACA;AACA,gDAA+C;AAC/C;AACA,iDAAgD;;AAEhD,2CAA0C;AAC1C,mDAAkD;AAClD,2BAA0B;AAC1B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAwB,eAAe;AACvC,6BAA4B,eAAe;AAC3C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAoB,UAAU;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAoB,UAAU;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;;;;;;iEC9sBD;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAC;;;;;;;iECjCD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,UAAS;;;AAGT;AACA;AACA;AACA;;AAEA;;AAEA;AACA,cAAa;AACb;;AAEA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,4DAA2D,iBAAiB;AAC5E;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,mDAAkD,QAAQ;AAC1D;AACA;;AAEA;AACA,UAAS;;AAET;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,mDAAkD,QAAQ;AAC1D;AACA;;AAEA;AACA,UAAS;;;AAGT;AACA;AACA;AACA;AACA;AACA,UAAS;;;AAGT;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAoC,QAAQ;AAC5C;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;;AAET;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,gDAA+C,OAAO;AACtD;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,UAAS;;AAET;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,4DAA2D,iBAAiB;AAC5E;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;;AAET;;AAEA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,cAAa;;AAEb;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;;;AAGT;;AAEA;AACA;;AAEA,0DAAyD,OAAO;AAChE;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;;AAEA;;AAEA,gEAA+D,OAAO;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA,UAAS;;AAET;;AAEA;;AAEA,gEAA+D,OAAO;AACtE;AACA;AACA;AACA,UAAS;;;AAGT;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA;;AAEA,4EAA2E,iBAAiB;AAC5F;AACA;AACA;AACA;;;AAGA;;AAEA,sEAAqE,QAAQ;AAC7E;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,yBAAwB;AACxB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;;AAEA,kEAAiE,OAAO;;AAExE;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA,kBAAiB;AACjB;AACA;;AAEA;AACA;AACA;AACA,UAAS;;AAET;;AAEA;AACA;;AAEA,kEAAiE,OAAO;;AAExE;AACA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,8CAA6C,OAAO;AACpD;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,8CAA6C,OAAO;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,0DAAyD;;;AAGzD;;AAEA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;;;AAGT;;AAEA;;AAEA;;AAEA;;AAEA,2DAA0D,OAAO;;AAEjE;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,6DAA4D,OAAO;AACnE;AACA;AACA;;AAEA;AACA,UAAS;;AAET;;AAEA;AACA;;AAEA,0EAAyE,eAAe;;AAExF;AACA;;AAEA;AACA;;AAEA,kEAAiE,OAAO;AACxE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gEAA+D,OAAO;AACtE;AACA;AACA;AACA;AACA,UAAS;;AAET;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,4DAA2D,OAAO;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,gEAA+D,OAAO;AACtE;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,sBAAqB;;AAErB;AACA;AACA,0BAAyB;AACzB;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;;;AAGT;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;;AAEA;AACA,wDAAuD,OAAO;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;;AAEA;;AAEA,8DAA6D,OAAO;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;;;AAIT;;AAEA;AACA;;;AAGA;AACA;;AAEA,UAAS;;AAET;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA,uDAAsD,OAAO;;AAE7D;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA,wDAAuD,OAAO;;AAE9D;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,sBAAqB;AACrB;AACA;;AAEA;AACA;;AAEA;AACA;;;AAGA,MAAK;;AAEL;AACA,EAAC;;;;;;;iEC3gCD;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;;AAGA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET,8BAA6B;;AAE7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAC;;;;;;;iECzDD;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA6C,OAAO;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;;AAEjB,mDAAkD,QAAQ;AAC1D;AACA;AACA;AACA,cAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,+CAA8C,QAAQ;AACtD;AACA;AACA;AACA;;AAEA;AACA,EAAC;;;;;;;iEC7ID;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;;AAEA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;;AAEA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;;AAEA;AACA;;;AAGA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,cAAa;AACb;AACA,cAAa;AACb;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;;AAEA;AACA;AACA,6BAA4B,OAAO;AACnC;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA,sEAAqE,OAAO;AAC5E;AACA;AACA;AACA,0CAAyC,OAAO;AAChD;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,UAAS;;AAET;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA,EAAC;;;;;;;iECjQD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;;AAEjB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,uDAAsD;AACtD,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;;AAGT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;;AAEA;;AAEA;;AAEA,cAAa;;AAEb;AACA;;AAEA;;AAEA,UAAS;;AAET;;AAEA;;AAEA;;AAEA,cAAa;;AAEb;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,0BAAyB;AACzB;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,0BAAyB;AACzB,UAAS;;;AAGT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA,UAAS;;AAET;AACA;;AAEA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA,UAAS;;AAET;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,cAAa;AACb;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA,UAAS;;AAET;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,UAAS;;AAET;;AAEA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,kDAAiD,OAAO;AACxD;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;;AAEA,UAAS;;AAET;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,cAAa;;AAEb;;AAEA,cAAa;;AAEb;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,sBAAqB;AACrB;AACA;;AAEA,kBAAiB;;AAEjB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA,EAAC;;;;;;;iEClnBD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,iCAAgC,gBAAgB;AAChD;AACA;AACA,cAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,yBAAwB,OAAO;AAC/B;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,UAAS;;;AAGT;AACA;;AAEA;;AAEA;AACA;;AAEA,oCAAmC,UAAU;AAC7C;AACA;AACA;AACA;;AAEA;AACA,yCAAwC,sCAAsC;AAC9E;;AAEA;AACA;AACA;;AAEA,cAAa;;AAEb;AACA;AACA;;AAEA;AACA,UAAS;;AAET;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,UAAS;;;AAGT;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,UAAS;;;;AAIT;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,cAAa;;AAEb;;AAEA,cAAa;;AAEb;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,kBAAiB;;AAEjB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;;AAEA,MAAK;;AAEL;;AAEA;AACA,EAAC;;;;;;;iECzTD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;;AAGT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT,MAAK;;AAEL;AACA,EAAC;;;;;;;iEC9CD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,6BAA4B,WAAW;AACvC;AACA;AACA,UAAS;;AAET;AACA;AACA,oCAAmC,WAAW;AAC9C;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,oCAAmC,WAAW;AAC9C;AACA;AACA,UAAS;;AAET;AACA;AACA,0CAAyC,WAAW;AACpD;AACA;AACA,UAAS;;AAET;AACA;AACA,0CAAyC,WAAW;AACpD;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,8CAA6C,WAAW;AACxD;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,6BAA4B,kBAAkB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAC;;;;;;;iEClGD;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET,2BAA0B;AAC1B;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA,+CAA8C,OAAO,QAAQ;AAC7D;AACA;AACA,UAAS;;AAET;AACA,+CAA8C,OAAO,QAAQ;AAC7D;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAC;;;;;;;iEClaD;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA,oEAAmE,OAAO;AAC1E;AACA;;AAEA;AACA;AACA;AACA,iDAAgD,OAAO;AACvD;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA,EAAC;;;;;;;iEC5CD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,0CAAyC;AACzC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,gBAAe,YAAY;AAC3B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,sBAAqB;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,yBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA,EAAC;;;;;;;iECrOD;;AAEA;;AAEA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,EAAC;;;;;;;iEChHD;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,EAAC;;;;;;;iEC1ID;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAC;;;;;;;iEClFD;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT,MAAK;;AAEL;AACA,EAAC;;;;;;;iECzED;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAC;;;;;;;iEC9ED;;AAEA;AACA;AACA;AACA;AACA,EAAC;;;;;;;iECND;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAiD,SAAS;AAC1D;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAa;AACb;AACA,cAAa;AACb;AACA,cAAa;AACb;AACA;;AAEA;AACA;AACA;AACA,cAAa;AACb;AACA,cAAa;AACb;AACA,cAAa;AACb;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAoD,SAAS;AAC7D;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;AAGA;AACA,EAAC;;;;;;;iECtKD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAmC;AACnC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa;;AAEb,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA,EAAC;;;;;;;iECvOD;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,oCAAmC;AACnC,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,cAAa,mFAAmF;AAChG;AACA;AACA;AACA;AACA,cAAa,2DAA2D;AACxE;AACA;AACA;AACA;AACA,cAAa,2DAA2D;AACxE;AACA;AACA;AACA;AACA,cAAa,mFAAmF;AAChG;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,iEAAgE;AAChE;AACA;AACA;AACA,cAAa;AACb,yFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,EAAC;;;;;;;iECzGD;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,6BAA4B;AAC5B;;AAEA;AACA,UAAS;;AAET;;AAEA;AACA,EAAC;;;;;;;iECnBD;;AAEA;AACA;AACA;AACA;;AAEA,oCAAmC;;AAEnC;AACA;AACA,oCAAmC;AACnC;AACA,UAAS;AACT;;AAEA;AACA;AACA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;;AAEA;AACA,4EAA2E;AAC3E;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,EAAC;;;;;;;iECnHD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA,UAAS;AACT;AACA,sCAAqC;;AAErC;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,EAAC;;;;;;;iEC9ED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA,uDAAsD,OAAO;AAC7D;AACA;AACA;AACA,UAAS;AACT;AACA,uDAAsD,OAAO;AAC7D;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA,uDAAsD,OAAO;AAC7D;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA,sDAAqD,OAAO;AAC5D;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA,UAAS;AACT;AACA,6BAA4B,sBAAsB;AAClD;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,kCAAiC;AACjC,gCAA+B;AAC/B,+BAA8B;;AAE9B;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAa;AACb,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;AAGA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,UAAS;AACT,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA,EAAC;;;;;;;iEC9ZD;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;;AAGT;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,UAAS;;AAET;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,cAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,6BAA4B,oBAAoB;AAChD;AACA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA,EAAC;;;;;;;iECjHD;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAAyB;AACzB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,cAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;;AAEb,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,EAAC;;;;;;;iEC5ID;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,iCAAgC,2BAA2B;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,kBAAiB;AACjB;AACA,kBAAiB;AACjB;AACA;AACA;AACA,cAAa;AACb;AACA;;AAEA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAa,uCAAuC;AACpD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,EAAC;;;;;;;iECpLD;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,kCAAiC;AACjC,gCAA+B;AAC/B,+BAA8B;;AAE9B;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,kBAAiB;AACjB;;AAEA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;AACA,sBAAqB;AACrB;AACA;AACA,kBAAiB;AACjB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA,cAAa;AACb;AACA,cAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA,EAAC;;;;;;;iEC5JD;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,oCAAmC;;AAEnC;AACA;AACA,oCAAmC;AACnC;AACA,UAAS;AACT;;AAEA;AACA;AACA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;;AAEA;AACA,4EAA2E;AAC3E;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,EAAC;;;;;;;iECrHD;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,6BAA4B;AAC5B;;AAEA;AACA,UAAS;;AAET;;AAEA;AACA,EAAC;;;;;;;iECnBD;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,iDAAgD,QAAQ;AACxD;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,iDAAgD,QAAQ;AACxD;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;AAEA;AACA,EAAC;;;;;;;iECvFD;;AAEA;AACA;AACA;AACA;AACA;AACA,EAAC;;;;;;;iECPD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,wDAAuD,OAAO;AAC9D;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA,EAAC;;;;;;;iECjCD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,oCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAiD,OAAO;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA,EAAC;;;;;;;iECpCD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,kDAAiD,OAAO;AACxD;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA,UAAS;AACT;;AAEA;AACA,iDAAgD,OAAO;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAuD,SAAS;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,sDAAqD,QAAQ;AAC7D;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;;AAET,gCAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,0DAAyD;AACzD;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,8CAA6C,OAAO;AACpD;AACA;AACA,uDAAsD,QAAQ;AAC9D;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA,EAAC;;;;;;;iEC7MD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,MAAK;;AAEL;AACA,EAAC;;;;;;;iECrED;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAgD,SAAS;AACzD;AACA;AACA;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;;;;;;iECxDD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,EAAC;;;;;;;iECxBD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA,EAAC;;;;;;;iECnCD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;;;;;;iECtOD;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,EAAC;;;;;;;iECzBD;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,6CAA4C,OAAO;AACnD;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,kDAAiD,OAAO;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA,EAAC;;;;;;;iECrDD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,EAAC;;;;;;;iECzBD;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,EAAC;;;;;;;iECfD;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,cAAa;;AAEb;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA,EAAC;;;;;;;iECtCD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAC;;;;;;;iECxDD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA,EAAC;;;;;;;iECrDD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA,EAAC;;;;;;;iECtED;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,MAAK;;AAEL;AACA,EAAC;;;;;;;iECnDD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;AAEA;AACA,EAAC;;;;;;;iECzBD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA,oDAAmD,OAAO;AAC1D;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,oDAAmD,OAAO;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA,EAAC;;;;;;;iECxDD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,EAAC;;;;;;;iECzBD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA,EAAC;;;;;;;iECnCD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAY;;AAEZ,kDAAiD;;AAEjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA,4CAA2C;AAC3C;AACA,UAAS;AACT;;AAEA;;AAEA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,UAAS;;;AAGT;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,cAAa;;AAEb;;AAEA;AACA;AACA;AACA;;AAEA,cAAa;;AAEb;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;;AAEA;AACA;AACA,sDAAqD,OAAO;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,kBAAiB;AACjB;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,UAAS;;;AAGT;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA,+CAA8C;;AAE9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;AACA,sBAAqB;AACrB;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,6DAA4D,SAAS;AACrE;AACA;AACA;AACA;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,kBAAiB,kBAAkB;;AAEnC;;AAEA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA,kBAAiB;AACjB;;AAEA;AACA;AACA;;AAEA,kBAAiB;;AAEjB;AACA;;AAEA,kBAAiB;;AAEjB;;AAEA,cAAa;;AAEb;AACA;;AAEA,cAAa;;AAEb;AACA,UAAS;;AAET;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAa;;;AAGb;;AAEA;AACA;AACA;;AAEA,cAAa;AACb;;AAEA;;AAEA,cAAa;;AAEb;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;;AAEjB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAA+B,OAAO;AACtC;AACA;AACA,sBAAqB;AACrB,gCAA+B,OAAO;AACtC;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;;AAEA;AACA;AACA,cAAa;AACb;AACA,UAAS;;AAET;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,cAAa;;AAEb;AACA;;AAEA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA,kBAAiB;AACjB;AACA;AACA,kBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA,sBAAqB;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;;;AAGT;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAqD,OAAO;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAC;;;;;;;iEC/qBD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,wDAAuD;;AAEvD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,mDAAkD,OAAO;AACzD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,yEAAwE,uDAAuD;AAC/H;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;;AAEA;AACA;AACA;AACA;AACA,uDAAsD,QAAQ;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,gDAA+C;AAC/C;AACA,0CAAyC;AACzC,0CAAyC;;AAEzC,qDAAoD,QAAQ;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA,gEAA+D,qBAAqB;AACpF;AACA;AACA;;AAEA;AACA;;AAEA;AACA,EAAC;;;;;;;iECxQD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA,oBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA,uBAAsB;AACtB;;AAEA;AACA,oBAAmB;AACnB,0CAAyC;AACzC;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,qDAAoD,OAAO;AAC3D;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,kBAAiB;;AAEjB,cAAa;;AAEb;AACA;AACA;AACA;AACA,kBAAiB;;AAEjB,cAAa;;AAEb;AACA;AACA,kBAAiB;;AAEjB;AACA,UAAS;AACT;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA,qDAAoD,OAAO;AAC3D;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,kBAAiB;;AAEjB;AACA;;AAEA,kBAAiB;;AAEjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;;AAGA;AACA;AACA,gCAA+B;AAC/B;AACA,gCAA+B;AAC/B,mCAAkC;AAClC,qCAAoC;AACpC,uCAAsC;AACtC,wCAAuC;AACvC,2BAA0B;AAC1B,gFAA+E;AAC/E,sCAAqC;AACrC,WAAU;AACV;AACA;;AAEA;AACA;AACA,gCAA+B;AAC/B;AACA,qCAAoC;AACpC,kCAAiC;AACjC,qCAAoC;AACpC;AACA;;AAEA;AACA,2CAA0C;AAC1C,gEAA+D;AAC/D,2BAA0B;AAC1B,oEAAmE;AACnE,qBAAoB;AACpB,WAAU;;AAEV;AACA,6CAA4C;AAC5C,+CAA8C;AAC9C,oDAAmD;AACnD,4CAA2C;AAC3C,oCAAmC;AACnC,4CAA2C;AAC3C,oCAAmC;AACnC,oDAAmD;AACnD,WAAU;AACV;AACA,+CAA8C;AAC9C,kFAAiF;AACjF,WAAU;AACV;AACA,+CAA8C;AAC9C,qDAAoD;AACpD,mEAAkE;AAClE,WAAU;;AAEV;AACA,WAAU;AACV,0CAAyC;AACzC,oCAAmC;AACnC,WAAU;;AAEV;AACA,WAAU;AACV,sCAAqC;AACrC,uCAAsC;AACtC,wCAAuC;AACvC,qBAAoB;AACpB,4BAA2B;AAC3B,8BAA6B;AAC7B,uBAAsB;AACtB,WAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA2C,gBAAgB;AAC3D;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,iCAAgC,wBAAwB;AACxD;AACA;AACA;AACA,iCAAgC,wBAAwB;AACxD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,mDAAkD,OAAO;AACzD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA6B;AAC7B;AACA;AACA,kCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;;;AAIL;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;;AAET;AACA,mEAAkE;AAClE,UAAS;AACT;AACA;;;AAGA;;AAEA,wEAAuE;AACvE,iDAAgD,sBAAsB,QAAQ,EAAE;AAChF,wCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA4B,oBAAoB;AAChD;AACA,yFAAwF;AACxF,yFAAwF;AACxF;AACA,+DAA8D;;AAE9D;AACA;AACA;;AAEA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA,+DAA8D;AAC9D,0DAAyD;;AAEzD,6BAA4B,oBAAoB;;AAEhD,2CAA0C;AAC1C;AACA;;AAEA;;AAEA,4FAA2F;AAC3F,4FAA2F;AAC3F;AACA,iFAAgF;;AAEhF;AACA;AACA;;AAEA;AACA;AACA,UAAS;AACT;;AAEA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA,sCAAqC;;AAErC;AACA,mBAAkB;AAClB,+BAA8B;AAC9B;AACA,+CAA8C;AAC9C,mBAAkB;AAClB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA,MAAK;;;AAGL;AACA;AACA;AACA;AACA;AACA,mEAAkE;AAClE;AACA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA,8CAA6C;AAC7C;AACA,UAAS;AACT;AACA,gFAA+E;AAC/E,UAAS;AACT;AACA;AACA;AACA,wEAAuE;AACvE,oDAAmD,0BAA0B,QAAQ,EAAE;AACvF,+CAA8C;AAC9C,uFAAsF;AACtF,6BAA4B,gCAAgC;AAC5D;;AAEA,gEAA+D;AAC/D,sFAAqF;AACrF,oEAAmE;AACnE,sEAAqE;AACrE,gDAA+C;AAC/C,iCAAgC;;AAEhC,gEAA+D;AAC/D,sFAAqF;AACrF,oEAAmE;AACnE,sEAAqE;AACrE,gDAA+C;AAC/C,iCAAgC;AAChC;AACA,4CAA2C;AAC3C;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,6CAA4C;AAC5C,sCAAqC;AACrC,0CAAyC;AACzC,uCAAsC;AACtC,0CAAyC;;AAEzC,0CAAyC;AACzC;AACA;AACA;AACA,+CAA8C;AAC9C,sDAAqD;AACrD,+CAA8C;AAC9C,kCAAiC;AACjC,mBAAkB;;AAElB;AACA,mBAAkB;AAClB,+BAA8B;AAC9B,0CAAyC;AACzC,sEAAqE;AACrE,qEAAoE;AACpE,wCAAuC;AACvC,uCAAsC;;AAEtC;AACA,+CAA8C;AAC9C,mBAAkB;AAClB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA,4EAA2E;AAC3E;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,qEAAoE;AACpE,UAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;;AAEA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,4GAA2G;;AAE3G,wCAAuC;AACvC;AACA;AACA;AACA,qCAAoC,eAAe;AACnD;;AAEA;;AAEA;AACA;;AAEA;AACA,qHAAoH;AACpH,qHAAoH;AACpH;AACA,cAAa;;AAEb;AACA;AACA;AACA,qCAAoC,eAAe;AACnD;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,qHAAoH;AACpH,qHAAoH;AACpH;AACA;AACA;AACA;AACA,sCAAqC;;AAErC;AACA,mBAAkB;AAClB,+BAA8B;AAC9B;AACA,mDAAkD;AAClD,mBAAkB;AAClB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA,oEAAmE;AACnE;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,qCAAoC;AACpC,uCAAsC;AACtC;AACA,mBAAkB;AAClB,qCAAoC;AACpC,qCAAoC;AACpC,sDAAqD;AACrD,sDAAqD;AACrD,8FAA6F;AAC7F,0FAAyF;AACzF,+FAA8F;AAC9F,2FAA0F;AAC1F,gGAA+F;AAC/F,2FAA0F;AAC1F,+FAA8F;AAC9F,0FAAyF;AACzF,sHAAqH;AACrH,sHAAqH;AACrH,oEAAmE;AACnE,iDAAgD;AAChD,kCAAiC;AACjC,wCAAuC;AACvC,uDAAsD;AACtD,mBAAkB;AAClB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;;;AAIL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,6CAA4C;AAC5C,yCAAwC;;AAExC;AACA,mBAAkB;AAClB,sHAAqH;AACrH,mBAAkB;AAClB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;;;AAGL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA4C;AAC5C,yCAAwC;;AAExC;AACA,mBAAkB;AAClB,uGAAsG;AACtG,mBAAkB;AAClB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,iCAAgC,2BAA2B;AAC3D;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,iCAAgC,eAAe;AAC/C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;;;AAGb;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,wCAAuC;AACvC;AACA,wCAAuC;AACvC,2CAA0C;AAC1C,6CAA4C;AAC5C,+CAA8C;AAC9C,gDAA+C;AAC/C,mCAAkC;AAClC,wFAAuF;AACvF,8CAA6C;AAC7C,mBAAkB;AAClB;AACA;;AAEA;AACA,6BAA4B,eAAe;AAC3C,2KAA0K;AAC1K;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,6CAA4C;AAC5C,6CAA4C;AAC5C,0CAAyC;AACzC,6CAA4C;AAC5C,sCAAqC,UAAU,qDAAqD;AACpG,uCAAsC,UAAU,0GAA0G;AAC1J,2CAA0C;AAC1C;AACA,8BAA6B;AAC7B,8BAA6B;AAC7B,gCAA+B;AAC/B,iDAAgD;;;AAGhD;AACA,mBAAkB;AAClB,8DAA6D;AAC7D,kFAAiF;AACjF,gFAA+E;AAC/E,4DAA2D;AAC3D,gEAA+D;AAC/D,+BAA8B;AAC9B,mBAAkB;;AAElB;AACA,mBAAkB;AAClB;AACA,kEAAiE;AACjE,gEAA+D;AAC/D,gCAA+B;AAC/B,qCAAoC;AACpC,6CAA4C;AAC5C,4DAA2D;AAC3D,8BAA6B;AAC7B,qBAAoB;AACpB;AACA,6CAA4C;AAC5C,yCAAwC;AACxC,kCAAiC,gBAAgB,OAAO;AACxD,uDAAsD;AACtD,kEAAiE;AACjE,oDAAmD;AACnD,wCAAuC;AACvC,iDAAgD;AAChD,mDAAkD;AAClD,2CAA0C;AAC1C,kEAAiE;;AAEjE,kEAAiE;AACjE,4CAA2C;AAC3C,wDAAuD;;AAEvD,4EAA2E;AAC3E,mGAAkG;AAClG,yFAAwF;;AAExF,oBAAmB;AACnB,qEAAoE;AACpE,4DAA2D;AAC3D,mBAAkB;AAClB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;;;;AAIL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAgC,eAAe;AAC/C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,wCAAuC;AACvC;AACA,wCAAuC;AACvC,2CAA0C;AAC1C,2CAA0C;AAC1C,6CAA4C;AAC5C,6CAA4C;AAC5C,+CAA8C;AAC9C,gDAA+C;AAC/C,mCAAkC;AAClC,wFAAuF;AACvF,8CAA6C;AAC7C,8CAA6C;AAC7C,mBAAkB;AAClB;AACA;;AAEA;AACA,6BAA4B,eAAe;AAC3C,2KAA0K;AAC1K;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,6CAA4C;AAC5C,6CAA4C;AAC5C,6CAA4C;AAC5C,0CAAyC;AACzC,6CAA4C;AAC5C,sCAAqC,UAAU,qDAAqD;AACpG,uCAAsC,UAAU,0GAA0G;AAC1J,2CAA0C;AAC1C;AACA,8BAA6B;AAC7B,4CAA2C;AAC3C,8BAA6B;AAC7B,gCAA+B;AAC/B,iDAAgD;;AAEhD;;AAEA;AACA,mBAAkB;AAClB,8DAA6D;AAC7D,qDAAoD;AACpD,kFAAiF;AACjF,8DAA6D;AAC7D,gFAA+E;AAC/E,4DAA2D;AAC3D,gEAA+D;AAC/D,+BAA8B;AAC9B,mBAAkB;;AAElB,+CAA8C;AAC9C,sDAAqD;AACrD,+CAA8C;AAC9C,2CAA0C;AAC1C,kCAAiC;AACjC,mBAAkB;;AAElB;AACA,mBAAkB;AAClB;AACA,gEAA+D;AAC/D,2CAA0C;AAC1C,4DAA2D;AAC3D,8BAA6B;AAC7B,qBAAoB;AACpB,sEAAqE;AACrE,qEAAoE;AACpE,wCAAuC;AACvC,8EAA6E;AAC7E,gDAA+C;AAC/C,2DAA0D;AAC1D,2DAA0D;AAC1D,6DAA4D;AAC5D,8CAA6C;;AAE7C,0CAAyC;AACzC,4DAA2D;AAC3D,8BAA6B;AAC7B,qBAAoB;;AAEpB,gEAA+D;;AAE/D,oDAAmD;AACnD,6CAA4C;;AAE5C;AACA,6CAA4C;AAC5C,yCAAwC;AACxC,kCAAiC,gBAAgB,OAAO;AACxD,uDAAsD;AACtD,kEAAiE;AACjE,0DAAyD;AACzD,wCAAuC;AACvC,iDAAgD;AAChD,mDAAkD;AAClD,2CAA0C;AAC1C,kEAAiE;;AAEjE,kEAAiE;AACjE,4CAA2C;AAC3C,wDAAuD;;AAEvD,yFAAwF;AACxF,mGAAkG;AAClG,yFAAwF;;AAExF,oBAAmB;AACnB,qEAAoE;AACpE,4DAA2D;AAC3D,mBAAkB;AAClB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;;AAEL;AACA,EAAC;;;;;;;iECv2CD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,oCAAmC;AACnC;AACA,oCAAmC;AACnC,oCAAmC;AACnC,mCAAkC;AAClC,2CAA0C;AAC1C,4CAA2C;AAC3C,+BAA8B;AAC9B,uGAAsG;AACtG,eAAc;AACd;;AAEA;AACA;AACA,oCAAmC;AACnC;AACA,uCAAsC;AACtC,+BAA8B;AAC9B,sDAAqD;AACrD,eAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,6BAA4B,gBAAgB;AAC5C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA,EAAC;;;;;;;iEClID;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAmC;AACnC;AACA,oCAAmC;AACnC,2CAA0C;AAC1C,4CAA2C;AAC3C,+BAA8B;AAC9B,qFAAoF;AACpF,eAAc;AACd;;AAEA;AACA;AACA,oCAAmC;AACnC;AACA,uCAAsC;AACtC,+BAA8B;AAC9B,sDAAqD;AACrD,eAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA,EAAC;;;;;;;iECpED;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,sCAAqC;AACrC,4BAA2B;AAC3B,iCAAgC;AAChC,gCAA+B;AAC/B,iCAAgC;AAChC,4BAA2B;AAC3B,yCAAwC;AACxC,6BAA4B;AAC5B,eAAc;AACd,6CAA4C;AAC5C;AACA,eAAc;AACd,iCAAgC;AAChC,0BAAyB;AACzB,uBAAsB;AACtB,6CAA4C;AAC5C,6CAA4C;AAC5C,iDAAgD;AAChD,eAAc;AACd;AACA;;AAEA;AACA;AACA;AACA;AACA,yBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,oCAAmC;;AAEnC;AACA;;AAEA,6BAA4B,mBAAmB,iBAAiB,YAAY,cAAc,gBAAgB,aAAa,YAAY,OAAO,mBAAmB,KAAK,mBAAmB,UAAU,UAAU,iBAAiB,mBAAmB,WAAW,UAAU,WAAW,UAAU,oBAAoB,wFAAwF,2DAA2D,wDAAwD,uDAAuD,sDAAsD,kBAAkB,2BAA2B,wBAAwB,mBAAmB,0CAA0C,uCAAuC,kCAAkC,oCAAoC,aAAa,gBAAgB,0CAA0C,sBAAsB,wBAAwB,uBAAuB,0BAA0B,oBAAoB,aAAa,wBAAwB,0BAA0B,qBAAqB,sCAAsC,kBAAkB,eAAe,WAAW,6CAA6C,WAAW;AAC1uC;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;;AAEjB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;AACA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb,UAAS;;AAET;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,kBAAiB;;AAEjB;AACA,cAAa;;AAEb;AACA;;AAEA;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,6BAA4B,gBAAgB;AAC5C;;AAEA;AACA;AACA;AACA,kBAAiB;;AAEjB;;AAEA;AACA;AACA;AACA;AACA,mDAAkD,kBAAkB;AACpE,0BAAyB;AACzB;;AAEA;AACA,iDAAgD;AAChD,sBAAqB;AACrB;AACA;;AAEA;AACA,yBAAwB,gBAAgB;AACxC;AACA;;AAEA;AACA,UAAS;;AAET;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;;AAEA,MAAK;;AAEL;AACA,EAAC;;;;;;;AChXD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA;;AAEA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;;AAEA,UAAS;AACT;AACA;;AAEA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA;;AAEA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA,cAAa;AACb;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA,EAAC;;;;;;;AC/LD;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAoC,OAAO;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAC;;;;;;;iEClHD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,qCAAoC;AACpC,qCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAwB;;AAExB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,oCAAmC;AACnC;;AAEA;AACA;AACA,gCAA+B;AAC/B;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,mDAAkD,QAAQ;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,iCAAgC;AAChC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA,+CAA8C;;AAE9C;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,UAAS;AACT;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA,EAAC;;;;;;;iECx2BD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,oCAAmC;AACnC;;AAEA,oCAAmC;AACnC,oCAAmC;AACnC,uCAAsC;;AAEtC,2CAA0C;AAC1C,4CAA2C;AAC3C,wCAAuC;;AAEvC,qCAAoC;;AAEpC,+BAA8B;AAC9B,sCAAqC;AACrC,qFAAoF;AACpF,eAAc;AACd;;AAEA;AACA;AACA;AACA,oCAAmC;AACnC;;AAEA,kCAAiC;AACjC,oCAAmC;AACnC,uCAAsC;AACtC,yCAAwC;AACxC,yCAAwC;AACxC,yCAAwC;;AAExC,qCAAoC;;AAEpC;AACA,+BAA8B;AAC9B,kDAAiD;AACjD,2DAA0D;AAC1D,kEAAiE;AACjE,mJAAkJ;AAClJ,iFAAgF;AAChF,6DAA4D;AAC5D,8CAA6C;AAC7C,yFAAwF;AACxF,0DAAyD;AACzD,yBAAwB;AACxB,iBAAgB;AAChB,8DAA6D;AAC7D,gDAA+C;AAC/C,gFAA+E;AAC/E,yDAAwD;AACxD,4CAA2C;AAC3C,oIAAmI;AACnI,eAAc;AACd;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,+BAA8B;AAC9B;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,EAAC;;;;;;;iEClSD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,sBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAa;AACb,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,6BAA4B,SAAS;;AAErC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA4B,SAAS;;AAErC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA,sBAAqB;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,UAAS;;AAET;;AAEA,4CAA2C,KAAK,iDAAiD;;AAEjG,mCAAkC;AAClC,6BAA4B;AAC5B,2CAA0C;AAC1C,6BAA4B;AAC5B,2CAA0C;AAC1C,6BAA4B;AAC5B,2BAA0B;AAC1B,6BAA4B;AAC5B,2BAA0B;AAC1B,8BAA6B;AAC7B,8BAA6B;AAC7B,8BAA6B;AAC7B,8BAA6B;AAC7B,6BAA4B,MAAM,GAAG;;AAErC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,+CAA8C,OAAO;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,8CAA6C,OAAO;AACpD;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAgC,gBAAgB;AAChD;AACA;AACA;AACA,4CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,6BAA4B,iBAAiB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAS;;;AAGT;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA,EAAC;;;;;;;iECraD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA4D,OAAO;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAgC,OAAO;AACvC;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,wDAAuD,OAAO;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAC;;;;;;;AC1JD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,iCAAgC;AAChC,4BAA2B;AAC3B,gCAA+B;AAC/B;AACA;AACA;AACA;AACA,gDAA+C,OAAO;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA0B;AAC1B,0BAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,6BAA4B,yBAAyB;AACrD;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;AACA;AACA,sBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;;AAGT;AACA;AACA;AACA,sDAAqD,uBAAuB;AAC5E;AACA,iCAAgC,6BAA6B;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,0DAAyD,OAAO;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;;AAGT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAAyD,OAAO;AAChE;AACA;AACA;AACA;AACA,gEAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;AACA;AACA;AACA,sBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAAyD,OAAO;AAChE;AACA;AACA;AACA;AACA;AACA;;AAEA,gFAA+E;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;AACA;AACA;AACA,sBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,6BAA4B,kBAAkB;AAC9C;AACA,6C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAiE;AACjE;AACA,0DAAyD,OAAO;AAChE;AACA,2EAA0E;AAC1E;AACA,mEAAkE,QAAQ;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;;AAEA;AACA,EAAC;;;;;;;iECtaD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAoC,OAAO;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAC;;;;;;;iEC1ED;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,6BAA4B,gBAAgB;AAC5C;AACA;;AAEA,cAAa;;AAEb,6BAA4B,oBAAoB;AAChD;AACA;AACA,sBAAqB;AACrB;AACA;AACA;AACA;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,cAAa;;AAEb;AACA;;AAEA;AACA;AACA;;AAEA,6BAA4B,gBAAgB;AAC5C;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;;AAGA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA,EAAC;;;;;;;iEC3QD;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA,UAAS;AACT;;AAEA;AACA,EAAC;;;;;;;iECjID;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,uCAAsC;AACtC;AACA,yCAAwC;AACxC,+CAA8C;AAC9C,gDAA+C;;AAE/C,2BAA0B;AAC1B;AACA,4GAA2G;AAC3G;AACA,mHAAkH;AAClH,eAAc;AACd;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,EAAC;;;;;;;iEC/OD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;;AAGA;AACA,mEAAkE;AAClE;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;;;AAIA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,UAAS;;AAET;;AAEA;;AAEA,qCAAoC;;AAEpC;;AAEA;AACA;AACA;AACA;;AAEA;;;AAGA,MAAK;;AAEL;;AAEA,EAAC;;;;;;;iECjND;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;;AAGA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;;AAEA;AACA;;AAEA;;AAEA;;AAEA,kBAAiB;AACjB;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,EAAC;;;;;;;iECvSD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,6BAA4B,mBAAmB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,sBAAqB;AACrB,kBAAiB;AACjB;AACA;AACA;;AAEA;AACA,MAAK;;;AAGL;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,mCAAkC;AAClC;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;;AAGA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;;;AAGA;AACA,UAAS;;AAET;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA,cAAa;;AAEb;AACA;AACA;;AAEA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,yCAAwC,oBAAoB,cAAc,eAAe,aAAa;AACtG,qDAAoD;AACpD,yIAAwI,oBAAoB,gCAAgC;AAC5L,+IAA8I,oBAAoB;AAClK,uGAAsG,oBAAoB;AAC1H;;AAEA;AACA;;;AAGA;;AAEA;AACA;AACA,kBAAiB;AACjB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,2CAA0C,OAAO;AACjD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA,kBAAiB;;AAEjB;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA,kBAAiB;;AAEjB;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA,kBAAiB;;AAEjB;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA,kBAAiB;;AAEjB;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA,kBAAiB;;AAEjB;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA,kBAAiB;;AAEjB;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA,kBAAiB;;AAEjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;AACA;AACA;AACA,sBAAqB;AACrB;AACA;;AAEA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,UAAS;;;AAGT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,uCAAsC;AACtC;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAa;AACb;AACA;AACA;;AAEA;AACA;AACA,UAAS;;;AAGT;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA,8CAA6C,OAAO;AACpD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAwB;AACxB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;;AAEA,MAAK;;AAEL;AACA,EAAC;;;;;;;iEC3nBD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;;;;;;iECjBD;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAmD,OAAO;;AAE1D;;AAEA;AACA,0CAAyC;;AAEzC;;AAEA,kBAAiB;;AAEjB;;AAEA,kBAAiB;AACjB;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;;AAEA,6BAA4B,iBAAiB;;AAE7C;AACA;AACA;;AAEA,iDAAgD,QAAQ;;AAExD;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA,sBAAqB;;AAErB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;;AAEA,6BAA4B,6BAA6B;AACzD;AACA;AACA;AACA;;AAEA,UAAS;;;AAGT;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;;AAEA;;AAEA,6BAA4B,iBAAiB;AAC7C;AACA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;;AAEA;AACA;AACA,UAAS;;AAET;;AAEA;AACA;AACA,UAAS;;AAET;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,cAAa;;AAEb;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;;;AAGT;;AAEA;AACA;;AAEA;AACA;;AAEA,cAAa;;AAEb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;;;AAGT;;AAEA;AACA;;AAEA;AACA;;AAEA,cAAa;;AAEb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;;AAET;;AAEA;AACA;;AAEA,yDAAwD,QAAQ;;AAEhE;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;;AAEA;AACA;AACA;AACA;AACA,yBAAwB,yBAAyB;AACjD;AACA;AACA,yBAAwB,0BAA0B;AAClD;AACA;AACA;AACA,yBAAwB,kCAAkC;AAC1D;AACA;AACA;AACA;AACA;;AAEA,UAAS;;;AAGT;AACA;AACA,UAAS;;;AAGT;AACA;AACA;;AAEA;AACA;AACA,cAAa;AACb;AACA,cAAa;;AAEb;AACA,UAAS;;;AAGT;AACA;AACA,UAAS;;;AAGT;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;;AAGT;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;;AAGT;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA,cAAa;;AAEb,UAAS;;;AAGT;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,cAAa;AACb;AACA,cAAa;;AAEb;AACA,UAAS;;;AAGT;AACA;AACA;AACA;AACA,cAAa;AACb;AACA,cAAa;;AAEb;AACA,UAAS;;;AAGT;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,4CAA2C;AAC3C;AACA,gDAA+C;AAC/C;;AAEA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA,cAAa;;AAEb;AACA,UAAS;;;AAGT;;AAEA;AACA;;AAEA;AACA,6BAA4B,iBAAiB;AAC7C;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,cAAa;;AAEb;AACA;;AAEA;AACA,UAAS;;;AAGT;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,UAAS;;;;AAIT;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,kBAAiB;AACjB;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,cAAa;;AAEb;AACA;;AAEA;;AAEA,UAAS;;AAET;AACA;AACA;;AAEA;AACA;;AAEA,8CAA6C,QAAQ;;AAErD;AACA;AACA;;AAEA;AACA;;AAEA;AACA,UAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,yBAAwB,0BAA0B;AAClD;AACA;AACA;AACA,qCAAoC,kCAAkC;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;;AAGA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,yBAAwB,2BAA2B;;AAEnD;AACA;AACA;AACA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA;;AAEA,UAAS;;AAET;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,6BAA4B,yBAAyB;;AAErD;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,sDAAqD;AACrD;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,kBAAiB;;AAEjB;AACA;AACA;AACA,kBAAiB;AACjB;AACA;;AAEA;;AAEA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,UAAS;;;AAGT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA,cAAa;;AAEb;AACA,UAAS;;;AAGT;AACA;;AAEA;AACA;AACA;AACA;AACA,iCAAgC,iBAAiB;AACjD;AACA;AACA;;AAEA,gDAA+C,OAAO;AACtD;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;;;AAGT;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;;AAEA;AACA,wCAAuC;AACvC,uCAAsC;AACtC,wCAAuC;AACvC;AACA,kDAAiD;AACjD,+CAA8C;AAC9C,gDAA+C;AAC/C,4CAA2C;AAC3C;AACA,2CAA0C;AAC1C,0CAAyC;AACzC,6CAA4C;AAC5C;AACA;AACA;;AAEA;AACA;AACA,4DAA2D,QAAQ;;AAEnE;AACA;AACA;AACA;AACA;AACA,6EAA4E;AAC5E;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kFAAiF;AACjF,kFAAiF;AACjF,qFAAoF;AACpF,kFAAiF;AACjF;AACA,kHAAiH;AACjH;AACA;;AAEA,yDAAwD,QAAQ;AAChE;AACA;AACA;AACA,uFAAsF;AACtF,yFAAwF;AACxF;AACA;AACA,UAAS;;AAET;AACA;AACA,wEAAuE;AACvE,sEAAqE;AACrE,gDAA+C;AAC/C,6DAA4D;AAC5D;AACA,0CAAyC;AACzC;AACA,0DAAyD;AACzD,uCAAsC;AACtC;AACA;AACA;;AAEA;;AAEA,8BAA6B,4BAA4B;AACzD;AACA;AACA;AACA,2GAA0G;AAC1G;AACA;;AAEA;AACA,gEAA+D,QAAQ;AACvE;AACA;AACA;AACA;AACA;AACA,wGAAuG;AACvG;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,yGAAwG;AACxG,6GAA4G;AAC5G;AACA;AACA,8FAA6F;AAC7F;AACA,UAAS;AACT;AACA;AACA;AACA,oDAAmD;AACnD;AACA,wCAAuC;AACvC,UAAS;;AAET;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,4CAA2C;AAC3C;AACA;;;AAGA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;;AAGA,sDAAqD;;AAErD;AACA;;AAEA,+CAA8C,QAAQ;;AAEtD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,0CAAyC;AACzC;AACA;;AAEA;;AAEA;AACA;AACA,UAAS;;;AAGT;AACA;AACA;AACA;AACA;AACA,UAAS;;;AAGT;AACA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,cAAa;;AAEb,mFAAkF;AAClF;AACA,kBAAiB;AACjB;AACA,kBAAiB;AACjB;;AAEA;AACA;;;AAGA;AACA;;AAEA;;AAEA;AACA;AACA,mEAAkE;AAClE;AACA,mDAAkD;;AAElD;AACA;AACA;AACA,cAAa;AACb;AACA,cAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,kBAAiB;AACjB;;AAEA,cAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA,cAAa;;AAEb;AACA;AACA;;AAEA;;AAEA,EAAC;;;;;;;iECjsCD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;;AAGT;AACA;AACA;AACA,UAAS;;;AAGT;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;;AAEA;AACA;AACA;;AAEA,0DAAyD,OAAO;;AAEhE;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;;AAEA,sDAAqD,OAAO;AAC5D;AACA;AACA;AACA;AACA;;AAEA;;AAEA,qEAAoE,OAAO;;AAE3E;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,sBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;;AAEA;;AAEA,uDAAsD,OAAO;;AAE7D;AACA;AACA;AACA;;AAEA,yEAAwE,OAAO;AAC/E;AACA;AACA;AACA;AACA;AACA;;AAEA,8DAA6D,OAAO;AACpE;AACA;AACA,qDAAoD,OAAO;AAC3D;;AAEA;AACA;;AAEA,wEAAuE,QAAQ;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;;AAEA;AACA,EAAC;;;;;;;iECnOD;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,EAAC;;;;;;;iECnCD;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,yBAAwB;AACxB,yBAAwB;AACxB,6FAA4F,mCAAmC;AAC/H;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,cAAa;;AAEb,UAAS;;;AAGT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA6B,sBAAsB;AACnD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;;AAET;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,sBAAqB;;AAErB,qCAAoC,iCAAiC;AACrE;AACA,yCAAwC,8BAA8B;;AAEtE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;;AAEb,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA,kBAAiB;AACjB;;AAEA;;AAEA;AACA,0CAAyC;;AAEzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,EAAC;;;;;;;iECxND;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,cAAa;AACb,UAAS;;AAET;;AAEA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAC;;;;;;;iEClED;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,+CAA8C;AAC9C;AACA;;AAEA;;AAEA,UAAS;;AAET,MAAK;;AAEL;AACA,EAAC;;;;;;;iEClCD;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,4CAA2C,OAAO;;AAElD;AACA;;AAEA;AACA;AACA,cAAa;AACb;AACA,cAAa;AACb;AACA,cAAa;AACb;AACA;;AAEA;AACA;;AAEA;;AAEA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,gDAA+C,OAAO;;AAEtD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,2BAA0B;;AAE1B;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA,EAAC;;;;;;;iECnJD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,cAAa;;AAEb;;AAEA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA,UAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA,cAAa;AACb;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA,cAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA,UAAS;AACT;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA,EAAC;;;;;;;iECvSD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;;AAGT;AACA;AACA;AACA;;AAEA,yBAAwB,SAAS;AACjC;AACA;;AAEA;AACA,yBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,4BAA2B;AAC3B;;AAEA;AACA;AACA;AACA;AACA;AACA,4BAA2B;AAC3B;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA,UAAS;;AAET;;AAEA;;AAEA;AACA;AACA;;AAEA,cAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gCAA+B;AAC/B;;AAEA;AACA;AACA;AACA;AACA;AACA,gCAA+B;AAC/B;;AAEA;AACA;;AAEA;AACA,cAAa;;AAEb,cAAa;;AAEb;;;AAGA;;AAEA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET,MAAK;;AAEL;;AAEA,EAAC;;;;;;;iEC1MD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;;AAGL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;;;AAIA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;;AAGT;AACA;AACA;AACA,UAAS;;AAET;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,qEAAoE;;AAEpE;AACA;;AAEA;AACA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;;AAGT;AACA;AACA,UAAS;AACT;AACA;;AAEA;;AAEA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;;AAEA;;AAEA;;;AAGA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;;;AAIA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA8B,8BAA8B;AAC5D;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,UAAS;AACT;AACA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;;AAEA;;AAEA;AACA;AACA,UAAS;;AAET;;AAEA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,cAAa;AACb;AACA;;AAEA;AACA,UAAS;;AAET;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,UAAS;AACT;AACA;AACA;;;AAGA;;;AAGA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;AAIA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,UAAS;;AAET;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,UAAS;AACT;AACA;AACA;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA,EAAC;;;;;;;iEChhCD;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;;AAEA;;AAEA;AACA,EAAC;;;;;;;iECzID;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;;AAGT;AACA,8DAA6D;;AAE7D,0DAAyD;;AAEzD;AACA;AACA;AACA;;AAEA,MAAK;;;AAGL;;AAEA;AACA,EAAC;;;;;;;iECxFD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA6B;AAC7B;;AAEA;AACA;AACA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,cAAa;;;AAGb;AACA;AACA;;AAEA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;;AAEA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA,EAAC;;;;;;;iEC7ID;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,WAAU;AACV,WAAU;AACV;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,UAAS;AACT;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,iEAAgE,QAAQ;AACxE;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,6BAA4B,mCAAmC;AAC/D;AACA,UAAS;;AAET;AACA;AACA,UAAS;AACT;;;AAGA;;AAEA;AACA;;AAEA,cAAa;;AAEb;AACA;;AAEA;AACA;AACA,6BAA4B,QAAQ;AACpC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,cAAa;AACb;AACA;AACA,UAAS;;AAET;AACA;;;AAGA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;;AAGA,MAAK;AACL;;AAEA;AACA;;AAEA;AACA,EAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iECnJD;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;;AAEA;AACA,iEAAgE,OAAO;AACvE;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;;AAEA;AACA;AACA;AACA,0DAAyD,OAAO;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,iCAAgC,kBAAkB;AAClD;AACA;AACA,cAAa;AACb,UAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;;AAEA;;AAEA;AACA,+DAA8D,OAAO;AACrE;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;;AAEA;AACA;AACA,mDAAkD,QAAQ;AAC1D;AACA,gEAA+D,QAAQ;AACvE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;;AAET;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;;AAEA,8DAA6D,OAAO;AACpE;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,yBAAwB,6BAA6B;AACrD;AACA;AACA;AACA;AACA;AACA;AACA,qBAAoB,6BAA6B;AACjD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;;AAEA;AACA;AACA;AACA,0DAAyD,OAAO;AAChE;AACA;AACA;;AAEA;AACA;AACA;AACA,yBAAwB,kBAAkB;AAC1C;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,EAAC;;;;;;;iEC1gBD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAqD,OAAO;AAC5D;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,uDAAsD,OAAO;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,uDAAsD,OAAO;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wDAAuD,OAAO;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,+DAA8D,OAAO;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,EAAC;;;;;;;;ACjPD,kD;;;;;;ACAA,kD;;;;;;ACAA,kD;;;;;;;iECAA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;;AAGL;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;;;AAGA;;;AAGA;;AAEA,EAAC;;;;;;;iECtDD;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,0CAAyC,UAAU;AACnD;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;;AAEA;AACA,EAAC;;;;;;;iECjOD;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,0CAAyC,UAAU;AACnD;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT,MAAK;;AAEL;AACA,EAAC;;;;;;;iECrFD;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;;AAEA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAwB,+CAA+C;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,6CAA4C,OAAO;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA,UAAS;;AAET;AACA;AACA;AACA,cAAa;AACb,UAAS;;AAET;AACA;AACA,4EAA2E,8BAA8B;AACzG;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAC;;;;;;;iEC3RD;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,EAAC;;;;;;;iEC7BD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,gCAA+B;AAC/B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAmC;AACnC,2CAA0C;AAC1C,4CAA2C;AAC3C;AACA,+BAA8B;AAC9B,qFAAoF;AACpF,eAAc;AACd;;AAEA;AACA;AACA,kCAAiC;AACjC;AACA,+BAA8B;AAC9B,sCAAqC;AACrC,eAAc;AACd;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAmC;AACnC;AACA,+BAA8B;AAC9B,qDAAoD;AACpD,eAAc;AACd;;AAEA;AACA;AACA,+BAA8B;AAC9B,wDAAuD;AACvD,eAAc;AACd;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAmC;AACnC,2CAA0C;AAC1C,4CAA2C;AAC3C,mCAAkC;AAClC;AACA,+BAA8B;AAC9B,iCAAgC;AAChC,qFAAoF;AACpF,eAAc;AACd;;AAEA;AACA;AACA,mCAAkC;AAClC,iCAAgC;AAChC,mCAAkC;AAClC,yDAAwD;AACxD,yCAAwC;AACxC;AACA,+BAA8B;AAC9B;AACA,0BAAyB;AACzB,6CAA4C;AAC5C,oFAAmF;AACnF,iCAAgC;AAChC,8DAA6D;AAC7D,mEAAkE;AAClE,2DAA0D;AAC1D,iBAAgB;AAChB,iCAAgC;AAChC,8DAA6D;AAC7D,kEAAiE;AACjE,0DAAyD;AACzD,iBAAgB;AAChB,wDAAuD;AACvD,eAAc;AACd;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAoB,eAAe;AACnC,yBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAoB,eAAe;AACnC,yBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,qBAAoB,qBAAqB;AACzC;AACA;AACA,yBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,qBAAoB,oBAAoB;AACxC,yBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,yBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,yBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAC;;;;;;;iEC/TD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,yCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA,kCAAiC;AACjC;AACA;AACA;AACA,8BAA6B;AAC7B;AACA;AACA;AACA;AACA,kCAAiC;AACjC;AACA;AACA,kCAAiC;AACjC;AACA;AACA;AACA;AACA,0BAAyB,OAAO;AAChC;AACA;AACA;AACA;AACA;AACA,8BAA6B;AAC7B;AACA;AACA,8BAA6B;AAC7B;AACA;AACA;AACA;AACA,sBAAqB,sBAAsB;AAC3C;AACA;AACA;AACA;AACA;AACA,0BAAyB;AACzB;AACA;AACA,0BAAyB;AACzB;AACA;AACA;AACA,sBAAqB,OAAO;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;;AAEA,qCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA6B;AAC7B;AACA;AACA;AACA;AACA,0BAAyB;AACzB;AACA;AACA;AACA;AACA,8BAA6B;AAC7B;AACA;AACA,8BAA6B;AAC7B;AACA;AACA;AACA;AACA,sBAAqB,sBAAsB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA6B;AAC7B;AACA;AACA;AACA;AACA,0BAAyB;AACzB;AACA;AACA;AACA;AACA,8BAA6B;AAC7B;AACA;AACA,8BAA6B;AAC7B;AACA;AACA;AACA;AACA,sBAAqB,OAAO;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA,0BAAyB;AACzB;AACA;AACA;AACA;AACA;AACA,8BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA,UAAS;AACT,MAAK;;AAEL;AACA,EAAC;;;;;;;iEC7OD;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,UAAS;;AAET;;;AAGA;;AAEA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,EAAC;;;;;;;iECxDD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,MAAK;;AAEL;;AAEA,EAAC;;;;;;;iEC7CD;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,sCAAqC;;AAErC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,mDAAkD,QAAQ;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;;;;;;iECnFD;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,sBAAqB;AACrB;AACA;AACA;AACA,sBAAqB;;AAErB;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,EAAC;;;;;;;iECtED;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA,UAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;;;;;;iEC/DD;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,6DAA4D,OAAO;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,6DAA4D,OAAO;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;;AAET;;AAEA;AACA;;AAEA;AACA,UAAS;;AAET;;AAEA;AACA;;AAEA;AACA,UAAS;;AAET;;AAEA;AACA;;AAEA;AACA,UAAS;;AAET;;AAEA;AACA;;AAEA;AACA,UAAS;;AAET;;AAEA;AACA;;AAEA;AACA,UAAS;;AAET;;AAEA;AACA;;AAEA;AACA,UAAS;;AAET;;AAEA;AACA;;AAEA;AACA,UAAS;;AAET;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,EAAC;;;;;;;iEC7PD;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,6BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;;AAEA;AACA,6BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,cAAa;AACb;AACA;;AAEA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,UAAS;;AAET;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,EAAC;;;;;;;iECjHD;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA,cAAa;;AAEb,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,UAAS;;AAET;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,EAAC;;;;;;;iECtED;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,yBAAwB,oBAAoB;AAC5C;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,2DAA0D,kBAAkB;AAC5E;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,UAAS;;;AAGT;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,4CAA2C,qBAAqB;AAChE;AACA;;AAEA,gDAA+C;;AAE/C;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;;AAGA;;;AAGA;;AAEA,EAAC;;;;;;;iECxID;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb,UAAS;;;AAGT;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,yDAAwD,OAAO;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;;AAGT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAwD,OAAO;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;;AAEA;AACA;AACA;AACA;;AAEA;AACA,6BAA4B,wBAAwB;AACpD;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,EAAC;;;;;;;AC/GD;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAA+D;AAC/D,yBAAwB;AACxB;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA,qBAAoB,OAAO;AAC3B;AACA;AACA;AACA,2CAA0C,aAAa,cAAc,gBAAgB,kBAAkB;AACvG;AACA,wDAAuD,aAAa,cAAc;AAClF;AACA,mDAAkD,wBAAwB;AAC1E;AACA;AACA;AACA;;AAEA;AACA;AACA,mBAAkB;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA,mBAAkB;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,qBAAoB,sBAAsB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,oBAAmB,QAAQ;AAC3B;AACA,qBAAoB,cAAc;AAClC;AACA;AACA;AACA;AACA,8BAA6B,mBAAmB;AAChD;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAC;;AAED;;;;;;;AChNA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,mBAAkB;AAClB;AACA;;AAEA;;AAEA;AACA;AACA,cAAa;AACb;AACA;AACA,cAAa;AACb;AACA;AACA,cAAa;;AAEb;;AAEA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA,cAAa;;AAEb;;AAEA;AACA;AACA,cAAa;AACb;AACA;AACA,cAAa;AACb;AACA;AACA,cAAa;;AAEb;;AAEA;AACA;AACA,cAAa;AACb;AACA;AACA,cAAa;;AAEb;;AAEA;AACA;AACA,cAAa;AACb;AACA;AACA,cAAa;AACb;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA,cAAa;AACb;AACA;AACA,cAAa;AACb;AACA;AACA,cAAa;;AAEb;;AAEA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA,cAAa;AACb;AACA;AACA,cAAa;AACb;AACA;AACA;AACA,cAAa;;AAEb;;AAEA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA,cAAa;AACb;AACA;AACA,cAAa;AACb;AACA;AACA,cAAa;AACb;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA,cAAa;;AAEb;;AAEA;AACA;AACA,cAAa;AACb;AACA;AACA,cAAa;AACb;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA,cAAa;AACb;AACA;AACA;AACA,cAAa;AACb;AACA;AACA,cAAa;AACb;AACA;AACA;AACA,cAAa;AACb;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA,cAAa;;AAEb;;AAEA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA,mBAAkB;AAClB;AACA;;AAEA;AACA;AACA,oBAAmB,uBAAuB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAmB,EAAE;AACrB,qBAAoB,QAAQ;AAC5B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B,qBAAoB,OAAO;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B,oBAAmB,OAAO;AAC1B,oBAAmB,EAAE;AACrB,qBAAoB,OAAO;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAmB,uBAAuB;AAC1C;AACA,oBAAmB,qCAAqC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAiC,kBAAkB;AACnD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,0BAAyB,iBAAiB;AAC1C;AACA;AACA;AACA;AACA;;AAEA;AACA,0BAAyB,sBAAsB;AAC/C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAAyC,uBAAuB;AAChE;AACA;AACA;AACA;AACA;AACA;AACA,8BAA6B;AAC7B;AACA,sBAAqB;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA6C,uBAAuB;AACpE;AACA;AACA,0BAAyB;AACzB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,kCAAiC,kBAAkB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,kCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,kCAAiC,yBAAyB;AAC1D;AACA;AACA;AACA,sBAAqB;AACrB;AACA,sBAAqB;AACrB;AACA,sBAAqB;AACrB;AACA,sBAAqB;AACrB;AACA,sBAAqB;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA6B,+BAA+B;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA6B,2CAA2C;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA6B,yBAAyB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;;AAEjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;;AAEjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;;AAEjB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAe,uBAAuB;AACtC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,wBAAuB,EAAE;AACzB,yBAAwB,QAAQ;AAChC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAuB,OAAO;AAC9B,yBAAwB,OAAO;AAC/B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAuB,OAAO;AAC9B,wBAAuB,OAAO;AAC9B,wBAAuB,EAAE;AACzB,yBAAwB,OAAO;AAC/B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAuB,uBAAuB;AAC9C,wBAAuB,qCAAqC;AAC5D;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAuB,QAAQ;AAC/B;AACA;;AAEA;AACA;AACA,wBAAuB,uBAAuB;AAC9C;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA,EAAC;;AAED;;;;;;;iECn6BA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;;;;;;iECdD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;;;;;;iEClCD;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,6CAA4C;AAC5C,cAAa;AACb,wCAAuC;AACvC;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA;AACA;AACA,UAAS;;AAET;AACA,4CAA2C;AAC3C;;AAEA,MAAK;;;;AAIL;AACA;AACA;;AAEA;;AAEA;AACA;AACA,UAAS;;AAET;AACA,4CAA2C;AAC3C;;AAEA,MAAK;;;;;AAKL;AACA;AACA;;AAEA;;AAEA;AACA;AACA,UAAS;;AAET;AACA,4CAA2C;AAC3C;;AAEA,MAAK;;;AAGL;AACA;AACA;AACA;;AAEA,+BAA8B;AAC9B;AACA,UAAS;AACT;AACA;AACA;AACA,MAAK;;;;AAIL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,EAAC;;;;;;;iECvHD;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;;AAEA,MAAK;;;;AAIL;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;;;AAIL;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;;AAGL;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;;;AAIL;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,EAAC;;;;;;;iECnGD;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,MAAK;;;AAGL;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;;AAGL;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,8DAA6D;AAC7D;AACA;AACA;AACA;AACA;AACA,MAAK;;;AAGL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,EAAC;;;;;;;iECrHD;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;;;AAIL;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;;AAGL;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA,EAAC;;;;;;;iECvRD;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;AAGA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,sDAAqD,OAAO;AAC5D;AACA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;;;;AAIL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;;AAEA;AACA,4DAA2D;AAC3D;;AAEA;AACA;AACA;AACA;;AAEA,kCAAiC;;AAEjC,6BAA4B,mBAAmB;;AAE/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;;;AAGL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,sDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA,MAAK;;;;AAIL;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,mDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,EAAC;;;;;;;iEC7KD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,UAAS;AACT;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA,cAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AAGA,MAAK;;AAEL;AACA;AACA;AACA,EAAC;;;;;;;;AC3ED;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;;AAEA;AACA;AACA,sCAAqC,4BAA4B;AACjE;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,6BAA4B,eAAe;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa;;AAEb,6BAA4B,+BAA+B;AAC3D;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,sBAAqB;AACrB;AACA;;AAEA,kBAAiB;;AAEjB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,kBAAiB;AACjB,iCAAgC,iBAAiB;AACjD;AACA;AACA;AACA;AACA,UAAS;;AAET;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;;AAEjB,cAAa,oCAAoC;AACjD;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA,UAAS;;AAET;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA,UAAS;;AAET;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAgC,iDAAiD;AACjF;AACA;AACA;AACA;AACA,6BAA4B,4BAA4B;AACxD;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA,MAAK;;AAEL;AACA,EAAC;;;;;;;AC1YD,kD;;;;;;iECAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA,sCAAqC,yCAAyC,WAAW,kCAAkC;AAC3H,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;;AAEA;AACA;;AAEA,6BAA4B,6BAA6B;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,6BAA4B,8BAA8B;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;AACA;AACA,qBAAoB,aAAa;AACjC;AACA;AACA;AACA,mDAAkD,OAAO;;AAEzD;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,8CAA6C;AAC7C,kBAAiB;AACjB;AACA;;AAEA,kBAAiB,OAAO;AACxB;AACA;AACA;;AAEA;AACA,UAAS;;AAET;AACA,sBAAqB,aAAa;AAClC;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,cAAa;;AAEb;AACA;AACA,iCAAgC,iBAAiB;AACjD;AACA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;;AAEA;AACA;;AAEA;;AAEA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;;;AAGA;AACA,EAAC;;;;;;;;;AC9JD,+LAA8L,oBAAoB,yBAAyB,6CAA6C,OAAO,OAAO,8CAA8C,OAAO,eAAe,KAAK,qEAAqE,yBAAyB,kDAAkD,qDAAqD,wBAAwB,SAAS,OAAO,iBAAiB,oDAAoD,OAAO,eAAe,KAAK,qEAAqE,yBAAyB,gBAAgB,sDAAsD,yDAAyD,gCAAgC,SAAS,OAAO,iBAAiB,4DAA4D,OAAO,eAAe,KAAK,uEAAuE,oBAAoB,+BAA+B,yDAAyD,OAAO,iBAAiB,0DAA0D,OAAO,eAAe,KAAK,yEAAyE,6BAA6B,mDAAmD,6DAA6D,oCAAoC,WAAW,OAAO,iBAAiB,kEAAkE,OAAO,eAAe,KAAK,qEAAqE,yBAAyB,gBAAgB,uDAAuD,+DAA+D,0CAA0C,SAAS,OAAO,iBAAiB,yEAAyE,OAAO,eAAe,KAAK,iIAAiI,0CAA0C,qCAAqC,KAAK,uHAAuH,mCAAmC,4CAA4C,KAAK,mMAAmM,mDAAmD,iDAAiD,uBAAuB,+CAA+C,8CAA8C,8CAA8C,2CAA2C,8BAA8B,KAAK,K;;;;;;ACArhG,6JAA4J,8KAA8K,+CAA+C,uDAAuD,uDAAuD,KAAK,4OAA4O,kCAAkC,6BAA6B,4BAA4B,0BAA0B,6CAA6C,oCAAoC,+BAA+B,wBAAwB,SAAS,uLAAuL,qEAAqE,KAAK,kIAAkI,0DAA0D,KAAK,85CAA85C,wBAAwB,4DAA4D,kDAAkD,gEAAgE,sGAAsG,4CAA4C,2HAA2H,kEAAkE,mNAAmN,yFAAyF,2EAA2E,yCAAyC,gDAAgD,uCAAuC,yBAAyB,OAAO,wLAAwL,yBAAyB,wEAAwE,+GAA+G,qFAAqF,uDAAuD,4DAA4D,sGAAsG,6DAA6D,kKAAkK,uGAAuG,qCAAqC,6BAA6B,qBAAqB,aAAa,yBAAyB,KAAK,0/BAA0/B,6DAA6D,kDAAkD,yCAAyC,6HAA6H,4CAA4C,2HAA2H,+EAA+E,qDAAqD,uCAAuC,4CAA4C,sFAAsF,6CAA6C,kJAAkJ,gFAAgF,qBAAqB,aAAa,yBAAyB,KAAK,w2BAAw2B,4BAA4B,sEAAsE,gFAAgF,qCAAqC,+BAA+B,oCAAoC,8EAA8E,qCAAqC,0IAA0I,0DAA0D,aAAa,yBAAyB,KAAK,8cAA8c,wBAAwB,0EAA0E,yCAAyC,yCAAyC,uFAAuF,+IAA+I,sFAAsF,0DAA0D,4DAA4D,mEAAmE,qGAAqG,gHAAgH,oDAAoD,KAAK,K;;;;;;ACAn4T,kFAAiF,8CAA8C,KAAK,wEAAwE,+CAA+C,KAAK,8EAA8E,wCAAwC,KAAK,0EAA0E,4CAA4C,KAAK,K;;;;;;ACAtf,2DAA0D,+EAA+E,KAAK,yCAAyC,8DAA8D,yBAAyB,kEAAkE,mBAAmB,KAAK,+CAA+C,0EAA0E,KAAK,4CAA4C,iDAAiD,iBAAiB,+CAA+C,0CAA0C,mDAAmD,0CAA0C,mBAAmB,KAAK,K;;;;;;ACAlyB,yCAAwC,4BAA4B,qCAAqC,kCAAkC,8BAA8B,gCAAgC,8BAA8B,iCAAiC,8BAA8B,yBAAyB,wDAAwD,2DAA2D,yDAAyD,qFAAqF,KAAK,K;;;;;;ACArkB,8EAA6E,qCAAqC,yCAAyC,4BAA4B,mCAAmC,gCAAgC,6QAA6Q,+CAA+C,+CAA+C,8BAA8B,KAAK,iGAAiG,uEAAuE,sEAAsE,KAAK,4CAA4C,oBAAoB,2EAA2E,0EAA0E,6CAA6C,kGAAkG,oFAAoF,uCAAuC,kDAAkD,yGAAyG,gGAAgG,oGAAoG,qEAAqE,4DAA4D,4CAA4C,mDAAmD,4FAA4F,+DAA+D,2BAA2B,K;;;;;;ACA/kE,6OAA4O,4EAA4E,gDAAgD,eAAe,8DAA8D,+EAA+E,iDAAiD,eAAe,4DAA4D,0CAA0C,KAAK,+N;;;;;;ACA/qB,8DAA6D,mEAAmE,wGAAwG,mDAAmD,6EAA6E,8CAA8C,2HAA2H,+CAA+C,gEAAgE,mGAAmG,+FAA+F,0DAA0D,4GAA4G,8DAA8D,mKAAmK,uEAAuE,uGAAuG,mMAAmM,WAAW,kDAAkD,gXAAgX,0CAA0C,mGAAmG,oCAAoC,gCAAgC,mFAAmF,wFAAwF,iPAAiP,iJAAiJ,kEAAkE,kDAAkD,8GAA8G,gIAAgI,iGAAiG,2EAA2E,iGAAiG,oDAAoD,iEAAiE,8CAA8C,4GAA4G,mDAAmD,4CAA4C,8KAA8K,0FAA0F,iDAAiD,4CAA4C,K;;;;;;ACAviI,0OAAyO,4DAA4D,oCAAoC,SAAS,8KAA8K,gFAAgF,wDAAwD,4FAA4F,wFAAwF,wFAAwF,wFAAwF,mCAAmC,mCAAmC,iCAAiC,iBAAiB,0LAA0L,mBAAmB,K;;;;;;ACAjzC,knBAAinB,2EAA2E,K;;;;;;ACA5rB,qKAAoK,sCAAsC,6BAA6B,+FAA+F,oGAAoG,iCAAiC,4CAA4C,wCAAwC,uCAAuC,uCAAuC,oBAAoB,mEAAmE,+BAA+B,+BAA+B,+BAA+B,iDAAiD,uCAAuC,iRAAiR,2EAA2E,4BAA4B,SAAS,kEAAkE,iCAAiC,4CAA4C,wCAAwC,uCAAuC,uCAAuC,sBAAsB,yBAAyB,oDAAoD,4CAA4C,4CAA4C,4CAA4C,4CAA4C,4CAA4C,4CAA4C,4CAA4C,4CAA4C,uIAAuI,6DAA6D,8BAA8B,gEAAgE,8BAA8B,gEAAgE,8BAA8B,mDAAmD,4DAA4D,wDAAwD,oBAAoB,2DAA2D,2DAA2D,2DAA2D,2DAA2D,8CAA8C,6HAA6H,2FAA2F,0FAA0F,0FAA0F,2FAA2F,2FAA2F,0FAA0F,0FAA0F,0FAA0F,0FAA0F,yFAAyF,yFAAyF,0FAA0F,0FAA0F,yFAAyF,yFAAyF,uCAAuC,4CAA4C,SAAS,K;;;;;;ACAn1I,mNAAkN,4BAA4B,yFAAyF,yCAAyC,4BAA4B,2BAA2B,2BAA2B,kIAAkI,4BAA4B,6BAA6B,gCAAgC,2BAA2B,4BAA4B,iCAAiC,4BAA4B,6BAA6B,iDAAiD,mEAAmE,iCAAiC,+BAA+B,+BAA+B,+DAA+D,6BAA6B,iCAAiC,4BAA4B,kCAAkC,6BAA6B,yDAAyD,8BAA8B,6BAA6B,8BAA8B,8BAA8B,kCAAkC,6BAA6B,4BAA4B,6BAA6B,6BAA6B,0BAA0B,iEAAiE,KAAK,wB;;;;;;ACA9nD,+GAA8G,wCAAwC,KAAK,8CAA8C,iDAAiD,sEAAsE,KAAK,qDAAqD,uFAAuF,KAAK,oBAAoB,uHAAuH,sIAAsI,yCAAyC,KAAK,6GAA6G,sFAAsF,KAAK,6B;;;;;;ACA79B,wCAAuC,mDAAmD,+CAA+C,+CAA+C,8CAA8C,+CAA+C,8CAA8C,gDAAgD,gDAAgD,+CAA+C,8CAA8C,+CAA+C,gDAAgD,iDAAiD,gDAAgD,+CAA+C,gDAAgD,+CAA+C,gDAAgD,iDAAiD,gDAAgD,gDAAgD,iDAAiD,iDAAiD,gDAAgD,+CAA+C,gDAAgD,gDAAgD,gDAAgD,+CAA+C,iDAAiD,gDAAgD,+CAA+C,gDAAgD,iDAAiD,gDAAgD,iDAAiD,+CAA+C,gDAAgD,gDAAgD,gDAAgD,gDAAgD,+CAA+C,+CAA+C,gDAAgD,gDAAgD,gDAAgD,+CAA+C,gDAAgD,gDAAgD,gDAAgD,gDAAgD,gDAAgD,+CAA+C,iDAAiD,+CAA+C,iDAAiD,iDAAiD,+CAA+C,+CAA+C,+CAA+C,iDAAiD,gDAAgD,gDAAgD,iDAAiD,K;;;;;;ACA7hG,kPAAiP,6BAA6B,sBAAsB,iHAAiH,4kBAA4kB,oBAAoB,oBAAoB,oBAAoB,uDAAuD,6BAA6B,oBAAoB,oBAAoB,oBAAoB,mDAAmD,6BAA6B,qBAAqB,qBAAqB,qBAAqB,qBAAqB,qBAAqB,qBAAqB,qBAAqB,qDAAqD,8BAA8B,qBAAqB,qBAAqB,qBAAqB,qBAAqB,qBAAqB,qBAAqB,qBAAqB,qBAAqB,qDAAqD,8BAA8B,qBAAqB,qBAAqB,qBAAqB,qBAAqB,qBAAqB,qBAAqB,qDAAqD,wGAAwG,iBAAiB,KAAK,qC;;;;;;ACA/gE,2PAA0P,0NAA0N,8CAA8C,2CAA2C,2BAA2B,yGAAyG,yGAAyG,yGAAyG,yGAAyG,wFAAwF,mHAAmH,2EAA2E,kFAAkF,gDAAgD,iDAAiD,qFAAqF,KAAK,0iBAA0iB,iEAAiE,uB;;;;;;ACA1nE,mKAAkK,yGAAyG,sNAAsN,uCAAuC,wEAAwE,6CAA6C,KAAK,iLAAiL,mCAAmC,8CAA8C,wFAAwF,8CAA8C,whBAAwhB,uMAAuM,4EAA4E,KAAK,2fAA2f,6DAA6D,uB;;;;;;ACAl3E,uNAAsN,+CAA+C,+CAA+C,8BAA8B,KAAK,mnBAAmnB,kEAAkE,qB","file":"OSG.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"hammerjs\"), require(\"q\"), require(\"zlib\"), require(\"jquery\"), require(\"leapjs\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"hammer\", \"q\", \"zlib\", \"jquery\", \"leap\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"OSG\"] = factory(require(\"hammerjs\"), require(\"q\"), require(\"zlib\"), require(\"jquery\"), require(\"leapjs\"));\n\telse\n\t\troot[\"OSG\"] = factory(root[\"Hammer\"], root[\"Q\"], root[\"Zlib\"], root[\"$\"], root[\"Leap\"]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_22__, __WEBPACK_EXTERNAL_MODULE_219__, __WEBPACK_EXTERNAL_MODULE_220__, __WEBPACK_EXTERNAL_MODULE_221__, __WEBPACK_EXTERNAL_MODULE_252__) {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 36bfba05a766b918d4b8\n **/","define( [\r\n 'osgNameSpace',\r\n 'osg/osg',\r\n 'osgAnimation/osgAnimation',\r\n 'osgDB/osgDB',\r\n 'osgGA/osgGA',\r\n 'osgUtil/osgUtil',\r\n 'osgViewer/osgViewer',\r\n 'osgShader/osgShader',\r\n 'osgShadow/osgShadow'\r\n], function ( osgNameSpace, osg, osgAnimation, osgDB, osgGA, osgUtil, osgViewer, osgShader, osgShadow ) {\r\n 'use strict';\r\n\r\n var openSceneGraph = osgNameSpace;\r\n\r\n openSceneGraph.osg = osg;\r\n openSceneGraph.osgAnimation = osgAnimation;\r\n openSceneGraph.osgDB = osgDB;\r\n openSceneGraph.osgGA = osgGA;\r\n openSceneGraph.osgUtil = osgUtil;\r\n openSceneGraph.osgViewer = osgViewer;\r\n openSceneGraph.osgShader = osgShader;\r\n openSceneGraph.osgShadow = osgShadow;\r\n\r\n var namespaces = [ 'osg', 'osgAnimation', 'osgDB', 'osgGA', 'osgUtil', 'osgViewer', 'osgShader', 'osgShadow' ];\r\n\r\n // for backward compatibility\r\n openSceneGraph.globalify = function () {\r\n namespaces.forEach( function ( namespace ) {\r\n window[ namespace ] = openSceneGraph[ namespace ];\r\n } );\r\n };\r\n\r\n return openSceneGraph;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/OSG.js\n ** module id = 1\n ** module chunks = 0 1\n **/","define( [\r\n 'version'\r\n], function ( version ) {\r\n return version;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgNameSpace.js\n ** module id = 3\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/BlendColor',\r\n 'osg/BlendFunc',\r\n 'osg/BoundingBox',\r\n 'osg/BoundingSphere',\r\n 'osg/BufferArray',\r\n 'osg/Camera',\r\n 'osg/ColorMask',\r\n 'osg/ComputeBoundsVisitor',\r\n 'osg/ComputeMatrixFromNodePath',\r\n 'osg/CullFace',\r\n 'osg/CullingSet',\r\n 'osg/CullSettings',\r\n 'osg/CullStack',\r\n 'osg/CullVisitor',\r\n 'osg/Depth',\r\n 'osg/DrawArrayLengths',\r\n 'osg/DrawArrays',\r\n 'osg/DrawElements',\r\n 'osg/EllipsoidModel',\r\n 'osg/FrameBufferObject',\r\n 'osg/FrameStamp',\r\n 'osg/Geometry',\r\n 'osg/GLObject',\r\n 'osg/Image',\r\n 'osg/ImageStream',\r\n 'osg/KdTree',\r\n 'osg/KdTreeBuilder',\r\n 'osg/Light',\r\n 'osg/LightSource',\r\n 'osg/LineWidth',\r\n 'osg/Lod',\r\n 'osg/Map',\r\n 'osg/Material',\r\n 'osg/Math',\r\n 'osg/Matrix',\r\n 'osg/MatrixTransform',\r\n 'osg/Node',\r\n 'osg/NodeVisitor',\r\n 'osg/Notify',\r\n 'osg/Object',\r\n 'osg/PagedLOD',\r\n 'osg/Polytope',\r\n 'osg/Plane',\r\n 'osg/PrimitiveFunctor',\r\n 'osg/PrimitiveSet',\r\n 'osg/Program',\r\n 'osg/Projection',\r\n 'osg/Quat',\r\n 'osg/RenderBin',\r\n 'osg/RenderLeaf',\r\n 'osg/RenderStage',\r\n 'osg/Shader',\r\n 'osg/Shape',\r\n 'osg/Stack',\r\n 'osg/State',\r\n 'osg/StateAttribute',\r\n 'osg/StateGraph',\r\n 'osg/StateSet',\r\n 'osg/Texture',\r\n 'osg/TextureCubeMap',\r\n 'osg/Transform',\r\n 'osg/TriangleIndexFunctor',\r\n 'osg/Uniform',\r\n 'osg/UpdateVisitor',\r\n 'osg/Utils',\r\n 'osg/Vec2',\r\n 'osg/Vec3',\r\n 'osg/Vec4',\r\n 'osg/Viewport',\r\n 'osgUtil/osgPool',\r\n 'osg/TransformEnums',\r\n 'osg/WebGLCaps'\r\n\r\n], function (\r\n BlendColor,\r\n BlendFunc,\r\n BoundingBox,\r\n BoundingSphere,\r\n BufferArray,\r\n Camera,\r\n ColorMask,\r\n ComputeBoundsVisitor,\r\n ComputeMatrixFromNodePath,\r\n CullFace,\r\n CullingSet,\r\n CullSettings,\r\n CullStack,\r\n CullVisitor,\r\n Depth,\r\n DrawArrayLengths,\r\n DrawArrays,\r\n DrawElements,\r\n EllipsoidModel,\r\n FrameBufferObject,\r\n FrameStamp,\r\n Geometry,\r\n GLObject,\r\n Image,\r\n ImageStream,\r\n KdTree,\r\n KdTreeBuilder,\r\n Light,\r\n LightSource,\r\n LineWidth,\r\n Lod,\r\n Map,\r\n Material,\r\n Math,\r\n Matrix,\r\n MatrixTransform,\r\n Node,\r\n NodeVisitor,\r\n Notify,\r\n Object,\r\n PagedLOD,\r\n Polytope,\r\n Plane,\r\n PrimitiveFunctor,\r\n PrimitiveSet,\r\n Program,\r\n Projection,\r\n Quat,\r\n RenderBin,\r\n RenderLeaf,\r\n RenderStage,\r\n Shader,\r\n Shape,\r\n Stack,\r\n State,\r\n StateAttribute,\r\n StateGraph,\r\n StateSet,\r\n Texture,\r\n TextureCubeMap,\r\n Transform,\r\n TriangleIndexFunctor,\r\n Uniform,\r\n UpdateVisitor,\r\n MACROUTILS,\r\n Vec2,\r\n Vec3,\r\n Vec4,\r\n Viewport,\r\n osgPool,\r\n TransformEnums,\r\n WebGLCaps ) {\r\n\r\n 'use strict';\r\n\r\n var osg = {};\r\n\r\n osg.BlendColor = BlendColor;\r\n osg.BlendFunc = BlendFunc;\r\n osg.BoundingBox = BoundingBox;\r\n osg.BoundingSphere = BoundingSphere;\r\n osg.BufferArray = BufferArray;\r\n osg.ColorMask = ColorMask;\r\n osg.Camera = Camera;\r\n osg.ColorMask = ColorMask;\r\n osg.ComputeBoundsVisitor = ComputeBoundsVisitor;\r\n MACROUTILS.objectMix( osg, ComputeMatrixFromNodePath );\r\n osg.CullFace = CullFace;\r\n osg.CullingSet = CullingSet;\r\n osg.CullSettings = CullSettings;\r\n osg.CullStack = CullStack;\r\n osg.CullVisitor = CullVisitor;\r\n osg.Depth = Depth;\r\n osg.DrawArrayLengths = DrawArrayLengths;\r\n osg.DrawArrays = DrawArrays;\r\n osg.DrawElements = DrawElements;\r\n osg.EllipsoidModel = EllipsoidModel;\r\n osg.WGS_84_RADIUS_EQUATOR = EllipsoidModel.WGS_84_RADIUS_EQUATOR;\r\n osg.WGS_84_RADIUS_POLAR = EllipsoidModel.WGS_84_RADIUS_POLAR;\r\n osg.FrameBufferObject = FrameBufferObject;\r\n osg.FrameStamp = FrameStamp;\r\n osg.Geometry = Geometry;\r\n osg.GLObject = GLObject;\r\n osg.Image = Image;\r\n osg.ImageStream = ImageStream;\r\n osg.KdTree = KdTree;\r\n osg.KdTreeBuilder = KdTreeBuilder;\r\n osg.Light = Light;\r\n osg.LightSource = LightSource;\r\n osg.LineWidth = LineWidth;\r\n osg.Lod = Lod;\r\n osg.Map = Map;\r\n osg.Material = Material;\r\n MACROUTILS.objectMix( osg, Math );\r\n osg.Matrix = Matrix;\r\n osg.MatrixTransform = MatrixTransform;\r\n osg.Node = Node;\r\n osg.NodeVisitor = NodeVisitor;\r\n MACROUTILS.objectMix( osg, Notify );\r\n osg.Object = Object;\r\n osg.PagedLOD = PagedLOD;\r\n osg.Plane = Plane;\r\n osg.Polytope = Polytope;\r\n osg.PrimitiveSet = PrimitiveSet;\r\n osg.PrimitiveFunctor = PrimitiveFunctor;\r\n osg.Program = Program;\r\n osg.Projection = Projection;\r\n osg.Quat = Quat;\r\n osg.RenderBin = RenderBin;\r\n osg.RenderLeaf = RenderLeaf;\r\n osg.RenderStage = RenderStage;\r\n osg.Shader = Shader;\r\n MACROUTILS.objectMix( osg, Shape );\r\n osg.Stack = Stack;\r\n osg.State = State;\r\n osg.StateAttribute = StateAttribute;\r\n osg.StateGraph = StateGraph;\r\n osg.StateSet = StateSet;\r\n osg.Texture = Texture;\r\n osg.TextureCubeMap = TextureCubeMap;\r\n osg.Transform = Transform;\r\n osg.TriangleIndexFunctor = TriangleIndexFunctor;\r\n osg.Uniform = Uniform;\r\n osg.UpdateVisitor = UpdateVisitor;\r\n MACROUTILS.objectMix( osg, MACROUTILS );\r\n osg.Vec2 = Vec2;\r\n osg.Vec3 = Vec3;\r\n osg.Vec4 = Vec4;\r\n osg.Viewport = Viewport;\r\n\r\n osg.memoryPools = osgPool.memoryPools;\r\n\r\n osg.Transform.RELATIVE_RF = TransformEnums.RELATIVE_RF;\r\n osg.Transform.ABSOLUTE_RF = TransformEnums.ABSOLUTE_RF;\r\n\r\n osg.WebGLCaps = WebGLCaps;\r\n\r\n return osg;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/osg.js\n ** module id = 4\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osgAnimation/Animation',\r\n 'osgAnimation/AnimationUpdateCallback',\r\n 'osgAnimation/BasicAnimationManager',\r\n 'osgAnimation/Channel',\r\n 'osgAnimation/Easing',\r\n 'osgAnimation/FloatLerpChannel',\r\n 'osgAnimation/FloatTarget',\r\n 'osgAnimation/Interpolator',\r\n 'osgAnimation/Keyframe',\r\n 'osgAnimation/LinkVisitor',\r\n 'osgAnimation/QuatLerpChannel',\r\n 'osgAnimation/QuatSlerpChannel',\r\n 'osgAnimation/QuatTarget',\r\n 'osgAnimation/Sampler',\r\n 'osgAnimation/StackedQuaternion',\r\n 'osgAnimation/StackedRotateAxis',\r\n 'osgAnimation/StackedTranslate',\r\n 'osgAnimation/Target',\r\n 'osgAnimation/UpdateMatrixTransform',\r\n 'osgAnimation/Vec3LerpChannel',\r\n 'osgAnimation/Vec3Target'\r\n], function ( MACROUTILS, Animation, AnimationUpdateCallback, BasicAnimationManager, Channel, Easing, FloatLerpChannel, FloatTarget, Interpolator, Keyframe, LinkVisitor, QuatLerpChannel, QuatSlerpChannel, QuatTarget, Sampler, StackedQuaternion, StackedRotateAxis, StackedTranslate, Target, UpdateMatrixTransform, Vec3LerpChannel, Vec3Target ) {\r\n\r\n var osgAnimation = {};\r\n\r\n osgAnimation.Animation = Animation;\r\n osgAnimation.AnimationUpdateCallback = AnimationUpdateCallback;\r\n osgAnimation.BasicAnimationManager = BasicAnimationManager;\r\n osgAnimation.Channel = Channel;\r\n MACROUTILS.objectMix( osgAnimation, Easing );\r\n osgAnimation.FloatLerpChannel = FloatLerpChannel;\r\n osgAnimation.FloatTarget = FloatTarget;\r\n MACROUTILS.objectMix( osgAnimation, Interpolator );\r\n MACROUTILS.objectMix( osgAnimation, Keyframe );\r\n osgAnimation.LinkVisitor = LinkVisitor;\r\n osgAnimation.QuatLerpChannel = QuatLerpChannel;\r\n osgAnimation.QuatSlerpChannel = QuatSlerpChannel;\r\n osgAnimation.QuatTarget = QuatTarget;\r\n osgAnimation.Sampler = Sampler;\r\n osgAnimation.StackedQuaternion = StackedQuaternion;\r\n osgAnimation.StackedRotateAxis = StackedRotateAxis;\r\n osgAnimation.StackedTranslate = StackedTranslate;\r\n osgAnimation.Target = Target;\r\n osgAnimation.UpdateMatrixTransform = UpdateMatrixTransform;\r\n osgAnimation.Vec3LerpChannel = Vec3LerpChannel;\r\n osgAnimation.Vec3Target = Vec3Target;\r\n\r\n return osgAnimation;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgAnimation/osgAnimation.js\n ** module id = 5\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osgDB/Input',\r\n 'osgDB/ReaderParser',\r\n 'osgWrappers/serializers/osg',\r\n 'osgWrappers/serializers/osgAnimation'\r\n], function ( MACROUTILS, Input, ReaderParser, osgWrappers, osgAnimationWrappers ) {\r\n\r\n\r\n var osgDB = {};\r\n osgDB.Input = Input;\r\n MACROUTILS.objectMix( osgDB, ReaderParser );\r\n osgDB.ObjectWrapper.serializers.osg = osgWrappers;\r\n osgDB.ObjectWrapper.serializers.osgAnimation = osgAnimationWrappers;\r\n\r\n return osgDB;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgDB/osgDB.js\n ** module id = 6\n ** module chunks = 0 1\n **/","define( [\r\n 'hammer',\r\n 'osgGA/FirstPersonManipulator',\r\n 'osgGA/FirstPersonManipulatorMouseKeyboardController',\r\n 'osgGA/FirstPersonManipulatorOculusController',\r\n 'osgGA/FirstPersonManipulatorDeviceOrientationController',\r\n 'osgGA/Manipulator',\r\n 'osgGA/OrbitManipulator',\r\n 'osgGA/OrbitManipulatorGamePadController',\r\n 'osgGA/OrbitManipulatorHammerController',\r\n 'osgGA/OrbitManipulatorLeapMotionController',\r\n 'osgGA/OrbitManipulatorMouseKeyboardController',\r\n 'osgGA/OrbitManipulatorDeviceOrientationController',\r\n 'osgGA/OrbitManipulatorOculusController',\r\n 'osgGA/SwitchManipulator',\r\n 'osgGA/OrbitManipulatorEnums'\r\n], function ( Hammer, FirstPersonManipulator, FirstPersonManipulatorMouseKeyboardController, FirstPersonManipulatorOculusController, FirstPersonManipulatorDeviceOrientationController, Manipulator, OrbitManipulator, OrbitManipulatorGamePadController, OrbitManipulatorHammerController, OrbitManipulatorLeapMotionController, OrbitManipulatorMouseKeyboardController, OrbitManipulatorDeviceOrientationController, OrbitManipulatorOculusController, SwitchManipulator, OrbitManipulatorEnums ) {\r\n\r\n 'use strict';\r\n\r\n var osgGA = {};\r\n\r\n Hammer.NO_MOUSEEVENTS = true; // disable hammer js mouse events\r\n\r\n osgGA.FirstPersonManipulator = FirstPersonManipulator;\r\n osgGA.getFirstPersonStandardMouseKeyboardControllerClass = function () {\r\n return FirstPersonManipulatorMouseKeyboardController;\r\n };\r\n osgGA.getFirstPersonOculusControllerClass = function () {\r\n return FirstPersonManipulatorOculusController;\r\n };\r\n osgGA.getFirstPersonDeviceOrientationController = function () {\r\n return FirstPersonManipulatorDeviceOrientationController;\r\n };\r\n osgGA.Manipulator = Manipulator;\r\n osgGA.OrbitManipulator = OrbitManipulator;\r\n osgGA.getOrbitManipulatorGamePadController = function () {\r\n return OrbitManipulatorGamePadController;\r\n };\r\n osgGA.getOrbitManipulatorHammerController = function () {\r\n return OrbitManipulatorHammerController;\r\n };\r\n osgGA.getOrbitManipulatorLeapMotionController = function () {\r\n return OrbitManipulatorLeapMotionController;\r\n };\r\n osgGA.getOrbitManipulatorMouseKeyboardController = function () {\r\n return OrbitManipulatorMouseKeyboardController;\r\n };\r\n osgGA.getOrbitManipulatorDeviceOrientationController = function () {\r\n return OrbitManipulatorDeviceOrientationController;\r\n };\r\n osgGA.getOrbitManipulatorOculusController = function () {\r\n return OrbitManipulatorOculusController;\r\n };\r\n\r\n osgGA.SwitchManipulator = SwitchManipulator;\r\n\r\n osgGA.OrbitManipulator.Rotate = OrbitManipulatorEnums.ROTATE;\r\n osgGA.OrbitManipulator.Pan = OrbitManipulatorEnums.PAN;\r\n osgGA.OrbitManipulator.Zoom = OrbitManipulatorEnums.ZOOM;\r\n\r\n return osgGA;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgGA/osgGA.js\n ** module id = 7\n ** module chunks = 0 1\n **/","define( [\r\n 'osgUtil/Composer',\r\n 'osgUtil/DisplayNormalVisitor',\r\n 'osgUtil/DisplayGeometryVisitor',\r\n 'osgUtil/DisplayNodeGraphVisitor',\r\n 'osgUtil/IntersectionVisitor',\r\n 'osgUtil/LineSegmentIntersector',\r\n 'osgUtil/NodeGizmo',\r\n 'osgUtil/Oculus',\r\n 'osgUtil/ParameterVisitor',\r\n 'osgUtil/PolytopeIntersector',\r\n 'osgUtil/PolytopePrimitiveIntersector',\r\n 'osgUtil/SphereIntersector',\r\n 'osgUtil/TangentSpaceGenerator',\r\n 'osgUtil/TriangleIntersector',\r\n 'osgUtil/WebVR',\r\n\r\n], function ( Composer,\r\n DisplayNormalVisitor,\r\n DisplayGeometryVisitor,\r\n DisplayNodeGraphVisitor,\r\n IntersectionVisitor,\r\n LineSegmentIntersector,\r\n NodeGizmo,\r\n Oculus,\r\n ParameterVisitor,\r\n PolytopeIntersector,\r\n PolytopePrimitiveIntersector,\r\n SphereIntersector,\r\n TangentSpaceGenerator,\r\n TriangleIntersect,\r\n WebVR ) {\r\n\r\n 'use strict';\r\n\r\n var osgUtil = {};\r\n\r\n osgUtil.Composer = Composer;\r\n osgUtil.DisplayNormalVisitor = DisplayNormalVisitor;\r\n osgUtil.DisplayGeometryVisitor = DisplayGeometryVisitor;\r\n osgUtil.DisplayNodeGraphVisitor = DisplayNodeGraphVisitor;\r\n osgUtil.IntersectionVisitor = IntersectionVisitor;\r\n osgUtil.LineSegmentIntersector = LineSegmentIntersector;\r\n osgUtil.NodeGizmo = NodeGizmo;\r\n osgUtil.Oculus = Oculus;\r\n osgUtil.ParameterVisitor = ParameterVisitor;\r\n osgUtil.PolytopeIntersector = PolytopeIntersector;\r\n osgUtil.PolytopePrimitiveIntersector = PolytopePrimitiveIntersector;\r\n osgUtil.SphereIntersector = SphereIntersector;\r\n osgUtil.TangentSpaceGenerator = TangentSpaceGenerator;\r\n osgUtil.TriangleIntersect = TriangleIntersect;\r\n osgUtil.WebVR = WebVR;\r\n\r\n return osgUtil;\r\n\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgUtil/osgUtil.js\n ** module id = 8\n ** module chunks = 0 1\n **/","define( [\r\n 'osgViewer/Renderer',\r\n 'osgViewer/View',\r\n 'osgViewer/Viewer',\r\n 'osgViewer/eventProxy/EventProxy'\r\n], function ( Renderer, View, Viewer, EventProxy ) {\r\n\r\n var osgViewer = {};\r\n\r\n osgViewer.Renderer = Renderer;\r\n osgViewer.View = View;\r\n osgViewer.Viewer = Viewer;\r\n osgViewer.EventProxy = EventProxy;\r\n\r\n return osgViewer;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgViewer/osgViewer.js\n ** module id = 9\n ** module chunks = 0 1\n **/","define( [\r\n 'osgShader/Compiler',\r\n 'osgShader/ShaderGenerator',\r\n 'osgShader/ShaderGeneratorProxy',\r\n 'osgShader/ShaderProcessor',\r\n 'osgShader/nodeFactory',\r\n 'osgShader/node',\r\n 'osgShader/utils'\r\n\r\n], function ( Compiler, ShaderGenerator, ShaderGeneratorProxy, ShaderProcessor, nodeFactory, node, utils ) {\r\n\r\n 'use strict';\r\n\r\n var lib = {};\r\n\r\n lib.Compiler = Compiler;\r\n lib.ShaderGenerator = ShaderGenerator;\r\n lib.ShaderGeneratorProxy = ShaderGeneratorProxy;\r\n lib.ShaderProcessor = ShaderProcessor;\r\n lib.nodeFactory = nodeFactory;\r\n lib.node = node;\r\n\r\n lib.utils = utils;\r\n\r\n\r\n // set it to one to have verbose in shaders\r\n lib.debugShaderNode = true;\r\n\r\n\r\n return lib;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShader/osgShader.js\n ** module id = 10\n ** module chunks = 0 1\n **/","define( [\r\n 'osgShadow/ShadowAttribute',\r\n 'osgShadow/ShadowFrustumIntersection',\r\n 'osgShadow/ShadowMap',\r\n 'osgShadow/ShadowSettings',\r\n 'osgShadow/ShadowTechnique',\r\n 'osgShadow/ShadowTexture',\r\n 'osgShadow/ShadowedScene'\r\n], function ( ShadowAttribute, ShadowFrustumIntersection, ShadowMap, ShadowSettings, ShadowTechnique, ShadowTexture, ShadowedScene ) {\r\n 'use strict';\r\n\r\n var osgShadow = {};\r\n\r\n osgShadow.ShadowAttribute = ShadowAttribute;\r\n osgShadow.ShadowFrustumIntersection = ShadowFrustumIntersection;\r\n osgShadow.ShadowMap = ShadowMap;\r\n osgShadow.ShadowedScene = ShadowedScene;\r\n osgShadow.ShadowSettings = ShadowSettings;\r\n osgShadow.ShadowTechnique = ShadowTechnique;\r\n osgShadow.ShadowTexture = ShadowTexture;\r\n\r\n\r\n return osgShadow;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShadow/osgShadow.js\n ** module id = 11\n ** module chunks = 0 1\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_22__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external {\"root\":\"Hammer\",\"commonjs2\":\"hammerjs\",\"commonjs\":\"hammerjs\",\"amd\":\"hammer\"}\n ** module id = 22\n ** module chunks = 0 1\n **/","define( [], function() {\n return {\n name: 'OpenSceneGraph',\n version: '0.2.1',\n author: 'Cedric Pinson (http://cedricpinson.com)'\n };\n} );\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/version.js\n ** module id = 23\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/StateAttribute',\r\n 'osg/Vec4'\r\n], function ( MACROUTILS, StateAttribute, Vec4 ) {\r\n\r\n /**\r\n * Manage BlendColor attribute\r\n * @class BlendColor\r\n */\r\n var BlendColor = function ( color ) {\r\n StateAttribute.call( this );\r\n this._constantColor = new Array( 4 );\r\n this._constantColor[ 0 ] = this._constantColor[ 1 ] = this._constantColor[ 2 ] = this._constantColor[ 3 ] = 1.0;\r\n if ( color !== undefined ) {\r\n this.setConstantColor( color );\r\n }\r\n };\r\n\r\n /** @lends BlendColor.prototype */\r\n BlendColor.prototype = MACROUTILS.objectLibraryClass( MACROUTILS.objectInherit( StateAttribute.prototype, {\r\n attributeType: 'BlendColor',\r\n cloneType: function () {\r\n return new BlendColor();\r\n },\r\n setConstantColor: function ( color ) {\r\n Vec4.copy( color, this._constantColor );\r\n },\r\n getConstantColor: function () {\r\n return this._constantColor;\r\n },\r\n apply: function ( state ) {\r\n var gl = state.getGraphicContext();\r\n gl.blendColor( this._constantColor[ 0 ],\r\n this._constantColor[ 1 ],\r\n this._constantColor[ 2 ],\r\n this._constantColor[ 3 ] );\r\n this._dirty = false;\r\n }\r\n } ), 'osg', 'BlendColor' );\r\n\r\n return BlendColor;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/BlendColor.js\n ** module id = 24\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/StateAttribute'\r\n], function ( MACROUTILS, StateAttribute ) {\r\n\r\n /**\r\n * Manage Blending mode\r\n * @class BlendFunc\r\n */\r\n var BlendFunc = function ( sourceRGB, destinationRGB, sourceAlpha, destinationAlpha ) {\r\n StateAttribute.call( this );\r\n this._sourceFactor = BlendFunc.DISABLE;\r\n this._destinationFactor = BlendFunc.DISABLE;\r\n this._sourceFactorAlpha = this._sourceFactor;\r\n this._destinationFactorAlpha = this._destinationFactor;\r\n this._separate = false;\r\n if ( sourceRGB !== undefined ) {\r\n this.setSource( sourceRGB );\r\n }\r\n if ( destinationRGB !== undefined ) {\r\n this.setDestination( destinationRGB );\r\n }\r\n\r\n if ( sourceAlpha !== undefined ) {\r\n this.setSourceAlpha( sourceAlpha );\r\n }\r\n if ( destinationAlpha !== undefined ) {\r\n this.setDestinationAlpha( destinationAlpha );\r\n }\r\n };\r\n\r\n BlendFunc.DISABLE = -1;\r\n BlendFunc.ZERO = 0;\r\n BlendFunc.ONE = 1;\r\n BlendFunc.SRC_COLOR = 0x0300;\r\n BlendFunc.ONE_MINUS_SRC_COLOR = 0x0301;\r\n BlendFunc.SRC_ALPHA = 0x0302;\r\n BlendFunc.ONE_MINUS_SRC_ALPHA = 0x0303;\r\n BlendFunc.DST_ALPHA = 0x0304;\r\n BlendFunc.ONE_MINUS_DST_ALPHA = 0x0305;\r\n BlendFunc.DST_COLOR = 0x0306;\r\n BlendFunc.ONE_MINUS_DST_COLOR = 0x0307;\r\n BlendFunc.SRC_ALPHA_SATURATE = 0x0308;\r\n\r\n /* Separate Blend Functions */\r\n BlendFunc.BLEND_DST_RGB = 0x80C8;\r\n BlendFunc.BLEND_SRC_RGB = 0x80C9;\r\n BlendFunc.BLEND_DST_ALPHA = 0x80CA;\r\n BlendFunc.BLEND_SRC_ALPHA = 0x80CB;\r\n BlendFunc.CONSTANT_COLOR = 0x8001;\r\n BlendFunc.ONE_MINUS_CONSTANT_COLOR = 0x8002;\r\n BlendFunc.CONSTANT_ALPHA = 0x8003;\r\n BlendFunc.ONE_MINUS_CONSTANT_ALPHA = 0x8004;\r\n BlendFunc.BLEND_COLOR = 0x8005;\r\n\r\n\r\n /** @lends BlendFunc.prototype */\r\n BlendFunc.prototype = MACROUTILS.objectLibraryClass( MACROUTILS.objectInherit( StateAttribute.prototype, {\r\n /**\r\n StateAttribute type of BlendFunc\r\n @type String\r\n */\r\n attributeType: 'BlendFunc',\r\n /**\r\n Create an instance of this StateAttribute\r\n */\r\n cloneType: function () /**BlendFunc*/ {\r\n return new BlendFunc();\r\n },\r\n setSource: function ( f ) {\r\n this.setSourceRGB( f );\r\n this.setSourceAlpha( f );\r\n },\r\n getSource: function () {\r\n return this._sourceFactor;\r\n },\r\n setDestination: function ( f ) {\r\n this.setDestinationRGB( f );\r\n this.setDestinationAlpha( f );\r\n },\r\n getDestination: function () {\r\n return this._destinationFactor;\r\n },\r\n getSeparate: function () {\r\n return this._separate;\r\n },\r\n checkSeparate: function () {\r\n return ( this._sourceFactor !== this._sourceFactorAlpha ||\r\n this._destinationFactor !== this._destinationFactorAlpha );\r\n },\r\n setSourceRGB: function ( f ) {\r\n if ( typeof f === 'string' ) {\r\n this._sourceFactor = BlendFunc[ f ];\r\n } else {\r\n this._sourceFactor = f;\r\n }\r\n this._separate = this.checkSeparate();\r\n },\r\n getSourceRGB: function () {\r\n return this._sourceFactor;\r\n },\r\n setSourceAlpha: function ( f ) {\r\n if ( typeof f === 'string' ) {\r\n this._sourceFactorAlpha = BlendFunc[ f ];\r\n } else {\r\n this._sourceFactorAlpha = f;\r\n }\r\n this._separate = this.checkSeparate();\r\n },\r\n getSourceAlpha: function () {\r\n return this._sourceFactorAlpha;\r\n },\r\n setDestinationRGB: function ( f ) {\r\n if ( typeof f === 'string' ) {\r\n this._destinationFactor = BlendFunc[ f ];\r\n } else {\r\n this._destinationFactor = f;\r\n }\r\n this._separate = this.checkSeparate();\r\n },\r\n getDestinationRGB: function () {\r\n return this._destinationFactor;\r\n },\r\n setDestinationAlpha: function ( f ) {\r\n if ( typeof f === 'string' ) {\r\n this._destinationFactorAlpha = BlendFunc[ f ];\r\n } else {\r\n this._destinationFactorAlpha = f;\r\n }\r\n this._separate = this.checkSeparate();\r\n },\r\n getDestinationAlpha: function () {\r\n return this._destinationFactorAlpha;\r\n },\r\n\r\n /**\r\n Apply the mode, must be called in the draw traversal\r\n @param state\r\n */\r\n apply: function ( state ) {\r\n var gl = state.getGraphicContext();\r\n if ( this._sourceFactor === BlendFunc.DISABLE || this._destinationFactor === BlendFunc.DISABLE ) {\r\n gl.disable( gl.BLEND );\r\n } else {\r\n gl.enable( gl.BLEND );\r\n if ( this._separate ) {\r\n gl.blendFuncSeparate( this._sourceFactor, this._destinationFactor,\r\n this._sourceFactorAlpha, this._destinationFactorAlpha );\r\n } else {\r\n gl.blendFunc( this._sourceFactor, this._destinationFactor );\r\n }\r\n }\r\n }\r\n } ), 'osg', 'BlendFunc' );\r\n\r\n return BlendFunc;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/BlendFunc.js\n ** module id = 25\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Notify',\r\n 'osg/Utils',\r\n 'osg/Vec3'\r\n], function ( Notify, MACROUTILS, Vec3 ) {\r\n\r\n 'use strict';\r\n\r\n var BoundingBox = function () {\r\n this._min = Vec3.create();\r\n this._max = Vec3.create();\r\n this.init();\r\n };\r\n BoundingBox.prototype = MACROUTILS.objectLibraryClass( {\r\n\r\n init: function () {\r\n Vec3.copy( Vec3.infinity, this._min );\r\n Vec3.copy( Vec3.negativeInfinity, this._max );\r\n },\r\n\r\n copy: function ( bbox ) {\r\n var min = this._min;\r\n var bmin = bbox._min;\r\n min[ 0 ] = bmin[ 0 ];\r\n min[ 1 ] = bmin[ 1 ];\r\n min[ 2 ] = bmin[ 2 ];\r\n\r\n var max = this._max;\r\n var bmax = bbox._max;\r\n max[ 0 ] = bmax[ 0 ];\r\n max[ 1 ] = bmax[ 1 ];\r\n max[ 2 ] = bmax[ 2 ];\r\n },\r\n\r\n valid: function () {\r\n return ( this._max[ 0 ] >= this._min[ 0 ] && this._max[ 1 ] >= this._min[ 1 ] && this._max[ 2 ] >= this._min[ 2 ] );\r\n },\r\n\r\n expandByBoundingSphere: function ( bs ) {\r\n if ( !bs.valid() ) {\r\n return;\r\n }\r\n var max = this._max;\r\n var min = this._min;\r\n min[ 0 ] = Math.min( min[ 0 ], bs._center[ 0 ] - bs._radius );\r\n min[ 1 ] = Math.min( min[ 1 ], bs._center[ 1 ] - bs._radius );\r\n min[ 2 ] = Math.min( min[ 2 ], bs._center[ 2 ] - bs._radius );\r\n\r\n max[ 0 ] = Math.max( max[ 0 ], bs._center[ 0 ] + bs._radius );\r\n max[ 1 ] = Math.max( max[ 1 ], bs._center[ 1 ] + bs._radius );\r\n max[ 2 ] = Math.max( max[ 2 ], bs._center[ 2 ] + bs._radius );\r\n },\r\n\r\n expandBySphere: function ( bs ) {\r\n Notify.log( 'BoundingBox.expandBySphere is deprecated, use instead BoundBox.expandByBoundingSphere' );\r\n return this.expandByBoundingSphere( bs );\r\n },\r\n\r\n expandByVec3: function ( v ) {\r\n var min = this._min;\r\n var max = this._max;\r\n min[ 0 ] = Math.min( min[ 0 ], v[ 0 ] );\r\n min[ 1 ] = Math.min( min[ 1 ], v[ 1 ] );\r\n min[ 2 ] = Math.min( min[ 2 ], v[ 2 ] );\r\n\r\n max[ 0 ] = Math.max( max[ 0 ], v[ 0 ] );\r\n max[ 1 ] = Math.max( max[ 1 ], v[ 1 ] );\r\n max[ 2 ] = Math.max( max[ 2 ], v[ 2 ] );\r\n },\r\n\r\n expandByBoundingBox: function ( bb ) {\r\n if ( !bb.valid() )\r\n return;\r\n\r\n var min = this._min;\r\n var max = this._max;\r\n var bbmin = bb._min;\r\n var bbmax = bb._max;\r\n\r\n if ( bbmin[ 0 ] < min[ 0 ] ) min[ 0 ] = bbmin[ 0 ];\r\n if ( bbmax[ 0 ] > max[ 0 ] ) max[ 0 ] = bbmax[ 0 ];\r\n\r\n if ( bbmin[ 1 ] < min[ 1 ] ) min[ 1 ] = bbmin[ 1 ];\r\n if ( bbmax[ 1 ] > max[ 1 ] ) max[ 1 ] = bbmax[ 1 ];\r\n\r\n if ( bbmin[ 2 ] < min[ 2 ] ) min[ 2 ] = bbmin[ 2 ];\r\n if ( bbmax[ 2 ] > max[ 2 ] ) max[ 2 ] = bbmax[ 2 ];\r\n },\r\n\r\n center: function ( result ) {\r\n var min = this._min;\r\n var max = this._max;\r\n if ( result === undefined ) {\r\n // TODO: deprecated warning?\r\n Notify.warn( 'deprecated use center( result ) instead !' );\r\n result = Vec3.create();\r\n }\r\n Vec3.set( ( min[ 0 ] + max[ 0 ] ) * 0.5, ( min[ 1 ] + max[ 1 ] ) * 0.5, ( min[ 2 ] + max[ 2 ] ) * 0.5, result );\r\n return result;\r\n },\r\n\r\n radius: function () {\r\n return Math.sqrt( this.radius2() );\r\n },\r\n\r\n radius2: ( function () {\r\n var cache = [ 0.0, 0.0, 0.0 ];\r\n return function () {\r\n var min = this._min;\r\n var max = this._max;\r\n cache[ 0 ] = max[ 0 ] - min[ 0 ];\r\n cache[ 1 ] = max[ 1 ] - min[ 1 ];\r\n cache[ 2 ] = max[ 2 ] - min[ 2 ];\r\n return 0.25 * ( cache[ 0 ] * cache[ 0 ] + cache[ 1 ] * cache[ 1 ] + cache[ 2 ] * cache[ 2 ] );\r\n };\r\n } )(),\r\n\r\n getMin: function () {\r\n return this._min;\r\n },\r\n\r\n getMax: function () {\r\n return this._max;\r\n },\r\n\r\n corner: function ( pos, resultVec ) {\r\n /*jshint bitwise: false */\r\n var ret = resultVec;\r\n if ( ret === undefined )\r\n ret = [ 0.0, 0.0, 0.0 ];\r\n\r\n if ( pos & 1 ) {\r\n ret[ 0 ] = this._max[ 0 ];\r\n } else {\r\n ret[ 0 ] = this._min[ 0 ];\r\n }\r\n if ( pos & 2 ) {\r\n ret[ 1 ] = this._max[ 1 ];\r\n } else {\r\n ret[ 1 ] = this._min[ 1 ];\r\n }\r\n if ( pos & 4 ) {\r\n ret[ 2 ] = this._max[ 2 ];\r\n } else {\r\n ret[ 2 ] = this._min[ 2 ];\r\n }\r\n return ret;\r\n /*jshint bitwise: true */\r\n }\r\n }, 'osg', 'BoundingBox' );\r\n\r\n return BoundingBox;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/BoundingBox.js\n ** module id = 26\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/BoundingBox',\r\n 'osg/Notify',\r\n 'osg/Vec3'\r\n], function ( BoundingBox, Notify, Vec3 ) {\r\n\r\n 'use strict';\r\n\r\n var BoundingSphere = function () {\r\n this._center = Vec3.create();\r\n this._radius = -1.0;\r\n };\r\n\r\n BoundingSphere.prototype = {\r\n init: function () {\r\n Vec3.init( this._center );\r\n this._radius = -1.0;\r\n },\r\n valid: function () {\r\n return this._radius >= 0.0;\r\n },\r\n set: function ( center, radius ) {\r\n this._center = center;\r\n this._radius = radius;\r\n },\r\n center: function () {\r\n return this._center;\r\n },\r\n radius: function () {\r\n return this._radius;\r\n },\r\n radius2: function () {\r\n return this._radius * this._radius;\r\n },\r\n\r\n expandByBoundingBox: ( function () {\r\n var v = Vec3.create();\r\n var newbb = new BoundingBox();\r\n return function ( bb ) {\r\n if ( !bb.valid() )\r\n return;\r\n\r\n var c;\r\n if ( this.valid() ) {\r\n newbb._min[ 0 ] = bb._min[ 0 ];\r\n newbb._min[ 1 ] = bb._min[ 1 ];\r\n newbb._min[ 2 ] = bb._min[ 2 ];\r\n newbb._max[ 0 ] = bb._max[ 0 ];\r\n newbb._max[ 1 ] = bb._max[ 1 ];\r\n newbb._max[ 2 ] = bb._max[ 2 ];\r\n\r\n for ( var i = 0; i < 8; i++ ) {\r\n Vec3.sub( bb.corner( c ), this._center, v ); // get the direction vector from corner\r\n Vec3.normalize( v, v ); // normalise it.\r\n v[ 0 ] *= -this._radius; // move the vector in the opposite direction distance radius.\r\n v[ 1 ] *= -this._radius; // move the vector in the opposite direction distance radius.\r\n v[ 2 ] *= -this._radius; // move the vector in the opposite direction distance radius.\r\n v[ 0 ] += this._center[ 0 ]; // move to absolute position.\r\n v[ 1 ] += this._center[ 1 ]; // move to absolute position.\r\n v[ 2 ] += this._center[ 2 ]; // move to absolute position.\r\n newbb.expandByVec3( v ); // add it into the new bounding box.\r\n }\r\n\r\n c = newbb.center( v );\r\n this._center[ 0 ] = c[ 0 ];\r\n this._center[ 1 ] = c[ 1 ];\r\n this._center[ 2 ] = c[ 2 ];\r\n this._radius = newbb.radius();\r\n } else {\r\n c = bb.center( v );\r\n this._center[ 0 ] = c[ 0 ];\r\n this._center[ 1 ] = c[ 1 ];\r\n this._center[ 2 ] = c[ 2 ];\r\n this._radius = bb.radius();\r\n }\r\n };\r\n } )(),\r\n\r\n expandByBox: function ( bb ) {\r\n Notify.log( 'BoundingSphere.expandByBox is deprecated, use instead BoundingSphere.expandByBoundingBox' );\r\n return this.expandByBoundingBox( bb );\r\n },\r\n\r\n expandByVec3: ( function () {\r\n var dv = [ 0.0, 0.0, 0.0 ];\r\n return function ( v ) {\r\n if ( this.valid() ) {\r\n Vec3.sub( v, this.center( dv ), dv );\r\n var r = Vec3.length( dv );\r\n if ( r > this.radius() ) {\r\n var dr = ( r - this.radius() ) * 0.5;\r\n this._center[ 0 ] += dv[ 0 ] * ( dr / r );\r\n this._center[ 1 ] += dv[ 1 ] * ( dr / r );\r\n this._center[ 2 ] += dv[ 2 ] * ( dr / r );\r\n this._radius += dr;\r\n }\r\n } else {\r\n this._center[ 0 ] = v[ 0 ];\r\n this._center[ 1 ] = v[ 1 ];\r\n this._center[ 2 ] = v[ 2 ];\r\n this._radius = 0.0;\r\n }\r\n };\r\n } )(),\r\n\r\n expandRadiusBySphere: function ( sh ) {\r\n if ( sh.valid() ) {\r\n if ( this.valid() ) {\r\n var r = Vec3.distance( sh._center, this._center ) + sh._radius;\r\n if ( r > this._radius ) {\r\n this._radius = r;\r\n }\r\n // else do nothing as vertex is within sphere.\r\n } else {\r\n Vec3.copy( sh._center, this._center );\r\n this._radius = sh._radius;\r\n }\r\n }\r\n },\r\n\r\n expandBy: function ( bs ) {\r\n Notify.log( 'BoundingSphere.expandBy is deprecated, use instead BoundingSphere.expandByBoundingSphere' );\r\n this.expandByBoundingSphere( bs );\r\n },\r\n\r\n expandByBoundingSphere: function ( sh ) {\r\n // ignore operation if incomming BoundingSphere is invalid.\r\n if ( !sh.valid() ) {\r\n return;\r\n }\r\n\r\n // This sphere is not set so use the inbound sphere\r\n if ( !this.valid() ) {\r\n this._center[ 0 ] = sh._center[ 0 ];\r\n this._center[ 1 ] = sh._center[ 1 ];\r\n this._center[ 2 ] = sh._center[ 2 ];\r\n this._radius = sh.radius();\r\n\r\n return;\r\n }\r\n\r\n // Calculate d == The distance between the sphere centers\r\n var d = Vec3.distance( this.center(), sh.center() );\r\n\r\n // New sphere is already inside this one\r\n if ( d + sh.radius() <= this.radius() ) {\r\n return;\r\n }\r\n\r\n // New sphere completely contains this one\r\n if ( d + this.radius() <= sh.radius() ) {\r\n this._center[ 0 ] = sh._center[ 0 ];\r\n this._center[ 1 ] = sh._center[ 1 ];\r\n this._center[ 2 ] = sh._center[ 2 ];\r\n this._radius = sh._radius;\r\n return;\r\n }\r\n\r\n\r\n // Build a new sphere that completely contains the other two:\r\n //\r\n // The center point lies halfway along the line between the furthest\r\n // points on the edges of the two spheres.\r\n //\r\n // Computing those two points is ugly - so we'll use similar triangles\r\n var newRadius = ( this.radius() + d + sh.radius() ) * 0.5;\r\n var ratio = ( newRadius - this.radius() ) / d;\r\n\r\n this._center[ 0 ] += ( sh._center[ 0 ] - this._center[ 0 ] ) * ratio;\r\n this._center[ 1 ] += ( sh._center[ 1 ] - this._center[ 1 ] ) * ratio;\r\n this._center[ 2 ] += ( sh._center[ 2 ] - this._center[ 2 ] ) * ratio;\r\n\r\n this._radius = newRadius;\r\n },\r\n contains: function ( v ) {\r\n if ( !this.valid() )\r\n return false;\r\n return Vec3.distance2( v, this.center() ) <= this.radius2();\r\n },\r\n intersects: function ( bs ) {\r\n if ( !this.valid() || !bs.valid() )\r\n return false;\r\n var r = this.radius() + bs.radius();\r\n return Vec3.distance2( this.center(), bs.center() ) <= r * r;\r\n }\r\n };\r\n\r\n return BoundingSphere;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/BoundingSphere.js\n ** module id = 27\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/Notify',\r\n 'osg/Object',\r\n 'osg/GLObject',\r\n 'osg/Timer'\r\n\r\n], function ( MACROUTILS, Notify, Object, GLObject, Timer ) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * BufferArray manage vertex / normal / ... array used by webgl.\r\n * @class BufferArray\r\n */\r\n var BufferArray = function ( type, elements, itemSize ) {\r\n GLObject.call( this );\r\n // maybe could inherit from Object\r\n this._instanceID = Object.getInstanceID();\r\n\r\n this.dirty();\r\n\r\n this._itemSize = itemSize;\r\n if ( typeof ( type ) === 'string' ) {\r\n type = BufferArray[ type ];\r\n }\r\n this._type = type;\r\n\r\n if ( elements !== undefined ) {\r\n if ( this._type === BufferArray.ELEMENT_ARRAY_BUFFER ) {\r\n this._elements = elements instanceof MACROUTILS.Uint16Array ? elements : new MACROUTILS.Uint16Array( elements );\r\n } else {\r\n this._elements = elements instanceof MACROUTILS.Float32Array ? elements : new MACROUTILS.Float32Array( elements );\r\n }\r\n }\r\n };\r\n\r\n BufferArray.ELEMENT_ARRAY_BUFFER = 0x8893;\r\n BufferArray.ARRAY_BUFFER = 0x8892;\r\n\r\n // static cache of glBuffers flagged for deletion, which will actually\r\n // be deleted in the correct GL context.\r\n BufferArray._sDeletedGLBufferArrayCache = new Map();\r\n\r\n // static method to delete Program \r\n BufferArray.deleteGLBufferArray = function ( gl, buffer ) {\r\n if ( !BufferArray._sDeletedGLBufferArrayCache.has( gl ) )\r\n BufferArray._sDeletedGLBufferArrayCache.set( gl, [] );\r\n BufferArray._sDeletedGLBufferArrayCache.get( gl ).push( buffer );\r\n };\r\n\r\n // static method to flush all the cached glPrograms which need to be deleted in the GL context specified\r\n BufferArray.flushDeletedGLBufferArrays = function ( gl, availableTime ) {\r\n // if no time available don't try to flush objects.\r\n if ( availableTime <= 0.0 ) return availableTime;\r\n if ( !BufferArray._sDeletedGLBufferArrayCache.has( gl ) ) return availableTime;\r\n var elapsedTime = 0.0;\r\n var beginTime = Timer.instance().tick();\r\n var deleteList = BufferArray._sDeletedGLBufferArrayCache.get( gl );\r\n var numBuffers = deleteList.length;\r\n for ( var i = numBuffers - 1; i >= 0 && elapsedTime < availableTime; i-- ) {\r\n gl.deleteBuffer( deleteList[ i ] );\r\n deleteList.splice( i, 1 );\r\n elapsedTime = Timer.instance().deltaS( beginTime, Timer.instance().tick() );\r\n }\r\n availableTime -= elapsedTime;\r\n return availableTime;\r\n };\r\n\r\n\r\n /** @lends BufferArray.prototype */\r\n BufferArray.prototype = MACROUTILS.objectInherit( GLObject.prototype, {\r\n setItemSize: function ( size ) {\r\n this._itemSize = size;\r\n },\r\n isValid: function () {\r\n if ( this._buffer !== undefined ||\r\n this._elements !== undefined ) {\r\n return true;\r\n }\r\n return false;\r\n },\r\n\r\n releaseGLObjects: function () {\r\n if ( this._buffer !== undefined && this._buffer !== null && this._gl !== undefined ) {\r\n BufferArray.deleteGLBufferArray( this._gl, this._buffer );\r\n }\r\n this._buffer = undefined;\r\n },\r\n\r\n bind: function ( gl ) {\r\n if ( !this._gl ) this.setGraphicContext( gl );\r\n var type = this._type;\r\n var buffer = this._buffer;\r\n\r\n if ( buffer ) {\r\n gl.bindBuffer( type, buffer );\r\n return;\r\n }\r\n\r\n if ( !buffer && this._elements.length > 0 ) {\r\n this._buffer = gl.createBuffer();\r\n this._numItems = this._elements.length / this._itemSize;\r\n gl.bindBuffer( type, this._buffer );\r\n }\r\n },\r\n getItemSize: function () {\r\n return this._itemSize;\r\n },\r\n dirty: function () {\r\n this._dirty = true;\r\n },\r\n isDirty: function () {\r\n return this._dirty;\r\n },\r\n compile: function ( gl ) {\r\n if ( this._dirty ) {\r\n MACROUTILS.timeStamp( 'osgjs.metrics:bufferData' );\r\n gl.bufferData( this._type, this._elements, gl.STATIC_DRAW );\r\n this._dirty = false;\r\n }\r\n },\r\n getElements: function () {\r\n return this._elements;\r\n },\r\n setElements: function ( elements ) {\r\n this._elements = elements;\r\n this._dirty = true;\r\n }\r\n } );\r\n\r\n BufferArray.create = function ( type, elements, itemSize ) {\r\n Notify.log( 'BufferArray.create is deprecated, use new BufferArray with same arguments instead' );\r\n return new BufferArray( type, elements, itemSize );\r\n };\r\n\r\n return BufferArray;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/BufferArray.js\n ** module id = 28\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/Transform',\r\n 'osg/CullSettings',\r\n 'osg/Matrix',\r\n 'osg/Texture',\r\n 'osg/TransformEnums'\r\n], function ( MACROUTILS, Transform, CullSettings, Matrix, Texture, TransformEnums ) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * Camera - is a subclass of Transform which represents encapsulates the settings of a Camera.\r\n * @class Camera\r\n * @inherits Transform CullSettings\r\n */\r\n var Camera = function () {\r\n Transform.call( this );\r\n CullSettings.call( this );\r\n\r\n this.viewport = undefined;\r\n this._graphicContext = undefined;\r\n this.setClearColor( [ 0, 0, 0, 1.0 ] );\r\n this.setClearDepth( 1.0 );\r\n\r\n /*jshint bitwise: false */\r\n this.setClearMask( Camera.COLOR_BUFFER_BIT | Camera.DEPTH_BUFFER_BIT );\r\n /*jshint bitwise: true */\r\n\r\n this.setViewMatrix( Matrix.create() );\r\n this.setProjectionMatrix( Matrix.create() );\r\n this.renderOrder = Camera.NESTED_RENDER;\r\n this.renderOrderNum = 0;\r\n\r\n this._view = undefined;\r\n this._renderer = undefined;\r\n this._attachments = {};\r\n };\r\n\r\n Camera.PRE_RENDER = 0;\r\n Camera.NESTED_RENDER = 1;\r\n Camera.POST_RENDER = 2;\r\n\r\n Camera.COLOR_BUFFER_BIT = 0x00004000;\r\n Camera.DEPTH_BUFFER_BIT = 0x00000100;\r\n Camera.STENCIL_BUFFER_BIT = 0x00000400;\r\n\r\n /** @lends Camera.prototype */\r\n Camera.prototype = MACROUTILS.objectLibraryClass( MACROUTILS.objectInherit(\r\n CullSettings.prototype,\r\n MACROUTILS.objectInherit( Transform.prototype, {\r\n // at which view this camera is attached\r\n getView: function () {\r\n return this._view;\r\n },\r\n\r\n setView: function ( view ) {\r\n this._view = view;\r\n },\r\n\r\n getRenderer: function () {\r\n return this._renderer;\r\n },\r\n\r\n setRenderer: function ( renderer ) {\r\n this._renderer = renderer;\r\n },\r\n\r\n\r\n getAttachments: function () {\r\n return this._attachments;\r\n },\r\n\r\n setGraphicContext: function ( gc ) {\r\n this._graphicContext = gc;\r\n },\r\n getGraphicContext: function () {\r\n return this._graphicContext;\r\n },\r\n setClearDepth: function ( depth ) {\r\n this.clearDepth = depth;\r\n },\r\n getClearDepth: function () {\r\n return this.clearDepth;\r\n },\r\n\r\n setClearMask: function ( mask ) {\r\n this.clearMask = mask;\r\n },\r\n getClearMask: function () {\r\n return this.clearMask;\r\n },\r\n\r\n setClearColor: function ( color ) {\r\n this.clearColor = color;\r\n },\r\n getClearColor: function () {\r\n return this.clearColor;\r\n },\r\n\r\n setViewport: function ( vp ) {\r\n this.viewport = vp;\r\n this.getOrCreateStateSet().setAttributeAndModes( vp );\r\n },\r\n getViewport: function () {\r\n return this.viewport;\r\n },\r\n\r\n\r\n setViewMatrix: function ( matrix ) {\r\n this.modelviewMatrix = matrix;\r\n },\r\n\r\n setProjectionMatrix: function ( matrix ) {\r\n this.projectionMatrix = matrix;\r\n },\r\n\r\n /** Set to an orthographic projection. See OpenGL glOrtho for documentation further details.*/\r\n setProjectionMatrixAsOrtho: function ( left, right,\r\n bottom, top,\r\n zNear, zFar ) {\r\n Matrix.makeOrtho( left, right, bottom, top, zNear, zFar, this.getProjectionMatrix() );\r\n },\r\n setNearFar: function ( zNear, zFar ) {\r\n this._near = zNear;\r\n this._far = zFar;\r\n },\r\n getNear: function () {\r\n return this._near;\r\n },\r\n getFar: function () {\r\n return this._far;\r\n },\r\n\r\n isRenderToTextureCamera: function () {\r\n return Object.keys( this._attachments ).length > 0;\r\n },\r\n\r\n getViewMatrix: function () {\r\n return this.modelviewMatrix;\r\n },\r\n getProjectionMatrix: function () {\r\n return this.projectionMatrix;\r\n },\r\n getRenderOrder: function () {\r\n return this.renderOrder;\r\n },\r\n setRenderOrder: function ( order, orderNum ) {\r\n this.renderOrder = order;\r\n this.renderOrderNum = orderNum;\r\n },\r\n\r\n detachAll: function () {\r\n this._attachments = {};\r\n\r\n if ( this.frameBufferObject )\r\n this.frameBufferObject.dirty();\r\n },\r\n\r\n attachTexture: function ( bufferComponent, texture, textureTarget ) {\r\n if ( this.frameBufferObject ) {\r\n this.frameBufferObject.dirty();\r\n }\r\n\r\n // because before the argument was level and the spec says\r\n // it must always be 0 ! is valid for 0 or undefined\r\n if ( !textureTarget ) {\r\n textureTarget = Texture.TEXTURE_2D;\r\n }\r\n\r\n this._attachments[ bufferComponent ] = {\r\n 'attachment': bufferComponent,\r\n 'texture': texture,\r\n 'textureTarget': textureTarget\r\n };\r\n },\r\n\r\n attachRenderBuffer: function ( bufferComponent, internalFormat ) {\r\n if ( this.frameBufferObject ) {\r\n this.frameBufferObject.dirty();\r\n }\r\n this._attachments[ bufferComponent ] = {\r\n 'format': internalFormat,\r\n 'attachment': bufferComponent\r\n };\r\n },\r\n\r\n computeLocalToWorldMatrix: function ( matrix /*,nodeVisitor*/ ) {\r\n if ( this.referenceFrame === TransformEnums.RELATIVE_RF ) {\r\n Matrix.preMult( matrix, this.modelviewMatrix );\r\n } else { // absolute\r\n Matrix.copy( this.modelviewMatrix, matrix );\r\n }\r\n return true;\r\n },\r\n\r\n computeWorldToLocalMatrix: ( function () {\r\n var minverse = Matrix.create();\r\n return function ( matrix /*, nodeVisitor */ ) {\r\n Matrix.inverse( this.modelviewMatrix, minverse );\r\n if ( this.referenceFrame === TransformEnums.RELATIVE_RF ) {\r\n Matrix.postMult( minverse, matrix );\r\n } else {\r\n Matrix.copy( minverse, matrix );\r\n }\r\n return true;\r\n };\r\n } )()\r\n\r\n } ) ), 'osg', 'Camera' );\r\n\r\n MACROUTILS.setTypeID( Camera );\r\n\r\n return Camera;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/Camera.js\n ** module id = 29\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/StateAttribute'\r\n], function ( MACROUTILS, StateAttribute ) {\r\n\r\n 'use strict';\r\n\r\n var ColorMask = function ( red, green, blue, alpha ) {\r\n\r\n StateAttribute.call( this );\r\n\r\n this._colorMask = [ true, true, true, true ];\r\n this.setMask( red, green, blue, alpha );\r\n };\r\n\r\n ColorMask.prototype = MACROUTILS.objectLibraryClass( MACROUTILS.objectInherit( StateAttribute.prototype, {\r\n\r\n attributeType: 'ColorMask',\r\n\r\n cloneType: function () {\r\n return new ColorMask();\r\n },\r\n\r\n setMask: function ( red, green, blue, alpha ) {\r\n\r\n if ( red !== undefined &&\r\n green !== undefined &&\r\n blue !== undefined &&\r\n alpha !== undefined ) {\r\n\r\n this._colorMask[ 0 ] = red;\r\n this._colorMask[ 1 ] = green;\r\n this._colorMask[ 2 ] = blue;\r\n this._colorMask[ 3 ] = alpha;\r\n\r\n this.dirty();\r\n }\r\n },\r\n\r\n apply: function ( state ) {\r\n var gl = state.getGraphicContext();\r\n gl.colorMask( this._colorMask[ 0 ], this._colorMask[ 1 ], this._colorMask[ 2 ], this._colorMask[ 3 ] );\r\n this._dirty = false;\r\n }\r\n } ), 'osg', 'ColorMask' );\r\n\r\n return ColorMask;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/ColorMask.js\n ** module id = 30\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/BoundingBox',\r\n 'osg/Geometry',\r\n 'osg/Matrix',\r\n 'osg/MatrixTransform',\r\n 'osg/NodeVisitor',\r\n 'osg/Utils'\r\n\r\n], function ( BoundingBox, Geometry, Matrix, MatrixTransform, NodeVisitor, MACROUTILS ) {\r\n\r\n 'use strict';\r\n\r\n var ComputeBoundsVisitor = function ( traversalMode ) {\r\n NodeVisitor.call( this, traversalMode );\r\n\r\n this._matrixStack = [];\r\n this._bb = new BoundingBox();\r\n };\r\n\r\n ComputeBoundsVisitor.prototype = MACROUTILS.objectLibraryClass( MACROUTILS.objectInherit( NodeVisitor.prototype, {\r\n\r\n reset: function () {\r\n this._matrixStack.length = 0;\r\n this._bb.init();\r\n },\r\n\r\n getBoundingBox: function () {\r\n return this._bb;\r\n },\r\n\r\n // not implemented\r\n //void getPolytope(osg::Polytope& polytope, float margin=0.1) const;\r\n //void getBase(osg::Polytope& polytope, float margin=0.1) const;\r\n\r\n //applyDrawable: function ( drawable ) {},\r\n\r\n applyTransform: function ( transform ) {\r\n\r\n var matrix = Matrix.create();\r\n var stackLength = this._matrixStack.length;\r\n\r\n if ( stackLength )\r\n Matrix.copy( this._matrixStack[ stackLength - 1 ], matrix );\r\n\r\n transform.computeLocalToWorldMatrix( matrix, this );\r\n\r\n this.pushMatrix( matrix );\r\n\r\n this.traverse( transform );\r\n\r\n this.popMatrix();\r\n },\r\n\r\n apply: function ( node ) {\r\n\r\n var typeID = node.getTypeID();\r\n\r\n if ( typeID === MatrixTransform.getTypeID() ) {\r\n this.applyTransform( node );\r\n return;\r\n\r\n } else if ( typeID === Geometry.getTypeID() ) {\r\n this.applyBoundingBox( node.getBoundingBox() );\r\n return;\r\n }\r\n\r\n this.traverse( node );\r\n\r\n },\r\n\r\n pushMatrix: function ( matrix ) {\r\n this._matrixStack.push( matrix );\r\n },\r\n\r\n popMatrix: function () {\r\n this._matrixStack.pop();\r\n },\r\n\r\n\r\n applyBoundingBox: ( function () {\r\n var bbOut = new BoundingBox();\r\n\r\n return function ( bbox ) {\r\n\r\n var stackLength = this._matrixStack.length;\r\n\r\n if ( !stackLength )\r\n this._bb.expandByBoundingBox( bbox );\r\n else if ( bbox.valid() ) {\r\n var matrix = this._matrixStack[ stackLength - 1 ];\r\n Matrix.transformBoundingBox( matrix, bbox, bbOut );\r\n this._bb.expandByBoundingBox( bbOut );\r\n }\r\n\r\n };\r\n } )(),\r\n\r\n getMatrixStack: function () {\r\n return this._matrixStack;\r\n }\r\n\r\n } ), 'osg', 'ComputeBoundsVisitor' );\r\n\r\n return ComputeBoundsVisitor;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/ComputeBoundsVisitor.js\n ** module id = 31\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Matrix',\r\n 'osg/TransformEnums'\r\n], function ( Matrix, TransformEnums ) {\r\n\r\n 'use strict';\r\n\r\n // TODO: GC PERF: add a result Matrix Parameter.\r\n var computeLocalToWorld = function ( nodePath, ignoreCameras ) {\r\n\r\n var ignoreCamera = ignoreCameras;\r\n if ( ignoreCamera === undefined ) ignoreCamera = true;\r\n\r\n var matrix = Matrix.create();\r\n\r\n var j = 0;\r\n if ( ignoreCamera ) {\r\n\r\n for ( j = nodePath.length - 1; j >= 0; j-- ) {\r\n var camera = nodePath[ j ];\r\n if ( camera.className() === 'Camera' &&\r\n ( camera.getReferenceFrame() !== TransformEnums.RELATIVE_RF || camera.getParents().length === 0 ) ) {\r\n break;\r\n }\r\n }\r\n\r\n // because when we break it's to an index - 1\r\n // it works because if nothing camera found j == -1 at the end of the loop\r\n // and if we found a camera we want to start at the camera index + 1\r\n j += 1;\r\n }\r\n\r\n for ( var i = j, l = nodePath.length; i < l; i++ ) {\r\n var node = nodePath[ i ];\r\n if ( node.computeLocalToWorldMatrix ) {\r\n node.computeLocalToWorldMatrix( matrix );\r\n }\r\n }\r\n\r\n return matrix;\r\n };\r\n\r\n return {\r\n computeLocalToWorld: computeLocalToWorld\r\n };\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/ComputeMatrixFromNodePath.js\n ** module id = 32\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/StateAttribute'\r\n], function ( MACROUTILS, StateAttribute ) {\r\n\r\n /**\r\n * Manage CullFace attribute\r\n * @class CullFace\r\n */\r\n var CullFace = function ( mode ) {\r\n StateAttribute.call( this );\r\n if ( mode === undefined ) {\r\n mode = CullFace.BACK;\r\n }\r\n this.setMode( mode );\r\n };\r\n\r\n CullFace.DISABLE = 0x0;\r\n CullFace.FRONT = 0x0404;\r\n CullFace.BACK = 0x0405;\r\n CullFace.FRONT_AND_BACK = 0x0408;\r\n\r\n /** @lends CullFace.prototype */\r\n CullFace.prototype = MACROUTILS.objectLibraryClass( MACROUTILS.objectInherit( StateAttribute.prototype, {\r\n attributeType: 'CullFace',\r\n cloneType: function () {\r\n return new CullFace();\r\n },\r\n setMode: function ( mode ) {\r\n if ( typeof mode === 'string' ) {\r\n mode = CullFace[ mode ];\r\n }\r\n this._mode = mode;\r\n },\r\n getMode: function () {\r\n return this._mode;\r\n },\r\n apply: function ( state ) {\r\n var gl = state.getGraphicContext();\r\n if ( this._mode === CullFace.DISABLE ) {\r\n gl.disable( gl.CULL_FACE );\r\n } else {\r\n gl.enable( gl.CULL_FACE );\r\n gl.cullFace( this._mode );\r\n }\r\n this._dirty = false;\r\n }\r\n } ), 'osg', 'CullFace' );\r\n\r\n return CullFace;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/CullFace.js\n ** module id = 33\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Polytope'\r\n], function ( Polytope ) {\r\n\r\n var CullingSet = function () {\r\n this._mask = CullingSet.DEFAULT_CULLING;\r\n this._frustum = new Polytope();\r\n\r\n\r\n };\r\n\r\n CullingSet.prototype = {\r\n\r\n setCullingMask: function ( mask ) {\r\n this._mask = mask;\r\n },\r\n getCullingMask: function () {\r\n return this._mask;\r\n },\r\n setFrustum: function ( frustum ) {\r\n this._frustum = frustum;\r\n },\r\n getFrustum: function () {\r\n return this._frustum;\r\n },\r\n getCurrentResultMask: function () {\r\n return this._frustum.getCurrentMask();\r\n },\r\n pushCurrentMask: function () {\r\n this._frustum.pushCurrentMask();\r\n },\r\n popCurrentMask: function () {\r\n this._frustum.popCurrentMask();\r\n },\r\n resetCullingMask: function () {\r\n this._frustum.setResultMask( this._frustum.getCurrentMask() );\r\n },\r\n isBoundingBoxCulled: function ( bbox ) {\r\n if ( this._mask & CullingSet.VIEW_FRUSTUM_CULLING ) {\r\n // is it outside the view frustum...\r\n if ( !this._frustum.containsBoundingBox( bbox ) ) return true;\r\n }\r\n return false;\r\n },\r\n isBoundingSphereCulled: function ( bs ) {\r\n if ( this._mask & CullingSet.VIEW_FRUSTUM_CULLING ) {\r\n // is it outside the view frustum...\r\n if ( !this._frustum.containsBoundingSphere( bs ) ) return true;\r\n }\r\n return false;\r\n },\r\n isVerticesCulled: function ( vertices ) {\r\n if ( this._mask & CullingSet.VIEW_FRUSTUM_CULLING ) {\r\n // is it outside the view frustum...\r\n if ( !this._frustum.containsVertices( vertices ) ) return true;\r\n }\r\n return false;\r\n }\r\n };\r\n\r\n CullingSet.NO_CULLING = 0x0;\r\n\r\n CullingSet.VIEW_FRUSTUM_LEFT_CULLING = 0x1;\r\n CullingSet.VIEW_FRUSTUM_RIGHT_CULLING = 0x2;\r\n CullingSet.VIEW_FRUSTUM_TOP_CULLING = 0x3;\r\n CullingSet.VIEW_FRUSTUM_BOTTOM_CULLING = 0x4;\r\n CullingSet.NEAR_PLANE_CULLING = 0x5;\r\n CullingSet.FAR_PLANE_CULLING = 0x6;\r\n\r\n CullingSet.VIEW_FRUSTUM_SIDES_CULLING = CullingSet.VIEW_FRUSTUM_LEFT_CULLING | CullingSet.VIEW_FRUSTUM_RIGHT_CULLING | CullingSet.VIEW_FRUSTUM_BOTTOM_CULLING | CullingSet.VIEW_FRUSTUM_TOP_CULLING;\r\n\r\n CullingSet.VIEW_FRUSTUM_CULLING = CullingSet.VIEW_FRUSTUM_SIDES_CULLING | CullingSet.NEAR_PLANE_CULLING | CullingSet.FAR_PLANE_CULLING;\r\n\r\n CullingSet.DEFAULT_CULLING = CullingSet.VIEW_FRUSTUM_SIDES_CULLING;\r\n\r\n CullingSet.ENABLE_ALL_CULLING = CullingSet.VIEW_FRUSTUM_CULLING;\r\n\r\n return CullingSet;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/CullingSet.js\n ** module id = 34\n ** module chunks = 0 1\n **/","define( [], function () {\r\n\r\n var CullSettings = function () {\r\n this._computeNearFar = true;\r\n this._nearFarRatio = 0.005;\r\n\r\n var lookVector = [ 0.0, 0.0, -1.0 ];\r\n /*jshint bitwise: false */\r\n this.bbCornerFar = ( lookVector[ 0 ] >= 0 ? 1 : 0 ) | ( lookVector[ 1 ] >= 0 ? 2 : 0 ) | ( lookVector[ 2 ] >= 0 ? 4 : 0 );\r\n this.bbCornerNear = ( ~this.bbCornerFar ) & 7;\r\n /*jshint bitwise: true */\r\n this._enableFrustumCulling = false;\r\n\r\n // who sets the parameter\r\n // if it's cullvisitor\r\n // it's an OVERRIDER for enableFrustumCulling\r\n // allowing for global EnableFrustimCulling\r\n this._settingsSourceOverrider = this;\r\n };\r\n\r\n CullSettings.prototype = {\r\n setCullSettings: function ( settings ) {\r\n this._computeNearFar = settings._computeNearFar;\r\n this._nearFarRatio = settings._nearFarRatio;\r\n this._enableFrustumCulling = settings._enableFrustumCulling;\r\n this._settingsSourceOverrider = settings._settingsSourceOverrider;\r\n },\r\n setNearFarRatio: function ( ratio ) {\r\n this._nearFarRatio = ratio;\r\n },\r\n getNearFarRatio: function () {\r\n return this._nearFarRatio;\r\n },\r\n setComputeNearFar: function ( value ) {\r\n this._computeNearFar = value;\r\n },\r\n getComputeNearFar: function () {\r\n return this._computeNearFar;\r\n },\r\n\r\n setEnableFrustumCulling: function ( value ) {\r\n this._enableFrustumCulling = value;\r\n },\r\n getEnableFrustumCulling: function () {\r\n return this._enableFrustumCulling;\r\n },\r\n\r\n getSettingSourceOverrider: function () {\r\n return this._settingsSourceOverrider;\r\n }\r\n\r\n };\r\n\r\n return CullSettings;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/CullSettings.js\n ** module id = 35\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/BoundingSphere',\r\n 'osg/Camera',\r\n 'osg/ComputeMatrixFromNodePath',\r\n 'osg/CullingSet',\r\n 'osg/Matrix',\r\n 'osg/MatrixTransform',\r\n 'osg/Notify',\r\n 'osg/Plane',\r\n 'osg/TransformEnums',\r\n 'osg/Vec3'\r\n], function ( BoundingSphere, Camera, ComputeMatrixFromNodePath, CullingSet, Matrix, MatrixTransform, Notify, Plane, TransformEnums ) {\r\n 'use strict';\r\n\r\n var CullStack = function () {\r\n this._modelViewMatrixStack = [];\r\n this._projectionMatrixStack = [];\r\n this._viewportStack = [];\r\n this._cullingSetStack = [];\r\n this._frustumVolume = -1.0;\r\n this._bbCornerFar = 0;\r\n this._bbCornerNear = 0;\r\n\r\n // keep a matrix in memory to avoid to create matrix\r\n this._reserveMatrixStack = [\r\n Matrix.create()\r\n ];\r\n this._reserveMatrixStack.current = 0;\r\n\r\n this._reserveCullingSetStack = [\r\n new CullingSet()\r\n ];\r\n this._reserveCullingSetStack.current = 0;\r\n\r\n\r\n\r\n // data for caching camera matrix inverse for computation of world/view\r\n // contains index of the camera node in the nodepath\r\n this._cameraIndexStack = [];\r\n // contains index of the camera modelview matrix in the modelViewMatrixStack\r\n this._cameraModelViewIndexStack = [];\r\n\r\n // contains the id has a key to computed Inverse Matrix\r\n this._cameraMatrixInverse = {};\r\n\r\n };\r\n\r\n CullStack.prototype = {\r\n\r\n _getReservedMatrix: function () {\r\n var m = this._reserveMatrixStack[ this._reserveMatrixStack.current++ ];\r\n if ( this._reserveMatrixStack.current === this._reserveMatrixStack.length ) {\r\n this._reserveMatrixStack.push( Matrix.create() );\r\n }\r\n return m;\r\n },\r\n\r\n _getReservedCullingSet: function () {\r\n var m = this._reserveCullingSetStack[ this._reserveCullingSetStack.current++ ];\r\n if ( this._reserveCullingSetStack.current === this._reserveCullingSetStack.length ) {\r\n this._reserveCullingSetStack.push( new CullingSet() );\r\n }\r\n return m;\r\n },\r\n reset: function () {\r\n this._modelViewMatrixStack.length = 0;\r\n this._projectionMatrixStack.length = 0;\r\n this._cullingSetStack.length = 0;\r\n\r\n this._reserveMatrixStack.current = 0;\r\n this._reserveCullingSetStack.current = 0;\r\n\r\n this._cameraModelViewIndexStack.length = 0;\r\n this._cameraIndexStack.length = 0;\r\n this._cameraMatrixInverse = {};\r\n },\r\n\r\n getProjectionMatrixStack: function () {\r\n return this._projectionMatrixStack;\r\n },\r\n getCurrentProjectionMatrix: function () {\r\n return this._projectionMatrixStack[ this._projectionMatrixStack.length - 1 ];\r\n },\r\n\r\n getCurrentModelViewMatrix: function () {\r\n return this._modelViewMatrixStack[ this._modelViewMatrixStack.length - 1 ];\r\n },\r\n\r\n getCurrentModelviewMatrix: function () {\r\n Notify.warn( 'deprecated switch to getCurrentModelViewMatrix' );\r\n return this.getCurrentModelViewMatrix();\r\n },\r\n\r\n getCameraInverseMatrix: function () {\r\n\r\n // Return or compute and cache the MatrixInverse of the last\r\n // active camera in absolute reference\r\n\r\n // if no index the camera inverse is the root with an fake id\r\n if ( !this._cameraIndexStack.length )\r\n return this._cameraMatrixInverse[ -1 ];\r\n\r\n var idx = this._cameraIndexStack[ this._cameraIndexStack.length - 1 ];\r\n\r\n // get the camera node\r\n var camera = this.getNodePath()[ idx ];\r\n var id = camera.getInstanceID();\r\n\r\n if ( this._cameraMatrixInverse[ id ] === undefined ) {\r\n var indexInModelViewMatrixStack = this._cameraModelViewIndexStack[ this._cameraModelViewIndexStack.length - 1 ];\r\n var mat = this._modelViewMatrixStack[ indexInModelViewMatrixStack ];\r\n var matInverse = this._getReservedMatrix();\r\n Matrix.inverse( mat, matInverse );\r\n this._cameraMatrixInverse[ id ] = matInverse;\r\n }\r\n return this._cameraMatrixInverse[ id ];\r\n },\r\n\r\n getCurrentModelWorldMatrix: function () {\r\n // Improvment could be to cache more things\r\n // and / or use this method only if the shader use it\r\n var invMatrix = this.getCameraInverseMatrix();\r\n var m = this._getReservedMatrix();\r\n var world = Matrix.mult( invMatrix, this.getCurrentModelViewMatrix(), m );\r\n return world;\r\n },\r\n\r\n getCurrentViewMatrix: function () {\r\n // Improvment could be to cache more things\r\n // and / or use this method only if the shader use it\r\n if ( !this._cameraIndexStack.length )\r\n return this._modelViewMatrixStack[ 0 ];\r\n\r\n // also we could keep the index of the current to avoid lenght-1 at each access\r\n // it's implemented in osg like that:\r\n // https://github.com/openscenegraph/osg/blob/master/include/osg/fast_back_stack\r\n var idx = this._cameraModelViewIndexStack[ this._cameraModelViewIndexStack.length - 1 ];\r\n return this._modelViewMatrixStack[ idx ];\r\n },\r\n\r\n getViewport: function () {\r\n if ( this._viewportStack.length === 0 ) {\r\n return undefined;\r\n }\r\n return this._viewportStack[ this._viewportStack.length - 1 ];\r\n },\r\n getLookVectorLocal: function () {\r\n var m = this.getCurrentModelViewMatrix();\r\n return [ -m[ 2 ], -m[ 6 ], -m[ 10 ] ];\r\n },\r\n pushViewport: function ( vp ) {\r\n this._viewportStack.push( vp );\r\n },\r\n popViewport: function () {\r\n this._viewportStack.pop();\r\n },\r\n\r\n pushCullingSet: function () {\r\n var cs = this._getReservedCullingSet();\r\n if ( this._enableFrustumCulling ) {\r\n Matrix.getFrustumPlanes( this.getCurrentProjectionMatrix(), this.getCurrentModelViewMatrix(), cs.getFrustum().getPlanes(), false );\r\n // TODO: no far no near.\r\n // should check if we have them\r\n // should add at least a near 0 clip if not\r\n cs.getFrustum().setupMask( 4 );\r\n }\r\n\r\n this._cullingSetStack.push( cs );\r\n },\r\n popCullingSet: function () {\r\n return this._cullingSetStack.pop();\r\n },\r\n getCurrentCullingSet: function () {\r\n return this._cullingSetStack[ this._cullingSetStack.length - 1 ];\r\n },\r\n\r\n\r\n pushCurrentMask: function () {\r\n var cs = this.getCurrentCullingSet();\r\n if ( cs ) cs.pushCurrentMask();\r\n },\r\n popCurrentMask: function () {\r\n var cs = this.getCurrentCullingSet();\r\n if ( cs ) cs.popCurrentMask();\r\n },\r\n\r\n isVerticesCulled: function ( vertices ) {\r\n if ( !this._enableFrustumCulling )\r\n return false;\r\n return this.getCurrentCullingSet().isVeritcesCulled( vertices );\r\n },\r\n\r\n isBoundingBoxCulled: function ( bb ) {\r\n if ( !this._enableFrustumCulling )\r\n return false;\r\n return bb.valid() && this.getCurrentCullingSet().isBoundingBoxCulled( bb );\r\n },\r\n\r\n isBoundingSphereCulled: function ( bs ) {\r\n if ( !this._enableFrustumCulling )\r\n return false;\r\n return bs.valid() && this.getCurrentCullingSet().isBoundingSphereCulled( bs );\r\n },\r\n\r\n isCulled: ( function () {\r\n var bsWorld = new BoundingSphere();\r\n return function ( node, nodePath ) {\r\n if ( !this._enableFrustumCulling )\r\n return false;\r\n if ( node.isCullingActive() ) {\r\n if ( this.getCurrentCullingSet().getCurrentResultMask() === 0 )\r\n return false; // father bounding sphere totally inside\r\n\r\n var matrix;\r\n\r\n // TODO: Perf just get World Matrix at each node transform\r\n // store it in a World Transform Node Path (only world matrix change)\r\n // so that it's computed once and reused for each further node getCurrentModelWorld\r\n // otherwise, it's 1 mult for each node, each matrix node, and each geometry\r\n //matrix = this.getCurrentModelWorldMatrix();\r\n // tricky: change push be before isculled, and pop in case of culling\r\n // strange bug for now on frustum culling sample with that\r\n\r\n if ( node.getTypeID() === MatrixTransform.typeID ) {\r\n // tricky: MatrixTransform getBound is already transformed to\r\n // its local space whereas nodepath also have its matrix ...\r\n // so to get world space, you HAVE to remove that matrix from nodePATH\r\n // TODO: GC Perf of array slice creating new array\r\n matrix = ComputeMatrixFromNodePath.computeLocalToWorld( nodePath.slice( 0, nodePath.length - 1 ) );\r\n } else {\r\n matrix = ComputeMatrixFromNodePath.computeLocalToWorld( nodePath );\r\n }\r\n\r\n\r\n\r\n Matrix.transformBoundingSphere( matrix, node.getBound(), bsWorld );\r\n return this.getCurrentCullingSet().isBoundingSphereCulled( bsWorld );\r\n } else {\r\n this.getCurrentCullingSet().resetCullingMask();\r\n return false;\r\n }\r\n };\r\n } )(),\r\n\r\n\r\n\r\n pushModelViewMatrix: function ( matrix ) {\r\n\r\n // When pushing a matrix, it can be a transform or camera. To compute\r\n // differents matrix type in shader ( ViewMatrix/ModelWorldMatrix/ModelViewMatrix )\r\n // we track camera node when using pushModelViewMatrix\r\n // To detect a camera, we check on the nodepath the type of the node and if the\r\n // camera is relatif or absolute.\r\n // When we detect an absolute camera we keep it's index to get it when needed to\r\n // compute the World/View matrix\r\n // There is an exception for the root camera, the root camera is not pushed on the\r\n // CullVisitor but only its matrixes, so to handle this we compute the inverse camera\r\n // when the nodepath has a lenght of 0\r\n // To avoid to compute too much inverse matrix, we keep a cache of them during the\r\n // traverse and store the result under the instanceID key, except for the root we use\r\n // the special id '-1'\r\n var np = this.getNodePath();\r\n var length = np.length;\r\n if ( !length ) { // root\r\n var matInverse = this._getReservedMatrix();\r\n Matrix.inverse( matrix, matInverse );\r\n this._cameraMatrixInverse[ -1 ] = matInverse;\r\n } else {\r\n var index = length - 1;\r\n if ( np[ index ].getTypeID() === Camera.getTypeID() && np[ index ].getReferenceFrame() === TransformEnums.ABSOLUTE_RF ) {\r\n this._cameraIndexStack.push( index );\r\n this._cameraModelViewIndexStack.push( this._modelViewMatrixStack.length );\r\n }\r\n }\r\n\r\n this._modelViewMatrixStack.push( matrix );\r\n var lookVector = this.getLookVectorLocal();\r\n\r\n /*jshint bitwise: false */\r\n this._bbCornerFar = ( lookVector[ 0 ] >= 0 ? 1 : 0 ) | ( lookVector[ 1 ] >= 0 ? 2 : 0 ) | ( lookVector[ 2 ] >= 0 ? 4 : 0 );\r\n this._bbCornerNear = ( ~this._bbCornerFar ) & 7;\r\n /*jshint bitwise: true */\r\n\r\n },\r\n popModelViewMatrix: function () {\r\n\r\n // if same index it's a camera and we have to pop it\r\n var np = this.getNodePath();\r\n var index = np.length - 1;\r\n if ( this._cameraIndexStack.length && index === this._cameraIndexStack[ this._cameraIndexStack.length - 1 ] ) {\r\n this._cameraIndexStack.pop();\r\n this._cameraModelViewIndexStack.pop();\r\n }\r\n\r\n this._modelViewMatrixStack.pop();\r\n var lookVector;\r\n if ( this._modelViewMatrixStack.length !== 0 ) {\r\n lookVector = this.getLookVectorLocal();\r\n } else {\r\n lookVector = [ 0, 0, -1 ];\r\n }\r\n\r\n /*jshint bitwise: false */\r\n this._bbCornerFar = ( lookVector[ 0 ] >= 0 ? 1 : 0 ) | ( lookVector[ 1 ] >= 0 ? 2 : 0 ) | ( lookVector[ 2 ] >= 0 ? 4 : 0 );\r\n this._bbCornerNear = ( ~this._bbCornerFar ) & 7;\r\n /*jshint bitwise: true */\r\n\r\n },\r\n pushProjectionMatrix: function ( matrix ) {\r\n this._projectionMatrixStack.push( matrix );\r\n\r\n // need to recompute frustum volume.\r\n this._frustumVolume = -1.0;\r\n\r\n this.pushCullingSet();\r\n },\r\n popProjectionMatrix: function () {\r\n this._projectionMatrixStack.pop();\r\n\r\n // need to recompute frustum volume.\r\n this._frustumVolume = -1.0;\r\n\r\n this.popCullingSet();\r\n }\r\n\r\n };\r\n\r\n return CullStack;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/CullStack.js\n ** module id = 36\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Notify',\r\n 'osg/Utils',\r\n 'osg/NodeVisitor',\r\n 'osg/CullSettings',\r\n 'osg/CullStack',\r\n 'osg/Matrix',\r\n 'osg/MatrixTransform',\r\n 'osg/Projection',\r\n 'osg/LightSource',\r\n 'osg/Geometry',\r\n 'osg/RenderLeaf',\r\n 'osg/RenderStage',\r\n 'osg/Node',\r\n 'osg/Lod',\r\n 'osg/PagedLOD',\r\n 'osg/Camera',\r\n 'osg/TransformEnums',\r\n 'osg/Vec3'\r\n], function ( Notify, MACROUTILS, NodeVisitor, CullSettings, CullStack, Matrix, MatrixTransform, Projection, LightSource, Geometry, RenderLeaf, RenderStage, Node, Lod, PagedLOD, Camera, TransformEnums, Vec3 ) {\r\n 'use strict';\r\n\r\n /**\r\n * CullVisitor traverse the tree and collect Matrix/State for the rendering traverse\r\n * @class CullVisitor\r\n */\r\n var CullVisitor = function () {\r\n NodeVisitor.call( this, NodeVisitor.TRAVERSE_ACTIVE_CHILDREN );\r\n CullSettings.call( this );\r\n CullStack.call( this );\r\n\r\n this._rootStateGraph = undefined;\r\n this._currentStateGraph = undefined;\r\n this._currentRenderBin = undefined;\r\n this._currentRenderStage = undefined;\r\n this._rootRenderStage = undefined;\r\n this._computedNear = Number.POSITIVE_INFINITY;\r\n this._computedFar = Number.NEGATIVE_INFINITY;\r\n\r\n var lookVector = [ 0.0, 0.0, -1.0 ];\r\n this._camera = undefined;\r\n /*jshint bitwise: false */\r\n this._bbCornerFar = ( lookVector[ 0 ] >= 0 ? 1 : 0 ) | ( lookVector[ 1 ] >= 0 ? 2 : 0 ) | ( lookVector[ 2 ] >= 0 ? 4 : 0 );\r\n this._bbCornerNear = ( ~this._bbCornerFar ) & 7;\r\n /*jshint bitwise: true */\r\n\r\n this._reserveLeafStack = [ new RenderLeaf() ];\r\n this._reserveLeafStack.current = 0;\r\n\r\n this._renderBinStack = [];\r\n this.visitorType = NodeVisitor.CULL_VISITOR;\r\n\r\n this._identityMatrix = Matrix.create();\r\n\r\n this._renderer = undefined;\r\n };\r\n\r\n /** @lends CullVisitor.prototype */\r\n CullVisitor.prototype = MACROUTILS.objectInherit( CullStack.prototype, MACROUTILS.objectInherit( CullSettings.prototype, MACROUTILS.objectInherit( NodeVisitor.prototype, {\r\n distance: function ( coord, matrix ) {\r\n return -( coord[ 0 ] * matrix[ 2 ] + coord[ 1 ] * matrix[ 6 ] + coord[ 2 ] * matrix[ 10 ] + matrix[ 14 ] );\r\n },\r\n\r\n getComputedNear: function () {\r\n return this._computedNear;\r\n },\r\n\r\n getComputedFar: function () {\r\n return this._computedFar;\r\n },\r\n\r\n handleCullCallbacksAndTraverse: function ( node ) {\r\n var ccb = node.getCullCallback();\r\n if ( ccb ) {\r\n if ( !ccb.cull( node, this ) ) {\r\n return;\r\n }\r\n }\r\n this.traverse( node );\r\n },\r\n setCamera: function ( camera ) {\r\n this._camera = camera;\r\n },\r\n getCurrentCamera: function () {\r\n return this._camera;\r\n },\r\n updateCalculatedNearFar: function ( matrix, drawable ) {\r\n\r\n var bb = drawable.getBoundingBox();\r\n var dNear, dFar;\r\n\r\n // efficient computation of near and far, only taking into account the nearest and furthest\r\n // corners of the bounding box.\r\n dNear = this.distance( bb.corner( this._bbCornerNear ), matrix );\r\n dFar = this.distance( bb.corner( this._bbCornerFar ), matrix );\r\n\r\n if ( dNear > dFar ) {\r\n var tmp = dNear;\r\n dNear = dFar;\r\n dFar = tmp;\r\n }\r\n\r\n if ( dFar < 0.0 ) {\r\n // whole object behind the eye point so discard\r\n return false;\r\n }\r\n\r\n if ( dNear < this._computedNear ) {\r\n this._computedNear = dNear;\r\n }\r\n\r\n if ( dFar > this._computedFar ) {\r\n this._computedFar = dFar;\r\n }\r\n\r\n return true;\r\n },\r\n\r\n\r\n setStateGraph: function ( sg ) {\r\n this._rootStateGraph = sg;\r\n this._currentStateGraph = sg;\r\n },\r\n setRenderStage: function ( rg ) {\r\n this._rootRenderStage = rg;\r\n this._currentRenderBin = rg;\r\n },\r\n setRenderer: function ( renderer ) {\r\n this._renderer = renderer;\r\n },\r\n getRenderer: function () {\r\n return this._renderer;\r\n },\r\n\r\n reset: function () {\r\n CullStack.prototype.reset.call( this );\r\n // Reset the stack before reseting the current leaf index.\r\n // Reseting elements and refilling them later is faster than create new elements\r\n // That's the reason to have a leafStack, see http://jsperf.com/refill/2\r\n this.resetRenderLeafStack();\r\n this._reserveLeafStack.current = 0;\r\n\r\n this._computedNear = Number.POSITIVE_INFINITY;\r\n this._computedFar = Number.NEGATIVE_INFINITY;\r\n },\r\n\r\n getCurrentRenderBin: function () {\r\n return this._currentRenderBin;\r\n },\r\n\r\n setCurrentRenderBin: function ( rb ) {\r\n this._currentRenderBin = rb;\r\n },\r\n\r\n // mimic the osg implementation\r\n // in osg you can push 0, in this case an identity matrix will be loaded\r\n addPositionedAttribute: function ( matrix, attribute ) {\r\n\r\n var m = matrix ? matrix : this._identityMatrix;\r\n this._currentRenderBin.getStage().positionedAttribute.push( [ m, attribute ] );\r\n\r\n },\r\n\r\n pushStateSet: function ( stateset ) {\r\n this._currentStateGraph = this._currentStateGraph.findOrInsert( stateset );\r\n if ( stateset.getBinName() !== undefined ) {\r\n var renderBinStack = this._renderBinStack;\r\n var currentRenderBin = this._currentRenderBin;\r\n renderBinStack.push( currentRenderBin );\r\n this._currentRenderBin = currentRenderBin.getStage().findOrInsert( stateset.getBinNumber(), stateset.getBinName() );\r\n }\r\n },\r\n\r\n /** Pop the top state set and hence associated state group.\r\n * Move the current state group to the parent of the popped\r\n * state group.\r\n */\r\n popStateSet: function () {\r\n var currentStateGraph = this._currentStateGraph;\r\n var stateset = currentStateGraph.getStateSet();\r\n this._currentStateGraph = currentStateGraph.parent;\r\n if ( stateset.getBinName() !== undefined ) {\r\n var renderBinStack = this._renderBinStack;\r\n if ( renderBinStack.length === 0 ) {\r\n this._currentRenderBin = this._currentRenderBin.getStage();\r\n } else {\r\n this._currentRenderBin = renderBinStack.pop();\r\n }\r\n }\r\n },\r\n\r\n popProjectionMatrix: function () {\r\n if ( this._computeNearFar === true && this._computedFar >= this._computedNear ) {\r\n var m = this.getCurrentProjectionMatrix();\r\n Matrix.clampProjectionMatrix( m, this._computedNear, this._computedFar, this._nearFarRatio );\r\n }\r\n CullStack.prototype.popProjectionMatrix.call( this );\r\n },\r\n\r\n popCameraModelViewProjectionMatrix: function ( /*camera*/) {\r\n this.popModelViewMatrix();\r\n this.popProjectionMatrix();\r\n },\r\n\r\n pushCameraModelViewProjectionMatrix: function ( camera, modelview, projection ) {\r\n this.pushModelViewMatrix( modelview );\r\n this.pushProjectionMatrix( projection );\r\n },\r\n\r\n apply: function ( node ) {\r\n this[ node.typeID ].call( this, node );\r\n },\r\n\r\n createOrReuseRenderLeaf: function () {\r\n var l = this._reserveLeafStack[ this._reserveLeafStack.current++ ];\r\n if ( this._reserveLeafStack.current === this._reserveLeafStack.length ) {\r\n this._reserveLeafStack.push( new RenderLeaf() );\r\n }\r\n return l;\r\n },\r\n\r\n resetRenderLeafStack: function () {\r\n for ( var i = 0, j = this._reserveLeafStack.current; i <= j; i++ ) {\r\n this._reserveLeafStack[ i ].reset();\r\n }\r\n }\r\n\r\n\r\n } ) ) );\r\n\r\n\r\n\r\n // Camera cull visitor call\r\n // ANY CHANGE, any change : double check in rendere Camera code\r\n // for the first camera\r\n CullVisitor.prototype[ Camera.typeID ] = function ( camera ) {\r\n\r\n var stateset = camera.getStateSet();\r\n if ( stateset ) this.pushStateSet( stateset );\r\n\r\n var modelview = this._getReservedMatrix();\r\n var projection = this._getReservedMatrix();\r\n\r\n if ( camera.getReferenceFrame() === TransformEnums.RELATIVE_RF ) {\r\n\r\n var lastProjectionMatrix = this.getCurrentProjectionMatrix();\r\n Matrix.mult( lastProjectionMatrix, camera.getProjectionMatrix(), projection );\r\n\r\n var lastViewMatrix = this.getCurrentModelViewMatrix();\r\n Matrix.mult( lastViewMatrix, camera.getViewMatrix(), modelview );\r\n\r\n } else {\r\n\r\n // absolute\r\n Matrix.copy( camera.getViewMatrix(), modelview );\r\n Matrix.copy( camera.getProjectionMatrix(), projection );\r\n\r\n }\r\n\r\n\r\n // save current state of the camera\r\n var previousZnear = this._computedNear;\r\n var previousZfar = this._computedFar;\r\n\r\n // save cullSettings\r\n // TODO Perf: why it's not a stack\r\n // and is pollutin GC ?\r\n var previousCullsettings = new CullSettings();\r\n previousCullsettings.setCullSettings( this );\r\n\r\n this._computedNear = Number.POSITIVE_INFINITY;\r\n this._computedFar = Number.NEGATIVE_INFINITY;\r\n //\r\n\r\n this.setCullSettings( camera );\r\n // global override\r\n // upon who setted the parameter\r\n // if it's cullvisitor\r\n // it's an OVERRIDER for enableFrustumCulling\r\n // allowing for global EnableFrustimCulling\r\n if ( previousCullsettings.getSettingSourceOverrider() === this && previousCullsettings.getEnableFrustumCulling() ) {\r\n this.setEnableFrustumCulling( true );\r\n }\r\n\r\n\r\n this.pushCameraModelViewProjectionMatrix( camera, modelview, projection );\r\n\r\n if ( camera.getViewport() ) {\r\n this.pushViewport( camera.getViewport() );\r\n }\r\n\r\n\r\n // nested camera\r\n if ( camera.getRenderOrder() === Camera.NESTED_RENDER ) {\r\n\r\n this.handleCullCallbacksAndTraverse( camera );\r\n\r\n } else {\r\n // not tested\r\n\r\n var previousStage = this.getCurrentRenderBin().getStage();\r\n\r\n // use render to texture stage\r\n var rtts = new RenderStage();\r\n rtts.setCamera( camera );\r\n rtts.setClearDepth( camera.getClearDepth() );\r\n rtts.setClearColor( camera.getClearColor() );\r\n\r\n rtts.setClearMask( camera.getClearMask() );\r\n\r\n var vp;\r\n if ( camera.getViewport() === undefined ) {\r\n vp = previousStage.getViewport();\r\n } else {\r\n vp = camera.getViewport();\r\n }\r\n rtts.setViewport( vp );\r\n\r\n // skip positional state for now\r\n // ...\r\n\r\n var previousRenderBin = this.getCurrentRenderBin();\r\n\r\n this.setCurrentRenderBin( rtts );\r\n\r\n this.handleCullCallbacksAndTraverse( camera );\r\n\r\n this.setCurrentRenderBin( previousRenderBin );\r\n\r\n if ( camera.getRenderOrder() === Camera.PRE_RENDER ) {\r\n this.getCurrentRenderBin().getStage().addPreRenderStage( rtts, camera.renderOrderNum );\r\n } else {\r\n this.getCurrentRenderBin().getStage().addPostRenderStage( rtts, camera.renderOrderNum );\r\n }\r\n }\r\n\r\n this.popCameraModelViewProjectionMatrix( camera );\r\n\r\n if ( camera.getViewport() ) {\r\n this.popViewport();\r\n }\r\n\r\n\r\n // store complete frustum\r\n // if we computed near far\r\n // for any other usage\r\n // (ie: shadow frustums intersection)\r\n if ( camera.getComputeNearFar() ) {\r\n camera.setNearFar( this._computedNear, this._computedFar );\r\n }\r\n // restore previous state of the camera\r\n this.setCullSettings( previousCullsettings );\r\n this._computedNear = previousZnear;\r\n this._computedFar = previousZfar;\r\n\r\n if ( stateset ) this.popStateSet();\r\n\r\n };\r\n\r\n\r\n CullVisitor.prototype[ MatrixTransform.typeID ] = function ( node ) {\r\n // Camera and lights must enlarge node parent bounding boxes for this not to cull\r\n if ( this.isCulled( node, this.nodePath ) ) {\r\n return;\r\n }\r\n // push the culling mode.\r\n this.pushCurrentMask();\r\n\r\n var matrix = this._getReservedMatrix();\r\n\r\n if ( node.getReferenceFrame() === TransformEnums.RELATIVE_RF ) {\r\n\r\n var lastMatrixStack = this.getCurrentModelViewMatrix();\r\n Matrix.mult( lastMatrixStack, node.getMatrix(), matrix );\r\n\r\n } else {\r\n // absolute\r\n Matrix.copy( node.getMatrix(), matrix );\r\n }\r\n this.pushModelViewMatrix( matrix );\r\n\r\n\r\n\r\n var stateset = node.getStateSet();\r\n\r\n if ( stateset ) this.pushStateSet( stateset );\r\n\r\n this.handleCullCallbacksAndTraverse( node );\r\n\r\n if ( stateset ) this.popStateSet();\r\n\r\n\r\n this.popModelViewMatrix();\r\n\r\n // pop the culling mode.\r\n this.popCurrentMask();\r\n };\r\n\r\n CullVisitor.prototype[ Projection.typeID ] = function ( node ) {\r\n var lastMatrixStack = this.getCurrentProjectionMatrix();\r\n var matrix = this._getReservedMatrix();\r\n Matrix.mult( lastMatrixStack, node.getProjectionMatrix(), matrix );\r\n this.pushProjectionMatrix( matrix );\r\n\r\n var stateset = node.getStateSet();\r\n if ( stateset ) this.pushStateSet( stateset );\r\n\r\n this.handleCullCallbacksAndTraverse( node );\r\n\r\n if ( stateset ) this.popStateSet();\r\n\r\n this.popProjectionMatrix();\r\n };\r\n\r\n // here it's treated as a group node for culling\r\n // as there's isn't any in osgjs\r\n // so frustumCulling is done here\r\n CullVisitor.prototype[ Node.typeID ] = function ( node ) {\r\n\r\n\r\n // Camera and lights must enlarge node parent bounding boxes for this not to cull\r\n if ( this.isCulled( node, this.nodePath ) ) {\r\n return;\r\n }\r\n\r\n // push the culling mode.\r\n this.pushCurrentMask();\r\n\r\n var stateset = node.getStateSet();\r\n if ( stateset ) this.pushStateSet( stateset );\r\n\r\n this.handleCullCallbacksAndTraverse( node );\r\n\r\n if ( stateset ) this.popStateSet();\r\n\r\n // pop the culling mode.\r\n this.popCurrentMask();\r\n };\r\n\r\n // same code like Node\r\n CullVisitor.prototype[ Lod.typeID ] = CullVisitor.prototype[ Node.typeID ];\r\n\r\n // same code like Node\r\n CullVisitor.prototype[ PagedLOD.typeID ] = CullVisitor.prototype[ Node.typeID ];\r\n\r\n\r\n CullVisitor.prototype[ LightSource.typeID ] = function ( node ) {\r\n\r\n var stateset = node.getStateSet();\r\n if ( stateset ) this.pushStateSet( stateset );\r\n\r\n var light = node.getLight();\r\n if ( light ) this.addPositionedAttribute( this.getCurrentModelViewMatrix(), light );\r\n\r\n this.handleCullCallbacksAndTraverse( node );\r\n\r\n if ( stateset ) this.popStateSet();\r\n };\r\n\r\n CullVisitor.prototype[ Geometry.typeID ] = ( function () {\r\n var tempVec = Vec3.create();\r\n\r\n return function ( node ) {\r\n\r\n\r\n var modelview = this.getCurrentModelViewMatrix();\r\n var bb = node.getBoundingBox();\r\n if ( this._computeNearFar && bb.valid() ) {\r\n if ( !this.updateCalculatedNearFar( modelview, node ) ) {\r\n return;\r\n }\r\n }\r\n\r\n var stateset = node.getStateSet();\r\n if ( stateset ) this.pushStateSet( stateset );\r\n\r\n\r\n // using modelview is not a pb because geometry\r\n // is a leaf node, else traversing the graph would be an\r\n // issue because we use modelview after\r\n this.handleCullCallbacksAndTraverse( node );\r\n\r\n var leafs = this._currentStateGraph.leafs;\r\n if ( leafs.length === 0 ) {\r\n this._currentRenderBin.addStateGraph( this._currentStateGraph );\r\n }\r\n\r\n var leaf = this.createOrReuseRenderLeaf();\r\n var depth = 0;\r\n if ( bb.valid() ) {\r\n depth = this.distance( bb.center( tempVec ), modelview );\r\n }\r\n if ( isNaN( depth ) ) {\r\n Notify.warn( 'warning geometry has a NaN depth, ' + modelview + ' center ' + bb.center() );\r\n } else {\r\n\r\n leaf.init( this._currentStateGraph,\r\n node,\r\n this.getCurrentProjectionMatrix(),\r\n this.getCurrentViewMatrix(),\r\n this.getCurrentModelViewMatrix(),\r\n this.getCurrentModelWorldMatrix(),\r\n depth );\r\n\r\n leafs.push( leaf );\r\n }\r\n\r\n if ( stateset ) this.popStateSet();\r\n\r\n };\r\n } )();\r\n\r\n return CullVisitor;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/CullVisitor.js\n ** module id = 37\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/StateAttribute'\r\n], function ( MACROUTILS, StateAttribute ) {\r\n\r\n var Depth = function ( func, near, far, writeMask ) {\r\n StateAttribute.call( this );\r\n\r\n this._func = Depth.LESS;\r\n this._near = 0.0;\r\n this._far = 1.0;\r\n this._writeMask = true;\r\n\r\n if ( func !== undefined ) {\r\n if ( typeof ( func ) === 'string' ) {\r\n this._func = Depth[ func ];\r\n } else {\r\n this._func = func;\r\n }\r\n }\r\n if ( near !== undefined ) {\r\n this._near = near;\r\n }\r\n if ( far !== undefined ) {\r\n this._far = far;\r\n }\r\n if ( writeMask !== undefined ) {\r\n this._writeMask = writeMask;\r\n }\r\n };\r\n\r\n Depth.DISABLE = 0x0000;\r\n Depth.NEVER = 0x0200;\r\n Depth.LESS = 0x0201;\r\n Depth.EQUAL = 0x0202;\r\n Depth.LEQUAL = 0x0203;\r\n Depth.GREATE = 0x0204;\r\n Depth.NOTEQU = 0x0205;\r\n Depth.GEQUAL = 0x0206;\r\n Depth.ALWAYS = 0x0207;\r\n\r\n Depth.prototype = MACROUTILS.objectLibraryClass( MACROUTILS.objectInherit( StateAttribute.prototype, {\r\n attributeType: 'Depth',\r\n cloneType: function () {\r\n return new Depth();\r\n },\r\n setRange: function ( near, far ) {\r\n this._near = near;\r\n this._far = far;\r\n },\r\n setWriteMask: function ( mask ) {\r\n this._writeMask = mask;\r\n },\r\n apply: function ( state ) {\r\n var gl = state.getGraphicContext();\r\n if ( this._func === 0 ) {\r\n gl.disable( gl.DEPTH_TEST );\r\n } else {\r\n gl.enable( gl.DEPTH_TEST );\r\n gl.depthFunc( this._func );\r\n gl.depthMask( this._writeMask );\r\n gl.depthRange( this._near, this._far );\r\n }\r\n }\r\n } ), 'osg', 'Depth' );\r\n\r\n return Depth;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/Depth.js\n ** module id = 38\n ** module chunks = 0 1\n **/","define( [], function () {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * DrawArrayLengths manage rendering primitives\r\n * @class DrawArrayLengths\r\n */\r\n var DrawArrayLengths = function ( mode, first, array ) {\r\n this._mode = mode;\r\n this._first = first;\r\n this._arrayLengths = array.slice( 0 );\r\n };\r\n\r\n /** @lends DrawArrayLengths.prototype */\r\n DrawArrayLengths.prototype = {\r\n draw: function ( state ) {\r\n var gl = state.getGraphicContext();\r\n var mode = this._mode;\r\n var first = this._first;\r\n var array = this._arrayLengths;\r\n for ( var i = 0, l = array.length; i < l; i++ ) {\r\n var count = array[ i ];\r\n gl.drawArrays( mode, first, count );\r\n first += count;\r\n }\r\n },\r\n getMode: function () {\r\n return this._mode;\r\n },\r\n getNumIndices: function () {\r\n var count = 0;\r\n var array = this._arrayLengths;\r\n for ( var i = 0, l = array.length; i < l; i++ ) {\r\n count += array[ i ];\r\n }\r\n return count;\r\n },\r\n getCount: function () {\r\n return this.getNumIndices();\r\n },\r\n getArrayLengths: function () {\r\n return this._arrayLengths;\r\n },\r\n getFirst: function () {\r\n return this._first;\r\n },\r\n setFirst: function ( first ) {\r\n this._first = first;\r\n }\r\n };\r\n\r\n return DrawArrayLengths;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/DrawArrayLengths.js\n ** module id = 39\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Notify',\r\n 'osg/PrimitiveSet'\r\n], function ( Notify, PrimitiveSet ) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * DrawArrays manage rendering primitives\r\n * @class DrawArrays\r\n */\r\n var DrawArrays = function ( mode, first, count ) {\r\n this.mode = mode;\r\n if ( mode !== undefined ) {\r\n if ( typeof ( mode ) === 'string' ) {\r\n mode = PrimitiveSet[ mode ];\r\n }\r\n this.mode = mode;\r\n }\r\n this.first = first;\r\n this.count = count;\r\n };\r\n\r\n /** @lends DrawArrays.prototype */\r\n DrawArrays.prototype = {\r\n draw: function ( state ) {\r\n if ( this.count === 0 )\r\n return;\r\n var gl = state.getGraphicContext();\r\n gl.drawArrays( this.mode, this.first, this.count );\r\n },\r\n getMode: function () {\r\n return this.mode;\r\n },\r\n getCount: function () {\r\n return this.count;\r\n },\r\n getFirst: function () {\r\n return this.first;\r\n },\r\n getNumIndices: function () {\r\n return this.count;\r\n },\r\n index: function ( i ) {\r\n return this.first + i;\r\n }\r\n\r\n };\r\n DrawArrays.create = function ( mode, first, count ) {\r\n Notify.log( 'DrawArrays.create is deprecated, use new DrawArrays with same arguments' );\r\n var d = new DrawArrays( mode, first, count );\r\n return d;\r\n };\r\n\r\n return DrawArrays;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/DrawArrays.js\n ** module id = 40\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Notify',\r\n 'osg/PrimitiveSet'\r\n], function ( Notify, PrimitiveSet ) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * DrawElements manage rendering of indexed primitives\r\n * @class DrawElements\r\n */\r\n var DrawElements = function ( mode, indices ) {\r\n this.mode = PrimitiveSet.POINTS;\r\n if ( mode !== undefined ) {\r\n if ( typeof ( mode ) === 'string' ) {\r\n mode = PrimitiveSet[ mode ];\r\n }\r\n this.mode = mode;\r\n }\r\n this.count = 0;\r\n this.offset = 0;\r\n this.indices = indices;\r\n this.uType = DrawElements.UNSIGNED_SHORT;\r\n if ( indices !== undefined ) {\r\n this.setIndices( indices );\r\n }\r\n };\r\n\r\n DrawElements.UNSIGNED_BYTE = 0x1401;\r\n DrawElements.UNSIGNED_SHORT = 0x1403;\r\n\r\n /** @lends DrawElements.prototype */\r\n DrawElements.prototype = {\r\n getMode: function () {\r\n return this.mode;\r\n },\r\n draw: function ( state ) {\r\n if ( this.count === 0 )\r\n return;\r\n state.setIndexArray( this.indices );\r\n var gl = state.getGraphicContext();\r\n gl.drawElements( this.mode, this.count, this.uType, this.offset );\r\n },\r\n setIndices: function ( indices ) {\r\n this.indices = indices;\r\n var elts = indices.getElements();\r\n this.count = elts.length;\r\n this.uType = elts.BYTES_PER_ELEMENT === 1 ? DrawElements.UNSIGNED_BYTE : DrawElements.UNSIGNED_SHORT;\r\n },\r\n getIndices: function () {\r\n return this.indices;\r\n },\r\n setFirst: function ( val ) {\r\n this.offset = val;\r\n },\r\n getFirst: function () {\r\n return this.offset;\r\n },\r\n setCount: function ( val ) {\r\n this.count = val;\r\n },\r\n getCount: function () {\r\n return this.count;\r\n },\r\n getNumIndices: function () {\r\n return this.indices.getElements().length;\r\n },\r\n index: function ( i ) {\r\n return this.indices.getElements()[ i ];\r\n }\r\n\r\n\r\n };\r\n\r\n DrawElements.create = function ( mode, indices ) {\r\n Notify.log( 'DrawElements.create is deprecated, use new DrawElements with same arguments' );\r\n return new DrawElements( mode, indices );\r\n };\r\n\r\n return DrawElements;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/DrawElements.js\n ** module id = 41\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Notify',\r\n 'osg/Matrix',\r\n 'osg/Vec3'\r\n], function ( Notify, Matrix, Vec3 ) {\r\n\r\n var EllipsoidModel = function () {\r\n this._radiusEquator = EllipsoidModel.WGS_84_RADIUS_EQUATOR;\r\n this._radiusPolar = EllipsoidModel.WGS_84_RADIUS_POLAR;\r\n this.computeCoefficients();\r\n };\r\n\r\n EllipsoidModel.WGS_84_RADIUS_EQUATOR = 6378137.0;\r\n EllipsoidModel.WGS_84_RADIUS_POLAR = 6356752.3142;\r\n\r\n EllipsoidModel.prototype = {\r\n setRadiusEquator: function ( radius ) {\r\n this._radiusEquator = radius;\r\n this.computeCoefficients();\r\n },\r\n getRadiusEquator: function () {\r\n return this._radiusEquator;\r\n },\r\n setRadiusPolar: function ( radius ) {\r\n this._radiusPolar = radius;\r\n this.computeCoefficients();\r\n },\r\n getRadiusPolar: function () {\r\n return this._radiusPolar;\r\n },\r\n convertLatLongHeightToXYZ: function ( latitude, longitude, height, result ) {\r\n if ( result === undefined ) {\r\n Notify.warn( 'deprecated, use this signature convertLatLongHeightToXYZ( latitude, longitude, height, result )' );\r\n result = [ 0.0, 0.0, 0.0 ];\r\n }\r\n var sinLatitude = Math.sin( latitude );\r\n var cosLatitude = Math.cos( latitude );\r\n var N = this._radiusEquator / Math.sqrt( 1.0 - this._eccentricitySquared * sinLatitude * sinLatitude );\r\n var X = ( N + height ) * cosLatitude * Math.cos( longitude );\r\n var Y = ( N + height ) * cosLatitude * Math.sin( longitude );\r\n var Z = ( N * ( 1.0 - this._eccentricitySquared ) + height ) * sinLatitude;\r\n result[ 0 ] = X;\r\n result[ 1 ] = Y;\r\n result[ 2 ] = Z;\r\n return result;\r\n },\r\n convertXYZToLatLongHeight: function ( X, Y, Z, result ) {\r\n if ( result === undefined ) {\r\n Notify.warn( 'deprecated, use this signature convertXYZToLatLongHeight( X, Y, Z , result)' );\r\n result = [ 0.0, 0.0, 0.0 ];\r\n }\r\n // http://www.colorado.edu/geography/gcraft/notes/datum/gif/xyzllh.gif\r\n var p = Math.sqrt( X * X + Y * Y );\r\n var theta = Math.atan2( Z * this._radiusEquator, ( p * this._radiusPolar ) );\r\n var eDashSquared = ( this._radiusEquator * this._radiusEquator - this._radiusPolar * this._radiusPolar ) / ( this._radiusPolar * this._radiusPolar );\r\n\r\n var sinTheta = Math.sin( theta );\r\n var cosTheta = Math.cos( theta );\r\n\r\n var latitude = Math.atan( ( Z + eDashSquared * this._radiusPolar * sinTheta * sinTheta * sinTheta ) /\r\n ( p - this._eccentricitySquared * this._radiusEquator * cosTheta * cosTheta * cosTheta ) );\r\n var longitude = Math.atan2( Y, X );\r\n\r\n var sinLatitude = Math.sin( latitude );\r\n var N = this._radiusEquator / Math.sqrt( 1.0 - this._eccentricitySquared * sinLatitude * sinLatitude );\r\n\r\n var cosLat = Math.cos( latitude );\r\n if ( cosLat === 0 ) cosLat = 1;\r\n var height = p / cosLat - N;\r\n result[ 0 ] = latitude;\r\n result[ 1 ] = longitude;\r\n result[ 2 ] = height;\r\n return result;\r\n },\r\n computeLocalUpVector: function ( X, Y, Z ) {\r\n // Note latitude is angle between normal to ellipsoid surface and XY-plane\r\n var latitude, longitude, altitude;\r\n var coord = this.convertXYZToLatLongHeight( X, Y, Z, latitude, longitude, altitude );\r\n latitude = coord[ 0 ];\r\n longitude = coord[ 1 ];\r\n altitude = coord[ 2 ];\r\n\r\n // Compute up vector\r\n return [ Math.cos( longitude ) * Math.cos( latitude ),\r\n Math.sin( longitude ) * Math.cos( latitude ),\r\n Math.sin( latitude )\r\n ];\r\n },\r\n isWGS84: function () {\r\n return ( this._radiusEquator === EllipsoidModel.WGS_84_RADIUS_EQUATOR && this._radiusPolar === EllipsoidModel.WGS_84_RADIUS_POLAR );\r\n },\r\n\r\n computeCoefficients: function () {\r\n var flattening = ( this._radiusEquator - this._radiusPolar ) / this._radiusEquator;\r\n this._eccentricitySquared = 2.0 * flattening - flattening * flattening;\r\n },\r\n computeLocalToWorldTransformFromLatLongHeight: function ( latitude, longitude, height, result ) {\r\n if ( result === undefined ) {\r\n Notify.warn( 'deprecated, use this signature computeLocalToWorldTransformFromLatLongHeight(latitude, longitude, height, result)' );\r\n result = new Array( 16 );\r\n }\r\n var pos = this.convertLatLongHeightToXYZ( latitude, longitude, height, result );\r\n Matrix.makeTranslate( pos[ 0 ], pos[ 1 ], pos[ 2 ], result );\r\n this.computeCoordinateFrame( latitude, longitude, result );\r\n return result;\r\n },\r\n computeLocalToWorldTransformFromXYZ: function ( X, Y, Z ) {\r\n var lla = this.convertXYZToLatLongHeight( X, Y, Z );\r\n var m = Matrix.makeTranslate( X, Y, Z, Matrix.create() );\r\n this.computeCoordinateFrame( lla[ 0 ], lla[ 1 ], m );\r\n return m;\r\n },\r\n computeCoordinateFrame: ( function () {\r\n var up = [ 0.0, 0.0, 0.0 ];\r\n var east = [ 0.0, 0.0, 0.0 ];\r\n var north = [ 0.0, 0.0, 0.0 ];\r\n return function ( latitude, longitude, localToWorld ) {\r\n // Compute up vector\r\n up[ 0 ] = Math.cos( longitude ) * Math.cos( latitude );\r\n up[ 1 ] = Math.sin( longitude ) * Math.cos( latitude );\r\n up[ 2 ] = Math.sin( latitude );\r\n\r\n // Compute east vector\r\n east[ 0 ] = -Math.sin( longitude );\r\n east[ 1 ] = -Math.cos( longitude );\r\n\r\n // Compute north vector = outer product up x east\r\n Vec3.cross( up, east, north );\r\n\r\n // set matrix\r\n Matrix.set( localToWorld, 0, 0, east[ 0 ] );\r\n Matrix.set( localToWorld, 0, 1, east[ 1 ] );\r\n Matrix.set( localToWorld, 0, 2, east[ 2 ] );\r\n\r\n Matrix.set( localToWorld, 1, 0, north[ 0 ] );\r\n Matrix.set( localToWorld, 1, 1, north[ 1 ] );\r\n Matrix.set( localToWorld, 1, 2, north[ 2 ] );\r\n\r\n Matrix.set( localToWorld, 2, 0, up[ 0 ] );\r\n Matrix.set( localToWorld, 2, 1, up[ 1 ] );\r\n Matrix.set( localToWorld, 2, 2, up[ 2 ] );\r\n };\r\n } )()\r\n };\r\n\r\n return EllipsoidModel;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/EllipsoidModel.js\n ** module id = 42\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Notify',\r\n 'osg/Utils',\r\n 'osg/GLObject',\r\n 'osg/StateAttribute',\r\n 'osg/Timer'\r\n\r\n], function ( Notify, MACROUTILS, GLObject, StateAttribute, Timer ) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * FrameBufferObject manage fbo / rtt\r\n * @class FrameBufferObject\r\n */\r\n var FrameBufferObject = function () {\r\n GLObject.call( this );\r\n StateAttribute.call( this );\r\n this._fbo = undefined;\r\n this._attachments = [];\r\n this.dirty();\r\n };\r\n\r\n FrameBufferObject.COLOR_ATTACHMENT0 = 0x8CE0;\r\n FrameBufferObject.DEPTH_ATTACHMENT = 0x8D00;\r\n FrameBufferObject.DEPTH_COMPONENT16 = 0x81A5;\r\n\r\n // static cache of glFrameBuffer flagged for deletion, which will actually\r\n // be deleted in the correct GL context.\r\n FrameBufferObject._sDeletedGLFrameBufferCache = new Map();\r\n\r\n // static method to delete FrameBuffers \r\n FrameBufferObject.deleteGLBufferArray = function ( gl, fb ) {\r\n if ( !FrameBufferObject._sDeletedGLFrameBufferCache.has( gl ) )\r\n FrameBufferObject._sDeletedGLFrameBufferCache.set( gl, [] );\r\n FrameBufferObject._sDeletedGLFrameBufferCache.get( gl ).push( fb );\r\n };\r\n\r\n\r\n // static method to flush all the cached glFrameBuffers which need to be deleted in the GL context specified\r\n FrameBufferObject.flushDeletedGLFrameBuffers = function ( gl, availableTime ) {\r\n // if no time available don't try to flush objects.\r\n if ( availableTime <= 0.0 ) return availableTime;\r\n if ( !FrameBufferObject._sDeletedGLFrameBufferCache.has( gl ) ) return availableTime;\r\n var elapsedTime = 0.0;\r\n var beginTime = Timer.instance().tick();\r\n var deleteList = FrameBufferObject._sDeletedGLFrameBufferCache.get( gl );\r\n var numBuffers = deleteList.length;\r\n for ( var i = numBuffers - 1; i >= 0 && elapsedTime < availableTime; i-- ) {\r\n gl.deleteFrameBuffer( deleteList[ i ] );\r\n deleteList.splice( i, 1 );\r\n elapsedTime = Timer.instance().deltaS( beginTime, Timer.instance().tick() );\r\n }\r\n availableTime -= elapsedTime;\r\n return availableTime;\r\n };\r\n\r\n /** @lends FrameBufferObject.prototype */\r\n FrameBufferObject.prototype = MACROUTILS.objectInherit( GLObject.prototype, MACROUTILS.objectInherit( StateAttribute.prototype, {\r\n attributeType: 'FrameBufferObject',\r\n cloneType: function () {\r\n return new FrameBufferObject();\r\n },\r\n setAttachment: function ( attachment ) {\r\n this._attachments.push( attachment );\r\n },\r\n releaseGLObjects: function () {\r\n if ( this._fbo !== undefined && this._gl !== undefined ) {\r\n FrameBufferObject.deleteGLFrameBuffer( this._gl, this._fbo );\r\n }\r\n this._fbo = undefined;\r\n // TODO: we probably need to delete also the renderBuffer\r\n },\r\n _reportFrameBufferError: function ( code ) {\r\n switch ( code ) {\r\n case 0x8CD6:\r\n Notify.debug( 'FRAMEBUFFER_INCOMPLETE_ATTACHMENT' );\r\n break;\r\n case 0x8CD7:\r\n Notify.debug( 'FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT' );\r\n break;\r\n case 0x8CD9:\r\n Notify.debug( 'FRAMEBUFFER_INCOMPLETE_DIMENSIONS' );\r\n break;\r\n case 0x8CDD:\r\n Notify.debug( 'FRAMEBUFFER_UNSUPPORTED' );\r\n break;\r\n default:\r\n Notify.debug( 'FRAMEBUFFER unknown error ' + code.toString( 16 ) );\r\n }\r\n },\r\n\r\n apply: function ( state ) {\r\n\r\n if ( !this._gl ) {\r\n this.setGraphicContext( state.getGraphicContext() );\r\n }\r\n var gl = this._gl;\r\n var status;\r\n\r\n var attachments = this._attachments;\r\n\r\n if ( attachments.length > 0 ) {\r\n\r\n if ( this.isDirty() ) {\r\n\r\n if ( !this._fbo ) {\r\n this._fbo = gl.createFramebuffer();\r\n }\r\n\r\n gl.bindFramebuffer( gl.FRAMEBUFFER, this._fbo );\r\n var hasRenderBuffer = false;\r\n\r\n for ( var i = 0, l = attachments.length; i < l; ++i ) {\r\n\r\n var attachment = attachments[ i ];\r\n\r\n // render buffer\r\n if ( attachment.texture === undefined ) {\r\n\r\n var rb = gl.createRenderbuffer();\r\n gl.bindRenderbuffer( gl.RENDERBUFFER, rb );\r\n gl.renderbufferStorage( gl.RENDERBUFFER, attachment.format, attachment.width, attachment.height );\r\n gl.framebufferRenderbuffer( gl.FRAMEBUFFER, attachment.attachment, gl.RENDERBUFFER, rb );\r\n hasRenderBuffer = true;\r\n\r\n } else {\r\n\r\n // use texture\r\n var texture = attachment.texture;\r\n // apply on unit 0 to init it\r\n state.applyTextureAttribute( 1, texture );\r\n\r\n gl.framebufferTexture2D( gl.FRAMEBUFFER, attachment.attachment, attachment.textureTarget, texture.getTextureObject().id(), 0 );\r\n\r\n }\r\n\r\n }\r\n\r\n status = gl.checkFramebufferStatus( gl.FRAMEBUFFER );\r\n if ( status !== 0x8CD5 ) {\r\n this._reportFrameBufferError( status );\r\n }\r\n\r\n if ( hasRenderBuffer ) { // set it to null only if used renderbuffer\r\n gl.bindRenderbuffer( gl.RENDERBUFFER, null );\r\n }\r\n\r\n this.setDirty( false );\r\n\r\n } else {\r\n\r\n gl.bindFramebuffer( gl.FRAMEBUFFER, this._fbo );\r\n\r\n if ( Notify.reportWebGLError === true ) {\r\n\r\n status = gl.checkFramebufferStatus( gl.FRAMEBUFFER );\r\n if ( status !== 0x8CD5 ) {\r\n this._reportFrameBufferError( status );\r\n }\r\n }\r\n\r\n }\r\n\r\n } else {\r\n gl.bindFramebuffer( gl.FRAMEBUFFER, null );\r\n }\r\n }\r\n } ) );\r\n\r\n return FrameBufferObject;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/FrameBufferObject.js\n ** module id = 43\n ** module chunks = 0 1\n **/","define( [], function () {\r\n\r\n var FrameStamp = function () {\r\n var frame = 0;\r\n var startSimulation = 0.0;\r\n var currentSimulation = 0.0;\r\n\r\n this.setReferenceTime = function ( s ) {\r\n startSimulation = s;\r\n };\r\n this.setSimulationTime = function ( s ) {\r\n currentSimulation = s;\r\n };\r\n this.getReferenceTime = function () {\r\n return startSimulation;\r\n };\r\n this.getSimulationTime = function () {\r\n return currentSimulation;\r\n };\r\n this.setFrameNumber = function ( n ) {\r\n frame = n;\r\n };\r\n this.getFrameNumber = function () {\r\n return frame;\r\n };\r\n };\r\n\r\n return FrameStamp;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/FrameStamp.js\n ** module id = 44\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/Vec3',\r\n 'osg/Node',\r\n 'osg/BoundingBox'\r\n], function ( MACROUTILS, Vec3, Node, BoundingBox ) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * Geometry manage array and primitives to draw a geometry.\r\n * @class Geometry\r\n */\r\n var Geometry = function () {\r\n Node.call( this );\r\n this.primitives = [];\r\n this.attributes = {};\r\n this._boundingBox = new BoundingBox();\r\n this._boundingBoxComputed = false;\r\n this.cacheAttributeList = {};\r\n this._shape = null;\r\n };\r\n\r\n /** @lends Geometry.prototype */\r\n Geometry.prototype = MACROUTILS.objectLibraryClass( MACROUTILS.objectInherit( Node.prototype, {\r\n releaseGLObjects: function () {\r\n this.stateset.releaseGLObjects();\r\n var i;\r\n for ( i in this.attributes ) {\r\n this.attributes[ i ].releaseGLObjects();\r\n }\r\n for ( var j = 0, l = this.primitives.length; j < l; j++ ) {\r\n var prim = this.primitives[ j ];\r\n if ( prim.getIndices !== undefined ) {\r\n if ( prim.getIndices() !== undefined && prim.getIndices() !== null ) {\r\n prim.indices.releaseGLObjects();\r\n }\r\n }\r\n }\r\n },\r\n dirtyBound: function () {\r\n if ( this._boundingBoxComputed === true ) {\r\n this._boundingBoxComputed = false;\r\n }\r\n Node.prototype.dirtyBound.call( this );\r\n },\r\n\r\n dirty: function () {\r\n this.cacheAttributeList = {};\r\n },\r\n getPrimitives: function () {\r\n return this.primitives;\r\n },\r\n getAttributes: function () {\r\n return this.attributes;\r\n },\r\n getShape: function () {\r\n return this._shape;\r\n },\r\n setShape: function ( shape ) {\r\n this._shape = shape;\r\n },\r\n getVertexAttributeList: function () {\r\n return this.attributes;\r\n },\r\n getPrimitiveSetList: function () {\r\n return this.primitives;\r\n },\r\n\r\n drawImplementation: function ( state ) {\r\n var program = state.getLastProgramApplied();\r\n var prgID = program.getInstanceID();\r\n if ( this.cacheAttributeList[ prgID ] === undefined ) {\r\n var attribute;\r\n\r\n var attributesCacheKeys = program._attributesCache.getKeys();\r\n var attributesCacheMap = program._attributesCache;\r\n var attributeList = [];\r\n\r\n var generated = '//generated by Geometry::implementation\\n';\r\n generated += 'state.lazyDisablingOfVertexAttributes();\\n';\r\n generated += 'var attr;\\n';\r\n\r\n for ( var i = 0, l = attributesCacheKeys.length; i < l; i++ ) {\r\n var key = attributesCacheKeys[ i ];\r\n attribute = attributesCacheMap[ key ];\r\n var attr = this.attributes[ key ];\r\n if ( attr === undefined ) {\r\n continue;\r\n }\r\n attributeList.push( attribute );\r\n // dont display the geometry if missing data\r\n generated += 'attr = this.attributes[\\'' + key + '\\'];\\n';\r\n generated += 'if (!attr.isValid()) { return; }\\n';\r\n generated += 'state.setVertexAttribArray(' + attribute + ', attr, false);\\n';\r\n }\r\n generated += 'state.applyDisablingOfVertexAttributes();\\n';\r\n var primitives = this.primitives;\r\n generated += 'var primitives = this.primitives;\\n';\r\n for ( var j = 0, m = primitives.length; j < m; ++j ) {\r\n generated += 'primitives[' + j + '].draw(state);\\n';\r\n }\r\n\r\n /*jshint evil: true */\r\n this.cacheAttributeList[ prgID ] = new Function( 'state', generated );\r\n /*jshint evil: false */\r\n }\r\n this.cacheAttributeList[ prgID ].call( this, state );\r\n },\r\n\r\n // for testing disabling drawing\r\n drawImplementationDummy: function ( state ) {\r\n /*jshint unused: true */\r\n // for testing only that's why the code is not removed\r\n var program = state.getLastProgramApplied();\r\n var attribute;\r\n var attributeList = [];\r\n var attributesCache = program._attributesCache;\r\n\r\n\r\n var primitives = this.primitives;\r\n //state.disableVertexAttribsExcept(attributeList);\r\n\r\n for ( var j = 0, m = primitives.length; j < m; ++j ) {\r\n //primitives[j].draw(state);\r\n }\r\n /*jshint unused: false */\r\n },\r\n\r\n getBoundingBox: function () {\r\n if ( !this._boundingBoxComputed ) {\r\n this.computeBoundingBox( this._boundingBox );\r\n this._boundingBoxComputed = true;\r\n }\r\n return this._boundingBox;\r\n },\r\n\r\n setBound: function ( bb ) {\r\n this._boundingBox = bb;\r\n this._boundingBoxComputed = true;\r\n },\r\n\r\n computeBoundingBox: function ( boundingBox ) {\r\n\r\n var vertexArray = this.getAttributes().Vertex;\r\n var v = [ 0.0, 0.0, 0.0 ];\r\n if ( vertexArray !== undefined &&\r\n vertexArray.getElements() !== undefined &&\r\n vertexArray.getItemSize() > 2 ) {\r\n var vertexes = vertexArray.getElements();\r\n Vec3.init( v );\r\n for ( var idx = 0, l = vertexes.length; idx < l; idx += 3 ) {\r\n v[ 0 ] = vertexes[ idx ];\r\n v[ 1 ] = vertexes[ idx + 1 ];\r\n v[ 2 ] = vertexes[ idx + 2 ];\r\n boundingBox.expandByVec3( v );\r\n }\r\n }\r\n return boundingBox;\r\n },\r\n\r\n computeBound: function ( boundingSphere ) {\r\n boundingSphere.init();\r\n var bb = this.getBoundingBox();\r\n boundingSphere.expandByBoundingBox( bb );\r\n return boundingSphere;\r\n }\r\n } ), 'osg', 'Geometry' );\r\n\r\n MACROUTILS.setTypeID( Geometry );\r\n\r\n return Geometry;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/Geometry.js\n ** module id = 45\n ** module chunks = 0 1\n **/","define( [], function () {\r\n\r\n 'use strict';\r\n\r\n // Base class for GLResources: Textures, Buffers, Programs, Shaders, FrameBuffers and RenderBuffers\r\n // It holds a reference to the graphic context that is needed for resource deletion\r\n\r\n var GLObject = function () {\r\n this._gl = undefined;\r\n };\r\n\r\n GLObject.prototype = {\r\n setGraphicContext: function ( gl ) {\r\n this._gl = gl;\r\n },\r\n getGraphicContext: function () {\r\n return this._gl;\r\n }\r\n };\r\n\r\n return GLObject;\r\n\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/GLObject.js\n ** module id = 46\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/Object'\r\n], function ( MACROUTILS, Object ) {\r\n\r\n 'use strict';\r\n\r\n var Image = function ( image ) {\r\n Object.call( this );\r\n\r\n this._imageObject = undefined;\r\n this._url = undefined;\r\n this._width = undefined;\r\n this._height = undefined;\r\n this._dirty = true;\r\n\r\n if ( image ) {\r\n this.setImage( image );\r\n }\r\n\r\n this._isGreyscale = undefined;\r\n };\r\n\r\n Image.prototype = MACROUTILS.objectLibraryClass( MACROUTILS.objectInherit( Object.prototype, {\r\n\r\n dirty: function () {\r\n this._isGreyscale = undefined;\r\n this._dirty = true;\r\n },\r\n\r\n isDirty: function () {\r\n return this._dirty;\r\n },\r\n\r\n setDirty: function ( bool ) {\r\n this._dirty = bool;\r\n },\r\n\r\n getImage: function () {\r\n return this._imageObject;\r\n },\r\n\r\n getURL: function () {\r\n return this._url;\r\n },\r\n\r\n setURL: function ( url ) {\r\n this._url = url;\r\n },\r\n\r\n setImage: function ( img ) {\r\n if ( !this._url && img && ( img.src || img.currentSrc ) ) {\r\n this._url = img.src;\r\n }\r\n this._imageObject = img;\r\n this.dirty();\r\n },\r\n\r\n isCanvas: function () {\r\n return this._imageObject instanceof HTMLCanvasElement;\r\n },\r\n\r\n isVideo: function () {\r\n return this._imageObject instanceof window.HTMLVideoElement;\r\n },\r\n\r\n isImage: function () {\r\n return this._imageObject instanceof window.Image;\r\n },\r\n\r\n isTypedArray: function () {\r\n return this._imageObject instanceof Uint8Array || this._imageObject instanceof Float32Array;\r\n },\r\n\r\n setWidth: function ( w ) {\r\n this._width = w;\r\n },\r\n\r\n setHeight: function ( h ) {\r\n this._height = h;\r\n },\r\n\r\n getWidth: function () {\r\n if ( this.isImage() ) {\r\n return this._imageObject.naturalWidth;\r\n } else if ( this.isVideo() ) {\r\n return this._imageObject.videoWidth;\r\n } else if ( this.isCanvas() ) {\r\n return this._imageObject.width;\r\n }\r\n return this._width;\r\n },\r\n\r\n getHeight: function () {\r\n if ( this.isImage() ) {\r\n return this._imageObject.naturalHeight;\r\n } else if ( this.isVideo() ) {\r\n return this._imageObject.videoHeight;\r\n } else if ( this.isCanvas() ) {\r\n return this._imageObject.height;\r\n }\r\n return this._height;\r\n },\r\n\r\n isGreyscale: function ( nbSamples ) {\r\n if ( this._isGreyscale !== undefined )\r\n return this._isGreyscale;\r\n\r\n if ( this._imageObject !== undefined && this.isReady() && this._isGreyscale === undefined ) {\r\n\r\n var canvas = this._imageObject;\r\n if ( !this.isCanvas() ) {\r\n canvas = document.createElement( 'canvas' );\r\n }\r\n var ctx = canvas.getContext( '2d' );\r\n canvas.width = this._imageObject.width;\r\n canvas.height = this._imageObject.height;\r\n ctx.drawImage( this._imageObject, 0, 0 );\r\n\r\n var sampleX, sampleY;\r\n // cap sample if needed\r\n if ( !nbSamples ) {\r\n sampleX = canvas.width;\r\n sampleY = canvas.height;\r\n }\r\n if ( nbSamples > 0 ) {\r\n nbSamples = Math.min( Math.min( canvas.width, canvas.height ), nbSamples );\r\n sampleX = sampleY = nbSamples;\r\n }\r\n\r\n var isGreyscale = true;\r\n var xFactor = canvas.width / ( sampleX );\r\n var yFactor = canvas.height / ( sampleY );\r\n for ( var i = 0; i < sampleX; i++ ) {\r\n for ( var j = 0; j < sampleY; j++ ) {\r\n var x = Math.floor( xFactor * ( i + 0.5 ) ),\r\n y = Math.floor( yFactor * ( j + 0.5 ) );\r\n var data = ctx.getImageData( x, y, 1, 1 ).data;\r\n if ( !( data[ 0 ] === data[ 1 ] && data[ 0 ] === data[ 2 ] ) ) {\r\n isGreyscale = false;\r\n break;\r\n }\r\n }\r\n }\r\n this._isGreyscale = isGreyscale;\r\n }\r\n\r\n return this._isGreyscale;\r\n },\r\n\r\n isReady: function () {\r\n\r\n // image are ready for static data\r\n if ( this.isCanvas() ||\r\n this.isTypedArray() ) {\r\n return true;\r\n }\r\n\r\n if ( this.isImage() ) {\r\n var image = this._imageObject;\r\n if ( image.complete ) {\r\n if ( image.naturalWidth !== undefined && image.naturalWidth === 0 ) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n }\r\n\r\n if ( this.isVideo() ) {\r\n if ( this.getWidth() !== 0 ) return true;\r\n }\r\n\r\n return false;\r\n }\r\n } ), 'osg', 'Image' );\r\n\r\n MACROUTILS.setTypeID( Image );\r\n\r\n return Image;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/Image.js\n ** module id = 47\n ** module chunks = 0 1\n **/","define( [\r\n 'q',\r\n 'osg/Utils',\r\n 'osg/Image'\r\n], function ( Q, MACROUTILS, Image ) {\r\n\r\n 'use strict';\r\n\r\n var ImageStream = function ( video ) {\r\n Image.call( this, video );\r\n this._canPlayDefered = undefined;\r\n };\r\n\r\n ImageStream.PAUSE = 0;\r\n ImageStream.PLAYING = 1;\r\n\r\n ImageStream.prototype = MACROUTILS.objectLibraryClass( MACROUTILS.objectInherit( Image.prototype, {\r\n\r\n isDirty: function () {\r\n return this._status === ImageStream.PLAYING; // video is dirty if playing\r\n },\r\n\r\n setImage: function ( video ) {\r\n Image.prototype.setImage.call( this, video );\r\n\r\n this._status = ImageStream.STOP;\r\n\r\n // event at the end of the stream\r\n video.addEventListener( 'ended', function () {\r\n this._status = ImageStream.PAUSE;\r\n }.bind( this ), true );\r\n\r\n this.dirty();\r\n },\r\n\r\n play: function () {\r\n this._imageObject.play();\r\n this._status = ImageStream.PLAYING;\r\n },\r\n\r\n stop: function () {\r\n this._imageObject.pause();\r\n this._status = ImageStream.PAUSE;\r\n },\r\n\r\n whenReady: function () {\r\n\r\n if ( !this._imageObject )\r\n return Q( false );\r\n\r\n if ( !this._canPlayDefered ) {\r\n this._canPlayDefered = Q.defer();\r\n this._imageObject.addEventListener(\r\n 'canplaythrough',\r\n function () {\r\n this._canPlayDefered.resolve( this );\r\n }.bind( this ),\r\n\r\n true );\r\n }\r\n\r\n return this._canPlayDefered.promise;\r\n }\r\n\r\n\r\n } ), 'osg', 'ImageStream' );\r\n\r\n MACROUTILS.setTypeID( ImageStream );\r\n\r\n return ImageStream;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/ImageStream.js\n ** module id = 48\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/Vec3',\r\n 'osg/BoundingBox',\r\n 'osg/TriangleIndexFunctor',\r\n 'osg/PrimitiveSet',\r\n 'osg/KdTreeRayIntersector',\r\n 'osg/KdTreeSphereIntersector'\r\n], function ( MACROUTILS, Vec3, BoundingBox, TriangleIndexFunctor, PrimitiveSet, KdTreeRayIntersector, KdTreeSphereIntersector ) {\r\n\r\n 'use strict';\r\n\r\n // **** GENERAL INFO ON KDTREE ****\r\n // A KdTree is a Spatial Partitionning Tree (http://en.wikipedia.org/wiki/Space_partitioning)\r\n // The type of tree is sort of defined by the splitting axis method:\r\n // - Per Axis split (octree/ kdtree)\r\n // - Arbritrary direction split (bsp)\r\n\r\n // The algorithm used for splitting, the name for finding best split is 'Surface Area Heuristic (SAH)'\r\n // Octree divide the space in 8 subspace (one box -> 8 sub boxes)\r\n // whereas kdtree does it by splitting population number in two equal group\r\n\r\n // Kd Tree http://en.wikipedia.org/wiki/K-d_tree\r\n // a given set of points is sorted along one Axis (e.g. X).\r\n // The sorted list is split at the median.\r\n // The result are two sets, one for each half-space (left and right).\r\n\r\n // Then, for the current node, the splitting-plane position (or the median-point) and depth is saved.\r\n // Finally, if the point-set has more than n point and the tree depth is below m \r\n // (with n,m chosen by the user, as build options), two child-nodes (L/R one for each point-set) \r\n // are created which themselfs repeat the pocedure.\r\n\r\n // The split-axis gets alternated at each depth, the split order is computed by checking the main\r\n // bounding box the length of its axis\r\n // **** GENERAL INFO ON KDTREE ****\r\n\r\n // The KdTree implemented here is flattened, ie, a node and its children all lie in the same array\r\n // The most important thing is the understanding of the variables first and second for each node\r\n // Their semantic depend if the node is a leaf or not\r\n // if it's a leaf :\r\n // first and second defines a range in the triangles array (triangles in the cell)\r\n // if it's not a leaf :\r\n // - first and second respectively represents the left and right sub children\r\n // We know that a node is a leaf if first is negative, in that case the range will be defined by\r\n // [ -first - 1, -first-1 + second ]\r\n var KdNode = function ( first, second ) {\r\n this._bb = new BoundingBox();\r\n this._first = first;\r\n this._second = second;\r\n // These variables represent the local clipped ray (for intersection test)\r\n // They are mostly temporary because they are recomputed for each intersection test\r\n this._nodeRayStart = Vec3.create();\r\n this._nodeRayEnd = Vec3.create();\r\n };\r\n\r\n var BuildKdTree = function ( kdTree ) {\r\n this._kdTree = kdTree;\r\n this._bb = new BoundingBox();\r\n this._primitiveIndices = null; // Uint32Array\r\n this._centers = null; // Float32Array\r\n this._axisOrder = [ 0, 0, 0 ];\r\n this._stackLength = 0;\r\n };\r\n\r\n BuildKdTree.prototype = {\r\n build: function ( options, geom ) {\r\n var targetTris = options._targetNumTrianglesPerLeaf;\r\n var vertexAttrib = geom.getVertexAttributeList().Vertex;\r\n if ( !vertexAttrib )\r\n return false;\r\n var vertices = vertexAttrib.getElements();\r\n if ( !vertices )\r\n return false;\r\n var nbVertices = vertices.length / 3;\r\n if ( nbVertices < targetTris )\r\n return false;\r\n\r\n this._bb.copy( geom.getBoundingBox() );\r\n this._kdTree.setVertices( vertices );\r\n\r\n this.computeDivisions( options );\r\n options._numVerticesProcessed += nbVertices;\r\n\r\n this.computeTriangles( geom );\r\n\r\n var node = new KdNode( -1, this._primitiveIndices.length );\r\n node._bb.copy( this._bb );\r\n var nodeNum = this._kdTree.addNode( node );\r\n\r\n var bb = new BoundingBox();\r\n bb.copy( this._bb );\r\n nodeNum = this.divide( options, bb, nodeNum, 0 );\r\n\r\n // Here we re-order the triangle list so that we can have a flat tree\r\n // _primitiveIndices is the ordered array of the triangle indices\r\n var triangles = this._kdTree.getTriangles();\r\n var primitives = this._primitiveIndices;\r\n var nbPrimitives = primitives.length;\r\n var triangleOrdered = new MACROUTILS.Uint32Array( triangles.length );\r\n for ( var i = 0, j = 0; i < nbPrimitives; ++i, j += 3 ) {\r\n var id = primitives[ i ] * 3;\r\n triangleOrdered[ j ] = triangles[ id ];\r\n triangleOrdered[ j + 1 ] = triangles[ id + 1 ];\r\n triangleOrdered[ j + 2 ] = triangles[ id + 2 ];\r\n }\r\n this._kdTree.setTriangles( triangleOrdered );\r\n\r\n return this._kdTree.getNodes().length > 0;\r\n },\r\n // The function first gather all the triangles of the geometry\r\n // It then computes the centroid for each triangle and initialize\r\n // of triangles indices that will refer to the main triangles array\r\n computeTriangles: function ( geom ) {\r\n var kdTree = this._kdTree;\r\n\r\n var totalLenArray = 0;\r\n var geomPrimitives = geom.primitives;\r\n var nbPrimitives = geomPrimitives.length;\r\n var i = 0;\r\n for ( i = 0; i < nbPrimitives; i++ ) {\r\n var prim = geomPrimitives[ i ];\r\n var mode = prim.getMode();\r\n // ignore points and line stuffs\r\n if ( mode === PrimitiveSet.TRIANGLES )\r\n totalLenArray += prim.getCount();\r\n else if ( mode === PrimitiveSet.TRIANGLE_STRIP || mode === PrimitiveSet.TRIANGLE_FAN )\r\n totalLenArray += ( prim.getCount() - 2 ) * 3;\r\n }\r\n var indices = new MACROUTILS.Uint32Array( totalLenArray );\r\n var next = 0;\r\n var cb = function ( i1, i2, i3 ) {\r\n if ( i1 === i2 || i1 === i3 || i2 === i3 )\r\n return;\r\n indices[ next ] = i1;\r\n indices[ next + 1 ] = i2;\r\n indices[ next + 2 ] = i3;\r\n next += 3;\r\n };\r\n\r\n var tif = new TriangleIndexFunctor( geom, cb );\r\n tif.apply();\r\n indices = indices.subarray( 0, next );\r\n\r\n var nbTriangles = indices.length;\r\n kdTree.setTriangles( indices );\r\n\r\n var vertices = kdTree.getVertices();\r\n\r\n this._centers = new MACROUTILS.Float32Array( nbTriangles );\r\n var centers = this._centers;\r\n this._primitiveIndices = new MACROUTILS.Uint32Array( nbTriangles / 3 );\r\n var primitives = this._primitiveIndices;\r\n\r\n var j = 0;\r\n for ( i = 0, j = 0; i < nbTriangles; i += 3, ++j ) {\r\n var iv0 = indices[ i ];\r\n var iv1 = indices[ i + 1 ];\r\n var iv2 = indices[ i + 2 ];\r\n\r\n // discard degenerate points\r\n if ( iv0 === iv1 || iv1 === iv2 || iv0 === iv2 )\r\n return;\r\n\r\n iv0 *= 3;\r\n iv1 *= 3;\r\n iv2 *= 3;\r\n\r\n var v0x = vertices[ iv0 ];\r\n var v0y = vertices[ iv0 + 1 ];\r\n var v0z = vertices[ iv0 + 2 ];\r\n\r\n var v1x = vertices[ iv1 ];\r\n var v1y = vertices[ iv1 + 1 ];\r\n var v1z = vertices[ iv1 + 2 ];\r\n\r\n var v2x = vertices[ iv2 ];\r\n var v2y = vertices[ iv2 + 1 ];\r\n var v2z = vertices[ iv2 + 2 ];\r\n\r\n var minx = Math.min( v0x, Math.min( v1x, v2x ) );\r\n var miny = Math.min( v0y, Math.min( v1y, v2y ) );\r\n var minz = Math.min( v0z, Math.min( v1z, v2z ) );\r\n\r\n var maxx = Math.max( v0x, Math.max( v1x, v2x ) );\r\n var maxy = Math.max( v0y, Math.max( v1y, v2y ) );\r\n var maxz = Math.max( v0z, Math.max( v1z, v2z ) );\r\n centers[ i ] = ( minx + maxx ) * 0.5;\r\n centers[ i + 1 ] = ( miny + maxy ) * 0.5;\r\n centers[ i + 2 ] = ( minz + maxz ) * 0.5;\r\n primitives[ j ] = j;\r\n }\r\n },\r\n computeDivisions: function ( options ) {\r\n this._stackLength = options._maxNumLevels;\r\n var max = this._bb._max;\r\n var min = this._bb._min;\r\n var dx = max[ 0 ] - min[ 0 ];\r\n var dy = max[ 1 ] - min[ 1 ];\r\n var dz = max[ 2 ] - min[ 2 ];\r\n var axisOrder = this._axisOrder;\r\n\r\n // We set the cutting order (longest edge aabb first)\r\n axisOrder[ 0 ] = ( dx >= dy && dx >= dz ) ? 0 : ( dy >= dz ) ? 1 : 2;\r\n axisOrder[ 2 ] = ( dx < dy && dx < dz ) ? 0 : ( dy < dz ) ? 1 : 2;\r\n var sum = axisOrder[ 0 ] + axisOrder[ 2 ];\r\n axisOrder[ 1 ] = sum === 3 ? 0 : sum === 2 ? 1 : 2;\r\n },\r\n // The core function of the kdtree building\r\n // It checks if the node need to be subdivide or not\r\n // If it decides it's a leaf, it computes the final bounding box of the node\r\n // and it ends here\r\n // If it's a node, then it puts the splitting axis position on the median population\r\n // On the same time it reorder the triangle index array\r\n divide: function ( options, bb, nodeIndex, level ) {\r\n var kdTree = this._kdTree;\r\n var primitives = this._primitiveIndices;\r\n var nodes = kdTree.getNodes();\r\n var node = nodes[ nodeIndex ];\r\n\r\n var first = node._first;\r\n var second = node._second;\r\n\r\n var needToDivide = level < this._stackLength && first < 0 && second > options._targetNumTrianglesPerLeaf;\r\n var istart = -first - 1;\r\n var iend = istart + second - 1;\r\n\r\n if ( !needToDivide ) {\r\n if ( first < 0 ) {\r\n // leaf is done, now compute bound on it.\r\n this.computeNodeBox( node, istart, iend );\r\n }\r\n return nodeIndex;\r\n }\r\n\r\n if ( first >= 0 )\r\n return nodeIndex;\r\n // leaf node as first < 0, so look at dividing it.\r\n\r\n var axis = this._axisOrder[ level % 3 ];\r\n var originalMin = bb._min[ axis ];\r\n var originalMax = bb._max[ axis ];\r\n\r\n var mid = ( originalMin + originalMax ) * 0.5;\r\n\r\n var originalLeftChildIndex = 0;\r\n var originalRightChildIndex = 0;\r\n var insitueDivision = false;\r\n\r\n var left = istart;\r\n var right = iend;\r\n\r\n var centers = this._centers;\r\n while ( left < right ) {\r\n while ( left < right && ( centers[ primitives[ left ] * 3 + axis ] <= mid ) ) {\r\n ++left;\r\n }\r\n\r\n while ( left < right && ( centers[ primitives[ right ] * 3 + axis ] > mid ) ) {\r\n --right;\r\n }\r\n\r\n if ( left < right ) {\r\n var tmp = primitives[ left ];\r\n primitives[ left ] = primitives[ right ];\r\n primitives[ right ] = tmp;\r\n ++left;\r\n --right;\r\n }\r\n }\r\n\r\n if ( left === right ) {\r\n if ( centers[ primitives[ left ] * 3 + axis ] <= mid ) ++left;\r\n else --right;\r\n }\r\n\r\n if ( ( right - istart ) <= -1 ) {\r\n originalLeftChildIndex = 0;\r\n originalRightChildIndex = nodeIndex;\r\n insitueDivision = true;\r\n } else if ( ( iend - left ) <= -1 ) {\r\n originalLeftChildIndex = nodeIndex;\r\n originalRightChildIndex = 0;\r\n insitueDivision = true;\r\n } else {\r\n originalLeftChildIndex = kdTree.addNode( new KdNode( -istart - 1, ( right - istart ) + 1 ) );\r\n originalRightChildIndex = kdTree.addNode( new KdNode( -left - 1, ( iend - left ) + 1 ) );\r\n }\r\n\r\n\r\n var restore = bb._max[ axis ];\r\n bb._max[ axis ] = mid;\r\n\r\n var leftChildIndex = originalLeftChildIndex !== 0 ? this.divide( options, bb, originalLeftChildIndex, level + 1 ) : 0;\r\n\r\n bb._max[ axis ] = restore;\r\n\r\n restore = bb._min[ axis ];\r\n bb._min[ axis ] = mid;\r\n\r\n var rightChildIndex = originalRightChildIndex !== 0 ? this.divide( options, bb, originalRightChildIndex, level + 1 ) : 0;\r\n\r\n bb._min[ axis ] = restore;\r\n\r\n if ( !insitueDivision ) {\r\n node._first = leftChildIndex;\r\n node._second = rightChildIndex;\r\n\r\n insitueDivision = true;\r\n\r\n var bnode = node._bb;\r\n bnode.init();\r\n if ( leftChildIndex !== 0 ) bnode.expandByBoundingBox( nodes[ leftChildIndex ]._bb );\r\n if ( rightChildIndex !== 0 ) bnode.expandByBoundingBox( nodes[ rightChildIndex ]._bb );\r\n }\r\n return nodeIndex;\r\n },\r\n // It computes the bounding box of the node so that the box contains all the triangles\r\n // of the cell\r\n computeNodeBox: function ( node, istart, iend ) {\r\n var minx = Infinity,\r\n miny = Infinity,\r\n minz = Infinity,\r\n maxx = -Infinity,\r\n maxy = -Infinity,\r\n maxz = -Infinity;\r\n var triangles = this._kdTree.getTriangles();\r\n var vertices = this._kdTree.getVertices();\r\n var primitives = this._primitiveIndices;\r\n for ( var i = istart; i <= iend; ++i ) {\r\n var id = primitives[ i ] * 3;\r\n var iv0 = triangles[ id ] * 3;\r\n var iv1 = triangles[ id + 1 ] * 3;\r\n var iv2 = triangles[ id + 2 ] * 3;\r\n\r\n var v0x = vertices[ iv0 ];\r\n var v0y = vertices[ iv0 + 1 ];\r\n var v0z = vertices[ iv0 + 2 ];\r\n\r\n var v1x = vertices[ iv1 ];\r\n var v1y = vertices[ iv1 + 1 ];\r\n var v1z = vertices[ iv1 + 2 ];\r\n\r\n var v2x = vertices[ iv2 ];\r\n var v2y = vertices[ iv2 + 1 ];\r\n var v2z = vertices[ iv2 + 2 ];\r\n\r\n minx = Math.min( minx, Math.min( v0x, Math.min( v1x, v2x ) ) );\r\n miny = Math.min( miny, Math.min( v0y, Math.min( v1y, v2y ) ) );\r\n minz = Math.min( minz, Math.min( v0z, Math.min( v1z, v2z ) ) );\r\n\r\n maxx = Math.max( maxx, Math.max( v0x, Math.max( v1x, v2x ) ) );\r\n maxy = Math.max( maxy, Math.max( v0y, Math.max( v1y, v2y ) ) );\r\n maxz = Math.max( maxz, Math.max( v0z, Math.max( v1z, v2z ) ) );\r\n }\r\n var epsilon = 1E-6;\r\n var bnode = node._bb;\r\n var bmin = bnode._min;\r\n var bmax = bnode._max;\r\n bmin[ 0 ] = minx - epsilon;\r\n bmin[ 1 ] = miny - epsilon;\r\n bmin[ 2 ] = minz - epsilon;\r\n bmax[ 0 ] = maxx + epsilon;\r\n bmax[ 1 ] = maxy + epsilon;\r\n bmax[ 2 ] = maxz + epsilon;\r\n }\r\n };\r\n\r\n var KdTree = function () {\r\n this._vertices = null;\r\n this._kdNodes = [];\r\n this._triangles = null; // Float32Array\r\n };\r\n\r\n KdTree.prototype = MACROUTILS.objectLibraryClass( {\r\n getVertices: function () {\r\n return this._vertices;\r\n },\r\n setVertices: function ( vertices ) {\r\n this._vertices = vertices;\r\n },\r\n getNodes: function () {\r\n return this._kdNodes;\r\n },\r\n getTriangles: function () {\r\n return this._triangles;\r\n },\r\n setTriangles: function ( triangles ) {\r\n this._triangles = triangles;\r\n },\r\n addNode: function ( node ) {\r\n this._kdNodes.push( node );\r\n return this._kdNodes.length - 1;\r\n },\r\n build: function ( options, geom ) {\r\n var buildTree = new BuildKdTree( this );\r\n return buildTree.build( options, geom );\r\n },\r\n intersectRay: function ( start, end, intersections, nodePath ) {\r\n if ( this._kdNodes.length === 0 ) {\r\n return false;\r\n }\r\n\r\n var numIntersectionsBefore = intersections.length;\r\n var intersector = new KdTreeRayIntersector( this._vertices, this._kdNodes, this._triangles, intersections, start, end, nodePath );\r\n intersector.intersect( this.getNodes()[ 0 ], start, end );\r\n\r\n return numIntersectionsBefore !== intersections.length;\r\n },\r\n intersectSphere: function ( center, radius, intersections, nodePath ) {\r\n if ( this._kdNodes.length === 0 ) {\r\n return false;\r\n }\r\n\r\n var numIntersectionsBefore = intersections.length;\r\n var intersector = new KdTreeSphereIntersector( this._vertices, this._kdNodes, this._triangles, intersections, center, radius, nodePath );\r\n intersector.intersect( this.getNodes()[ 0 ] );\r\n\r\n return numIntersectionsBefore !== intersections.length;\r\n }\r\n }, 'osg', 'KdTree' );\r\n\r\n return KdTree;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/KdTree.js\n ** module id = 49\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/NodeVisitor',\r\n 'osg/KdTree'\r\n], function ( MACROUTILS, NodeVisitor, KdTree ) {\r\n\r\n 'use strict';\r\n\r\n var KdTreeBuilder = function ( options ) {\r\n NodeVisitor.call( this );\r\n this._buildOptions = options !== undefined ? options : {\r\n _numVerticesProcessed: 0,\r\n _targetNumTrianglesPerLeaf: 50,\r\n _maxNumLevels: 20\r\n };\r\n };\r\n\r\n KdTreeBuilder.prototype = MACROUTILS.objectInherit( NodeVisitor.prototype, {\r\n apply: function ( node ) {\r\n if ( node.getShape ) {\r\n var shape = node.getShape();\r\n if ( shape === null ) { // we test if the kdTree is already built\r\n var kdTree = new KdTree();\r\n if ( kdTree.build( this._buildOptions, node ) ) {\r\n node.setShape( kdTree );\r\n }\r\n }\r\n }\r\n this.traverse( node );\r\n }\r\n } );\r\n\r\n return KdTreeBuilder;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/KdTreeBuilder.js\n ** module id = 50\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/StateAttribute',\r\n 'osg/Uniform',\r\n 'osg/Matrix',\r\n 'osg/Vec3',\r\n 'osg/Vec4',\r\n 'osg/Map',\r\n 'osg/Notify'\r\n], function ( MACROUTILS, StateAttribute, Uniform, Matrix, Vec3, Vec4, Map, Notify ) {\r\n 'use strict';\r\n\r\n\r\n // use the same kind of opengl lights\r\n // see http://www.glprogramming.com/red/chapter05.html\r\n\r\n\r\n var Light = function ( lightNumber, disable ) {\r\n StateAttribute.call( this );\r\n\r\n if ( lightNumber === undefined ) {\r\n lightNumber = 0;\r\n }\r\n\r\n this._ambient = [ 0.2, 0.2, 0.2, 1.0 ];\r\n this._diffuse = [ 0.8, 0.8, 0.8, 1.0 ];\r\n this._specular = [ 0.2, 0.2, 0.2, 1.0 ];\r\n\r\n // Default is directional as postion[3] is 0\r\n this._position = [ 0.0, 0.0, 1.0, 0.0 ];\r\n this._direction = [ 0.0, 0.0, -1.0 ];\r\n\r\n // TODO : refactor lights management w=1.0 (isHemi), w=-1.0\r\n // (isNotHemi) _ground contains the color but w says if it's\r\n // an hemi or not\r\n this._ground = [ 0.2, 0.2, 0.2, -1.0 ];\r\n\r\n this._spotCutoff = 180.0;\r\n this._spotBlend = 0.01;\r\n\r\n // the array contains constant, linear, quadratic factor\r\n this._attenuation = [ 1.0, 0.0, 0.0, 0.0 ];\r\n\r\n this._lightUnit = lightNumber;\r\n\r\n this._invMatrix = new Matrix.create();\r\n\r\n this._enable = !disable;\r\n\r\n this.dirty();\r\n\r\n };\r\n\r\n Light.DIRECTION = 'DIRECTION';\r\n Light.SPOT = 'SPOT';\r\n Light.POINT = 'POINT';\r\n Light.HEMI = 'HEMI';\r\n\r\n Light.uniforms = {};\r\n Light.prototype = MACROUTILS.objectLibraryClass( MACROUTILS.objectInherit( StateAttribute.prototype, {\r\n\r\n attributeType: 'Light',\r\n\r\n cloneType: function () {\r\n return new Light( this._lightUnit, true );\r\n },\r\n\r\n getTypeMember: function () {\r\n return this.attributeType + this._lightUnit;\r\n },\r\n\r\n getUniformName: function ( name ) {\r\n var prefix = this.getType() + this._lightUnit.toString();\r\n return prefix + '_uniform_' + name;\r\n },\r\n\r\n getHash: function () {\r\n return this.getTypeMember() + this.getLightType() + this.isEnabled().toString();\r\n },\r\n\r\n getOrCreateUniforms: function () {\r\n\r\n var obj = Light;\r\n var typeMember = this.getTypeMember();\r\n\r\n if ( obj.uniforms[ typeMember ] ) return obj.uniforms[ typeMember ];\r\n\r\n var uniformList = {\r\n 'ambient': 'createFloat4',\r\n 'diffuse': 'createFloat4',\r\n 'specular': 'createFloat4',\r\n\r\n 'attenuation': 'createFloat4',\r\n 'position': 'createFloat4',\r\n 'direction': 'createFloat3',\r\n\r\n 'spotCutOff': 'createFloat1',\r\n 'spotBlend': 'createFloat1',\r\n\r\n 'ground': 'createFloat3',\r\n\r\n 'matrix': 'createMatrix4',\r\n 'invMatrix': 'createMatrix4'\r\n\r\n };\r\n\r\n var uniforms = {};\r\n\r\n Object.keys( uniformList ).forEach( function ( key ) {\r\n\r\n var type = uniformList[ key ];\r\n var func = Uniform[ type ];\r\n uniforms[ key ] = func( this.getUniformName( key ) );\r\n\r\n }.bind( this ) );\r\n\r\n obj.uniforms[ typeMember ] = new Map( uniforms );\r\n\r\n return obj.uniforms[ typeMember ];\r\n },\r\n\r\n // enable / disable is not implemented in uniform\r\n // we should add it\r\n isEnabled: function () {\r\n return this._enable;\r\n },\r\n setEnabled: function ( bool ) {\r\n this._enable = bool;\r\n this.dirty();\r\n },\r\n // Deprecated methods, should be removed in the future\r\n isEnable: function () {\r\n Notify.log( 'Light.isEnable() is deprecated, use isEnabled instead' );\r\n return this.isEnabled();\r\n },\r\n setEnable: function ( bool ) {\r\n Notify.log( 'Light.setEnable() is deprecated, use setEnabled instead' );\r\n this.setEnabled( bool );\r\n },\r\n // colors\r\n setAmbient: function ( a ) {\r\n Vec4.copy( a, this._ambient );\r\n this.dirty();\r\n },\r\n getAmbient: function () {\r\n return this._ambient;\r\n },\r\n\r\n setDiffuse: function ( a ) {\r\n Vec4.copy( a, this._diffuse );\r\n this.dirty();\r\n },\r\n getDiffuse: function () {\r\n return this._diffuse;\r\n },\r\n\r\n setSpecular: function ( a ) {\r\n Vec4.copy( a, this._specular );\r\n this.dirty();\r\n },\r\n getSpecular: function () {\r\n return this._specular;\r\n },\r\n\r\n\r\n // position, also used for directional light\r\n // position[3] === 0 means directional\r\n // see creating lightsources http://www.glprogramming.com/red/chapter05.html\r\n setPosition: function ( a ) {\r\n Vec4.copy( a, this._position );\r\n this.dirty();\r\n },\r\n getPosition: function () {\r\n return this._position;\r\n },\r\n\r\n // unused for directional\r\n setDirection: function ( a ) {\r\n Vec3.copy( a, this._direction );\r\n this.dirty();\r\n },\r\n getDirection: function () {\r\n return this._direction;\r\n },\r\n\r\n\r\n setSpotCutoff: function ( a ) {\r\n this._spotCutoff = a;\r\n this.dirty();\r\n },\r\n getSpotCutoff: function () {\r\n return this._spotCutoff;\r\n },\r\n\r\n setSpotBlend: function ( a ) {\r\n this._spotBlend = a;\r\n this.dirty();\r\n },\r\n getSpotBlend: function () {\r\n return this._spotBlend;\r\n },\r\n\r\n // set/get the color of the ground\r\n setGround: function ( a ) {\r\n Vec3.copy( a, this._ground );\r\n this.dirty();\r\n },\r\n getGround: function () {\r\n return this._ground;\r\n },\r\n\r\n // attenuation coeff\r\n setConstantAttenuation: function ( value ) {\r\n this._attenuation[ 0 ] = value;\r\n this.dirty();\r\n },\r\n getConstantAttenuation: function () {\r\n return this._attenuation[ 0 ];\r\n },\r\n\r\n setLinearAttenuation: function ( value ) {\r\n this._attenuation[ 1 ] = value;\r\n this.dirty();\r\n },\r\n getLinearAttenuation: function () {\r\n return this._attenuation[ 1 ];\r\n },\r\n\r\n setQuadraticAttenuation: function ( value ) {\r\n this._attenuation[ 2 ] = value;\r\n this.dirty();\r\n },\r\n getQuadraticAttenuation: function () {\r\n return this._attenuation[ 2 ];\r\n },\r\n\r\n setLightType: function ( type ) {\r\n if ( type === Light.DIRECTION )\r\n return this.setLightAsDirection();\r\n else if ( type === Light.SPOT )\r\n return this.setLightAsSpot();\r\n else if ( type === Light.HEMI )\r\n return this.setLightAsHemi();\r\n return this.setLightAsPoint();\r\n },\r\n\r\n getLightType: function () {\r\n if ( this.isDirectionLight() )\r\n return Light.DIRECTION;\r\n else if ( this.isSpotLight() )\r\n return Light.SPOT;\r\n else if ( this.isHemiLight() )\r\n return Light.HEMI;\r\n return Light.POINT;\r\n },\r\n\r\n setLightAsSpot: function () {\r\n Vec4.set( 0.0, 0.0, 0.0, 1.0, this._position );\r\n Vec3.set( 0.0, 0.0, -1.0, this._direction );\r\n this._ground[ 3 ] = -1.0;\r\n this._spotCutoff = 90;\r\n this.dirty();\r\n },\r\n\r\n setLightAsPoint: function () {\r\n Vec4.set( 0.0, 0.0, 0.0, 1.0, this._position );\r\n Vec3.set( 0.0, 0.0, -1.0, this._direction );\r\n this._ground[ 3 ] = -1.0;\r\n this.dirty();\r\n },\r\n\r\n setLightAsDirection: function () {\r\n Vec4.set( 0.0, 0.0, 1.0, 0.0, this._position );\r\n this._spotCutoff = 180;\r\n this._ground[ 3 ] = -1.0;\r\n this.dirty();\r\n },\r\n\r\n setLightAsHemi: function () {\r\n Vec4.set( 0.0, 0.0, 1.0, 0.0, this._position );\r\n this._spotCutoff = 180;\r\n this._ground[ 3 ] = 1.0;\r\n this.dirty();\r\n },\r\n\r\n setLightNumber: function ( unit ) {\r\n this._lightUnit = unit;\r\n this.dirty();\r\n },\r\n\r\n getLightNumber: function () {\r\n return this._lightUnit;\r\n },\r\n\r\n // internal helper\r\n isSpotLight: function () {\r\n return this._spotCutoff < 180.0;\r\n },\r\n\r\n isDirectionLight: function () {\r\n return this._position[ 3 ] === 0.0 && this._ground[ 3 ] < 0.0;\r\n },\r\n\r\n isHemiLight: function () {\r\n return this._ground[ 3 ] >= 0.0;\r\n },\r\n\r\n // matrix is current model view, which can mean:\r\n // world (node refAbsolute)\r\n // world+camera (camera is refAbsolute)\r\n // world+camera+camera+... (camera relative...)\r\n applyPositionedUniform: function ( matrix /*, state*/ ) {\r\n\r\n var uniformMap = this.getOrCreateUniforms();\r\n Matrix.copy( matrix, uniformMap.matrix.get() );\r\n uniformMap.matrix.dirty();\r\n\r\n Matrix.copy( matrix, uniformMap.invMatrix.get() );\r\n uniformMap.invMatrix.get()[ 12 ] = 0;\r\n uniformMap.invMatrix.get()[ 13 ] = 0;\r\n uniformMap.invMatrix.get()[ 14 ] = 0;\r\n\r\n Matrix.inverse( uniformMap.invMatrix.get(), uniformMap.invMatrix.get() );\r\n Matrix.transpose( uniformMap.invMatrix.get(), uniformMap.invMatrix.get() );\r\n\r\n uniformMap.invMatrix.dirty();\r\n },\r\n\r\n apply: function ( /*state*/) {\r\n\r\n if ( !this._enable )\r\n return;\r\n\r\n var uniformMap = this.getOrCreateUniforms();\r\n\r\n Vec4.copy( this._position, uniformMap.position.get() );\r\n uniformMap.position.dirty();\r\n\r\n if ( this.isSpotLight() ) {\r\n var spotsize = Math.cos( this._spotCutoff * Math.PI / 180.0 );\r\n uniformMap.spotCutOff.get()[ 0 ] = spotsize;\r\n uniformMap.spotCutOff.dirty();\r\n\r\n uniformMap.spotBlend.get()[ 0 ] = ( 1.0 - spotsize ) * this._spotBlend;\r\n uniformMap.spotBlend.dirty();\r\n\r\n Vec3.copy( this._direction, uniformMap.direction.get() );\r\n uniformMap.direction.dirty();\r\n }\r\n if ( this.isHemiLight() ) {\r\n Vec3.copy( this._ground, uniformMap.ground.get() );\r\n uniformMap.ground.dirty();\r\n }\r\n\r\n Vec4.copy( this._attenuation, uniformMap.attenuation.get() );\r\n uniformMap.attenuation.dirty();\r\n\r\n Vec4.copy( this._diffuse, uniformMap.diffuse.get() );\r\n uniformMap.diffuse.dirty();\r\n\r\n Vec4.copy( this._specular, uniformMap.specular.get() );\r\n uniformMap.specular.dirty();\r\n\r\n Vec4.copy( this._ambient, uniformMap.ambient.get() );\r\n uniformMap.ambient.dirty();\r\n\r\n\r\n this.setDirty( false );\r\n }\r\n\r\n } ), 'osg', 'Light' );\r\n\r\n MACROUTILS.setTypeID( Light );\r\n\r\n return Light;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/Light.js\n ** module id = 51\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/Node'\r\n], function ( MACROUTILS, Node ) {\r\n\r\n /**\r\n * LightSource is a positioned node to use with StateAttribute Light\r\n * @class LightSource\r\n */\r\n var LightSource = function () {\r\n Node.call( this );\r\n this._light = undefined;\r\n };\r\n\r\n /** @lends LightSource.prototype */\r\n LightSource.prototype = MACROUTILS.objectLibraryClass( MACROUTILS.objectInherit( Node.prototype, {\r\n getLight: function () {\r\n return this._light;\r\n },\r\n setLight: function ( light ) {\r\n this._light = light;\r\n }\r\n } ), 'osg', 'LightSource' );\r\n\r\n MACROUTILS.setTypeID( LightSource );\r\n\r\n return LightSource;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/LightSource.js\n ** module id = 52\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/StateAttribute',\r\n], function ( MACROUTILS, StateAttribute ) {\r\n\r\n var LineWidth = function ( lineWidth ) {\r\n StateAttribute.call( this );\r\n this.lineWidth = 1.0;\r\n if ( lineWidth !== undefined ) {\r\n this.lineWidth = lineWidth;\r\n }\r\n };\r\n LineWidth.prototype = MACROUTILS.objectLibraryClass( MACROUTILS.objectInherit( StateAttribute.prototype, {\r\n attributeType: 'LineWidth',\r\n cloneType: function () {\r\n return new LineWidth();\r\n },\r\n apply: function ( state ) {\r\n state.getGraphicContext().lineWidth( this.lineWidth );\r\n }\r\n } ), 'osg', 'LineWidth' );\r\n\r\n return LineWidth;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/LineWidth.js\n ** module id = 53\n ** module chunks = 0 1\n **/","/**\r\n * @author Jordi Torres\r\n */\r\n\r\n\r\ndefine( [\r\n 'osg/Utils',\r\n 'osg/Node',\r\n 'osg/NodeVisitor',\r\n 'osg/Matrix',\r\n 'osg/Vec3',\r\n 'osg/BoundingSphere'\r\n], function ( MACROUTILS, Node, NodeVisitor, Matrix, Vec3, BoundingSphere ) {\r\n /**\r\n * Lod that can contains child node\r\n * @class Lod\r\n */\r\n var Lod = function () {\r\n Node.call( this );\r\n this._radius = -1;\r\n this._range = [];\r\n this._rangeMode = Lod.DISTANCE_FROM_EYE_POINT;\r\n this._userDefinedCenter = [];\r\n this._centerMode = Lod.USE_BOUNDING_SPHERE_CENTER;\r\n };\r\n\r\n Lod.DISTANCE_FROM_EYE_POINT = 0;\r\n Lod.PIXEL_SIZE_ON_SCREEN = 1;\r\n\r\n Lod.USE_BOUNDING_SPHERE_CENTER = 0;\r\n Lod.USER_DEFINED_CENTER = 1;\r\n Lod.UNION_OF_BOUNDING_SPHERE_AND_USER_DEFINED = 2;\r\n\r\n /** @lends Lod.prototype */\r\n Lod.prototype = MACROUTILS.objectLibraryClass( MACROUTILS.objectInherit( Node.prototype, {\r\n // Functions here\r\n getRadius: function () {\r\n return this._radius;\r\n },\r\n\r\n /** Set the object-space reference radius of the volume enclosed by the LOD.\r\n * Used to determine the bounding sphere of the LOD in the absence of any children.*/\r\n setRadius: function ( radius ) {\r\n this._radius = radius;\r\n },\r\n\r\n setCenter: function ( center ) {\r\n if ( this._centerMode !== Lod.UNION_OF_BOUNDING_SPHERE_AND_USER_DEFINED )\r\n this._centerMode = Lod.USER_DEFINED_CENTER;\r\n this._userDefinedCenter = center;\r\n },\r\n\r\n getCenter: function () {\r\n if ( ( this._centerMode === Lod.USER_DEFINED_CENTER ) || ( this._centerMode === Lod.UNION_OF_BOUNDING_SPHERE_AND_USER_DEFINED ) )\r\n return this._userDefinedCenter;\r\n else return this.getBound().center();\r\n },\r\n\r\n setCenterMode: function ( centerMode ) {\r\n this._centerMode = centerMode;\r\n },\r\n\r\n computeBound: function ( bsphere ) {\r\n if ( this._centerMode === Lod.USER_DEFINED_CENTER && this._radius >= 0.0 ) {\r\n bsphere.set( this._userDefinedCenter, this._radius );\r\n return bsphere;\r\n } else if ( this._centerMode === Lod.UNION_OF_BOUNDING_SPHERE_AND_USER_DEFINED && this._radius >= 0.0 ) {\r\n bsphere.set( this._userDefinedCenter, this._radius );\r\n var bs = new BoundingSphere();\r\n bsphere.expandByBoundingSphere( Node.prototype.computeBound.call( this, bs ) );\r\n return bsphere;\r\n } else {\r\n Node.prototype.computeBound.call( this, bsphere );\r\n return bsphere;\r\n }\r\n },\r\n\r\n projectBoundingSphere: ( function () {\r\n // from http://www.iquilezles.org/www/articles/sphereproj/sphereproj.htm\r\n // Sample code at http://www.shadertoy.com/view/XdBGzd?\r\n var o = Vec3.create();\r\n return function ( sph, camMatrix, fle ) {\r\n Matrix.transformVec3( camMatrix, sph.center(), o );\r\n var r2 = sph.radius2();\r\n var z2 = o[ 2 ] * o[ 2 ];\r\n var l2 = Vec3.length2( o );\r\n var area = -Math.PI * fle * fle * r2 * Math.sqrt( Math.abs( ( l2 - r2 ) / ( r2 - z2 ) ) ) / ( r2 - z2 );\r\n return area;\r\n };\r\n } )(),\r\n\r\n setRangeMode: function ( mode ) {\r\n //TODO: check if mode is correct\r\n this._rangeMode = mode;\r\n },\r\n\r\n addChildNode: function ( node ) {\r\n\r\n Node.prototype.addChild.call( this, node );\r\n if ( this.children.length > this._range.length ) {\r\n var r = [];\r\n var max = 0.0;\r\n if ( this._range.lenght > 0 )\r\n max = this._range[ this._range.length - 1 ][ 1 ];\r\n r.push( [ max, max ] );\r\n this._range.push( r );\r\n }\r\n return true;\r\n },\r\n\r\n addChild: function ( node, min, max ) {\r\n Node.prototype.addChild.call( this, node );\r\n\r\n if ( this.children.length > this._range.length ) {\r\n var r = [];\r\n r.push( [ min, min ] );\r\n this._range.push( r );\r\n }\r\n this._range[ this.children.length - 1 ][ 0 ] = min;\r\n this._range[ this.children.length - 1 ][ 1 ] = max;\r\n return true;\r\n },\r\n\r\n traverse: ( function () {\r\n\r\n // avoid to generate variable on the heap to limit garbage collection\r\n // instead create variable and use the same each time\r\n var zeroVector = Vec3.create();\r\n var eye = Vec3.create();\r\n var viewModel = Matrix.create();\r\n\r\n return function ( visitor ) {\r\n var traversalMode = visitor.traversalMode;\r\n\r\n switch ( traversalMode ) {\r\n\r\n case NodeVisitor.TRAVERSE_ALL_CHILDREN:\r\n\r\n for ( var index = 0; index < this.children.length; index++ ) {\r\n this.children[ index ].accept( visitor );\r\n }\r\n break;\r\n\r\n case ( NodeVisitor.TRAVERSE_ACTIVE_CHILDREN ):\r\n var requiredRange = 0;\r\n var matrix = visitor.getCurrentModelViewMatrix();\r\n Matrix.inverse( matrix, viewModel );\r\n // Calculate distance from viewpoint\r\n if ( this._rangeMode === Lod.DISTANCE_FROM_EYE_POINT ) {\r\n Matrix.transformVec3( viewModel, zeroVector, eye );\r\n var d = Vec3.distance( eye, this.getBound().center() );\r\n requiredRange = d;\r\n } else {\r\n // Let's calculate pixels on screen\r\n var projmatrix = visitor.getCurrentProjectionMatrix();\r\n // focal lenght is the value stored in projmatrix[0]\r\n requiredRange = this.projectBoundingSphere( this.getBound(), matrix, projmatrix[ 0 ] );\r\n // Multiply by a factor to get the real area value\r\n requiredRange = ( requiredRange * visitor.getViewport().width() * visitor.getViewport().width() ) * 0.25;\r\n }\r\n\r\n var numChildren = this.children.length;\r\n if ( this._range.length < numChildren ) numChildren = this._range.length;\r\n\r\n for ( var j = 0; j < numChildren; ++j ) {\r\n if ( this._range[ j ][ 0 ] <= requiredRange && requiredRange < this._range[ j ][ 1 ] ) {\r\n this.children[ j ].accept( visitor );\r\n }\r\n }\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n };\r\n } )()\r\n\r\n } ), 'osg', 'Lod' );\r\n\r\n MACROUTILS.setTypeID( Lod );\r\n return Lod;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/Lod.js\n ** module id = 54\n ** module chunks = 0 1\n **/","define( [\r\n\r\n], function () {\r\n 'use strict';\r\n\r\n var Map = function ( obj ) {\r\n\r\n Object.defineProperty( this, '_dirty', {\r\n configurable: true,\r\n enumerable: false,\r\n writable: true,\r\n value: true\r\n } );\r\n\r\n Object.defineProperty( this, '_keys', {\r\n configurable: true,\r\n enumerable: false,\r\n writable: true,\r\n value: undefined\r\n } );\r\n\r\n if ( obj ) this.setMap( obj );\r\n };\r\n\r\n Map.prototype = {\r\n\r\n getKeys: function () {\r\n if ( this._dirty ) {\r\n this._keys = Object.keys( this );\r\n this._dirty = false;\r\n }\r\n return this._keys;\r\n },\r\n\r\n dirty: function () {\r\n this._dirty = true;\r\n },\r\n\r\n remove: function ( key ) {\r\n //this[ key ] = undefined;\r\n delete this[ key ];\r\n this.dirty();\r\n this.getKeys();\r\n },\r\n\r\n setMap: function ( map ) {\r\n\r\n var i, l;\r\n // remove all\r\n var keys = Object.keys( this );\r\n if ( keys.length > 0 ) {\r\n for ( i = 0, l = keys.length; i < l; i++ )\r\n delete this[ keys[ i ] ];\r\n }\r\n\r\n // add new\r\n keys = Object.keys( map );\r\n if ( keys.length > 0 ) {\r\n for ( i = 0, l = keys.length; i < l; i++ ) {\r\n var key = keys[ i ];\r\n this[ key ] = map[ key ];\r\n }\r\n }\r\n\r\n this.dirty();\r\n }\r\n\r\n };\r\n\r\n return Map;\r\n\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/Map.js\n ** module id = 55\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/StateAttribute',\r\n 'osg/Vec4',\r\n 'osg/Uniform',\r\n 'osg/Map'\r\n], function ( MACROUTILS, StateAttribute, Vec4, Uniform, Map ) {\r\n 'use strict';\r\n\r\n // Define a material attribute\r\n var Material = function () {\r\n StateAttribute.call( this );\r\n this._ambient = [ 0.2, 0.2, 0.2, 1.0 ];\r\n this._diffuse = [ 0.8, 0.8, 0.8, 1.0 ];\r\n this._specular = [ 0.0, 0.0, 0.0, 1.0 ];\r\n this._emission = [ 0.0, 0.0, 0.0, 1.0 ];\r\n this._shininess = 12.5;\r\n this._shadeless = false;\r\n };\r\n\r\n Material.prototype = MACROUTILS.objectLibraryClass( MACROUTILS.objectInherit( StateAttribute.prototype, {\r\n\r\n attributeType: 'Material',\r\n\r\n cloneType: function () {\r\n return new Material();\r\n },\r\n\r\n getParameterName: function ( name ) {\r\n return this.getType() + '_uniform_' + name;\r\n },\r\n\r\n getOrCreateUniforms: function () {\r\n var obj = Material;\r\n if ( obj.uniforms ) return obj.uniforms;\r\n\r\n var uniformList = {\r\n 'ambient': Uniform.createFloat4( [ 0, 0, 0, 0 ], 'MaterialAmbient' ),\r\n 'diffuse': Uniform.createFloat4( [ 0, 0, 0, 0 ], 'MaterialDiffuse' ),\r\n 'specular': Uniform.createFloat4( [ 0, 0, 0, 0 ], 'MaterialSpecular' ),\r\n 'emission': Uniform.createFloat4( [ 0, 0, 0, 0 ], 'MaterialEmission' ),\r\n 'shininess': Uniform.createFloat1( [ 0 ], 'MaterialShininess' )\r\n };\r\n\r\n obj.uniforms = new Map( uniformList );\r\n return obj.uniforms;\r\n },\r\n\r\n\r\n setEmission: function ( a ) {\r\n Vec4.copy( a, this._emission );\r\n this._dirty = true;\r\n },\r\n\r\n getEmission: function () {\r\n return this._emission;\r\n },\r\n\r\n\r\n setAmbient: function ( a ) {\r\n Vec4.copy( a, this._ambient );\r\n this._dirty = true;\r\n },\r\n\r\n getAmbient: function () {\r\n return this._ambient;\r\n },\r\n\r\n\r\n setSpecular: function ( a ) {\r\n Vec4.copy( a, this._specular );\r\n this._dirty = true;\r\n },\r\n\r\n getSpecular: function () {\r\n return this._specular;\r\n },\r\n\r\n\r\n setDiffuse: function ( a ) {\r\n Vec4.copy( a, this._diffuse );\r\n this._dirty = true;\r\n },\r\n\r\n getDiffuse: function () {\r\n return this._diffuse;\r\n },\r\n\r\n\r\n setShininess: function ( a ) {\r\n this._shininess = a;\r\n this._dirty = true;\r\n },\r\n\r\n getShininess: function () {\r\n return this._shininess;\r\n },\r\n\r\n\r\n setTransparency: function ( a ) {\r\n this._diffuse[ 3 ] = 1.0 - a;\r\n this._dirty = true;\r\n },\r\n\r\n getTransparency: function () {\r\n return this._diffuse[ 3 ];\r\n },\r\n\r\n\r\n\r\n apply: function ( /*state*/) {\r\n var uniforms = this.getOrCreateUniforms();\r\n\r\n uniforms.ambient.set( this._ambient );\r\n uniforms.diffuse.set( this._diffuse );\r\n uniforms.specular.set( this._specular );\r\n uniforms.emission.set( this._emission );\r\n uniforms.shininess.set( [ this._shininess ] );\r\n\r\n this.setDirty( false );\r\n }\r\n\r\n\r\n } ), 'osg', 'Material' );\r\n\r\n return Material;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/Material.js\n ** module id = 56\n ** module chunks = 0 1\n **/","define( [], function () {\r\n\r\n var clamp = function ( x, min, max ) {\r\n // http://jsperf.com/math-clamp\r\n // http://jsperf.com/clamping-methods/2\r\n return Math.min( max, Math.max( min, x ) );\r\n };\r\n\r\n var smoothStep = function ( edge0, edge1, x ) {\r\n var t = clamp( ( x - edge0 ) / ( edge1 - edge0 ), 0.0, 1.0 );\r\n return t * t * ( 3.0 - 2.0 * t );\r\n };\r\n\r\n return {\r\n clamp: clamp,\r\n smoothStep: smoothStep\r\n };\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/Math.js\n ** module id = 57\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/BoundingBox',\r\n 'osg/Notify',\r\n 'osg/Plane',\r\n 'osg/Quat',\r\n 'osg/Vec3',\r\n 'osg/Vec4'\r\n], function ( BoundingBox, Notify, Plane, Quat, Vec3, Vec4 ) {\r\n\r\n 'use strict';\r\n\r\n /** @class Matrix Operations */\r\n var Matrix = {\r\n\r\n create: function () {\r\n return [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ];\r\n },\r\n isIdentity: function ( matrix ) {\r\n for ( var i = 0; i < 16; i++ ) {\r\n if ( matrix[ i ] !== Matrix.identity[ i ] ) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n },\r\n valid: function ( matrix ) {\r\n for ( var i = 0; i < 16; i++ ) {\r\n if ( isNaN( matrix[ i ] ) ) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n },\r\n setRow: function ( matrix, row, v0, v1, v2, v3 ) {\r\n var rowIndex = row * 4;\r\n matrix[ rowIndex + 0 ] = v0;\r\n matrix[ rowIndex + 1 ] = v1;\r\n matrix[ rowIndex + 2 ] = v2;\r\n matrix[ rowIndex + 3 ] = v3;\r\n },\r\n innerProduct: function ( a, b, r, c ) {\r\n var rIndex = r * 4;\r\n return ( ( a[ rIndex + 0 ] * b[ 0 + c ] ) + ( a[ rIndex + 1 ] * b[ 4 + c ] ) + ( a[ rIndex + 2 ] * b[ 8 + c ] ) + ( a[ rIndex + 3 ] * b[ 12 + c ] ) );\r\n },\r\n\r\n set: function ( matrix, row, col, value ) {\r\n matrix[ row * 4 + col ] = value;\r\n return value;\r\n },\r\n\r\n get: function ( matrix, row, col ) {\r\n return matrix[ row * 4 + col ];\r\n },\r\n\r\n makeIdentity: function ( matrix ) {\r\n if ( matrix === undefined ) {\r\n Notify.warn( 'no matrix destination !' );\r\n return Matrix.create();\r\n }\r\n Matrix.copy( Matrix.identity, matrix );\r\n\r\n // explaining comment\r\n //Matrix.setRow( matrix, 0, 1.0, 0.0, 0.0, 0.0 );\r\n //Matrix.setRow( matrix, 1, 0.0, 1.0, 0.0, 0.0 );\r\n //Matrix.setRow( matrix, 2, 0.0, 0.0, 1.0, 0.0 );\r\n //Matrix.setRow( matrix, 3, 0.0, 0.0, 0.0, 1.0 );\r\n return matrix;\r\n },\r\n\r\n /**\r\n * @param {Number} x position\r\n * @param {Number} y position\r\n * @param {Number} z position\r\n * @param {Array} matrix to write result\r\n */\r\n makeTranslate: function ( x, y, z, matrix ) {\r\n if ( matrix === undefined ) {\r\n Notify.warn( 'no matrix destination !' );\r\n matrix = Matrix.create();\r\n Matrix.setRow( matrix, 3, x, y, z, 1.0 );\r\n return matrix;\r\n }\r\n Matrix.setRow( matrix, 0, 1.0, 0.0, 0.0, 0.0 );\r\n Matrix.setRow( matrix, 1, 0.0, 1.0, 0.0, 0.0 );\r\n Matrix.setRow( matrix, 2, 0.0, 0.0, 1.0, 0.0 );\r\n Matrix.setRow( matrix, 3, x, y, z, 1.0 );\r\n return matrix;\r\n },\r\n\r\n setTrans: function ( matrix, x, y, z ) {\r\n matrix[ 12 ] = x;\r\n matrix[ 13 ] = y;\r\n matrix[ 14 ] = z;\r\n return matrix;\r\n },\r\n\r\n getTrans: function ( matrix, result ) {\r\n result[ 0 ] = matrix[ 12 ];\r\n result[ 1 ] = matrix[ 13 ];\r\n result[ 2 ] = matrix[ 14 ];\r\n return result;\r\n },\r\n\r\n // do a * b and result in a\r\n preMult: function ( a, b ) {\r\n var atmp0, atmp1, atmp2, atmp3;\r\n\r\n atmp0 = ( b[ 0 ] * a[ 0 ] ) + ( b[ 1 ] * a[ 4 ] ) + ( b[ 2 ] * a[ 8 ] ) + ( b[ 3 ] * a[ 12 ] );\r\n atmp1 = ( b[ 4 ] * a[ 0 ] ) + ( b[ 5 ] * a[ 4 ] ) + ( b[ 6 ] * a[ 8 ] ) + ( b[ 7 ] * a[ 12 ] );\r\n atmp2 = ( b[ 8 ] * a[ 0 ] ) + ( b[ 9 ] * a[ 4 ] ) + ( b[ 10 ] * a[ 8 ] ) + ( b[ 11 ] * a[ 12 ] );\r\n atmp3 = ( b[ 12 ] * a[ 0 ] ) + ( b[ 13 ] * a[ 4 ] ) + ( b[ 14 ] * a[ 8 ] ) + ( b[ 15 ] * a[ 12 ] );\r\n a[ 0 ] = atmp0;\r\n a[ 4 ] = atmp1;\r\n a[ 8 ] = atmp2;\r\n a[ 12 ] = atmp3;\r\n\r\n atmp0 = ( b[ 0 ] * a[ 1 ] ) + ( b[ 1 ] * a[ 5 ] ) + ( b[ 2 ] * a[ 9 ] ) + ( b[ 3 ] * a[ 13 ] );\r\n atmp1 = ( b[ 4 ] * a[ 1 ] ) + ( b[ 5 ] * a[ 5 ] ) + ( b[ 6 ] * a[ 9 ] ) + ( b[ 7 ] * a[ 13 ] );\r\n atmp2 = ( b[ 8 ] * a[ 1 ] ) + ( b[ 9 ] * a[ 5 ] ) + ( b[ 10 ] * a[ 9 ] ) + ( b[ 11 ] * a[ 13 ] );\r\n atmp3 = ( b[ 12 ] * a[ 1 ] ) + ( b[ 13 ] * a[ 5 ] ) + ( b[ 14 ] * a[ 9 ] ) + ( b[ 15 ] * a[ 13 ] );\r\n a[ 1 ] = atmp0;\r\n a[ 5 ] = atmp1;\r\n a[ 9 ] = atmp2;\r\n a[ 13 ] = atmp3;\r\n\r\n atmp0 = ( b[ 0 ] * a[ 2 ] ) + ( b[ 1 ] * a[ 6 ] ) + ( b[ 2 ] * a[ 10 ] ) + ( b[ 3 ] * a[ 14 ] );\r\n atmp1 = ( b[ 4 ] * a[ 2 ] ) + ( b[ 5 ] * a[ 6 ] ) + ( b[ 6 ] * a[ 10 ] ) + ( b[ 7 ] * a[ 14 ] );\r\n atmp2 = ( b[ 8 ] * a[ 2 ] ) + ( b[ 9 ] * a[ 6 ] ) + ( b[ 10 ] * a[ 10 ] ) + ( b[ 11 ] * a[ 14 ] );\r\n atmp3 = ( b[ 12 ] * a[ 2 ] ) + ( b[ 13 ] * a[ 6 ] ) + ( b[ 14 ] * a[ 10 ] ) + ( b[ 15 ] * a[ 14 ] );\r\n a[ 2 ] = atmp0;\r\n a[ 6 ] = atmp1;\r\n a[ 10 ] = atmp2;\r\n a[ 14 ] = atmp3;\r\n\r\n atmp0 = ( b[ 0 ] * a[ 3 ] ) + ( b[ 1 ] * a[ 7 ] ) + ( b[ 2 ] * a[ 11 ] ) + ( b[ 3 ] * a[ 15 ] );\r\n atmp1 = ( b[ 4 ] * a[ 3 ] ) + ( b[ 5 ] * a[ 7 ] ) + ( b[ 6 ] * a[ 11 ] ) + ( b[ 7 ] * a[ 15 ] );\r\n atmp2 = ( b[ 8 ] * a[ 3 ] ) + ( b[ 9 ] * a[ 7 ] ) + ( b[ 10 ] * a[ 11 ] ) + ( b[ 11 ] * a[ 15 ] );\r\n atmp3 = ( b[ 12 ] * a[ 3 ] ) + ( b[ 13 ] * a[ 7 ] ) + ( b[ 14 ] * a[ 11 ] ) + ( b[ 15 ] * a[ 15 ] );\r\n a[ 3 ] = atmp0;\r\n a[ 7 ] = atmp1;\r\n a[ 11 ] = atmp2;\r\n a[ 15 ] = atmp3;\r\n\r\n return a;\r\n },\r\n\r\n // do a * b and result in b\r\n postMult: function ( a, b ) {\r\n var btmp0, btmp1, btmp2, btmp3;\r\n // post mult\r\n btmp0 = ( b[ 0 ] * a[ 0 ] ) + ( b[ 1 ] * a[ 4 ] ) + ( b[ 2 ] * a[ 8 ] ) + ( b[ 3 ] * a[ 12 ] );\r\n btmp1 = ( b[ 0 ] * a[ 1 ] ) + ( b[ 1 ] * a[ 5 ] ) + ( b[ 2 ] * a[ 9 ] ) + ( b[ 3 ] * a[ 13 ] );\r\n btmp2 = ( b[ 0 ] * a[ 2 ] ) + ( b[ 1 ] * a[ 6 ] ) + ( b[ 2 ] * a[ 10 ] ) + ( b[ 3 ] * a[ 14 ] );\r\n btmp3 = ( b[ 0 ] * a[ 3 ] ) + ( b[ 1 ] * a[ 7 ] ) + ( b[ 2 ] * a[ 11 ] ) + ( b[ 3 ] * a[ 15 ] );\r\n b[ 0 ] = btmp0;\r\n b[ 1 ] = btmp1;\r\n b[ 2 ] = btmp2;\r\n b[ 3 ] = btmp3;\r\n\r\n btmp0 = ( b[ 4 ] * a[ 0 ] ) + ( b[ 5 ] * a[ 4 ] ) + ( b[ 6 ] * a[ 8 ] ) + ( b[ 7 ] * a[ 12 ] );\r\n btmp1 = ( b[ 4 ] * a[ 1 ] ) + ( b[ 5 ] * a[ 5 ] ) + ( b[ 6 ] * a[ 9 ] ) + ( b[ 7 ] * a[ 13 ] );\r\n btmp2 = ( b[ 4 ] * a[ 2 ] ) + ( b[ 5 ] * a[ 6 ] ) + ( b[ 6 ] * a[ 10 ] ) + ( b[ 7 ] * a[ 14 ] );\r\n btmp3 = ( b[ 4 ] * a[ 3 ] ) + ( b[ 5 ] * a[ 7 ] ) + ( b[ 6 ] * a[ 11 ] ) + ( b[ 7 ] * a[ 15 ] );\r\n b[ 4 ] = btmp0;\r\n b[ 5 ] = btmp1;\r\n b[ 6 ] = btmp2;\r\n b[ 7 ] = btmp3;\r\n\r\n btmp0 = ( b[ 8 ] * a[ 0 ] ) + ( b[ 9 ] * a[ 4 ] ) + ( b[ 10 ] * a[ 8 ] ) + ( b[ 11 ] * a[ 12 ] );\r\n btmp1 = ( b[ 8 ] * a[ 1 ] ) + ( b[ 9 ] * a[ 5 ] ) + ( b[ 10 ] * a[ 9 ] ) + ( b[ 11 ] * a[ 13 ] );\r\n btmp2 = ( b[ 8 ] * a[ 2 ] ) + ( b[ 9 ] * a[ 6 ] ) + ( b[ 10 ] * a[ 10 ] ) + ( b[ 11 ] * a[ 14 ] );\r\n btmp3 = ( b[ 8 ] * a[ 3 ] ) + ( b[ 9 ] * a[ 7 ] ) + ( b[ 10 ] * a[ 11 ] ) + ( b[ 11 ] * a[ 15 ] );\r\n b[ 8 ] = btmp0;\r\n b[ 9 ] = btmp1;\r\n b[ 10 ] = btmp2;\r\n b[ 11 ] = btmp3;\r\n\r\n btmp0 = ( b[ 12 ] * a[ 0 ] ) + ( b[ 13 ] * a[ 4 ] ) + ( b[ 14 ] * a[ 8 ] ) + ( b[ 15 ] * a[ 12 ] );\r\n btmp1 = ( b[ 12 ] * a[ 1 ] ) + ( b[ 13 ] * a[ 5 ] ) + ( b[ 14 ] * a[ 9 ] ) + ( b[ 15 ] * a[ 13 ] );\r\n btmp2 = ( b[ 12 ] * a[ 2 ] ) + ( b[ 13 ] * a[ 6 ] ) + ( b[ 14 ] * a[ 10 ] ) + ( b[ 15 ] * a[ 14 ] );\r\n btmp3 = ( b[ 12 ] * a[ 3 ] ) + ( b[ 13 ] * a[ 7 ] ) + ( b[ 14 ] * a[ 11 ] ) + ( b[ 15 ] * a[ 15 ] );\r\n b[ 12 ] = btmp0;\r\n b[ 13 ] = btmp1;\r\n b[ 14 ] = btmp2;\r\n b[ 15 ] = btmp3;\r\n\r\n return b;\r\n },\r\n multa: function ( a, b, r ) {\r\n if ( r === a ) {\r\n return Matrix.preMult( a, b );\r\n } else if ( r === b ) {\r\n return Matrix.postMult( a, b );\r\n } else {\r\n if ( r === undefined ) {\r\n Notify.warn( 'no matrix destination !' );\r\n r = Matrix.create();\r\n }\r\n r[ 0 ] = b[ 0 ] * a[ 0 ] + b[ 1 ] * a[ 4 ] + b[ 2 ] * a[ 8 ] + b[ 3 ] * a[ 12 ];\r\n r[ 1 ] = b[ 0 ] * a[ 1 ] + b[ 1 ] * a[ 5 ] + b[ 2 ] * a[ 9 ] + b[ 3 ] * a[ 13 ];\r\n r[ 2 ] = b[ 0 ] * a[ 2 ] + b[ 1 ] * a[ 6 ] + b[ 2 ] * a[ 10 ] + b[ 3 ] * a[ 14 ];\r\n r[ 3 ] = b[ 0 ] * a[ 3 ] + b[ 1 ] * a[ 7 ] + b[ 2 ] * a[ 11 ] + b[ 3 ] * a[ 15 ];\r\n\r\n r[ 4 ] = b[ 4 ] * a[ 0 ] + b[ 5 ] * a[ 4 ] + b[ 6 ] * a[ 8 ] + b[ 7 ] * a[ 12 ];\r\n r[ 5 ] = b[ 4 ] * a[ 1 ] + b[ 5 ] * a[ 5 ] + b[ 6 ] * a[ 9 ] + b[ 7 ] * a[ 13 ];\r\n r[ 6 ] = b[ 4 ] * a[ 2 ] + b[ 5 ] * a[ 6 ] + b[ 6 ] * a[ 10 ] + b[ 7 ] * a[ 14 ];\r\n r[ 7 ] = b[ 4 ] * a[ 3 ] + b[ 5 ] * a[ 7 ] + b[ 6 ] * a[ 11 ] + b[ 7 ] * a[ 15 ];\r\n\r\n r[ 8 ] = b[ 8 ] * a[ 0 ] + b[ 9 ] * a[ 4 ] + b[ 10 ] * a[ 8 ] + b[ 11 ] * a[ 12 ];\r\n r[ 9 ] = b[ 8 ] * a[ 1 ] + b[ 9 ] * a[ 5 ] + b[ 10 ] * a[ 9 ] + b[ 11 ] * a[ 13 ];\r\n r[ 10 ] = b[ 8 ] * a[ 2 ] + b[ 9 ] * a[ 6 ] + b[ 10 ] * a[ 10 ] + b[ 11 ] * a[ 14 ];\r\n r[ 11 ] = b[ 8 ] * a[ 3 ] + b[ 9 ] * a[ 7 ] + b[ 10 ] * a[ 11 ] + b[ 11 ] * a[ 15 ];\r\n\r\n r[ 12 ] = b[ 12 ] * a[ 0 ] + b[ 13 ] * a[ 4 ] + b[ 14 ] * a[ 8 ] + b[ 15 ] * a[ 12 ];\r\n r[ 13 ] = b[ 12 ] * a[ 1 ] + b[ 13 ] * a[ 5 ] + b[ 14 ] * a[ 9 ] + b[ 15 ] * a[ 13 ];\r\n r[ 14 ] = b[ 12 ] * a[ 2 ] + b[ 13 ] * a[ 6 ] + b[ 14 ] * a[ 10 ] + b[ 15 ] * a[ 14 ];\r\n r[ 15 ] = b[ 12 ] * a[ 3 ] + b[ 13 ] * a[ 7 ] + b[ 14 ] * a[ 11 ] + b[ 15 ] * a[ 15 ];\r\n\r\n return r;\r\n }\r\n },\r\n /* r = a * b */\r\n mult: function ( a, b, r ) {\r\n var s00 = b[ 0 ];\r\n var s01 = b[ 1 ];\r\n var s02 = b[ 2 ];\r\n var s03 = b[ 3 ];\r\n var s10 = b[ 4 ];\r\n var s11 = b[ 5 ];\r\n var s12 = b[ 6 ];\r\n var s13 = b[ 7 ];\r\n var s20 = b[ 8 ];\r\n var s21 = b[ 9 ];\r\n var s22 = b[ 10 ];\r\n var s23 = b[ 11 ];\r\n var s30 = b[ 12 ];\r\n var s31 = b[ 13 ];\r\n var s32 = b[ 14 ];\r\n var s33 = b[ 15 ];\r\n\r\n var o00 = a[ 0 ];\r\n var o01 = a[ 1 ];\r\n var o02 = a[ 2 ];\r\n var o03 = a[ 3 ];\r\n var o10 = a[ 4 ];\r\n var o11 = a[ 5 ];\r\n var o12 = a[ 6 ];\r\n var o13 = a[ 7 ];\r\n var o20 = a[ 8 ];\r\n var o21 = a[ 9 ];\r\n var o22 = a[ 10 ];\r\n var o23 = a[ 11 ];\r\n var o30 = a[ 12 ];\r\n var o31 = a[ 13 ];\r\n var o32 = a[ 14 ];\r\n var o33 = a[ 15 ];\r\n\r\n r[ 0 ] = s00 * o00 + s01 * o10 + s02 * o20 + s03 * o30;\r\n r[ 1 ] = s00 * o01 + s01 * o11 + s02 * o21 + s03 * o31;\r\n r[ 2 ] = s00 * o02 + s01 * o12 + s02 * o22 + s03 * o32;\r\n r[ 3 ] = s00 * o03 + s01 * o13 + s02 * o23 + s03 * o33;\r\n\r\n r[ 4 ] = s10 * o00 + s11 * o10 + s12 * o20 + s13 * o30;\r\n r[ 5 ] = s10 * o01 + s11 * o11 + s12 * o21 + s13 * o31;\r\n r[ 6 ] = s10 * o02 + s11 * o12 + s12 * o22 + s13 * o32;\r\n r[ 7 ] = s10 * o03 + s11 * o13 + s12 * o23 + s13 * o33;\r\n\r\n r[ 8 ] = s20 * o00 + s21 * o10 + s22 * o20 + s23 * o30;\r\n r[ 9 ] = s20 * o01 + s21 * o11 + s22 * o21 + s23 * o31;\r\n r[ 10 ] = s20 * o02 + s21 * o12 + s22 * o22 + s23 * o32;\r\n r[ 11 ] = s20 * o03 + s21 * o13 + s22 * o23 + s23 * o33;\r\n\r\n r[ 12 ] = s30 * o00 + s31 * o10 + s32 * o20 + s33 * o30;\r\n r[ 13 ] = s30 * o01 + s31 * o11 + s32 * o21 + s33 * o31;\r\n r[ 14 ] = s30 * o02 + s31 * o12 + s32 * o22 + s33 * o32;\r\n r[ 15 ] = s30 * o03 + s31 * o13 + s32 * o23 + s33 * o33;\r\n\r\n return r;\r\n },\r\n multOrig: function ( a, b, r ) {\r\n var inner1 = 0.0,\r\n inner2 = 0.0,\r\n inner3 = 0.0,\r\n inner4 = 0.0;\r\n if ( r === a ) {\r\n // pre mult\r\n for ( var col = 0; col < 4; col++ ) {\r\n inner1 = Matrix.innerProduct( b, a, 0, col );\r\n inner2 = Matrix.innerProduct( b, a, 1, col );\r\n inner3 = Matrix.innerProduct( b, a, 2, col );\r\n inner4 = Matrix.innerProduct( b, a, 3, col );\r\n a[ 0 + col ] = inner1;\r\n a[ 4 + col ] = inner2;\r\n a[ 8 + col ] = inner3;\r\n a[ 12 + col ] = inner4;\r\n }\r\n return a;\r\n //return Matrix.preMult(r, b);\r\n } else if ( r === b ) {\r\n // post mult\r\n for ( var row = 0; row < 4; row++ ) {\r\n inner1 = Matrix.innerProduct( b, a, row, 0 );\r\n inner2 = Matrix.innerProduct( b, a, row, 1 );\r\n inner3 = Matrix.innerProduct( b, a, row, 2 );\r\n inner4 = Matrix.innerProduct( b, a, row, 3 );\r\n Matrix.setRow( b, row, inner1, inner2, inner3, inner4 );\r\n }\r\n return b;\r\n //return Matrix.postMult(r, a);\r\n }\r\n if ( r === undefined ) {\r\n Notify.warn( 'no matrix destination !' );\r\n r = Matrix.create();\r\n }\r\n\r\n var s00 = b[ 0 ];\r\n var s01 = b[ 1 ];\r\n var s02 = b[ 2 ];\r\n var s03 = b[ 3 ];\r\n var s10 = b[ 4 ];\r\n var s11 = b[ 5 ];\r\n var s12 = b[ 6 ];\r\n var s13 = b[ 7 ];\r\n var s20 = b[ 8 ];\r\n var s21 = b[ 9 ];\r\n var s22 = b[ 10 ];\r\n var s23 = b[ 11 ];\r\n var s30 = b[ 12 ];\r\n var s31 = b[ 13 ];\r\n var s32 = b[ 14 ];\r\n var s33 = b[ 15 ];\r\n\r\n var o00 = a[ 0 ];\r\n var o01 = a[ 1 ];\r\n var o02 = a[ 2 ];\r\n var o03 = a[ 3 ];\r\n var o10 = a[ 4 ];\r\n var o11 = a[ 5 ];\r\n var o12 = a[ 6 ];\r\n var o13 = a[ 7 ];\r\n var o20 = a[ 8 ];\r\n var o21 = a[ 9 ];\r\n var o22 = a[ 10 ];\r\n var o23 = a[ 11 ];\r\n var o30 = a[ 12 ];\r\n var o31 = a[ 13 ];\r\n var o32 = a[ 14 ];\r\n var o33 = a[ 15 ];\r\n\r\n r[ 0 ] = s00 * o00 + s01 * o10 + s02 * o20 + s03 * o30;\r\n r[ 1 ] = s00 * o01 + s01 * o11 + s02 * o21 + s03 * o31;\r\n r[ 2 ] = s00 * o02 + s01 * o12 + s02 * o22 + s03 * o32;\r\n r[ 3 ] = s00 * o03 + s01 * o13 + s02 * o23 + s03 * o33;\r\n\r\n r[ 4 ] = s10 * o00 + s11 * o10 + s12 * o20 + s13 * o30;\r\n r[ 5 ] = s10 * o01 + s11 * o11 + s12 * o21 + s13 * o31;\r\n r[ 6 ] = s10 * o02 + s11 * o12 + s12 * o22 + s13 * o32;\r\n r[ 7 ] = s10 * o03 + s11 * o13 + s12 * o23 + s13 * o33;\r\n\r\n r[ 8 ] = s20 * o00 + s21 * o10 + s22 * o20 + s23 * o30;\r\n r[ 9 ] = s20 * o01 + s21 * o11 + s22 * o21 + s23 * o31;\r\n r[ 10 ] = s20 * o02 + s21 * o12 + s22 * o22 + s23 * o32;\r\n r[ 11 ] = s20 * o03 + s21 * o13 + s22 * o23 + s23 * o33;\r\n\r\n r[ 12 ] = s30 * o00 + s31 * o10 + s32 * o20 + s33 * o30;\r\n r[ 13 ] = s30 * o01 + s31 * o11 + s32 * o21 + s33 * o31;\r\n r[ 14 ] = s30 * o02 + s31 * o12 + s32 * o22 + s33 * o32;\r\n r[ 15 ] = s30 * o03 + s31 * o13 + s32 * o23 + s33 * o33;\r\n\r\n return r;\r\n },\r\n\r\n makeLookFromDirection: ( function () {\r\n var s = [ 0.0, 0.0, 0.0 ];\r\n var u = [ 0.0, 0.0, 0.0 ];\r\n var neg = [ 0.0, 0.0, 0.0 ];\r\n\r\n return function ( eye, eyeDir, up, result ) {\r\n if ( result === undefined ) {\r\n Notify.warn( 'no matrix destination !' );\r\n result = Matrix.create();\r\n }\r\n var f = eyeDir;\r\n Vec3.cross( f, up, s );\r\n Vec3.normalize( s, s );\r\n\r\n Vec3.cross( s, f, u );\r\n Vec3.normalize( u, u );\r\n\r\n // s[0], u[0], -f[0], 0.0,\r\n // s[1], u[1], -f[1], 0.0,\r\n // s[2], u[2], -f[2], 0.0,\r\n // 0, 0, 0, 1.0\r\n\r\n result[ 0 ] = s[ 0 ];\r\n result[ 1 ] = u[ 0 ];\r\n result[ 2 ] = -f[ 0 ];\r\n result[ 3 ] = 0.0;\r\n result[ 4 ] = s[ 1 ];\r\n result[ 5 ] = u[ 1 ];\r\n result[ 6 ] = -f[ 1 ];\r\n result[ 7 ] = 0.0;\r\n result[ 8 ] = s[ 2 ];\r\n result[ 9 ] = u[ 2 ];\r\n result[ 10 ] = -f[ 2 ];\r\n result[ 11 ] = 0.0;\r\n result[ 12 ] = 0;\r\n result[ 13 ] = 0;\r\n result[ 14 ] = 0;\r\n result[ 15 ] = 1.0;\r\n\r\n Matrix.multTranslate( result, Vec3.neg( eye, neg ), result );\r\n return result;\r\n };\r\n } )(),\r\n makeLookAt: ( function () {\r\n var f = [ 0.0, 0.0, 0.0 ];\r\n\r\n return function ( eye, center, up, result ) {\r\n if ( result === undefined ) {\r\n Notify.warn( 'no matrix destination !' );\r\n result = Matrix.create();\r\n }\r\n\r\n\r\n Vec3.sub( center, eye, f );\r\n Vec3.normalize( f, f );\r\n this.makeLookFromDirection( eye, f, up, result );\r\n return result;\r\n };\r\n } )(),\r\n makeOrtho: function ( left, right, bottom, top, zNear, zFar, result ) {\r\n if ( result === undefined ) {\r\n Notify.warn( 'no matrix destination !' );\r\n result = Matrix.create();\r\n }\r\n // note transpose of Matrix_implementation wr.t OpenGL documentation, since the OSG use post multiplication rather than pre.\r\n // we will change this convention later\r\n var tx = -( right + left ) / ( right - left );\r\n var ty = -( top + bottom ) / ( top - bottom );\r\n var tz = -( zFar + zNear ) / ( zFar - zNear );\r\n var row = Matrix.setRow;\r\n row( result, 0, 2.0 / ( right - left ), 0.0, 0.0, 0.0 );\r\n row( result, 1, 0.0, 2.0 / ( top - bottom ), 0.0, 0.0 );\r\n row( result, 2, 0.0, 0.0, -2.0 / ( zFar - zNear ), 0.0 );\r\n row( result, 3, tx, ty, tz, 1.0 );\r\n return result;\r\n },\r\n\r\n getLookAt: ( function () {\r\n var inv = [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ];\r\n var v1 = [ 0.0, 0.0, 0.0 ];\r\n var v2 = [ 0.0, 1.0, 0.0 ];\r\n var v3 = [ 0.0, 0.0, -1.0 ];\r\n\r\n return function ( matrix, eye, center, up, distance ) {\r\n if ( distance === undefined ) {\r\n distance = 1.0;\r\n }\r\n var result = Matrix.inverse( matrix, inv );\r\n if ( !result ) {\r\n Matrix.makeIdentity( inv );\r\n }\r\n Matrix.transformVec3( inv, v1, eye );\r\n Matrix.transform3x3( matrix, v2, up );\r\n Matrix.transform3x3( matrix, v3, center );\r\n Vec3.normalize( center, center );\r\n Vec3.add( Vec3.mult( center, distance, v1 ), eye, center );\r\n };\r\n } )(),\r\n\r\n //getRotate_David_Spillings_Mk1\r\n getRotate: ( function () {\r\n var tq = [ 0.0, 0.0, 0.0, 0.0 ];\r\n\r\n return function ( mat, quatResult ) {\r\n if ( quatResult === undefined ) {\r\n Notify.warn( 'no quat destination !' );\r\n quatResult = [ 0.0, 0.0, 0.0, 0.0 ];\r\n }\r\n\r\n var s;\r\n var i, j;\r\n\r\n // Use tq to store the largest trace\r\n var mat00 = mat[ 4 * 0 + 0 ];\r\n var mat11 = mat[ 4 * 1 + 1 ];\r\n var mat22 = mat[ 4 * 2 + 2 ];\r\n tq[ 0 ] = 1.0 + mat00 + mat11 + mat22;\r\n tq[ 1 ] = 1.0 + mat00 - mat11 - mat22;\r\n tq[ 2 ] = 1.0 - mat00 + mat11 - mat22;\r\n tq[ 3 ] = 1.0 - mat00 - mat11 + mat22;\r\n\r\n // Find the maximum (could also use stacked if's later)\r\n j = 0;\r\n for ( i = 1; i < 4; i++ ) {\r\n if ( ( tq[ i ] > tq[ j ] ) ) {\r\n j = i;\r\n } else {\r\n j = j;\r\n }\r\n }\r\n\r\n // check the diagonal\r\n if ( j === 0 ) {\r\n /* perform instant calculation */\r\n quatResult[ 3 ] = tq[ 0 ];\r\n quatResult[ 0 ] = mat[ 1 * 4 + 2 ] - mat[ 2 * 4 + 1 ];\r\n quatResult[ 1 ] = mat[ 2 * 4 + 0 ] - mat[ 0 + 2 ];\r\n quatResult[ 2 ] = mat[ 0 + 1 ] - mat[ 1 * 4 + 0 ];\r\n } else if ( j === 1 ) {\r\n quatResult[ 3 ] = mat[ 1 * 4 + 2 ] - mat[ 2 * 4 + 1 ];\r\n quatResult[ 0 ] = tq[ 1 ];\r\n quatResult[ 1 ] = mat[ 0 + 1 ] + mat[ 1 * 4 + 0 ];\r\n quatResult[ 2 ] = mat[ 2 * 4 + 0 ] + mat[ 0 + 2 ];\r\n } else if ( j === 2 ) {\r\n quatResult[ 3 ] = mat[ 2 * 4 + 0 ] - mat[ 0 + 2 ];\r\n quatResult[ 0 ] = mat[ 0 + 1 ] + mat[ 1 * 4 + 0 ];\r\n quatResult[ 1 ] = tq[ 2 ];\r\n quatResult[ 2 ] = mat[ 1 * 4 + 2 ] + mat[ 2 * 4 + 1 ];\r\n } else /* if (j==3) */ {\r\n quatResult[ 3 ] = mat[ 0 + 1 ] - mat[ 1 * 4 + 0 ];\r\n quatResult[ 0 ] = mat[ 2 * 4 + 0 ] + mat[ 0 + 2 ];\r\n quatResult[ 1 ] = mat[ 1 * 4 + 2 ] + mat[ 2 * 4 + 1 ];\r\n quatResult[ 2 ] = tq[ 3 ];\r\n }\r\n\r\n s = Math.sqrt( 0.25 / tq[ j ] );\r\n quatResult[ 3 ] *= s;\r\n quatResult[ 0 ] *= s;\r\n quatResult[ 1 ] *= s;\r\n quatResult[ 2 ] *= s;\r\n\r\n return quatResult;\r\n };\r\n } )(),\r\n\r\n // Matrix M = Matrix M * Matrix Translate\r\n preMultTranslate: function ( mat, translate ) {\r\n var val;\r\n if ( translate[ 0 ] !== 0.0 ) {\r\n val = translate[ 0 ];\r\n mat[ 12 ] += val * mat[ 0 ];\r\n mat[ 13 ] += val * mat[ 1 ];\r\n mat[ 14 ] += val * mat[ 2 ];\r\n mat[ 15 ] += val * mat[ 3 ];\r\n }\r\n\r\n if ( translate[ 1 ] !== 0.0 ) {\r\n val = translate[ 1 ];\r\n mat[ 12 ] += val * mat[ 4 ];\r\n mat[ 13 ] += val * mat[ 5 ];\r\n mat[ 14 ] += val * mat[ 6 ];\r\n mat[ 15 ] += val * mat[ 7 ];\r\n }\r\n\r\n if ( translate[ 2 ] !== 0.0 ) {\r\n val = translate[ 2 ];\r\n mat[ 12 ] += val * mat[ 8 ];\r\n mat[ 13 ] += val * mat[ 9 ];\r\n mat[ 14 ] += val * mat[ 10 ];\r\n mat[ 15 ] += val * mat[ 11 ];\r\n }\r\n return mat;\r\n },\r\n\r\n // result = Matrix M * Matrix Translate\r\n multTranslate: function ( mat, translate, result ) {\r\n if ( result === undefined ) {\r\n Notify.warn( 'no matrix destination !' );\r\n result = Matrix.create();\r\n }\r\n if ( result !== mat ) {\r\n Matrix.copy( mat, result );\r\n }\r\n\r\n var val;\r\n if ( translate[ 0 ] !== 0.0 ) {\r\n val = translate[ 0 ];\r\n result[ 12 ] += val * mat[ 0 ];\r\n result[ 13 ] += val * mat[ 1 ];\r\n result[ 14 ] += val * mat[ 2 ];\r\n result[ 15 ] += val * mat[ 3 ];\r\n }\r\n\r\n if ( translate[ 1 ] !== 0.0 ) {\r\n val = translate[ 1 ];\r\n result[ 12 ] += val * mat[ 4 ];\r\n result[ 13 ] += val * mat[ 5 ];\r\n result[ 14 ] += val * mat[ 6 ];\r\n result[ 15 ] += val * mat[ 7 ];\r\n }\r\n\r\n if ( translate[ 2 ] !== 0.0 ) {\r\n val = translate[ 2 ];\r\n result[ 12 ] += val * mat[ 8 ];\r\n result[ 13 ] += val * mat[ 9 ];\r\n result[ 14 ] += val * mat[ 10 ];\r\n result[ 15 ] += val * mat[ 11 ];\r\n }\r\n return result;\r\n },\r\n\r\n makeRotate: ( function () {\r\n var qtemp = Quat.create();\r\n\r\n return function ( angle, x, y, z, result ) {\r\n if ( result === undefined ) {\r\n Notify.warn( 'no matrix destination !' );\r\n result = Matrix.create();\r\n }\r\n return Matrix.makeRotateFromQuat( Quat.makeRotate( angle, x, y, z, qtemp ), result );\r\n };\r\n } )(),\r\n\r\n transform3x3: function ( m, v, result ) {\r\n if ( result === undefined ) {\r\n Notify.warn( 'no matrix destination !' );\r\n result = Matrix.create();\r\n }\r\n\r\n result[ 0 ] = m[ 0 ] * v[ 0 ] + m[ 1 ] * v[ 1 ] + m[ 2 ] * v[ 2 ];\r\n result[ 1 ] = m[ 4 ] * v[ 0 ] + m[ 5 ] * v[ 1 ] + m[ 6 ] * v[ 2 ];\r\n result[ 2 ] = m[ 8 ] * v[ 0 ] + m[ 9 ] * v[ 1 ] + m[ 10 ] * v[ 2 ];\r\n return result;\r\n },\r\n\r\n transformVec3: ( function () {\r\n var tmpVec = [ 0.0, 0.0, 0.0 ];\r\n\r\n return function ( matrix, vector, result ) {\r\n if ( result === undefined ) {\r\n Notify.warn( 'no vec3 destination !' );\r\n result = Vec3.create();\r\n }\r\n\r\n var d = 1.0 / ( matrix[ 3 ] * vector[ 0 ] + matrix[ 7 ] * vector[ 1 ] + matrix[ 11 ] * vector[ 2 ] + matrix[ 15 ] );\r\n\r\n var tmp;\r\n if ( result === vector ) {\r\n tmp = tmpVec;\r\n } else {\r\n tmp = result;\r\n }\r\n tmp[ 0 ] = ( matrix[ 0 ] * vector[ 0 ] + matrix[ 4 ] * vector[ 1 ] + matrix[ 8 ] * vector[ 2 ] + matrix[ 12 ] ) * d;\r\n tmp[ 1 ] = ( matrix[ 1 ] * vector[ 0 ] + matrix[ 5 ] * vector[ 1 ] + matrix[ 9 ] * vector[ 2 ] + matrix[ 13 ] ) * d;\r\n tmp[ 2 ] = ( matrix[ 2 ] * vector[ 0 ] + matrix[ 6 ] * vector[ 1 ] + matrix[ 10 ] * vector[ 2 ] + matrix[ 14 ] ) * d;\r\n\r\n if ( result === vector ) {\r\n Vec3.copy( tmp, result );\r\n }\r\n return result;\r\n };\r\n } )(),\r\n\r\n transformVec4: ( function () {\r\n var tmpVec = Vec4.create();\r\n\r\n return function ( matrix, vector, result ) {\r\n\r\n if ( result === undefined ) {\r\n Notify.warn( 'no Vec4 destination !' );\r\n result = Vec4.create();\r\n }\r\n var tmp;\r\n if ( result === vector ) {\r\n tmp = tmpVec;\r\n } else {\r\n tmp = result;\r\n }\r\n tmp[ 0 ] = ( matrix[ 0 ] * vector[ 0 ] + matrix[ 4 ] * vector[ 1 ] + matrix[ 8 ] * vector[ 2 ] + matrix[ 12 ] * vector[ 3 ] );\r\n tmp[ 1 ] = ( matrix[ 1 ] * vector[ 0 ] + matrix[ 5 ] * vector[ 1 ] + matrix[ 9 ] * vector[ 2 ] + matrix[ 13 ] * vector[ 3 ] );\r\n tmp[ 2 ] = ( matrix[ 2 ] * vector[ 0 ] + matrix[ 6 ] * vector[ 1 ] + matrix[ 10 ] * vector[ 2 ] + matrix[ 14 ] * vector[ 3 ] );\r\n tmp[ 3 ] = ( matrix[ 3 ] * vector[ 0 ] + matrix[ 7 ] * vector[ 1 ] + matrix[ 11 ] * vector[ 2 ] + matrix[ 15 ] * vector[ 3 ] );\r\n\r\n if ( result === vector ) {\r\n Vec4.copy( tmp, result );\r\n }\r\n return result;\r\n };\r\n } )(),\r\n\r\n // could be 6 mult\r\n // http://dev.theomader.com/transform-bounding-boxes/\r\n // https://github.com/erich666/GraphicsGems/blob/master/gems/TransBox.c\r\n transformBoundingBox: ( function () {\r\n var tmpCorner = Vec3.create();\r\n var tmpVec = Vec3.create();\r\n var tempBbox = new BoundingBox();\r\n return function ( m, bbIn, bbOut ) {\r\n if ( bbOut === bbIn ) {\r\n bbOut = tempBbox;\r\n }\r\n bbOut.init();\r\n bbOut.expandByVec3( Matrix.transformVec3( m, bbIn.corner( 0, tmpCorner ), tmpVec ) );\r\n bbOut.expandByVec3( Matrix.transformVec3( m, bbIn.corner( 1, tmpCorner ), tmpVec ) );\r\n bbOut.expandByVec3( Matrix.transformVec3( m, bbIn.corner( 2, tmpCorner ), tmpVec ) );\r\n bbOut.expandByVec3( Matrix.transformVec3( m, bbIn.corner( 3, tmpCorner ), tmpVec ) );\r\n bbOut.expandByVec3( Matrix.transformVec3( m, bbIn.corner( 4, tmpCorner ), tmpVec ) );\r\n bbOut.expandByVec3( Matrix.transformVec3( m, bbIn.corner( 5, tmpCorner ), tmpVec ) );\r\n bbOut.expandByVec3( Matrix.transformVec3( m, bbIn.corner( 6, tmpCorner ), tmpVec ) );\r\n bbOut.expandByVec3( Matrix.transformVec3( m, bbIn.corner( 7, tmpCorner ), tmpVec ) );\r\n\r\n if ( bbOut === tempBbox ) {\r\n bbIn.copy( tempBbox );\r\n }\r\n\r\n };\r\n } )(),\r\n\r\n transformBoundingSphere: ( function () {\r\n var scaleVec = Vec3.create();\r\n return function ( matrix, bSphere, bsOut ) {\r\n if ( !bSphere.valid() ) {\r\n return bsOut;\r\n }\r\n Vec3.copy( bSphere._center, bsOut._center );\r\n bsOut._radius = bSphere._radius;\r\n var sphCenter = bsOut._center;\r\n var sphRadius = bsOut._radius;\r\n\r\n Matrix.getScale2( matrix, scaleVec );\r\n var scale = Math.sqrt( Math.max( Math.max( scaleVec[ 0 ], scaleVec[ 1 ] ), scaleVec[ 2 ] ) );\r\n sphRadius = sphRadius * scale;\r\n bsOut._radius = sphRadius;\r\n Matrix.transformVec3( matrix, sphCenter, sphCenter );\r\n\r\n return bsOut;\r\n };\r\n } )(),\r\n\r\n transformVec4PostMult: ( function () {\r\n var tmpVec = Vec4.create();\r\n\r\n return function ( matrix, vector, result ) {\r\n\r\n if ( result === undefined ) {\r\n Notify.warn( 'no Vec4 destination !' );\r\n result = Vec4.create();\r\n }\r\n var tmp;\r\n if ( result === vector ) {\r\n tmp = tmpVec;\r\n } else {\r\n tmp = result;\r\n }\r\n tmp[ 0 ] = ( matrix[ 0 ] * vector[ 0 ] + matrix[ 1 ] * vector[ 1 ] + matrix[ 2 ] * vector[ 2 ] + matrix[ 3 ] * vector[ 3 ] );\r\n tmp[ 1 ] = ( matrix[ 4 ] * vector[ 0 ] + matrix[ 5 ] * vector[ 1 ] + matrix[ 6 ] * vector[ 2 ] + matrix[ 7 ] * vector[ 3 ] );\r\n tmp[ 2 ] = ( matrix[ 8 ] * vector[ 0 ] + matrix[ 9 ] * vector[ 1 ] + matrix[ 10 ] * vector[ 2 ] + matrix[ 11 ] * vector[ 3 ] );\r\n tmp[ 3 ] = ( matrix[ 12 ] * vector[ 0 ] + matrix[ 13 ] * vector[ 1 ] + matrix[ 14 ] * vector[ 2 ] + matrix[ 15 ] * vector[ 3 ] );\r\n\r\n if ( result === vector ) {\r\n Vec4.copy( tmp, result );\r\n }\r\n return result;\r\n };\r\n } )(),\r\n copy: function ( matrix, result ) {\r\n if ( result === undefined ) {\r\n Notify.warn( 'no matrix destination !' );\r\n result = Matrix.create();\r\n }\r\n result[ 0 ] = matrix[ 0 ];\r\n result[ 1 ] = matrix[ 1 ];\r\n result[ 2 ] = matrix[ 2 ];\r\n result[ 3 ] = matrix[ 3 ];\r\n result[ 4 ] = matrix[ 4 ];\r\n result[ 5 ] = matrix[ 5 ];\r\n result[ 6 ] = matrix[ 6 ];\r\n result[ 7 ] = matrix[ 7 ];\r\n result[ 8 ] = matrix[ 8 ];\r\n result[ 9 ] = matrix[ 9 ];\r\n result[ 10 ] = matrix[ 10 ];\r\n result[ 11 ] = matrix[ 11 ];\r\n result[ 12 ] = matrix[ 12 ];\r\n result[ 13 ] = matrix[ 13 ];\r\n result[ 14 ] = matrix[ 14 ];\r\n result[ 15 ] = matrix[ 15 ];\r\n return result;\r\n },\r\n\r\n inverse: ( function () {\r\n var tmp = [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ];\r\n\r\n return function ( matrix, result ) {\r\n if ( result === matrix ) {\r\n Matrix.copy( matrix, tmp );\r\n matrix = tmp;\r\n }\r\n\r\n if ( matrix[ 3 ] === 0.0 && matrix[ 7 ] === 0.0 && matrix[ 11 ] === 0.0 && matrix[ 15 ] === 1.0 ) {\r\n return Matrix.inverse4x3( matrix, result );\r\n } else {\r\n return Matrix.inverse4x4( matrix, result );\r\n }\r\n };\r\n } )(),\r\n\r\n /**\r\n * if a result argument is given the return of the function is true or false\r\n * depending if the matrix can be inverted, else if no result argument is given\r\n * the return is identity if the matrix can not be inverted and the matrix overthise\r\n */\r\n inverse4x4: function ( matrix, result ) {\r\n var tmp0 = matrix[ 10 ] * matrix[ 15 ];\r\n var tmp1 = matrix[ 14 ] * matrix[ 11 ];\r\n var tmp2 = matrix[ 6 ] * matrix[ 15 ];\r\n var tmp3 = matrix[ 14 ] * matrix[ 7 ];\r\n var tmp4 = matrix[ 6 ] * matrix[ 11 ];\r\n var tmp5 = matrix[ 10 ] * matrix[ 7 ];\r\n var tmp6 = matrix[ 2 ] * matrix[ 15 ];\r\n var tmp7 = matrix[ 14 ] * matrix[ 3 ];\r\n var tmp8 = matrix[ 2 ] * matrix[ 11 ];\r\n var tmp9 = matrix[ 10 ] * matrix[ 3 ];\r\n var tmp10 = matrix[ 2 ] * matrix[ 7 ];\r\n var tmp11 = matrix[ 6 ] * matrix[ 3 ];\r\n var tmp12 = matrix[ 8 ] * matrix[ 13 ];\r\n var tmp13 = matrix[ 12 ] * matrix[ 9 ];\r\n var tmp14 = matrix[ 4 ] * matrix[ 13 ];\r\n var tmp15 = matrix[ 12 ] * matrix[ 5 ];\r\n var tmp16 = matrix[ 4 ] * matrix[ 9 ];\r\n var tmp17 = matrix[ 8 ] * matrix[ 5 ];\r\n var tmp18 = matrix[ 0 ] * matrix[ 13 ];\r\n var tmp19 = matrix[ 12 ] * matrix[ 1 ];\r\n var tmp20 = matrix[ 0 ] * matrix[ 9 ];\r\n var tmp21 = matrix[ 8 ] * matrix[ 1 ];\r\n var tmp22 = matrix[ 0 ] * matrix[ 5 ];\r\n var tmp23 = matrix[ 4 ] * matrix[ 1 ];\r\n\r\n var t0 = ( ( tmp0 * matrix[ 5 ] + tmp3 * matrix[ 9 ] + tmp4 * matrix[ 13 ] ) -\r\n ( tmp1 * matrix[ 5 ] + tmp2 * matrix[ 9 ] + tmp5 * matrix[ 13 ] ) );\r\n var t1 = ( ( tmp1 * matrix[ 1 ] + tmp6 * matrix[ 9 ] + tmp9 * matrix[ 13 ] ) -\r\n ( tmp0 * matrix[ 1 ] + tmp7 * matrix[ 9 ] + tmp8 * matrix[ 13 ] ) );\r\n var t2 = ( ( tmp2 * matrix[ 1 ] + tmp7 * matrix[ 5 ] + tmp10 * matrix[ 13 ] ) -\r\n ( tmp3 * matrix[ 1 ] + tmp6 * matrix[ 5 ] + tmp11 * matrix[ 13 ] ) );\r\n var t3 = ( ( tmp5 * matrix[ 1 ] + tmp8 * matrix[ 5 ] + tmp11 * matrix[ 9 ] ) -\r\n ( tmp4 * matrix[ 1 ] + tmp9 * matrix[ 5 ] + tmp10 * matrix[ 9 ] ) );\r\n\r\n var d1 = ( matrix[ 0 ] * t0 + matrix[ 4 ] * t1 + matrix[ 8 ] * t2 + matrix[ 12 ] * t3 );\r\n if ( Math.abs( d1 ) < Number.EPSILON ) {\r\n Notify.log( 'Warning can\\'t inverse matrix ' + matrix );\r\n return false;\r\n }\r\n var d = 1.0 / d1;\r\n\r\n var out00 = d * t0;\r\n var out01 = d * t1;\r\n var out02 = d * t2;\r\n var out03 = d * t3;\r\n\r\n var out10 = d * ( ( tmp1 * matrix[ 4 ] + tmp2 * matrix[ 8 ] + tmp5 * matrix[ 12 ] ) -\r\n ( tmp0 * matrix[ 4 ] + tmp3 * matrix[ 8 ] + tmp4 * matrix[ 12 ] ) );\r\n var out11 = d * ( ( tmp0 * matrix[ 0 ] + tmp7 * matrix[ 8 ] + tmp8 * matrix[ 12 ] ) -\r\n ( tmp1 * matrix[ 0 ] + tmp6 * matrix[ 8 ] + tmp9 * matrix[ 12 ] ) );\r\n var out12 = d * ( ( tmp3 * matrix[ 0 ] + tmp6 * matrix[ 4 ] + tmp11 * matrix[ 12 ] ) -\r\n ( tmp2 * matrix[ 0 ] + tmp7 * matrix[ 4 ] + tmp10 * matrix[ 12 ] ) );\r\n var out13 = d * ( ( tmp4 * matrix[ 0 ] + tmp9 * matrix[ 4 ] + tmp10 * matrix[ 8 ] ) -\r\n ( tmp5 * matrix[ 0 ] + tmp8 * matrix[ 4 ] + tmp11 * matrix[ 8 ] ) );\r\n\r\n var out20 = d * ( ( tmp12 * matrix[ 7 ] + tmp15 * matrix[ 11 ] + tmp16 * matrix[ 15 ] ) -\r\n ( tmp13 * matrix[ 7 ] + tmp14 * matrix[ 11 ] + tmp17 * matrix[ 15 ] ) );\r\n var out21 = d * ( ( tmp13 * matrix[ 3 ] + tmp18 * matrix[ 11 ] + tmp21 * matrix[ 15 ] ) -\r\n ( tmp12 * matrix[ 3 ] + tmp19 * matrix[ 11 ] + tmp20 * matrix[ 15 ] ) );\r\n var out22 = d * ( ( tmp14 * matrix[ 3 ] + tmp19 * matrix[ 7 ] + tmp22 * matrix[ 15 ] ) -\r\n ( tmp15 * matrix[ 3 ] + tmp18 * matrix[ 7 ] + tmp23 * matrix[ 15 ] ) );\r\n var out23 = d * ( ( tmp17 * matrix[ 3 ] + tmp20 * matrix[ 7 ] + tmp23 * matrix[ 11 ] ) -\r\n ( tmp16 * matrix[ 3 ] + tmp21 * matrix[ 7 ] + tmp22 * matrix[ 11 ] ) );\r\n\r\n var out30 = d * ( ( tmp14 * matrix[ 10 ] + tmp17 * matrix[ 14 ] + tmp13 * matrix[ 6 ] ) -\r\n ( tmp16 * matrix[ 14 ] + tmp12 * matrix[ 6 ] + tmp15 * matrix[ 10 ] ) );\r\n var out31 = d * ( ( tmp20 * matrix[ 14 ] + tmp12 * matrix[ 2 ] + tmp19 * matrix[ 10 ] ) -\r\n ( tmp18 * matrix[ 10 ] + tmp21 * matrix[ 14 ] + tmp13 * matrix[ 2 ] ) );\r\n var out32 = d * ( ( tmp18 * matrix[ 6 ] + tmp23 * matrix[ 14 ] + tmp15 * matrix[ 2 ] ) -\r\n ( tmp22 * matrix[ 14 ] + tmp14 * matrix[ 2 ] + tmp19 * matrix[ 6 ] ) );\r\n var out33 = d * ( ( tmp22 * matrix[ 10 ] + tmp16 * matrix[ 2 ] + tmp21 * matrix[ 6 ] ) -\r\n ( tmp20 * matrix[ 6 ] + tmp23 * matrix[ 10 ] + tmp17 * matrix[ 2 ] ) );\r\n\r\n result[ 0 ] = out00;\r\n result[ 1 ] = out01;\r\n result[ 2 ] = out02;\r\n result[ 3 ] = out03;\r\n result[ 4 ] = out10;\r\n result[ 5 ] = out11;\r\n result[ 6 ] = out12;\r\n result[ 7 ] = out13;\r\n result[ 8 ] = out20;\r\n result[ 9 ] = out21;\r\n result[ 10 ] = out22;\r\n result[ 11 ] = out23;\r\n result[ 12 ] = out30;\r\n result[ 13 ] = out31;\r\n result[ 14 ] = out32;\r\n result[ 15 ] = out33;\r\n\r\n return true;\r\n },\r\n\r\n // comes from OpenSceneGraph\r\n /*\r\n Matrix inversion technique:\r\n Given a matrix mat, we want to invert it.\r\n mat = [ r00 r01 r02 a\r\n r10 r11 r12 b\r\n r20 r21 r22 c\r\n tx ty tz d ]\r\n We note that this matrix can be split into three matrices.\r\n mat = rot * trans * corr, where rot is rotation part, trans is translation part, and corr is the correction due to perspective (if any).\r\n rot = [ r00 r01 r02 0\r\n r10 r11 r12 0\r\n r20 r21 r22 0\r\n 0 0 0 1 ]\r\n trans = [ 1 0 0 0\r\n 0 1 0 0\r\n 0 0 1 0\r\n tx ty tz 1 ]\r\n corr = [ 1 0 0 px\r\n 0 1 0 py\r\n 0 0 1 pz\r\n 0 0 0 s ]\r\n\r\n where the elements of corr are obtained from linear combinations of the elements of rot, trans, and mat.\r\n So the inverse is mat' = (trans * corr)' * rot', where rot' must be computed the traditional way, which is easy since it is only a 3x3 matrix.\r\n This problem is simplified if [px py pz s] = [0 0 0 1], which will happen if mat was composed only of rotations, scales, and translations (which is common). In this case, we can ignore corr entirely which saves on a lot of computations.\r\n */\r\n\r\n inverse4x3: ( function () {\r\n var inv = [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ];\r\n\r\n return function ( matrix, result ) {\r\n\r\n // Copy rotation components\r\n var r00 = matrix[ 0 ];\r\n var r01 = matrix[ 1 ];\r\n var r02 = matrix[ 2 ];\r\n\r\n var r10 = matrix[ 4 ];\r\n var r11 = matrix[ 5 ];\r\n var r12 = matrix[ 6 ];\r\n\r\n var r20 = matrix[ 8 ];\r\n var r21 = matrix[ 9 ];\r\n var r22 = matrix[ 10 ];\r\n\r\n // Partially compute inverse of rot\r\n result[ 0 ] = r11 * r22 - r12 * r21;\r\n result[ 1 ] = r02 * r21 - r01 * r22;\r\n result[ 2 ] = r01 * r12 - r02 * r11;\r\n\r\n // Compute determinant of rot from 3 elements just computed\r\n var oneOverDet = 1.0 / ( r00 * result[ 0 ] + r10 * result[ 1 ] + r20 * result[ 2 ] );\r\n r00 *= oneOverDet;\r\n r10 *= oneOverDet;\r\n r20 *= oneOverDet; // Saves on later computations\r\n\r\n // Finish computing inverse of rot\r\n result[ 0 ] *= oneOverDet;\r\n result[ 1 ] *= oneOverDet;\r\n result[ 2 ] *= oneOverDet;\r\n result[ 3 ] = 0.0;\r\n result[ 4 ] = r12 * r20 - r10 * r22; // Have already been divided by det\r\n result[ 5 ] = r00 * r22 - r02 * r20; // same\r\n result[ 6 ] = r02 * r10 - r00 * r12; // same\r\n result[ 7 ] = 0.0;\r\n result[ 8 ] = r10 * r21 - r11 * r20; // Have already been divided by det\r\n result[ 9 ] = r01 * r20 - r00 * r21; // same\r\n result[ 10 ] = r00 * r11 - r01 * r10; // same\r\n result[ 11 ] = 0.0;\r\n result[ 15 ] = 1.0;\r\n\r\n var tx, ty, tz;\r\n\r\n var d = matrix[ 15 ];\r\n var dm = d - 1.0;\r\n if ( dm * dm > 1.0e-6 ) // Involves perspective, so we must\r\n { // compute the full inverse\r\n\r\n result[ 12 ] = result[ 13 ] = result[ 14 ] = 0.0;\r\n\r\n var a = matrix[ 3 ];\r\n var b = matrix[ 7 ];\r\n var c = matrix[ 11 ];\r\n var px = result[ 0 ] * a + result[ 1 ] * b + result[ 2 ] * c;\r\n var py = result[ 4 ] * a + result[ 5 ] * b + result[ 6 ] * c;\r\n var pz = result[ 8 ] * a + result[ 9 ] * b + result[ 10 ] * c;\r\n\r\n tx = matrix[ 12 ];\r\n ty = matrix[ 13 ];\r\n tz = matrix[ 14 ];\r\n var oneOverS = 1.0 / ( d - ( tx * px + ty * py + tz * pz ) );\r\n\r\n tx *= oneOverS;\r\n ty *= oneOverS;\r\n tz *= oneOverS; // Reduces number of calculations later on\r\n\r\n // Compute inverse of trans*corr\r\n inv[ 0 ] = tx * px + 1.0;\r\n inv[ 1 ] = ty * px;\r\n inv[ 2 ] = tz * px;\r\n inv[ 3 ] = -px * oneOverS;\r\n inv[ 4 ] = tx * py;\r\n inv[ 5 ] = ty * py + 1.0;\r\n inv[ 6 ] = tz * py;\r\n inv[ 7 ] = -py * oneOverS;\r\n inv[ 8 ] = tx * pz;\r\n inv[ 9 ] = ty * pz;\r\n inv[ 10 ] = tz * pz + 1.0;\r\n inv[ 11 ] = -pz * oneOverS;\r\n inv[ 12 ] = -tx;\r\n inv[ 13 ] = -ty;\r\n inv[ 14 ] = -tz;\r\n inv[ 15 ] = oneOverS;\r\n\r\n Matrix.preMult( result, inv ); // Finish computing full inverse of mat\r\n } else {\r\n\r\n tx = matrix[ 12 ];\r\n ty = matrix[ 13 ];\r\n tz = matrix[ 14 ];\r\n\r\n // Compute translation components of mat'\r\n result[ 12 ] = -( tx * result[ 0 ] + ty * result[ 4 ] + tz * result[ 8 ] );\r\n result[ 13 ] = -( tx * result[ 1 ] + ty * result[ 5 ] + tz * result[ 9 ] );\r\n result[ 14 ] = -( tx * result[ 2 ] + ty * result[ 6 ] + tz * result[ 10 ] );\r\n }\r\n return true;\r\n };\r\n } )(),\r\n\r\n transpose: function ( mat, dest ) {\r\n // from glMatrix\r\n // If we are transposing ourselves we can skip a few steps but have to cache some values\r\n if ( mat === dest ) {\r\n var a01 = mat[ 1 ],\r\n a02 = mat[ 2 ],\r\n a03 = mat[ 3 ];\r\n var a12 = mat[ 6 ],\r\n a13 = mat[ 7 ];\r\n var a23 = mat[ 11 ];\r\n\r\n mat[ 1 ] = mat[ 4 ];\r\n mat[ 2 ] = mat[ 8 ];\r\n mat[ 3 ] = mat[ 12 ];\r\n mat[ 4 ] = a01;\r\n mat[ 6 ] = mat[ 9 ];\r\n mat[ 7 ] = mat[ 13 ];\r\n mat[ 8 ] = a02;\r\n mat[ 9 ] = a12;\r\n mat[ 11 ] = mat[ 14 ];\r\n mat[ 12 ] = a03;\r\n mat[ 13 ] = a13;\r\n mat[ 14 ] = a23;\r\n return mat;\r\n } else {\r\n dest[ 0 ] = mat[ 0 ];\r\n dest[ 1 ] = mat[ 4 ];\r\n dest[ 2 ] = mat[ 8 ];\r\n dest[ 3 ] = mat[ 12 ];\r\n dest[ 4 ] = mat[ 1 ];\r\n dest[ 5 ] = mat[ 5 ];\r\n dest[ 6 ] = mat[ 9 ];\r\n dest[ 7 ] = mat[ 13 ];\r\n dest[ 8 ] = mat[ 2 ];\r\n dest[ 9 ] = mat[ 6 ];\r\n dest[ 10 ] = mat[ 10 ];\r\n dest[ 11 ] = mat[ 14 ];\r\n dest[ 12 ] = mat[ 3 ];\r\n dest[ 13 ] = mat[ 7 ];\r\n dest[ 14 ] = mat[ 11 ];\r\n dest[ 15 ] = mat[ 15 ];\r\n return dest;\r\n }\r\n },\r\n\r\n getFrustumPlanes: ( function () {\r\n\r\n var mvp;\r\n\r\n return function ( projection, view, result, withNearFar ) {\r\n mvp = mvp ? mvp : Matrix.create();\r\n Matrix.mult( projection, view, mvp );\r\n\r\n if ( withNearFar === undefined )\r\n withNearFar = false;\r\n // Right clipping plane.\r\n var right = result[ 0 ];\r\n right[ 0 ] = mvp[ 3 ] - mvp[ 0 ];\r\n right[ 1 ] = mvp[ 7 ] - mvp[ 4 ];\r\n right[ 2 ] = mvp[ 11 ] - mvp[ 8 ];\r\n right[ 3 ] = mvp[ 15 ] - mvp[ 12 ];\r\n\r\n // Left clipping plane.\r\n var left = result[ 1 ];\r\n left[ 0 ] = mvp[ 3 ] + mvp[ 0 ];\r\n left[ 1 ] = mvp[ 7 ] + mvp[ 4 ];\r\n left[ 2 ] = mvp[ 11 ] + mvp[ 8 ];\r\n left[ 3 ] = mvp[ 15 ] + mvp[ 12 ];\r\n\r\n // Bottom clipping plane.\r\n var bottom = result[ 2 ];\r\n bottom[ 0 ] = mvp[ 3 ] + mvp[ 1 ];\r\n bottom[ 1 ] = mvp[ 7 ] + mvp[ 5 ];\r\n bottom[ 2 ] = mvp[ 11 ] + mvp[ 9 ];\r\n bottom[ 3 ] = mvp[ 15 ] + mvp[ 13 ];\r\n\r\n // Top clipping plane.\r\n var top = result[ 3 ];\r\n top[ 0 ] = mvp[ 3 ] - mvp[ 1 ];\r\n top[ 1 ] = mvp[ 7 ] - mvp[ 5 ];\r\n top[ 2 ] = mvp[ 11 ] - mvp[ 9 ];\r\n top[ 3 ] = mvp[ 15 ] - mvp[ 13 ];\r\n\r\n if ( withNearFar ) {\r\n // Far clipping plane.\r\n var far = result[ 4 ];\r\n far[ 0 ] = mvp[ 3 ] - mvp[ 2 ];\r\n far[ 1 ] = mvp[ 7 ] - mvp[ 6 ];\r\n far[ 2 ] = mvp[ 11 ] - mvp[ 10 ];\r\n far[ 3 ] = mvp[ 15 ] - mvp[ 14 ];\r\n\r\n // Near clipping plane.\r\n var near = result[ 5 ];\r\n near[ 0 ] = mvp[ 3 ] + mvp[ 2 ];\r\n near[ 1 ] = mvp[ 7 ] + mvp[ 6 ];\r\n near[ 2 ] = mvp[ 11 ] + mvp[ 10 ];\r\n near[ 3 ] = mvp[ 15 ] + mvp[ 14 ];\r\n }\r\n\r\n //Normalize the planes\r\n var j = withNearFar ? 6 : 4;\r\n for ( var i = 0; i < j; i++ ) {\r\n Plane.normalizeEquation( result[ i ] );\r\n }\r\n\r\n };\r\n } )(),\r\n\r\n makePerspective: function ( fovy, aspect, znear, zfar, result ) {\r\n if ( result === undefined ) {\r\n Notify.warn( 'no matrix destination !' );\r\n result = Matrix.create();\r\n }\r\n var ymax = znear * Math.tan( fovy * Math.PI / 360.0 );\r\n var ymin = -ymax;\r\n var xmin = ymin * aspect;\r\n var xmax = ymax * aspect;\r\n\r\n return Matrix.makeFrustum( xmin, xmax, ymin, ymax, znear, zfar, result );\r\n },\r\n\r\n getFrustum: function ( matrix, result ) {\r\n var right = 0.0;\r\n var left = 0.0;\r\n var top = 0.0;\r\n var bottom = 0.0;\r\n var zNear, zFar;\r\n\r\n if ( matrix[ 0 * 4 + 3 ] !== 0.0 || matrix[ 1 * 4 + 3 ] !== 0.0 || matrix[ 2 * 4 + 3 ] !== -1.0 || matrix[ 3 * 4 + 3 ] !== 0.0 ) {\r\n return false;\r\n }\r\n\r\n // note: near and far must be used inside this method instead of zNear and zFar\r\n // because zNear and zFar are references and they may point to the same variable.\r\n var tempNear = matrix[ 3 * 4 + 2 ] / ( matrix[ 2 * 4 + 2 ] - 1.0 );\r\n var tempFar = matrix[ 3 * 4 + 2 ] / ( 1.0 + matrix[ 2 * 4 + 2 ] );\r\n\r\n left = tempNear * ( matrix[ 2 * 4 ] - 1.0 ) / matrix[ 0 ];\r\n right = tempNear * ( 1.0 + matrix[ 2 * 4 ] ) / matrix[ 0 ];\r\n\r\n top = tempNear * ( 1.0 + matrix[ 2 * 4 + 1 ] ) / matrix[ 1 * 4 + 1 ];\r\n bottom = tempNear * ( matrix[ 2 * 4 + 1 ] - 1.0 ) / matrix[ 1 * 4 + 1 ];\r\n\r\n zNear = tempNear;\r\n zFar = tempFar;\r\n\r\n result.left = left;\r\n result.right = right;\r\n result.top = top;\r\n result.bottom = bottom;\r\n result.zNear = zNear;\r\n result.zFar = zFar;\r\n\r\n return true;\r\n },\r\n\r\n getPerspective: ( function () {\r\n var c = {\r\n 'right': 0,\r\n 'left': 0,\r\n 'top': 0,\r\n 'bottom': 0,\r\n 'zNear': 0,\r\n 'zFar': 0\r\n };\r\n return function ( matrix, result ) {\r\n // get frustum and compute results\r\n var r = Matrix.getFrustum( matrix, c );\r\n if ( r ) {\r\n result.fovy = 180 / Math.PI * ( Math.atan( c.top / c.zNear ) - Math.atan( c.bottom / c.zNear ) );\r\n result.aspectRatio = ( c.right - c.left ) / ( c.top - c.bottom );\r\n }\r\n result.zNear = c.zNear;\r\n result.zFar = c.zFar;\r\n return result;\r\n };\r\n } )(),\r\n\r\n makeScale: function ( x, y, z, result ) {\r\n if ( result === undefined ) {\r\n Notify.warn( 'no matrix destination !' );\r\n result = Matrix.create();\r\n }\r\n Matrix.setRow( result, 0, x, 0.0, 0.0, 0.0 );\r\n Matrix.setRow( result, 1, 0.0, y, 0.0, 0.0 );\r\n Matrix.setRow( result, 2, 0.0, 0.0, z, 0.0 );\r\n Matrix.setRow( result, 3, 0.0, 0.0, 0.0, 1.0 );\r\n return result;\r\n },\r\n\r\n getScale: ( function () {\r\n var sx = Vec3.create();\r\n var sy = Vec3.create();\r\n var sz = Vec3.create();\r\n return function ( matrix, result ) {\r\n sx[ 0 ] = matrix[ 0 ];\r\n sx[ 1 ] = matrix[ 4 ];\r\n sx[ 2 ] = matrix[ 8 ];\r\n sy[ 0 ] = matrix[ 1 ];\r\n sy[ 1 ] = matrix[ 5 ];\r\n sy[ 2 ] = matrix[ 9 ];\r\n sz[ 0 ] = matrix[ 2 ];\r\n sz[ 1 ] = matrix[ 6 ];\r\n sz[ 2 ] = matrix[ 10 ];\r\n\r\n result[ 0 ] = Vec3.length( sx );\r\n result[ 1 ] = Vec3.length( sy );\r\n result[ 2 ] = Vec3.length( sz );\r\n return result;\r\n };\r\n } )(),\r\n\r\n getScale2: ( function () {\r\n var sx = Vec3.create();\r\n var sy = Vec3.create();\r\n var sz = Vec3.create();\r\n return function ( matrix, result ) {\r\n sx[ 0 ] = matrix[ 0 ];\r\n sx[ 1 ] = matrix[ 4 ];\r\n sx[ 2 ] = matrix[ 8 ];\r\n sy[ 0 ] = matrix[ 1 ];\r\n sy[ 1 ] = matrix[ 5 ];\r\n sy[ 2 ] = matrix[ 9 ];\r\n sz[ 0 ] = matrix[ 2 ];\r\n sz[ 1 ] = matrix[ 6 ];\r\n sz[ 2 ] = matrix[ 10 ];\r\n\r\n result[ 0 ] = Vec3.length2( sx );\r\n result[ 1 ] = Vec3.length2( sy );\r\n result[ 2 ] = Vec3.length2( sz );\r\n return result;\r\n };\r\n } )(),\r\n\r\n clampProjectionMatrix: function ( projection, znear, zfar, nearFarRatio, resultNearFar ) {\r\n var epsilon = 1e-6;\r\n if ( zfar < znear - epsilon ) {\r\n Notify.log( 'clampProjectionMatrix not applied, invalid depth range, znear = ' + znear + ' zfar = ' + zfar );\r\n return false;\r\n }\r\n\r\n var desiredZnear, desiredZfar;\r\n if ( zfar < znear + epsilon ) {\r\n // znear and zfar are too close together and could cause divide by zero problems\r\n // late on in the clamping code, so move the znear and zfar apart.\r\n var average = ( znear + zfar ) * 0.5;\r\n znear = average - epsilon;\r\n zfar = average + epsilon;\r\n // OSG_INFO << '_clampProjectionMatrix widening znear and zfar to '<\r\n Set update node callback, called during update traversal.\r\n The Object must have the following method\r\n update(node, nodeVisitor) {}\r\n note, callback is responsible for scenegraph traversal so\r\n they must call traverse(node,nv) to ensure that the\r\n scene graph subtree (and associated callbacks) are traversed.\r\n

\r\n

\r\n Here a dummy UpdateCallback example\r\n

\r\n @example\r\n var DummyUpdateCallback = function() {};\r\n DummyUpdateCallback.prototype = {\r\n update: function(node, nodeVisitor) {\r\n return true;\r\n }\r\n };\r\n\r\n @param Oject callback\r\n */\r\n setUpdateCallback: function ( cb ) {\r\n if ( !this._updateCallbacks.length )\r\n this.addUpdateCallback( cb );\r\n else\r\n this._updateCallbacks[ 0 ] = cb;\r\n },\r\n /** Get update node callback, called during update traversal.\r\n @type Oject\r\n */\r\n getUpdateCallback: function () {\r\n return this._updateCallbacks[ 0 ];\r\n },\r\n\r\n addUpdateCallback: function ( cb ) {\r\n this._updateCallbacks.push( cb );\r\n },\r\n removeUpdateCallback: function ( cb ) {\r\n var arrayIdx = this._updateCallbacks.indexOf( cb );\r\n if ( arrayIdx !== -1 )\r\n this._updateCallbacks.splice( arrayIdx, 1 );\r\n },\r\n getUpdateCallbackList: function () {\r\n return this._updateCallbacks;\r\n },\r\n\r\n\r\n /**\r\n

\r\n Set cull node callback, called during cull traversal.\r\n The Object must have the following method\r\n cull(node, nodeVisitor) {}\r\n note, callback is responsible for scenegraph traversal so\r\n they must return true to traverse.\r\n

\r\n

\r\n Here a dummy CullCallback example\r\n

\r\n @example\r\n var DummyCullCallback = function() {};\r\n DummyCullCallback.prototype = {\r\n cull: function(node, nodeVisitor) {\r\n return true;\r\n }\r\n };\r\n\r\n @param Oject callback\r\n */\r\n setCullCallback: function ( cb ) {\r\n this._cullCallback = cb;\r\n },\r\n getCullCallback: function () {\r\n return this._cullCallback;\r\n },\r\n\r\n hasChild: function ( child ) {\r\n for ( var i = 0, l = this.children.length; i < l; i++ ) {\r\n if ( this.children[ i ] === child ) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n addChild: function ( child ) {\r\n var c = this.children.push( child );\r\n child.addParent( this );\r\n this.dirtyBound();\r\n return c;\r\n },\r\n getChildren: function () {\r\n return this.children;\r\n },\r\n getParents: function () {\r\n return this.parents;\r\n },\r\n addParent: function ( parent ) {\r\n this.parents.push( parent );\r\n },\r\n removeParent: function ( parent ) {\r\n for ( var i = 0, l = this.parents.length, parents = this.parents; i < l; i++ ) {\r\n if ( parents[ i ] === parent ) {\r\n parents.splice( i, 1 );\r\n return;\r\n }\r\n }\r\n },\r\n removeChildren: function () {\r\n var children = this.children;\r\n if ( children.length !== 0 ) {\r\n for ( var i = 0, l = children.length; i < l; i++ ) {\r\n children[ i ].removeParent( this );\r\n }\r\n children.length = 0;\r\n this.dirtyBound();\r\n }\r\n },\r\n\r\n // preserve order\r\n removeChild: function ( child ) {\r\n var children = this.children;\r\n for ( var i = 0, l = children.length; i < l; i++ ) {\r\n if ( children[ i ] === child ) {\r\n child.removeParent( this );\r\n children.splice( i, 1 );\r\n i--;\r\n l--;\r\n this.dirtyBound();\r\n }\r\n }\r\n },\r\n\r\n traverse: function ( visitor ) {\r\n for ( var i = 0, l = this.children.length; i < l; i++ ) {\r\n var child = this.children[ i ];\r\n child.accept( visitor );\r\n }\r\n },\r\n\r\n ascend: function ( visitor ) {\r\n for ( var i = 0, l = this.parents.length; i < l; i++ ) {\r\n var parent = this.parents[ i ];\r\n parent.accept( visitor );\r\n }\r\n },\r\n\r\n getBound: function () {\r\n if ( !this.boundingSphereComputed ) {\r\n this.computeBound( this.boundingSphere );\r\n this.boundingSphereComputed = true;\r\n }\r\n return this.boundingSphere;\r\n },\r\n\r\n\r\n computeBound: function ( bSphere ) {\r\n\r\n var l = this.children.length;\r\n\r\n bSphere.init();\r\n if ( l === 0 ) return bSphere;\r\n\r\n var cc, i;\r\n var bb = this._boundingBox;\r\n bb.init();\r\n for ( i = 0; i < l; i++ ) {\r\n cc = this.children[ i ];\r\n if ( cc.referenceFrame === undefined || cc.referenceFrame === TransformEnums.RELATIVE_RF ) {\r\n bb.expandByBoundingSphere( cc.getBound() );\r\n }\r\n }\r\n if ( !bb.valid() ) return bSphere;\r\n\r\n bSphere.set( bb.center( bSphere.center() ), 0.0 );\r\n for ( i = 0; i < l; i++ ) {\r\n cc = this.children[ i ];\r\n if ( cc.referenceFrame === undefined || cc.referenceFrame === TransformEnums.RELATIVE_RF ) {\r\n bSphere.expandRadiusBySphere( cc.getBound() );\r\n }\r\n }\r\n return bSphere;\r\n },\r\n\r\n getWorldMatrices: function ( halt ) {\r\n var CollectParentPaths = function ( halt ) {\r\n this.nodePaths = [];\r\n this.halt = halt;\r\n NodeVisitor.call( this, NodeVisitor.TRAVERSE_PARENTS );\r\n };\r\n CollectParentPaths.prototype = MACROUTILS.objectInherit( NodeVisitor.prototype, {\r\n apply: function ( node ) {\r\n if ( node.parents.length === 0 || node === this.halt || ( node.referenceFrame !== undefined && node.referenceFrame === TransformEnums.ABSOLUTE_RF ) ) {\r\n // copy\r\n this.nodePaths.push( this.nodePath.slice( 0 ) );\r\n } else {\r\n this.traverse( node );\r\n }\r\n }\r\n } );\r\n var collected = new CollectParentPaths( halt );\r\n this.accept( collected );\r\n var matrixList = [];\r\n\r\n for ( var i = 0, l = collected.nodePaths.length; i < l; i++ ) {\r\n var np = collected.nodePaths[ i ];\r\n if ( np.length === 0 ) {\r\n matrixList.push( Matrix.create() );\r\n } else {\r\n matrixList.push( ComputeMatrixFromNodePath.computeLocalToWorld( np ) );\r\n }\r\n }\r\n return matrixList;\r\n },\r\n\r\n setCullingActive: function ( value ) {\r\n if ( this._cullingActive === value ) return;\r\n if ( this._numChildrenWithCullingDisabled === 0 && this.parents.length > 0 ) {\r\n var delta = 0;\r\n if ( !this._cullingActive ) --delta;\r\n if ( !value ) ++delta;\r\n if ( delta !== 0 ) {\r\n for ( var i = 0, k = this.parents.length; i < k; i++ ) {\r\n this.parents[ i ].setNumChildrenWithCullingDisabled( this.parents[ i ].getNumChildrenWithCullingDisabled() + delta );\r\n }\r\n }\r\n }\r\n this._cullingActive = value;\r\n },\r\n\r\n getCullingActive: function () {\r\n return this._cullingActive;\r\n },\r\n\r\n isCullingActive: function () {\r\n return this._numChildrenWithCullingDisabled === 0 && this._cullingActive && this.getBound().valid();\r\n },\r\n\r\n setNumChildrenWithCullingDisabled: function ( num ) {\r\n if ( this._numChildrenWithCullingDisabled === num ) return;\r\n if ( this._cullingActive && this.parents.length > 0 ) {\r\n var delta = 0;\r\n if ( this._numChildrenWithCullingDisabled > 0 ) --delta;\r\n if ( num > 0 ) ++delta;\r\n if ( delta !== 0 ) {\r\n for ( var i = 0, k = this.parents.length; i < k; i++ ) {\r\n this.parents[ i ].setNumChildrenWithCullingDisabled( this.parents[ i ].getNumChildrenWithCullingDisabled() + delta );\r\n }\r\n }\r\n }\r\n this._numChildrenWithCullingDisabled = num;\r\n },\r\n\r\n getNumChildrenWithCullingDisabled: function () {\r\n return this._numChildrenWithCullingDisabled;\r\n },\r\n\r\n releaseGLObjects: function () {\r\n if ( this.stateset !== undefined ) this.stateset.releaseGLObjects();\r\n }\r\n\r\n } ), 'osg', 'Node' );\r\n MACROUTILS.setTypeID( Node );\r\n\r\n return Node;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/Node.js\n ** module id = 60\n ** module chunks = 0 1\n **/","define( [], function () {\r\n\r\n 'use strict';\r\n\r\n var NodeVisitor = function ( traversalMode ) {\r\n /*jshint bitwise: false */\r\n this.traversalMask = ~0x0;\r\n /*jshint bitwise: true */\r\n this.nodeMaskOverride = 0;\r\n this.traversalMode = traversalMode;\r\n if ( traversalMode === undefined ) {\r\n this.traversalMode = NodeVisitor.TRAVERSE_ALL_CHILDREN;\r\n }\r\n this.nodePath = [];\r\n this.visitorType = NodeVisitor.NODE_VISITOR;\r\n this._databaseRequestHandler = undefined;\r\n this._frameStamp = undefined;\r\n };\r\n\r\n //NodeVisitor.TRAVERSE_NONE = 0;\r\n NodeVisitor.TRAVERSE_PARENTS = 1;\r\n NodeVisitor.TRAVERSE_ALL_CHILDREN = 2;\r\n NodeVisitor.TRAVERSE_ACTIVE_CHILDREN = 3;\r\n NodeVisitor.NODE_VISITOR = 0;\r\n NodeVisitor.UPDATE_VISITOR = 1;\r\n NodeVisitor.CULL_VISITOR = 2;\r\n\r\n\r\n NodeVisitor._traversalFunctions = {};\r\n NodeVisitor._traversalFunctions[ NodeVisitor.TRAVERSE_PARENTS ] = function ( node ) {\r\n node.ascend( this );\r\n };\r\n NodeVisitor._traversalFunctions[ NodeVisitor.TRAVERSE_ALL_CHILDREN ] = function ( node ) {\r\n node.traverse( this );\r\n };\r\n NodeVisitor._traversalFunctions[ NodeVisitor.TRAVERSE_ACTIVE_CHILDREN ] = function ( node ) {\r\n node.traverse( this );\r\n };\r\n\r\n\r\n NodeVisitor._pushOntoNodePath = {};\r\n NodeVisitor._pushOntoNodePath[ NodeVisitor.TRAVERSE_PARENTS ] = function ( node ) {\r\n this.nodePath.unshift( node );\r\n };\r\n NodeVisitor._pushOntoNodePath[ NodeVisitor.TRAVERSE_ALL_CHILDREN ] = function ( node ) {\r\n this.nodePath.push( node );\r\n };\r\n NodeVisitor._pushOntoNodePath[ NodeVisitor.TRAVERSE_ACTIVE_CHILDREN ] = function ( node ) {\r\n this.nodePath.push( node );\r\n };\r\n NodeVisitor._popFromNodePath = {};\r\n NodeVisitor._popFromNodePath[ NodeVisitor.TRAVERSE_PARENTS ] = function () {\r\n return this.nodePath.shift();\r\n };\r\n NodeVisitor._popFromNodePath[ NodeVisitor.TRAVERSE_ALL_CHILDREN ] = function () {\r\n this.nodePath.pop();\r\n };\r\n NodeVisitor._popFromNodePath[ NodeVisitor.TRAVERSE_ACTIVE_CHILDREN ] = function () {\r\n this.nodePath.pop();\r\n };\r\n\r\n NodeVisitor.prototype = {\r\n\r\n setFrameStamp: function ( frameStamp ) {\r\n this._frameStamp = frameStamp;\r\n },\r\n\r\n getFrameStamp: function () {\r\n return this._frameStamp;\r\n },\r\n\r\n\r\n setNodeMaskOverride: function ( m ) {\r\n this.nodeMaskOverride = m;\r\n },\r\n getNodeMaskOverride: function () {\r\n return this.nodeMaskOverride;\r\n },\r\n\r\n setTraversalMask: function ( m ) {\r\n this.traversalMask = m;\r\n },\r\n getTraversalMask: function () {\r\n return this.traversalMask;\r\n },\r\n\r\n getNodePath: function () {\r\n return this.nodePath;\r\n },\r\n\r\n pushOntoNodePath: function ( node ) {\r\n NodeVisitor._pushOntoNodePath[ this.traversalMode ].call( this, node );\r\n },\r\n popFromNodePath: function () {\r\n NodeVisitor._popFromNodePath[ this.traversalMode ].call( this );\r\n },\r\n validNodeMask: function ( node ) {\r\n var nm = node.getNodeMask();\r\n /*jshint bitwise: false */\r\n return ( ( this.traversalMask & ( this.nodeMaskOverride | nm ) ) !== 0 );\r\n /*jshint bitwise: true */\r\n },\r\n apply: function ( node ) {\r\n this.traverse( node );\r\n },\r\n traverse: function ( node ) {\r\n NodeVisitor._traversalFunctions[ this.traversalMode ].call( this, node );\r\n },\r\n getVisitorType: function () {\r\n return this.visitorType;\r\n },\r\n setDatabaseRequestHandler: function ( dbpager ) {\r\n this._databaseRequestHandler = dbpager;\r\n },\r\n getDatabaseRequestHandler: function () {\r\n return this._databaseRequestHandler;\r\n }\r\n };\r\n\r\n return NodeVisitor;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/NodeVisitor.js\n ** module id = 61\n ** module chunks = 0 1\n **/","define( [], function () {\r\n\r\n var Notify = {};\r\n\r\n Notify.DEBUG = 0;\r\n Notify.INFO = 1;\r\n Notify.NOTICE = 2;\r\n Notify.WARN = 3;\r\n Notify.ERROR = 4;\r\n\r\n Notify.console = window.console;\r\n\r\n // #FIXME getStackTrace was initially in webgl-utils (as a global function) but only used in this file\r\n /** Obtain a stacktrace from the current stack http://eriwen.com/javascript/js-stack-trace/\r\n */\r\n function getStackTrace( err ) {\r\n if ( Notify.console && Notify.console.trace ) {\r\n if ( Notify.console.groupCollapsed ) Notify.console.groupCollapsed();\r\n Notify.console.trace();\r\n if ( Notify.console.groupEnd ) Notify.console.groupEnd();\r\n return '';\r\n }\r\n var callstack = [];\r\n try {\r\n if ( arguments.length === 1 ) {\r\n throw err;\r\n } else {\r\n throw new Error();\r\n }\r\n } catch ( error ) {\r\n if ( error.stack ) { //Firefox and Chrome\r\n callstack = ( error.stack + '\\n' ).replace( /^\\S[^\\(]+?[\\n$]/gm, '' ).\r\n replace( /^\\s+(at eval )?at\\s+/gm, '' ).\r\n replace( /^([^\\(]+?)([\\n$])/gm, '{anonymous}()@$1$2' ).\r\n replace( /^Object.\\s*\\(([^\\)]+)\\)/gm, '{anonymous}()@$1' ).split( '\\n' );\r\n // Remove call to this function\r\n callstack.shift();\r\n\r\n }\r\n }\r\n // Remove empty entries\r\n for ( var i = 0; i < callstack.length; ++i ) {\r\n if ( callstack[ i ] === '' ) {\r\n callstack.splice( i, 1 );\r\n --i;\r\n }\r\n }\r\n\r\n return callstack;\r\n }\r\n /** logging with readability in mind.\r\n * @param { str } actual log text\r\n * @param { fold } sometimes you want to hide looooong text\r\n * @param { noTrace } where that log came from ?\r\n * @param { level } what severity is that log (gives text color too )\r\n */\r\n function logSub( str, level, fold, noTrace ) {\r\n if ( Notify.console !== undefined ) {\r\n if ( fold && Notify.console.groupCollapsed ) Notify.console.groupCollapsed();\r\n if ( noTrace ) {\r\n Notify.console[ level ]( str );\r\n } else {\r\n Notify.console[ level ]( str, getStackTrace() );\r\n }\r\n if ( fold && Notify.console.groupEnd ) Notify.console.groupEnd();\r\n }\r\n }\r\n\r\n Notify.setNotifyLevel = function ( level ) {\r\n\r\n\r\n var log = function ( str, fold, noTrace ) {\r\n logSub( str, 'log', fold, noTrace );\r\n };\r\n\r\n var info = function ( str, fold, noTrace ) {\r\n logSub( str, 'info', fold, noTrace );\r\n };\r\n\r\n var warn = function ( str, fold, noTrace ) {\r\n logSub( str, 'warn', fold, noTrace );\r\n };\r\n\r\n var error = function ( str, fold ) {\r\n logSub( str, 'error', fold, true ); // error does trace auto\r\n };\r\n\r\n var debug = function ( str, fold, noTrace ) {\r\n logSub( str, 'debug', fold, noTrace );\r\n };\r\n\r\n var assert = function ( test, str ) {\r\n if ( this.console !== undefined ) {\r\n this.console.assert( test, str, getStackTrace() );\r\n }\r\n };\r\n\r\n var dummy = function () {};\r\n\r\n Notify.assert = dummy;\r\n Notify.debug = dummy;\r\n Notify.info = dummy;\r\n Notify.log = Notify.notice = dummy;\r\n Notify.warn = dummy;\r\n Notify.error = dummy;\r\n\r\n if ( level <= Notify.DEBUG ) {\r\n Notify.debug = debug;\r\n Notify.assert = assert;\r\n }\r\n if ( level <= Notify.INFO ) {\r\n Notify.info = info;\r\n }\r\n if ( level <= Notify.NOTICE ) {\r\n Notify.log = Notify.notice = log;\r\n }\r\n if ( level <= Notify.WARN ) {\r\n Notify.warn = warn;\r\n }\r\n if ( level <= Notify.ERROR ) {\r\n Notify.error = error;\r\n }\r\n };\r\n\r\n Notify.setNotifyLevel( Notify.NOTICE );\r\n\r\n Notify.reportWebGLError = false;\r\n\r\n Notify.setConsole = function ( replacement ) {\r\n Notify.console = replacement;\r\n };\r\n\r\n return Notify;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/Notify.js\n ** module id = 62\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils'\r\n], function ( MACROUTILS ) {\r\n\r\n /**\r\n * Object class\r\n * @class Object\r\n */\r\n var Object = function () {\r\n this._name = undefined;\r\n this._userdata = undefined;\r\n this._instanceID = Object.getInstanceID();\r\n };\r\n\r\n /** @lends Object.prototype */\r\n Object.prototype = MACROUTILS.objectLibraryClass( {\r\n getInstanceID: function () {\r\n return this._instanceID;\r\n },\r\n setName: function ( name ) {\r\n this._name = name;\r\n },\r\n getName: function () {\r\n return this._name;\r\n },\r\n setUserData: function ( data ) {\r\n this._userdata = data;\r\n },\r\n getUserData: function () {\r\n return this._userdata;\r\n }\r\n },\r\n 'osg', 'Object' );\r\n\r\n\r\n // get an instanceID for each object\r\n ( function () {\r\n var instanceID = 0;\r\n Object.getInstanceID = function () {\r\n instanceID += 1;\r\n return instanceID;\r\n };\r\n } )();\r\n\r\n return Object;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/Object.js\n ** module id = 63\n ** module chunks = 0 1\n **/","/**\r\n * @author Jordi Torres\r\n */\r\ndefine( [\r\n 'q',\r\n 'osg/Utils',\r\n 'osg/Lod',\r\n 'osg/NodeVisitor',\r\n 'osg/Matrix',\r\n 'osg/Vec3'\r\n], function ( Q, MACROUTILS, Lod, NodeVisitor, Matrix, Vec3 ) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * PagedLOD that can contains paged child nodes\r\n * @class PagedLod\r\n */\r\n var PagedLOD = function () {\r\n Lod.call( this );\r\n this._perRangeDataList = [];\r\n this._loading = false;\r\n this._expiryTime = 0.0;\r\n this._expiryFrame = 0;\r\n this._centerMode = Lod.USER_DEFINED_CENTER;\r\n this._frameNumberOfLastTraversal = 0;\r\n };\r\n\r\n /**\r\n * PerRangeData utility structure to store per range values\r\n * @class PerRangeData\r\n */\r\n var PerRangeData = function () {\r\n this.filename = '';\r\n this.function = undefined;\r\n this.loaded = false;\r\n this.timeStamp = 0.0;\r\n this.frameNumber = 0;\r\n this.frameNumberOfLastTraversal = 0;\r\n this.dbrequest = undefined;\r\n };\r\n\r\n /** @lends PagedLOD.prototype */\r\n PagedLOD.prototype = MACROUTILS.objectLibraryClass( MACROUTILS.objectInherit( Lod.prototype, {\r\n // Functions here\r\n setRange: function ( childNo, min, max ) {\r\n if ( childNo >= this._range.length ) {\r\n var r = [];\r\n r.push( [ min, min ] );\r\n this._range.push( r );\r\n }\r\n this._range[ childNo ][ 0 ] = min;\r\n this._range[ childNo ][ 1 ] = max;\r\n },\r\n\r\n setExpiryTime: function ( expiryTime ) {\r\n this._expiryTime = expiryTime;\r\n },\r\n\r\n setFileName: function ( childNo, filename ) {\r\n // May we should expand the vector first?\r\n if ( childNo >= this._perRangeDataList.length ) {\r\n var rd = new PerRangeData();\r\n rd.filename = filename;\r\n this._perRangeDataList.push( rd );\r\n } else {\r\n this._perRangeDataList[ childNo ].filename = filename;\r\n }\r\n },\r\n setFunction: function ( childNo, func ) {\r\n if ( childNo >= this._perRangeDataList.length ) {\r\n var rd = new PerRangeData();\r\n rd.function = func;\r\n this._perRangeDataList.push( rd );\r\n } else {\r\n this._perRangeDataList[ childNo ].function = func;\r\n }\r\n },\r\n\r\n addChild: function ( node, min, max ) {\r\n Lod.prototype.addChild.call( this, node, min, max );\r\n this._perRangeDataList.push( new PerRangeData() );\r\n },\r\n\r\n addChildNode: function ( node ) {\r\n Lod.prototype.addChildNode.call( this, node );\r\n },\r\n\r\n setFrameNumberOfLastTraversal: function ( frameNumber ) {\r\n this._frameNumberOfLastTraversal = frameNumber;\r\n },\r\n\r\n getFrameNumberOfLastTraversal: function () {\r\n return this._frameNumberOfLastTraversal;\r\n },\r\n setTimeStamp: function ( childNo, timeStamp ) {\r\n this._perRangeDataList[ childNo ].timeStamp = timeStamp;\r\n },\r\n setFrameNumber: function ( childNo, frameNumber ) {\r\n this._perRangeDataList[ childNo ].frameNumber = frameNumber;\r\n },\r\n getDatabaseRequest: function ( childNo ) {\r\n return this._perRangeDataList[ childNo ].dbrequest;\r\n },\r\n removeExpiredChildren: function ( expiryTime, expiryFrame, removedChildren ) {\r\n var i = this.children.length - 1;\r\n var timed, framed;\r\n timed = this._perRangeDataList[ i ].timeStamp + this._expiryTime;\r\n framed = this._perRangeDataList[ i ].frameNumber + this._expiryFrame;\r\n if ( timed < expiryTime && framed < expiryFrame && ( this._perRangeDataList[ i ].filename.length > 0 ||\r\n this._perRangeDataList[ i ].function !== undefined ) ) {\r\n removedChildren.push( this.children[ i ] );\r\n this.removeChild( this.children[ i ] );\r\n this._perRangeDataList[ i ].loaded = false;\r\n if ( this._perRangeDataList[ i ].dbrequest !== undefined ) {\r\n this._perRangeDataList[ i ].dbrequest._groupExpired = true;\r\n //this._perRangeDataList[ i ].dbrequest = undefined;\r\n }\r\n }\r\n },\r\n\r\n traverse: ( function () {\r\n\r\n // avoid to generate variable on the heap to limit garbage collection\r\n // instead create variable and use the same each time\r\n var zeroVector = Vec3.create();\r\n var eye = Vec3.create();\r\n var viewModel = Matrix.create();\r\n\r\n return function ( visitor ) {\r\n\r\n var traversalMode = visitor.traversalMode;\r\n var updateTimeStamp = false;\r\n\r\n if ( visitor.getVisitorType() === NodeVisitor.CULL_VISITOR ) {\r\n this._frameNumberOfLastTraversal = visitor.getFrameStamp().getFrameNumber();\r\n updateTimeStamp = true;\r\n }\r\n\r\n switch ( traversalMode ) {\r\n\r\n case NodeVisitor.TRAVERSE_ALL_CHILDREN:\r\n\r\n for ( var index = 0; index < this.children.length; index++ ) {\r\n this.children[ index ].accept( visitor );\r\n }\r\n break;\r\n\r\n case ( NodeVisitor.TRAVERSE_ACTIVE_CHILDREN ):\r\n var requiredRange = 0;\r\n\r\n // Calculate distance from viewpoint\r\n var matrix = visitor.getCurrentModelViewMatrix();\r\n Matrix.inverse( matrix, viewModel );\r\n if ( this._rangeMode === Lod.DISTANCE_FROM_EYE_POINT ) {\r\n Matrix.transformVec3( viewModel, zeroVector, eye );\r\n var d = Vec3.distance( eye, this.getBound().center() );\r\n requiredRange = d;\r\n } else {\r\n // Calculate pixels on screen\r\n var projmatrix = visitor.getCurrentProjectionMatrix();\r\n // focal lenght is the value stored in projmatrix[0]\r\n requiredRange = this.projectBoundingSphere( this.getBound(), matrix, projmatrix[ 0 ] );\r\n // Get the real area value\r\n requiredRange = ( requiredRange * visitor.getViewport().width() * visitor.getViewport().width() ) * 0.25;\r\n if ( requiredRange < 0 ) requiredRange = this._range[ this._range.length - 1 ][ 0 ];\r\n }\r\n\r\n var needToLoadChild = false;\r\n var lastChildTraversed = -1;\r\n for ( var j = 0; j < this._range.length; ++j ) {\r\n if ( this._range[ j ][ 0 ] <= requiredRange && requiredRange < this._range[ j ][ 1 ] ) {\r\n if ( j < this.children.length ) {\r\n\r\n if ( updateTimeStamp ) {\r\n this._perRangeDataList[ j ].timeStamp = visitor.getFrameStamp().getSimulationTime();\r\n this._perRangeDataList[ j ].frameNumber = visitor.getFrameStamp().getFrameNumber();\r\n }\r\n\r\n this.children[ j ].accept( visitor );\r\n lastChildTraversed = j;\r\n } else {\r\n needToLoadChild = true;\r\n }\r\n }\r\n }\r\n if ( needToLoadChild ) {\r\n var numChildren = this.children.length;\r\n if ( numChildren > 0 && ( ( numChildren - 1 ) !== lastChildTraversed ) ) {\r\n\r\n if ( updateTimeStamp ) {\r\n this._perRangeDataList[ numChildren - 1 ].timeStamp = visitor.getFrameStamp().getSimulationTime();\r\n this._perRangeDataList[ numChildren - 1 ].frameNumber = visitor.getFrameStamp().getFrameNumber();\r\n }\r\n\r\n this.children[ numChildren - 1 ].accept( visitor );\r\n }\r\n // now request the loading of the next unloaded child.\r\n if ( numChildren < this._perRangeDataList.length ) {\r\n // compute priority from where abouts in the required range the distance falls.\r\n var priority = ( this._range[ numChildren ][ 0 ] - requiredRange ) / ( this._range[ numChildren ][ 1 ] - this._range[ numChildren ][ 0 ] );\r\n if ( this._rangeMode === Lod.PIXEL_SIZE_ON_SCREEN ) {\r\n priority = -priority;\r\n }\r\n // Here we do the request\r\n var group = visitor.nodePath[ visitor.nodePath.length - 1 ];\r\n if ( this._perRangeDataList[ numChildren ].loaded === false ) {\r\n this._perRangeDataList[ numChildren ].loaded = true;\r\n var dbhandler = visitor.getDatabaseRequestHandler();\r\n this._perRangeDataList[ numChildren ].dbrequest = dbhandler.requestNodeFile( this._perRangeDataList[ numChildren ].function, this._perRangeDataList[ numChildren ].filename, group, visitor.getFrameStamp().getSimulationTime(), priority );\r\n } else {\r\n // Update timestamp of the request.\r\n if ( this._perRangeDataList[ numChildren ].dbrequest !== undefined ) {\r\n this._perRangeDataList[ numChildren ].dbrequest._timeStamp = visitor.getFrameStamp().getSimulationTime();\r\n this._perRangeDataList[ numChildren ].dbrequest._priority = priority;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n break;\r\n }\r\n };\r\n } )()\r\n\r\n\r\n } ), 'osg', 'PagedLOD' );\r\n\r\n MACROUTILS.setTypeID( PagedLOD );\r\n return PagedLOD;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/PagedLOD.js\n ** module id = 64\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Matrix',\r\n 'osg/Notify',\r\n 'osg/Plane',\r\n 'osg/Utils'\r\n], function ( Matrix, Notify, Plane, MACROUTILS ) {\r\n /*jshint bitwise: false */\r\n 'use strict';\r\n /**\r\n * Polytope class for representing convex clipping volumes made up of a set of planes.\r\n * When adding planes, their normals should point inwards (into the volume)\r\n * @class Polytope\r\n */\r\n var Polytope = function () {\r\n\r\n this._clippingMask = 0x0;\r\n\r\n this._planeList = [ Plane.create(), Plane.create(), Plane.create(), Plane.create(), Plane.create(), Plane.create() ];\r\n this._vertexList = [];\r\n\r\n // stack of clipping masks\r\n this._maskStack = [];\r\n\r\n // init with a clear mask\r\n this._resultMask = 0;\r\n this._maskStack.push( this._resultMask );\r\n };\r\n\r\n Polytope.prototype = MACROUTILS.objectInherit( Object.prototype, {\r\n\r\n\r\n getPlanes: function () {\r\n return this._planeList;\r\n },\r\n setPlanes: function ( pl ) {\r\n this._planeList = pl;\r\n this.setupMask();\r\n },\r\n\r\n clear: function () {\r\n this._planeList.length = 0;\r\n this.setupMask();\r\n },\r\n\r\n /** Create a Polytope which is a cube, centered at 0,0,0, with sides of 2 units.*/\r\n setToUnitFrustum: function ( withNear, withFar ) {\r\n if ( withNear === undefined ) withNear = true;\r\n\r\n if ( withFar === undefined ) withFar = true;\r\n\r\n this._planeList.length = 0;\r\n this._planeList.push( Plane.create().set( 1.0, 0.0, 0.0, 1.0 ) ); // left plane.\r\n this._planeList.push( Plane.create().set( -1.0, 0.0, 0.0, 1.0 ) ); // right plane.\r\n this._planeList.push( Plane.create().set( 0.0, 1.0, 0.0, 1.0 ) ); // bottom plane.\r\n this._planeList.push( Plane.create().set( 0.0, -1.0, 0.0, 1.0 ) ); // top plane.\r\n if ( withNear ) this._planeList.push( Plane.create().set( 0.0, 0.0, 1.0, 1.0 ) ); // near plane\r\n if ( withFar ) this._planeList.push( Plane.create().set( 0.0, 0.0, -1.0, 1.0 ) ); // far plane\r\n this.setupMask();\r\n },\r\n\r\n\r\n /** Create a Polytope which is a equivalent to BoundingBox.*/\r\n setToBoundingBox: function ( bb ) {\r\n this._planeList.length = 0;\r\n this._planeList.push( Plane.create().set( 1.0, 0.0, 0.0, -bb.getMin()[ 0 ] ) ); // left plane.\r\n this._planeList.push( Plane.create().set( -1.0, 0.0, 0.0, bb.getMax()[ 0 ] ) ); // right plane.\r\n this._planeList.push( Plane.create().set( 0.0, 1.0, 0.0, -bb.getMin()[ 1 ] ) ); // bottom plane.\r\n this._planeList.push( Plane.create().set( 0.0, -1.0, 0.0, bb.getMax()[ 1 ] ) ); // top plane.\r\n this._planeList.push( Plane.create().set( 0.0, 0.0, 1.0, -bb.getMin()[ 2 ] ) ); // near plane\r\n this._planeList.push( Plane.create().set( 0.0, 0.0, -1.0, bb.getMax()[ 2 ] ) ); // far plane\r\n this.setupMask();\r\n },\r\n\r\n setAndTransformProvidingInverse: function ( pt, matrix ) {\r\n this._referenceVertexList = pt._referenceVertexList;\r\n var resultMask = pt._maskStack[ this._maskStack.length - 1 ];\r\n if ( resultMask === 0 ) {\r\n this._maskStack[ this._maskStack.length - 1 ] = 0;\r\n this._resultMask = 0;\r\n this._planeList.length = 0;\r\n return;\r\n }\r\n var selectorMask = 0x1;\r\n\r\n var numActivePlanes = 0;\r\n // count number of active planes.\r\n var i;\r\n for ( i = 0; i !== pt._planeList.length; ++i ) {\r\n if ( resultMask & selectorMask ) ++numActivePlanes;\r\n selectorMask <<= 1;\r\n }\r\n\r\n this._planeList.length = numActivePlanes;\r\n this._resultMask = 0;\r\n selectorMask = 0x1;\r\n var index = 0;\r\n for ( i = 0; i !== pt._planeList.length; ++i ) {\r\n if ( resultMask & selectorMask ) {\r\n this._planeList[ index ] = pt._planeList[ i ];\r\n Plane.transformProvidingInverse( this._planeList[ index++ ], matrix );\r\n this._resultMask = ( this._resultMask << 1 ) | 1;\r\n }\r\n selectorMask <<= 1;\r\n }\r\n\r\n this._maskStack[ this._maskStack.length - 1 ] = this._resultMask;\r\n },\r\n\r\n voidset: function ( pl ) {\r\n this._planeList = pl;\r\n this.setupMask();\r\n },\r\n\r\n\r\n add: function ( pl ) {\r\n this._planeList.push( pl );\r\n this.setupMask();\r\n },\r\n\r\n empty: function () {\r\n return this._planeList.length === 0;\r\n },\r\n\r\n getPlaneList: function () {\r\n return this._planeList;\r\n },\r\n\r\n setReferenceVertexList: function ( vertices ) {\r\n this._referenceVertexList = vertices;\r\n },\r\n\r\n getReferenceVertexList: function () {\r\n return this._referenceVertexList;\r\n },\r\n\r\n setupMask: function ( plength ) {\r\n this._resultMask = 0;\r\n plength = ( plength !== undefined ) ? plength : this._planeList.length;\r\n for ( var i = 0; i < plength; ++i ) {\r\n this._resultMask = ( this._resultMask << 1 ) | 1;\r\n }\r\n this._maskStack = [];\r\n this._maskStack.push( this._resultMask );\r\n },\r\n\r\n getCurrentMask: function () {\r\n return this._maskStack[ this._maskStack.length - 1 ];\r\n },\r\n\r\n setResultMask: function ( mask ) {\r\n this._resultMask = mask;\r\n },\r\n\r\n getResultMask: function () {\r\n return this._resultMask;\r\n },\r\n\r\n getMaskStack: function () {\r\n return this._maskStack;\r\n },\r\n\r\n\r\n // push but keep current mask\r\n pushCurrentMask: function () {\r\n this._maskStack.push( this._resultMask );\r\n },\r\n // pop and restore previous mask\r\n popCurrentMask: function () {\r\n return this._maskStack.pop();\r\n },\r\n\r\n\r\n /** Check whether a vertex is contained within clipping set.*/\r\n containsVertex: function ( v ) {\r\n if ( !this._maskStack[ this._maskStack.length - 1 ] ) return true;\r\n\r\n var selectorMask = 0x1;\r\n for ( var i = 0; i < this._planeList.length; ++i ) {\r\n if ( ( this._maskStack[ this._maskStack.length - 1 ] & selectorMask ) && ( Plane.distanceToPlane( this._planeList[ i ], v ) < 0.0 ) ) {\r\n return false;\r\n }\r\n selectorMask <<= 1;\r\n }\r\n return true;\r\n },\r\n\r\n /** Check whether any part of vertex list is contained within clipping set.*/\r\n containsVertices: function ( vertices ) {\r\n if ( !this._maskStack[ this._maskStack.length - 1 ] ) return true;\r\n\r\n this._resultMask = this._maskStack[ this._maskStack.length - 1 ];\r\n\r\n for ( var k = 0; k < vertices.length; ++k ) {\r\n var v = vertices[ k ];\r\n var outside = false;\r\n var selectorMask = 0x1;\r\n for ( var i = 0; !outside && i < this._planeList.length; ++i ) {\r\n if ( ( this._maskStack[ this._maskStack.length - 1 ] & selectorMask ) && ( Plane.distanceToPlane( this._planeList[ i ], v ) < 0.0 ) ) {\r\n outside = true;\r\n }\r\n selectorMask <<= 1;\r\n }\r\n\r\n if ( !outside ) return true;\r\n }\r\n return false;\r\n },\r\n\r\n /** Check whether any part of a bounding sphere is contained within clipping set.\r\n Using a mask to determine which planes should be used for the check, and\r\n modifying the mask to turn off planes which wouldn't contribute to clipping\r\n of any internal objects. This feature is used in osgUtil::CullVisitor\r\n to prevent redundant plane checking.*/\r\n containsBoundingSphere: function ( bs ) {\r\n if ( !this._maskStack[ this._maskStack.length - 1 ] || !bs.valid() ) return true;\r\n\r\n this._resultMask = this._maskStack[ this._maskStack.length - 1 ];\r\n var selectorMask = 0x1;\r\n\r\n for ( var i = 0; i < this._planeList.length; ++i ) {\r\n if ( this._resultMask & selectorMask ) {\r\n var res = Plane.intersectsOrContainsBoundingSphere( this._planeList[ i ], bs );\r\n if ( Plane.OUTSIDE === res ) {\r\n // totally outside a clipping set.\r\n return false;\r\n } else if ( Plane.INSIDE === res ) {\r\n // subsequent checks against this plane not required.\r\n this._resultMask ^= selectorMask;\r\n }\r\n // else if ( Plane.INTERSECT === res ) { // last possible case\r\n // can say nothing.\r\n // subsequent checks against this plane needed.\r\n //}\r\n }\r\n selectorMask <<= 1;\r\n }\r\n return true;\r\n },\r\n\r\n /** Check whether any part of a bounding box is contained within clipping set.\r\n Using a mask to determine which planes should be used for the check, and\r\n modifying the mask to turn off planes which wouldn't contribute to clipping\r\n of any internal objects. This feature is used in osgUtil::CullVisitor\r\n to prevent redundant plane checking.*/\r\n containsBoundingBox: function ( bb ) {\r\n if ( !this._maskStack[ this._maskStack.length - 1 ] ) return true;\r\n\r\n this._resultMask = this._maskStack[ this._maskStack.length - 1 ];\r\n var selectorMask = 0x1;\r\n\r\n for ( var i = 0; i < this._planeList.length; ++i ) {\r\n if ( this._resultMask & selectorMask ) {\r\n var res = Plane.intersectsOrContainsBoundingBox( this._planeList[ i ], bb );\r\n if ( Plane.OUTSIDE === res ) return false; // outside clipping set.\r\n else if ( Plane.INSIDE === res ) this._resultMask ^= selectorMask; // subsequent checks against this plane not required.\r\n // else if ( Plane.INTERSECT === res ) the last case need\r\n // no test here but further tests\r\n }\r\n selectorMask <<= 1;\r\n }\r\n // correct frustum culling should double check now for\r\n // http://www.iquilezles.org/www/articles/frustumcorrect/frustumcorrect.htm\r\n // which is inside one \"plane\", but outside the convex plane intersection\r\n return true;\r\n },\r\n\r\n /** Check whether all of vertex list is contained with clipping set.*/\r\n containsAllOfVertices: function ( vertices ) {\r\n if ( !this._maskStack[ this._maskStack.length - 1 ] ) return false;\r\n\r\n this._resultMask = this._maskStack[ this._maskStack.length - 1 ];\r\n var selectorMask = 0x1;\r\n\r\n for ( var i = 0; i < this._planeList.length; ++i ) {\r\n if ( this._resultMask & selectorMask ) {\r\n var res = Plane.intersectsOrContainsVertices( this._planeList[ i ], vertices );\r\n if ( res < 1 ) return false; // intersects, or is below plane.\r\n this._resultMask ^= selectorMask; // subsequent checks against this plane not required.\r\n }\r\n selectorMask <<= 1;\r\n }\r\n return true;\r\n },\r\n\r\n /** Check whether the entire bounding sphere is contained within clipping set.*/\r\n containsAllOfBoundingSphere: function ( bs ) {\r\n if ( !this._maskStack[ this._maskStack.length - 1 ] ) return false;\r\n\r\n this._resultMask = this._maskStack[ this._maskStack.length - 1 ];\r\n var selectorMask = 0x1;\r\n\r\n for ( var i = 0; i < this._planeList.length; ++i ) {\r\n if ( this._resultMask & selectorMask ) {\r\n var res = Plane.intersectsOrContainsBoundingSphere( this._planeList[ i ], bs );\r\n if ( res < 1 ) return false; // intersects, or is below plane.\r\n this._resultMask ^= selectorMask; // subsequent checks against this plane not required.\r\n }\r\n selectorMask <<= 1;\r\n }\r\n return true;\r\n },\r\n\r\n /** Check whether the entire bounding box is contained within clipping set.*/\r\n containsAllOfBoundingBox: function ( bbox ) {\r\n if ( !this._maskStack[ this._maskStack.length - 1 ] ) return false;\r\n\r\n this._resultMask = this._maskStack[ this._maskStack.length - 1 ];\r\n var selectorMask = 0x1;\r\n\r\n for ( var i = 0; i < this._planeList.length; ++i ) {\r\n if ( this._resultMask & selectorMask ) {\r\n var res = Plane.intersectsOrContainsBoundingBox( this._planeList[ i ], bbox );\r\n if ( res < 1 ) return false; // intersects, or is below plane.\r\n this._resultMask ^= selectorMask; // subsequent checks against this plane not required.\r\n }\r\n selectorMask <<= 1;\r\n }\r\n return true;\r\n },\r\n\r\n\r\n /** Transform the clipping set by matrix. Note, this operations carries out\r\n * the calculation of the inverse of the matrix since a plane must\r\n * be multiplied by the inverse transposed to transform it. This\r\n * makes this operation expensive. If the inverse has been already\r\n * calculated elsewhere then use transformProvidingInverse() instead.\r\n * See http://www.worldserver.com/turk/computergraphics/NormalTransformations.pdf*/\r\n transform: function ( matrix ) {\r\n var inverse = new Matrix();\r\n inverse.invert( matrix );\r\n this.transformProvidingInverse( inverse );\r\n },\r\n\r\n /** Transform the clipping set by provide a pre inverted matrix.\r\n * see transform for details. */\r\n transformProvidingInverse: function ( matrix ) {\r\n if ( !this._maskStack[ this._maskStack.length - 1 ] ) return;\r\n\r\n this._resultMask = this._maskStack[ this._maskStack.length - 1 ];\r\n var selectorMask = 0x1;\r\n for ( var i = 0; i < this._planeList.length; ++i ) {\r\n if ( this._resultMask & selectorMask ) {\r\n Plane.transformProvidingInverse( this._planeList[ i ], matrix );\r\n selectorMask <<= 1;\r\n }\r\n }\r\n }\r\n\r\n\r\n\r\n } );\r\n\r\n /*jshint bitwise: true */\r\n\r\n return Polytope;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/Polytope.js\n ** module id = 65\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Matrix',\r\n 'osg/Utils',\r\n 'osg/Vec4',\r\n 'osg/Vec3',\r\n], function ( Matrix, MACROUTILS, Vec4, Vec3 ) {\r\n\r\n 'use strict';\r\n\r\n /** @class Plane Operations */\r\n var Plane = MACROUTILS.objectInherit( Vec4, {\r\n // Many case (frustum, convexity)\r\n // needs to know where from a plane it stands,\r\n // not just boolean intersection\r\n INSIDE: 1,\r\n INTERSECT: 2,\r\n OUTSIDE: 3,\r\n /* Transform the plane */\r\n transformProvidingInverse: function () {\r\n var iplane = Plane.create();\r\n return function ( plane, matrix ) {\r\n Matrix.transformVec4PostMult( matrix, plane, iplane );\r\n Plane.normalizeEquation( iplane );\r\n Plane.copy( iplane, plane );\r\n return plane;\r\n };\r\n },\r\n\r\n normalizeEquation: function ( plane ) {\r\n // multiply the coefficients of the plane equation with a constant factor so that the equation a^2+b^2+c^2 = 1 holds.\r\n var inv = 1.0 / Math.sqrt( plane[ 0 ] * plane[ 0 ] + plane[ 1 ] * plane[ 1 ] + plane[ 2 ] * plane[ 2 ] );\r\n plane[ 0 ] *= inv;\r\n plane[ 1 ] *= inv;\r\n plane[ 2 ] *= inv;\r\n plane[ 3 ] *= inv;\r\n },\r\n /*only the normal Component*/\r\n getNormal: function ( plane, result ) {\r\n result[ 0 ] = plane[ 0 ];\r\n result[ 1 ] = plane[ 1 ];\r\n result[ 2 ] = plane[ 2 ];\r\n return result;\r\n },\r\n setNormal: function ( plane, normal ) {\r\n plane[ 0 ] = normal[ 0 ];\r\n plane[ 1 ] = normal[ 1 ];\r\n plane[ 2 ] = normal[ 2 ];\r\n },\r\n /* only the distance getter*/\r\n getDistance: function ( plane ) {\r\n return plane[ 3 ];\r\n },\r\n setDistance: function ( plane, distance ) {\r\n plane[ 3 ] = distance;\r\n },\r\n\r\n /* using the plane equation, compute distance to plane of a point*/\r\n distanceToPlane: function ( plane, position ) {\r\n return plane[ 0 ] * position[ 0 ] + plane[ 1 ] * position[ 1 ] + plane[ 2 ] * position[ 2 ] + plane[ 3 ];\r\n },\r\n\r\n\r\n intersectsOrContainsBoundingSphere: function ( plane, bSphere ) {\r\n if ( !bSphere.valid() ) return Plane.OUTSIDE;\r\n var position = bSphere.center();\r\n var radius = bSphere.radius();\r\n var d = this.distanceToPlane( plane, position );\r\n if ( d < -radius ) {\r\n return Plane.OUTSIDE;\r\n } else if ( d <= radius ) {\r\n return Plane.INTERSECT;\r\n }\r\n return Plane.INSIDE;\r\n },\r\n\r\n instersectsBoundingSphere: function ( plane, bSphere ) {\r\n return this.intersectsOrContainsBoundingSphere( plane, bSphere ) === Plane.INTERSECT;\r\n },\r\n\r\n // absPlane optional paramter is an optimisation for the\r\n // DOD case: on plane, many bounding boxes\r\n intersectsOrContainsBoundingBox: function () {\r\n var center = Vec3.create();\r\n var extent = Vec3.create();\r\n var absTemp = Vec3.create();\r\n return function ( plane, bbox, absPlane ) {\r\n Vec3.add( bbox.getMax(), bbox.getMin(), center );\r\n Vec3.mult( center, 0.5, center );\r\n\r\n Vec3.sub( bbox.getMax(), bbox.getMin(), center );\r\n Vec3.mult( extent, 0.5, extent );\r\n\r\n var d = Vec3.dot( center, plane );\r\n if ( !absPlane ) {\r\n absPlane = absTemp;\r\n absPlane[ 0 ] = Math.abs( plane[ 0 ] );\r\n absPlane[ 1 ] = Math.abs( plane[ 1 ] );\r\n absPlane[ 2 ] = Math.abs( plane[ 2 ] );\r\n }\r\n var r = Vec3.dot( extent, absPlane );\r\n if ( d + r > 0 ) return Plane.INTERSECT; // partially inside\r\n if ( d - r >= 0 ) return Plane.INSIDE; // fully inside\r\n return Plane.OUTSIDE;\r\n };\r\n },\r\n\r\n intersectsBoundingBox: function ( plane, bbox, absPlane ) {\r\n return this.intersectsOrContainsBoundingBox( plane, bbox, absPlane ) === Plane.INTERSECT;\r\n },\r\n\r\n intersectOrContainsVertices: function ( plane, vertices ) {\r\n var side = -1;\r\n // all points must be on one side only\r\n for ( var i = 0; i < vertices.length; i++ ) {\r\n var d = this.distanceToPlane( plane, vertices[ i ] );\r\n if ( d < 0.0 ) {\r\n if ( side === 1 ) return Plane.INTERSECT;\r\n side = 2;\r\n } else if ( d > 0.0 ) {\r\n if ( side === 2 ) return Plane.INTERSECT;\r\n side = 1;\r\n } else { //if ( d === 0.0 )\r\n return Plane.INTERSECT;\r\n }\r\n }\r\n return ( side > 0 ) ? Plane.INSIDE : Plane.OUTSIDE;\r\n\r\n },\r\n intersectVertices: function ( plane, vertices ) {\r\n return this.intersectOrContainsVertices( plane, vertices ) === Plane.INTERSECT;\r\n }\r\n\r\n\r\n } );\r\n\r\n return Plane;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/Plane.js\n ** module id = 66\n ** module chunks = 0 1\n **/","/**\r\n * @author Jordi Torres\r\n */\r\n\r\ndefine( [\r\n 'osg/Vec3',\r\n 'osg/PrimitiveSet'\r\n], function ( Vec3, PrimitiveSet ) {\r\n\r\n /**\r\n * PrimitiveFunctor emulates the TemplatePrimitiveFunctor class in OSG and can\r\n * be used to get access to the vertices that compose the things drawn by osgjs.\r\n * Feed it with a callback that will be called for geometry.\r\n * The callback must be a closure and have the next structure:\r\n *\r\n * var myCallback = function( ) {\r\n * return {\r\n * operatorPoint : function ( v ) { }, // Do your point operations here\r\n * operatorLine : function ( v1, v2 ){ }, // Do you line operations here\r\n * operatorTriangle : function ( v1, v2, v3 ) { } // Do your triangle operations here\r\n * }\r\n * };\r\n *\r\n * Important Note: You should take into account that you are accesing the actual vertices of the primitive\r\n * you might want to do a copy of these values in your callback to avoid to modify the primitive geometry\r\n * @class PrimitiveFunctor\r\n */\r\n\r\n var PrimitiveFunctor = function ( geom, cb, vertices ) {\r\n this._geom = geom;\r\n this._cb = cb;\r\n this._vertices = vertices;\r\n };\r\n\r\n PrimitiveFunctor.prototype = {\r\n applyDrawElementsPoints: ( function () {\r\n var v = Vec3.create();\r\n return function ( count, indexes ) {\r\n var cb = this._cb();\r\n for ( var i = 0; i < count; ++i ) {\r\n var j = indexes[ i ] * 3;\r\n v[ 0 ] = this._vertices[ j ];\r\n v[ 1 ] = this._vertices[ j + 1 ];\r\n v[ 2 ] = this._vertices[ j + 2 ];\r\n cb.operatorPoint( v );\r\n }\r\n };\r\n } )(),\r\n applyDrawElementsLines: ( function () {\r\n var v1 = Vec3.create();\r\n var v2 = Vec3.create();\r\n return function ( count, indexes ) {\r\n var cb = this._cb();\r\n for ( var i = 0; i < count - 1; i += 2 ) {\r\n var j = indexes[ i ] * 3;\r\n v1[ 0 ] = this._vertices[ j ];\r\n v1[ 1 ] = this._vertices[ j + 1 ];\r\n v1[ 2 ] = this._vertices[ j + 2 ];\r\n j = indexes[ i + 1 ] * 3;\r\n v2[ 0 ] = this._vertices[ j ];\r\n v2[ 1 ] = this._vertices[ j + 1 ];\r\n v2[ 2 ] = this._vertices[ j + 2 ];\r\n cb.operatorLine( v1, v2 );\r\n }\r\n };\r\n } )(),\r\n\r\n applyDrawElementsLineStrip: ( function () {\r\n var v1 = Vec3.create();\r\n var v2 = Vec3.create();\r\n return function ( count, indexes ) {\r\n var cb = this._cb();\r\n for ( var i = 0; i < count - 1; ++i ) {\r\n var j = indexes[ i ] * 3;\r\n v1[ 0 ] = this._vertices[ j ];\r\n v1[ 1 ] = this._vertices[ j + 1 ];\r\n v1[ 2 ] = this._vertices[ j + 2 ];\r\n j = indexes[ i + 1 ] * 3;\r\n v2[ 0 ] = this._vertices[ j ];\r\n v2[ 1 ] = this._vertices[ j + 1 ];\r\n v2[ 2 ] = this._vertices[ j + 2 ];\r\n cb.operatorLine( v1, v2 );\r\n }\r\n };\r\n } )(),\r\n\r\n applyDrawElementsLineLoop: ( function () {\r\n var v1 = Vec3.create();\r\n var v2 = Vec3.create();\r\n return function ( count, indexes ) {\r\n var cb = this._cb();\r\n var last = count - 1;\r\n for ( var i = 0; i < last; ++i ) {\r\n var j = indexes[ i ] * 3;\r\n v1[ 0 ] = this._vertices[ j ];\r\n v1[ 1 ] = this._vertices[ j + 1 ];\r\n v1[ 2 ] = this._vertices[ j + 2 ];\r\n j = indexes[ i + 1 ] * 3;\r\n v2[ 0 ] = this._vertices[ j ];\r\n v2[ 1 ] = this._vertices[ j + 1 ];\r\n v2[ 2 ] = this._vertices[ j + 2 ];\r\n cb.operatorLine( v1, v2 );\r\n }\r\n last = indexes[ last ] * 3;\r\n v1[ 0 ] = this._vertices[ last ];\r\n v1[ 1 ] = this._vertices[ last + 1 ];\r\n v1[ 2 ] = this._vertices[ last + 2 ];\r\n var first = indexes[ 0 ] * 3;\r\n v2[ 0 ] = this._vertices[ first ];\r\n v2[ 1 ] = this._vertices[ first + 1 ];\r\n v2[ 2 ] = this._vertices[ first + 2 ];\r\n cb.operatorLine( v1, v2 );\r\n };\r\n } )(),\r\n\r\n applyDrawElementsTriangles: ( function () {\r\n var v1 = Vec3.create();\r\n var v2 = Vec3.create();\r\n var v3 = Vec3.create();\r\n return function ( count, indexes ) {\r\n var cb = this._cb();\r\n for ( var i = 0; i < count; i += 3 ) {\r\n var j = indexes[ i ] * 3;\r\n v1[ 0 ] = this._vertices[ j ];\r\n v1[ 1 ] = this._vertices[ j + 1 ];\r\n v1[ 2 ] = this._vertices[ j + 2 ];\r\n j = indexes[ i + 1 ] * 3;\r\n v2[ 0 ] = this._vertices[ j ];\r\n v2[ 1 ] = this._vertices[ j + 1 ];\r\n v2[ 2 ] = this._vertices[ j + 2 ];\r\n j = indexes[ i + 2 ] * 3;\r\n v3[ 0 ] = this._vertices[ j ];\r\n v3[ 1 ] = this._vertices[ j + 1 ];\r\n v3[ 2 ] = this._vertices[ j + 2 ];\r\n cb.operatorTriangle( v1, v2, v3 );\r\n }\r\n };\r\n } )(),\r\n\r\n applyDrawElementsTriangleStrip: ( function () {\r\n var v1 = Vec3.create();\r\n var v2 = Vec3.create();\r\n var v3 = Vec3.create();\r\n return function ( count, indexes ) {\r\n var cb = this._cb();\r\n for ( var i = 2, pos = 0; i < count; ++i, ++pos ) {\r\n var j = indexes[ pos ] * 3;\r\n v1[ 0 ] = this._vertices[ j ];\r\n v1[ 1 ] = this._vertices[ j + 1 ];\r\n v1[ 2 ] = this._vertices[ j + 2 ];\r\n j = indexes[ pos + 1 ] * 3;\r\n v2[ 0 ] = this._vertices[ j ];\r\n v2[ 1 ] = this._vertices[ j + 1 ];\r\n v2[ 2 ] = this._vertices[ j + 2 ];\r\n j = indexes[ pos + 2 ] * 3;\r\n v3[ 0 ] = this._vertices[ j ];\r\n v3[ 1 ] = this._vertices[ j + 1 ];\r\n v3[ 2 ] = this._vertices[ j + 2 ];\r\n if ( i % 2 ) {\r\n cb.operatorTriangle( v1, v3, v2 );\r\n } else {\r\n cb.operatorTriangle( v1, v2, v3 );\r\n }\r\n }\r\n };\r\n } )(),\r\n\r\n applyDrawElementsTriangleFan: ( function () {\r\n var v1 = Vec3.create();\r\n var v2 = Vec3.create();\r\n var v3 = Vec3.create();\r\n return function ( count, indexes ) {\r\n var cb = this._cb();\r\n var first = indexes[ 0 ];\r\n for ( var i = 2, pos = 1; i < count; ++i, ++pos ) {\r\n v1[ 0 ] = this._vertices[ first ];\r\n v1[ 1 ] = this._vertices[ first + 1 ];\r\n v1[ 2 ] = this._vertices[ first + 2 ];\r\n var j = indexes[ pos ] * 3;\r\n v2[ 0 ] = this._vertices[ j ];\r\n v2[ 1 ] = this._vertices[ j + 1 ];\r\n v2[ 2 ] = this._vertices[ j + 2 ];\r\n j = indexes[ pos + 1 ] * 3;\r\n v3[ 0 ] = this._vertices[ j ];\r\n v3[ 1 ] = this._vertices[ j + 1 ];\r\n v3[ 2 ] = this._vertices[ j + 2 ];\r\n cb.operatorTriangle( v1, v2, v3 );\r\n }\r\n };\r\n } )(),\r\n\r\n applyDrawArraysPoints: ( function () {\r\n var v = Vec3.create();\r\n return function ( first, count ) {\r\n var cb = this._cb();\r\n for ( var i = first; i < first + count; ++i ) {\r\n var j = i * 3;\r\n v[ 0 ] = this._vertices[ j ];\r\n v[ 1 ] = this._vertices[ j + 1 ];\r\n v[ 2 ] = this._vertices[ j + 2 ];\r\n cb.operatorPoint( v );\r\n }\r\n };\r\n } )(),\r\n\r\n applyDrawArraysLines: ( function () {\r\n var v1 = Vec3.create();\r\n var v2 = Vec3.create();\r\n return function ( first, count ) {\r\n var cb = this._cb();\r\n for ( var i = first; i < first + count - 1; i += 2 ) {\r\n var j = i * 3;\r\n v1[ 0 ] = this._vertices[ j ];\r\n v1[ 1 ] = this._vertices[ j + 1 ];\r\n v1[ 2 ] = this._vertices[ j + 2 ];\r\n j = ( i + 1 ) * 3;\r\n v2[ 0 ] = this._vertices[ j ];\r\n v2[ 1 ] = this._vertices[ j + 1 ];\r\n v2[ 2 ] = this._vertices[ j + 2 ];\r\n cb.operatorLine( v1, v2 );\r\n }\r\n };\r\n } )(),\r\n\r\n applyDrawArraysLineStrip: ( function () {\r\n var v1 = Vec3.create();\r\n var v2 = Vec3.create();\r\n return function ( first, count ) {\r\n var cb = this._cb();\r\n for ( var i = first; i < first + count - 1; ++i ) {\r\n var j = i * 3;\r\n v1[ 0 ] = this._vertices[ j ];\r\n v1[ 1 ] = this._vertices[ j + 1 ];\r\n v1[ 2 ] = this._vertices[ j + 2 ];\r\n j = ( i + 1 ) * 3;\r\n v2[ 0 ] = this._vertices[ j ];\r\n v2[ 1 ] = this._vertices[ j + 1 ];\r\n v2[ 2 ] = this._vertices[ j + 2 ];\r\n cb.operatorLine( v1, v2 );\r\n }\r\n };\r\n } )(),\r\n applyDrawArraysLineLoop: ( function () {\r\n var v1 = Vec3.create();\r\n var v2 = Vec3.create();\r\n return function ( first, count ) {\r\n var cb = this._cb();\r\n var last = first + count - 1;\r\n for ( var i = first; i < last; ++i ) {\r\n var j = i * 3;\r\n v1[ 0 ] = this._vertices[ j ];\r\n v1[ 1 ] = this._vertices[ j + 1 ];\r\n v1[ 2 ] = this._vertices[ j + 2 ];\r\n j = ( i + 1 ) * 3;\r\n v2[ 0 ] = this._vertices[ j ];\r\n v2[ 1 ] = this._vertices[ j + 1 ];\r\n v2[ 2 ] = this._vertices[ j + 2 ];\r\n cb.operatorLine( v1, v2 );\r\n }\r\n last = last * 3;\r\n v1[ 0 ] = this._vertices[ last ];\r\n v1[ 1 ] = this._vertices[ last + 1 ];\r\n v1[ 2 ] = this._vertices[ last + 2 ];\r\n first = first * 3;\r\n v2[ 0 ] = this._vertices[ first ];\r\n v2[ 1 ] = this._vertices[ first + 1 ];\r\n v2[ 2 ] = this._vertices[ first + 2 ];\r\n cb.operatorLine( v1, v2 );\r\n };\r\n } )(),\r\n\r\n applyDrawArraysTriangles: ( function () {\r\n var v1 = Vec3.create();\r\n var v2 = Vec3.create();\r\n var v3 = Vec3.create();\r\n return function ( first, count ) {\r\n var cb = this._cb();\r\n for ( var i = first; i < first + count; i += 3 ) {\r\n var j = i * 3;\r\n v1[ 0 ] = this._vertices[ j ];\r\n v1[ 1 ] = this._vertices[ j + 1 ];\r\n v1[ 2 ] = this._vertices[ j + 2 ];\r\n j = ( i + 1 ) * 3;\r\n v2[ 0 ] = this._vertices[ j ];\r\n v2[ 1 ] = this._vertices[ j + 1 ];\r\n v2[ 2 ] = this._vertices[ j + 2 ];\r\n j = ( i + 2 ) * 3;\r\n v3[ 0 ] = this._vertices[ j ];\r\n v3[ 1 ] = this._vertices[ j + 1 ];\r\n v3[ 2 ] = this._vertices[ j + 2 ];\r\n cb.operatorTriangle( v1, v2, v3 );\r\n }\r\n };\r\n } )(),\r\n\r\n applyDrawArraysTriangleStrip: ( function () {\r\n var v1 = Vec3.create();\r\n var v2 = Vec3.create();\r\n var v3 = Vec3.create();\r\n return function ( first, count ) {\r\n var cb = this._cb();\r\n for ( var i = 2, pos = first; i < count; ++i, ++pos ) {\r\n var j = pos * 3;\r\n v1[ 0 ] = this._vertices[ j ];\r\n v1[ 1 ] = this._vertices[ j + 1 ];\r\n v1[ 2 ] = this._vertices[ j + 2 ];\r\n j = ( pos + 1 ) * 3;\r\n v2[ 0 ] = this._vertices[ j ];\r\n v2[ 1 ] = this._vertices[ j + 1 ];\r\n v2[ 2 ] = this._vertices[ j + 2 ];\r\n j = ( pos + 2 ) * 3;\r\n v3[ 0 ] = this._vertices[ j ];\r\n v3[ 1 ] = this._vertices[ j + 1 ];\r\n v3[ 2 ] = this._vertices[ j + 2 ];\r\n if ( i % 2 ) {\r\n cb.operatorTriangle( v1, v3, v2 );\r\n } else {\r\n cb.operatorTriangle( v1, v2, v3 );\r\n }\r\n }\r\n };\r\n } )(),\r\n\r\n applyDrawArraysTriangleFan: ( function () {\r\n var v1 = Vec3.create();\r\n var v2 = Vec3.create();\r\n var v3 = Vec3.create();\r\n return function ( first, count ) {\r\n var cb = this._cb();\r\n for ( var i = 2, pos = first + 1; i < count; ++i, ++pos ) {\r\n v1[ 0 ] = this._vertices[ first ];\r\n v1[ 1 ] = this._vertices[ first + 1 ];\r\n v1[ 2 ] = this._vertices[ first + 2 ];\r\n var j = pos * 3;\r\n v2[ 0 ] = this._vertices[ j ];\r\n v2[ 1 ] = this._vertices[ j + 1 ];\r\n v2[ 2 ] = this._vertices[ j + 2 ];\r\n j = ( pos + 1 ) * 3;\r\n v3[ 0 ] = this._vertices[ j ];\r\n v3[ 1 ] = this._vertices[ j + 1 ];\r\n v3[ 2 ] = this._vertices[ j + 2 ];\r\n cb.operatorTriangle( v1, v2, v3 );\r\n }\r\n };\r\n } )(),\r\n\r\n apply: function () {\r\n var geom = this._geom;\r\n var primitives = geom.primitives;\r\n if ( !primitives )\r\n return;\r\n var nbPrimitives = primitives.length;\r\n for ( var i = 0; i < nbPrimitives; i++ ) {\r\n var primitive = primitives[ i ];\r\n if ( primitive.getIndices !== undefined ) {\r\n var indexes = primitive.indices.getElements();\r\n switch ( primitive.getMode() ) {\r\n case PrimitiveSet.POINTS:\r\n this.applyDrawElementsPoints( primitive.getCount(), indexes );\r\n break;\r\n case PrimitiveSet.LINES:\r\n this.applyDrawElementsLines( primitive.getCount(), indexes );\r\n break;\r\n case PrimitiveSet.LINE_STRIP:\r\n this.applyDrawElementsLineStrip( primitive.getCount(), indexes );\r\n break;\r\n case PrimitiveSet.LINE_LOOP:\r\n this.applyDrawElementsLineLoop( primitive.getCount(), indexes );\r\n break;\r\n case PrimitiveSet.TRIANGLES:\r\n this.applyDrawElementsTriangles( primitive.getCount(), indexes );\r\n break;\r\n case PrimitiveSet.TRIANGLE_STRIP:\r\n this.applyDrawElementsTriangleStrip( primitive.getCount(), indexes );\r\n break;\r\n case PrimitiveSet.TRIANGLE_FAN:\r\n this.applyDrawElementsTriangleFan( primitive.getCount(), indexes );\r\n break;\r\n }\r\n } else { // draw array\r\n switch ( primitive.getMode() ) {\r\n case PrimitiveSet.POINTS:\r\n this.applyDrawArraysPoints( primitive.getFirst(), primitive.getCount() );\r\n break;\r\n case PrimitiveSet.LINES:\r\n this.applyDrawArraysLines( primitive.getFirst(), primitive.getCount() );\r\n break;\r\n case PrimitiveSet.LINE_STRIP:\r\n this.applyDrawArraysLineStrip( primitive.getFirst(), primitive.getCount() );\r\n break;\r\n case PrimitiveSet.LINE_LOOP:\r\n this.applyDrawArraysLineLoop( primitive.getFirst(), primitive.getCount() );\r\n break;\r\n case PrimitiveSet.TRIANGLES:\r\n this.applyDrawArraysTriangles( primitive.getFirst(), primitive.getCount() );\r\n break;\r\n case PrimitiveSet.TRIANGLE_STRIP:\r\n this.applyDrawArraysTriangleStrip( primitive.getFirst(), primitive.getCount() );\r\n break;\r\n case PrimitiveSet.TRIANGLE_FAN:\r\n this.applyDrawArraysTriangleFan( primitive.getFirst(), primitive.getCount() );\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n return PrimitiveFunctor;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/PrimitiveFunctor.js\n ** module id = 67\n ** module chunks = 0 1\n **/","define( [], function () {\r\n\r\n var PrimitiveSet = {};\r\n PrimitiveSet.POINTS = 0x0000;\r\n PrimitiveSet.LINES = 0x0001;\r\n PrimitiveSet.LINE_LOOP = 0x0002;\r\n PrimitiveSet.LINE_STRIP = 0x0003;\r\n PrimitiveSet.TRIANGLES = 0x0004;\r\n PrimitiveSet.TRIANGLE_STRIP = 0x0005;\r\n PrimitiveSet.TRIANGLE_FAN = 0x0006;\r\n\r\n return PrimitiveSet;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/PrimitiveSet.js\n ** module id = 68\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/Notify',\r\n 'osg/GLObject',\r\n 'osg/StateAttribute',\r\n 'osg/Map',\r\n 'osg/Timer'\r\n], function ( MACROUTILS, Notify, GLObject, StateAttribute, CustomMap, Timer ) {\r\n 'use strict';\r\n\r\n /**\r\n * Program encapsulate an vertex and fragment shader\r\n * @class Program\r\n */\r\n var Program = function ( vShader, fShader ) {\r\n GLObject.call( this );\r\n StateAttribute.call( this );\r\n this._program = null;\r\n\r\n // used to know if it's a default program\r\n // a default program does nothing but avoid to do some\r\n // useless logic\r\n // if we vertex or fragment shader are set it's not a default\r\n // program anymore\r\n this._nullProgram = true;\r\n\r\n this._vertex = undefined;\r\n this._fragment = undefined;\r\n\r\n this._uniformsCache = undefined;\r\n this._attributesCache = undefined;\r\n\r\n if ( vShader )\r\n this.setVertexShader( vShader );\r\n\r\n if ( fShader )\r\n this.setFragmentShader( fShader );\r\n };\r\n\r\n // static cache of glPrograms flagged for deletion, which will actually\r\n // be deleted in the correct GL context.\r\n Program._sDeletedGLProgramCache = new Map();\r\n\r\n // static method to delete Program \r\n Program.deleteGLProgram = function ( gl, program ) {\r\n if ( !Program._sDeletedGLProgramCache.has( gl ) )\r\n Program._sDeletedGLProgramCache.set( gl, [] );\r\n Program._sDeletedGLProgramCache.get( gl ).push( program );\r\n };\r\n // static method to flush all the cached glPrograms which need to be deleted in the GL context specified\r\n Program.flushDeletedGLPrograms = function ( gl, availableTime ) {\r\n // if no time available don't try to flush objects.\r\n if ( availableTime <= 0.0 ) return availableTime;\r\n if ( !Program._sDeletedGLProgramCache.has( gl ) ) return availableTime;\r\n var elapsedTime = 0.0;\r\n var beginTime = Timer.instance().tick();\r\n var deleteList = Program._sDeletedGLProgramCache.get( gl );\r\n var numPrograms = deleteList.length;\r\n for ( var i = numPrograms - 1; i >= 0 && elapsedTime < availableTime; i-- ) {\r\n gl.deleteProgram( deleteList[ i ] );\r\n deleteList.splice( i, 1 );\r\n elapsedTime = Timer.instance().deltaS( beginTime, Timer.instance().tick() );\r\n }\r\n availableTime -= elapsedTime;\r\n return availableTime;\r\n };\r\n\r\n /** @lends Program.prototype */\r\n Program.prototype = MACROUTILS.objectLibraryClass( MACROUTILS.objectInherit( GLObject.prototype, MACROUTILS.objectInherit( StateAttribute.prototype, {\r\n\r\n attributeType: 'Program',\r\n\r\n cloneType: function () {\r\n return new Program();\r\n },\r\n\r\n setVertexShader: function ( vs ) {\r\n this._vertex = vs;\r\n this._nullProgram = false;\r\n },\r\n\r\n setFragmentShader: function ( fs ) {\r\n this._fragment = fs;\r\n this._nullProgram = false;\r\n },\r\n\r\n getVertexShader: function () {\r\n return this._vertex;\r\n },\r\n getFragmentShader: function () {\r\n return this._fragment;\r\n },\r\n\r\n getProgram: function () {\r\n return this._program;\r\n },\r\n\r\n releaseGLObjects: function () {\r\n // Call to releaseGLOBjects on shaders\r\n if ( this._vertex !== undefined ) this._vertex.releaseGLObjects();\r\n if ( this._fragment !== undefined ) this._fragment.releaseGLObjects();\r\n if ( this._program === null ) return;\r\n if ( this._gl !== undefined ) {\r\n Program.deleteGLProgram( this._gl, this._program );\r\n }\r\n this._program = undefined;\r\n },\r\n\r\n apply: function ( state ) {\r\n\r\n if ( this._nullProgram ) return;\r\n\r\n if ( !this._gl ) {\r\n this.setGraphicContext( state.getGraphicContext() );\r\n }\r\n var gl = this._gl;\r\n if ( !this._program || this.isDirty() ) {\r\n\r\n var compileClean;\r\n\r\n if ( !this._vertex.shader ) {\r\n compileClean = this._vertex.compile( gl );\r\n }\r\n\r\n if ( !this._fragment.shader ) {\r\n compileClean = this._fragment.compile( gl );\r\n }\r\n\r\n if ( compileClean ) {\r\n\r\n this._program = gl.createProgram();\r\n\r\n gl.attachShader( this._program, this._vertex.shader );\r\n gl.attachShader( this._program, this._fragment.shader );\r\n MACROUTILS.timeStamp( 'osgjs.metrics:linkShader' );\r\n gl.linkProgram( this._program );\r\n\r\n if ( !gl.getProgramParameter( this._program, gl.LINK_STATUS ) && !gl.isContextLost() ) {\r\n var errLink = gl.getProgramInfoLog( this._program );\r\n\r\n Notify.error( errLink );\r\n Notify.log( 'can\\'t link program\\n' + 'vertex shader:\\n' + this._vertex.text + '\\n fragment shader:\\n' + this._fragment.text, true, false );\r\n // rawgl trick is for webgl inspector\r\n var debugShader = ( gl.rawgl !== undefined ? gl.rawgl : gl );\r\n if ( debugShader !== undefined && debugShader.getExtension !== undefined ) debugShader = debugShader.getExtension( 'WEBGL_debug_shaders' );\r\n if ( debugShader && errLink === 'Failed to create D3D shaders.\\n' ) {\r\n\r\n Notify.error( debugShader.getTranslatedShaderSource( this._vertex.shader ), true, false );\r\n Notify.error( debugShader.getTranslatedShaderSource( this._fragment.shader ), true, false );\r\n }\r\n\r\n compileClean = false;\r\n }\r\n // TODO: better usage of validate.\r\n // as it's intended at shader program usage\r\n // validating against current gl state\r\n // Not for compilation stage\r\n // gl.validateProgram( this._program );\r\n\r\n }\r\n\r\n if ( !compileClean ) {\r\n // Any error, Any\r\n // Pink must die.\r\n if ( !Program.prototype._failSafeCache ) {\r\n\r\n var program = gl.createProgram();\r\n this._vertex.failSafe( gl );\r\n this._fragment.failSafe( gl );\r\n\r\n gl.attachShader( program, this._vertex.shader );\r\n gl.attachShader( program, this._fragment.shader );\r\n gl.linkProgram( program );\r\n gl.validateProgram( program );\r\n\r\n // cache to compile and allocate only once\r\n // not polluting the inspector\r\n Program.prototype._failSafeCache = program;\r\n }\r\n Notify.warn( 'FailSafe shader Activated ' );\r\n this._program = this._failSafeCache;\r\n }\r\n\r\n this._uniformsCache = new CustomMap();\r\n this._attributesCache = new CustomMap();\r\n\r\n this.cacheUniformList( gl, this._vertex.text );\r\n this.cacheUniformList( gl, this._fragment.text );\r\n\r\n this.cacheAttributeList( gl, this._vertex.text );\r\n\r\n this.setDirty( false );\r\n }\r\n\r\n state.applyProgram( this._program );\r\n },\r\n\r\n cacheUniformList: function ( gl, str ) {\r\n var r = str.match( /uniform\\s+\\w+\\s+\\w+/g );\r\n var map = this._uniformsCache;\r\n if ( r !== null ) {\r\n for ( var i = 0, l = r.length; i < l; i++ ) {\r\n var uniform = r[ i ].match( /uniform\\s+\\w+\\s+(\\w+)/ )[ 1 ];\r\n var location = gl.getUniformLocation( this._program, uniform );\r\n if ( location !== undefined && location !== null ) {\r\n if ( map[ uniform ] === undefined ) {\r\n map[ uniform ] = location;\r\n this._uniformsCache.dirty();\r\n }\r\n }\r\n }\r\n }\r\n },\r\n\r\n cacheAttributeList: function ( gl, str ) {\r\n var r = str.match( /attribute\\s+\\w+\\s+\\w+/g );\r\n var map = this._attributesCache;\r\n if ( r !== null ) {\r\n for ( var i = 0, l = r.length; i < l; i++ ) {\r\n var attr = r[ i ].match( /attribute\\s+\\w+\\s+(\\w+)/ )[ 1 ];\r\n var location = gl.getAttribLocation( this._program, attr );\r\n if ( location !== -1 && location !== undefined ) {\r\n if ( map[ attr ] === undefined ) {\r\n map[ attr ] = location;\r\n this._attributesCache.dirty();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n } ) ), 'osg', 'Program' );\r\n\r\n return Program;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/Program.js\n ** module id = 69\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/Node',\r\n 'osg/Matrix'\r\n], function ( MACROUTILS, Node, Matrix ) {\r\n\r\n var Projection = function () {\r\n Node.call( this );\r\n this.projection = Matrix.create();\r\n };\r\n Projection.prototype = MACROUTILS.objectInherit( Node.prototype, {\r\n getProjectionMatrix: function () {\r\n return this.projection;\r\n },\r\n setProjectionMatrix: function ( m ) {\r\n this.projection = m;\r\n }\r\n } );\r\n\r\n MACROUTILS.setTypeID( Projection );\r\n\r\n return Projection;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/Projection.js\n ** module id = 70\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Vec3',\r\n 'osg/Notify'\r\n], function ( Vec3, Notify ) {\r\n\r\n 'use strict';\r\n\r\n /** @class Quaternion Operations */\r\n var Quat = {\r\n create: function () {\r\n return [ 0.0, 0.0, 0.0, 1.0 ];\r\n },\r\n copy: function ( s, d ) {\r\n d[ 0 ] = s[ 0 ];\r\n d[ 1 ] = s[ 1 ];\r\n d[ 2 ] = s[ 2 ];\r\n d[ 3 ] = s[ 3 ];\r\n return d;\r\n },\r\n makeIdentity: function ( element ) {\r\n return Quat.init( element );\r\n },\r\n zeroRotation: function ( element ) {\r\n return Quat.init( element );\r\n },\r\n\r\n init: function ( element ) {\r\n element[ 0 ] = 0.0;\r\n element[ 1 ] = 0.0;\r\n element[ 2 ] = 0.0;\r\n element[ 3 ] = 1.0;\r\n return element;\r\n },\r\n\r\n sub: function ( a, b, result ) {\r\n result[ 0 ] = a[ 0 ] - b[ 0 ];\r\n result[ 1 ] = a[ 1 ] - b[ 1 ];\r\n result[ 2 ] = a[ 2 ] - b[ 2 ];\r\n result[ 3 ] = a[ 3 ] - b[ 3 ];\r\n return result;\r\n },\r\n\r\n add: function ( a, b, result ) {\r\n result[ 0 ] = a[ 0 ] + b[ 0 ];\r\n result[ 1 ] = a[ 1 ] + b[ 1 ];\r\n result[ 2 ] = a[ 2 ] + b[ 2 ];\r\n result[ 3 ] = a[ 3 ] + b[ 3 ];\r\n return result;\r\n },\r\n\r\n dot: function ( a, b ) {\r\n return a[ 0 ] * b[ 0 ] + a[ 1 ] * b[ 1 ] + a[ 2 ] * b[ 2 ] + a[ 3 ] * b[ 3 ];\r\n },\r\n\r\n length2: function ( a ) {\r\n return a[ 0 ] * a[ 0 ] + a[ 1 ] * a[ 1 ] + a[ 2 ] * a[ 2 ] + a[ 3 ] * a[ 3 ];\r\n },\r\n\r\n length: function ( a ) {\r\n return Math.sqrt( a[ 0 ] * a[ 0 ] + a[ 1 ] * a[ 1 ] + a[ 2 ] * a[ 2 ] + a[ 3 ] * a[ 3 ] );\r\n },\r\n\r\n neg: function ( a, result ) {\r\n result[ 0 ] = -a[ 0 ];\r\n result[ 1 ] = -a[ 1 ];\r\n result[ 2 ] = -a[ 2 ];\r\n result[ 3 ] = -a[ 3 ];\r\n return result;\r\n },\r\n\r\n makeRotate: function ( angle, x, y, z, result ) {\r\n if ( result === undefined ) {\r\n Notify.warn( 'no quat destination !' );\r\n result = this.create();\r\n }\r\n\r\n var epsilon = 0.0000001;\r\n var length = Math.sqrt( x * x + y * y + z * z );\r\n if ( length < epsilon ) {\r\n return this.init( result );\r\n }\r\n\r\n var inversenorm = 1.0 / length;\r\n var coshalfangle = Math.cos( 0.5 * angle );\r\n var sinhalfangle = Math.sin( 0.5 * angle );\r\n\r\n result[ 0 ] = x * sinhalfangle * inversenorm;\r\n result[ 1 ] = y * sinhalfangle * inversenorm;\r\n result[ 2 ] = z * sinhalfangle * inversenorm;\r\n result[ 3 ] = coshalfangle;\r\n return result;\r\n },\r\n\r\n lerp: function ( t, a, b, r ) {\r\n r[ 0 ] = a[ 0 ] + ( b[ 0 ] - a[ 0 ] ) * t;\r\n r[ 1 ] = a[ 1 ] + ( b[ 1 ] - a[ 1 ] ) * t;\r\n r[ 2 ] = a[ 2 ] + ( b[ 2 ] - a[ 2 ] ) * t;\r\n r[ 3 ] = a[ 3 ] + ( b[ 3 ] - a[ 3 ] ) * t;\r\n return r;\r\n },\r\n\r\n slerp: function ( t, from, to, result ) {\r\n var epsilon = 0.00001;\r\n\r\n var quatTo = to;\r\n var cosomega = this.dot( from, quatTo );\r\n if ( cosomega < 0.0 ) {\r\n cosomega = -cosomega;\r\n this.neg( to, quatTo );\r\n }\r\n\r\n var omega;\r\n var sinomega;\r\n var scaleFrom;\r\n var scaleTo;\r\n if ( ( 1.0 - cosomega ) > epsilon ) {\r\n omega = Math.acos( cosomega ); // 0 <= omega <= Pi (see man acos)\r\n sinomega = Math.sin( omega ); // this sinomega should always be +ve so\r\n // could try sinomega=sqrt(1-cosomega*cosomega) to avoid a sin()?\r\n scaleFrom = Math.sin( ( 1.0 - t ) * omega ) / sinomega;\r\n scaleTo = Math.sin( t * omega ) / sinomega;\r\n } else {\r\n /* --------------------------------------------------\r\n The ends of the vectors are very close\r\n we can use simple linear interpolation - no need\r\n to worry about the 'spherical' interpolation\r\n -------------------------------------------------- */\r\n scaleFrom = 1.0 - t;\r\n scaleTo = t;\r\n }\r\n\r\n result[ 0 ] = from[ 0 ] * scaleFrom + quatTo[ 0 ] * scaleTo;\r\n result[ 1 ] = from[ 1 ] * scaleFrom + quatTo[ 1 ] * scaleTo;\r\n result[ 2 ] = from[ 2 ] * scaleFrom + quatTo[ 2 ] * scaleTo;\r\n result[ 3 ] = from[ 3 ] * scaleFrom + quatTo[ 3 ] * scaleTo;\r\n return result;\r\n },\r\n\r\n transformVec3: function ( q, a, result ) {\r\n var x = a[ 0 ];\r\n var y = a[ 1 ];\r\n var z = a[ 2 ];\r\n var qx = q[ 0 ];\r\n var qy = q[ 1 ];\r\n var qz = q[ 2 ];\r\n var qw = q[ 3 ];\r\n // calculate quat * vec\r\n var ix = qw * x + qy * z - qz * y;\r\n var iy = qw * y + qz * x - qx * z;\r\n var iz = qw * z + qx * y - qy * x;\r\n var iw = -qx * x - qy * y - qz * z;\r\n\r\n // calculate result * inverse quat\r\n result[ 0 ] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\r\n result[ 1 ] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\r\n result[ 2 ] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\r\n return result;\r\n },\r\n\r\n normalize: function ( q, qr ) {\r\n var div = 1.0 / this.length( q );\r\n qr[ 0 ] = q[ 0 ] * div;\r\n qr[ 1 ] = q[ 1 ] * div;\r\n qr[ 2 ] = q[ 2 ] * div;\r\n qr[ 3 ] = q[ 3 ] * div;\r\n return qr;\r\n },\r\n\r\n // we suppose to have unit quaternion\r\n conj: function ( a, result ) {\r\n result[ 0 ] = -a[ 0 ];\r\n result[ 1 ] = -a[ 1 ];\r\n result[ 2 ] = -a[ 2 ];\r\n result[ 3 ] = a[ 3 ];\r\n return result;\r\n },\r\n\r\n inverse: function ( a, result ) {\r\n var div = 1.0 / this.length2( a );\r\n this.conj( a, result );\r\n result[ 0 ] *= div;\r\n result[ 1 ] *= div;\r\n result[ 2 ] *= div;\r\n result[ 3 ] *= div;\r\n return result;\r\n },\r\n\r\n // we suppose to have unit quaternion\r\n // multiply 2 quaternions\r\n mult: function ( a, b, result ) {\r\n var ax = a[ 0 ];\r\n var ay = a[ 1 ];\r\n var az = a[ 2 ];\r\n var aw = a[ 3 ];\r\n\r\n var bx = b[ 0 ];\r\n var by = b[ 1 ];\r\n var bz = b[ 2 ];\r\n var bw = b[ 3 ];\r\n\r\n result[ 0 ] = ax * bw + ay * bz - az * by + aw * bx;\r\n result[ 1 ] = -ax * bz + ay * bw + az * bx + aw * by;\r\n result[ 2 ] = ax * by - ay * bx + az * bw + aw * bz;\r\n result[ 3 ] = -ax * bx - ay * by - az * bz + aw * bw;\r\n return result;\r\n },\r\n\r\n div: function ( a, b, result ) {\r\n var d = 1.0 / b;\r\n result[ 0 ] = a[ 0 ] * d;\r\n result[ 1 ] = a[ 1 ] * d;\r\n result[ 2 ] = a[ 2 ] * d;\r\n result[ 3 ] = a[ 3 ] * d;\r\n return result;\r\n },\r\n\r\n exp: function ( a, res ) {\r\n var r = Math.sqrt( a[ 0 ] * a[ 0 ] + a[ 1 ] * a[ 1 ] + a[ 2 ] * a[ 2 ] );\r\n var et = Math.exp( a[ 3 ] );\r\n var s = 0;\r\n if ( r > 0.00001 ) {\r\n s = et * Math.sin( r ) / r;\r\n }\r\n if ( res === undefined ) {\r\n Notify.warn( 'no quat destination !' );\r\n res = Quat.create();\r\n }\r\n res[ 0 ] = s * a[ 0 ];\r\n res[ 1 ] = s * a[ 1 ];\r\n res[ 2 ] = s * a[ 2 ];\r\n res[ 3 ] = et * Math.cos( r );\r\n return res;\r\n },\r\n\r\n ln: function ( a, res ) {\r\n var n = a[ 0 ] * a[ 0 ] + a[ 1 ] * a[ 1 ] + a[ 2 ] * a[ 2 ];\r\n var r = Math.sqrt( n );\r\n var t = 0;\r\n if ( r > 0.00001 ) {\r\n t = Math.atan2( r, a[ 3 ] ) / r;\r\n }\r\n if ( res === undefined ) {\r\n Notify.warn( 'no quat destination !' );\r\n res = Quat.create();\r\n }\r\n n += a[ 3 ] * a[ 3 ];\r\n res[ 0 ] = t * a[ 0 ];\r\n res[ 1 ] = t * a[ 1 ];\r\n res[ 2 ] = t * a[ 2 ];\r\n res[ 3 ] = 0.5 * Math.log( n );\r\n return res;\r\n },\r\n\r\n\r\n //http://theory.org/software/qfa/writeup/node12.html\r\n //http://www.ece.uwaterloo.ca/~dwharder/C++/CQOST/src/\r\n //http://willperone.net/Code/quaternion.php\r\n\r\n // a is computeTangent(q1-1,q1,q2)\r\n // b is computeTangent(q2-1,q2,q2+1)\r\n squad: function ( t, q1, a, b, q2, r ) {\r\n var r1 = this.slerp( t, q1, q2 );\r\n var r2 = this.slerp( t, a, b );\r\n return this.slerp( 2.0 * t * ( 1.0 - t ), r1, r2, r );\r\n },\r\n\r\n // qcur is current\r\n // q0 is qcur-1\r\n // q2 is qcur+1\r\n // compute tangent in of q1\r\n computeTangent: function ( q0, qcur, q2, r ) {\r\n\r\n // first step\r\n var invq = this.inv( qcur );\r\n var qa, qb;\r\n\r\n this.mult( q2, invq, qa );\r\n this.ln( qa, qa );\r\n\r\n this.mult( q0, invq, qb );\r\n this.ln( qb, qb );\r\n\r\n this.add( qa, qb, qa );\r\n this.div( qa, -4.0, qa );\r\n this.exp( qa, qb );\r\n return this.mult( qb, qcur, r );\r\n },\r\n\r\n makeRotateFromTo: function ( from, to, out ) {\r\n // Now let's get into the real stuff\r\n // Use \"dot product plus one\" as test as it can be re-used later on\r\n var dotProdPlus1 = 1.0 + Vec3.dot( from, to );\r\n\r\n // Check for degenerate case of full u-turn. Use epsilon for detection\r\n if ( dotProdPlus1 < 1e-7 ) {\r\n\r\n // Get an orthogonal vector of the given vector\r\n // in a plane with maximum vector coordinates.\r\n // Then use it as quaternion axis with pi angle\r\n // Trick is to realize one value at least is >0.6 for a normalized vector.\r\n var x = from[ 0 ];\r\n var y = from[ 1 ];\r\n var z = from[ 2 ];\r\n var norm;\r\n if ( Math.abs( x ) < 0.6 ) {\r\n norm = Math.sqrt( 1.0 - x * x );\r\n out[ 1 ] = z / norm;\r\n out[ 2 ] = -y / norm;\r\n out[ 0 ] = out[ 3 ] = 0.0;\r\n } else if ( Math.abs( y ) < 0.6 ) {\r\n norm = Math.sqrt( 1.0 - y * y );\r\n out[ 0 ] = -z / norm;\r\n out[ 2 ] = x / norm;\r\n out[ 1 ] = out[ 3 ] = 0.0;\r\n } else {\r\n norm = Math.sqrt( 1.0 - z * z );\r\n out[ 0 ] = y / norm;\r\n out[ 1 ] = -x / norm;\r\n out[ 2 ] = out[ 3 ] = 0.0;\r\n }\r\n } else {\r\n // Find the shortest angle quaternion that transforms normalized vectors\r\n // into one other. Formula is still valid when vectors are colinear\r\n\r\n var s = Math.sqrt( 0.5 * dotProdPlus1 );\r\n Vec3.cross( from, to, out );\r\n var f = 0.5 / s;\r\n out[ 0 ] *= f;\r\n out[ 1 ] *= f;\r\n out[ 2 ] *= f;\r\n out[ 3 ] = s;\r\n }\r\n return out;\r\n }\r\n };\r\n\r\n return Quat;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/Quat.js\n ** module id = 71\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n\r\n 'osg/Notify',\r\n 'osg/Object'\r\n\r\n], function ( MACROUTILS, Notify, Object ) {\r\n\r\n 'use strict';\r\n\r\n var RenderBin = function () {\r\n Object.call( this );\r\n\r\n this._leafs = [];\r\n this.positionedAttribute = [];\r\n this._renderStage = undefined;\r\n this._bins = {};\r\n this.stateGraphList = [];\r\n this._parent = undefined;\r\n this._binNum = 0;\r\n\r\n this._sorted = false;\r\n this._sortMode = RenderBin.defaultSortMode;\r\n\r\n this._drawCallback = undefined;\r\n };\r\n\r\n RenderBin.SORT_BY_STATE = 0;\r\n RenderBin.SORT_BACK_TO_FRONT = 1;\r\n RenderBin.SORT_FRONT_TO_BACK = 2;\r\n\r\n // change it at runtime for default RenderBin if needed\r\n RenderBin.defaultSortMode = RenderBin.SORT_BY_STATE;\r\n\r\n RenderBin.BinPrototypes = {\r\n RenderBin: function () {\r\n return new RenderBin();\r\n },\r\n DepthSortedBin: function () {\r\n var rb = new RenderBin();\r\n rb._sortMode = RenderBin.SORT_BACK_TO_FRONT;\r\n return rb;\r\n }\r\n };\r\n\r\n RenderBin.prototype = MACROUTILS.objectLibraryClass( MACROUTILS.objectInherit( Object.prototype, {\r\n _createRenderBin: function ( binName ) {\r\n if ( binName === undefined || RenderBin.BinPrototypes[ binName ] === undefined ) {\r\n return RenderBin.BinPrototypes.RenderBin();\r\n }\r\n return RenderBin.BinPrototypes[ binName ]();\r\n },\r\n getStateGraphList: function () {\r\n return this.stateGraphList;\r\n },\r\n copyLeavesFromStateGraphListToRenderLeafList: function () {\r\n\r\n this._leafs.splice( 0, this._leafs.length );\r\n var detectedNaN = false;\r\n\r\n for ( var i = 0, l = this.stateGraphList.length; i < l; i++ ) {\r\n var leafs = this.stateGraphList[ i ].leafs;\r\n for ( var j = 0, k = leafs.length; j < k; j++ ) {\r\n var leaf = leafs[ j ];\r\n if ( isNaN( leaf._depth ) ) {\r\n detectedNaN = true;\r\n } else {\r\n this._leafs.push( leaf );\r\n }\r\n }\r\n }\r\n\r\n if ( detectedNaN ) {\r\n Notify.debug( 'warning: RenderBin::copyLeavesFromStateGraphListToRenderLeafList() detected NaN depth values, database may be corrupted.' );\r\n }\r\n // empty the render graph list to prevent it being drawn along side the render leaf list (see drawImplementation.)\r\n this.stateGraphList.splice( 0, this.stateGraphList.length );\r\n },\r\n\r\n\r\n sortBackToFront: function () {\r\n\r\n this.copyLeavesFromStateGraphListToRenderLeafList();\r\n\r\n var cmp = function ( a, b ) {\r\n return b._depth - a._depth;\r\n };\r\n\r\n this._leafs.sort( cmp );\r\n },\r\n\r\n\r\n sortFrontToBack: function () {\r\n\r\n this.copyLeavesFromStateGraphListToRenderLeafList();\r\n\r\n var cmp = function ( a, b ) {\r\n return a._depth - b._depth;\r\n };\r\n\r\n this._leafs.sort( cmp );\r\n },\r\n\r\n\r\n sortImplementation: function () {\r\n var SortMode = RenderBin;\r\n switch ( this._sortMode ) {\r\n case SortMode.SORT_BACK_TO_FRONT:\r\n this.sortBackToFront();\r\n break;\r\n case SortMode.SORT_FRONT_TO_BACK:\r\n this.sortFrontToBack();\r\n break;\r\n case SortMode.SORT_BY_STATE:\r\n // do nothing\r\n break;\r\n }\r\n },\r\n\r\n sort: function () {\r\n if ( this._sorted ) {\r\n return;\r\n }\r\n\r\n var bins = this._bins;\r\n var keys = window.Object.keys( bins );\r\n for ( var i = 0, l = keys.length; i < l; i++ ) {\r\n bins[ keys[ i ] ].sort();\r\n }\r\n this.sortImplementation();\r\n\r\n this._sorted = true;\r\n },\r\n\r\n setParent: function ( parent ) {\r\n this._parent = parent;\r\n },\r\n getParent: function () {\r\n return this._parent;\r\n },\r\n getBinNumber: function () {\r\n return this._binNum;\r\n },\r\n findOrInsert: function ( binNum, binName ) {\r\n var bin = this._bins[ binNum ];\r\n if ( bin === undefined ) {\r\n bin = this._createRenderBin( binName );\r\n bin._parent = this;\r\n bin._binNum = binNum;\r\n bin._renderStage = this._renderStage;\r\n this._bins[ binNum ] = bin;\r\n }\r\n return bin;\r\n },\r\n getStage: function () {\r\n return this._renderStage;\r\n },\r\n addStateGraph: function ( sg ) {\r\n this.stateGraphList.push( sg );\r\n },\r\n reset: function () {\r\n this.stateGraphList.length = 0;\r\n this._bins = {};\r\n this.positionedAttribute.length = 0;\r\n this._leafs.length = 0;\r\n this._sorted = false;\r\n },\r\n\r\n\r\n draw: function ( state, previousRenderLeaf ) {\r\n\r\n var previousLeaf = previousRenderLeaf;\r\n // use callback drawImplementation if exist\r\n if ( this._drawCallback && this._drawCallback.drawImplementation ) {\r\n previousLeaf = this._drawCallback.drawImplementation( this, state, previousLeaf );\r\n } else {\r\n previousLeaf = this.drawImplementation( state, previousLeaf );\r\n }\r\n\r\n return previousLeaf;\r\n },\r\n\r\n applyPositionedAttribute: function ( state, positionedAttributes ) {\r\n // the idea is to set uniform 'globally' in uniform map.\r\n for ( var index = 0, l = positionedAttributes.length; index < l; index++ ) {\r\n var element = positionedAttributes[ index ];\r\n // add or set uniforms in state\r\n var stateAttribute = element[ 1 ];\r\n var matrix = element[ 0 ];\r\n state.setGlobalDefaultAttribute( stateAttribute );\r\n stateAttribute.apply( state );\r\n stateAttribute.applyPositionedUniform( matrix, state );\r\n state.haveAppliedAttribute( stateAttribute );\r\n }\r\n },\r\n\r\n drawImplementation: function ( state, previousRenderLeaf ) {\r\n\r\n var previousLeaf = previousRenderLeaf;\r\n var binsKeys = window.Object.keys( this._bins );\r\n var bins = this._bins;\r\n\r\n var binsArray = [];\r\n\r\n for ( var i = 0, l = binsKeys.length; i < l; i++ ) {\r\n var k = binsKeys[ i ];\r\n binsArray.push( bins[ k ] );\r\n }\r\n\r\n var cmp = function ( a, b ) {\r\n return a._binNum - b._binNum;\r\n };\r\n\r\n binsArray.sort( cmp );\r\n\r\n var current = 0;\r\n var end = binsArray.length;\r\n\r\n var bin;\r\n // draw pre bins\r\n for ( ; current < end; current++ ) {\r\n bin = binsArray[ current ];\r\n if ( bin.getBinNumber() > 0 ) {\r\n break;\r\n }\r\n previousLeaf = bin.draw( state, previousLeaf );\r\n }\r\n\r\n // draw leafs\r\n previousLeaf = this.drawLeafs( state, previousLeaf );\r\n\r\n // draw post bins\r\n for ( ; current < end; current++ ) {\r\n bin = binsArray[ current ];\r\n previousLeaf = bin.draw( state, previousLeaf );\r\n }\r\n return previousLeaf;\r\n },\r\n\r\n\r\n drawLeafs: function ( state, previousRenderLeaf ) {\r\n\r\n var stateList = this.stateGraphList;\r\n var leafs = this._leafs;\r\n var previousLeaf = previousRenderLeaf;\r\n var leaf;\r\n\r\n\r\n // draw fine grained ordering.\r\n for ( var d = 0, dl = leafs.length; d < dl; d++ ) {\r\n leaf = leafs[ d ];\r\n leaf.render( state, previousLeaf );\r\n previousLeaf = leaf;\r\n }\r\n\r\n\r\n // draw coarse grained ordering.\r\n for ( var i = 0, l = stateList.length; i < l; i++ ) {\r\n\r\n var sg = stateList[ i ];\r\n\r\n for ( var j = 0, ll = sg.leafs.length; j < ll; j++ ) {\r\n\r\n leaf = sg.leafs[ j ];\r\n leaf.render( state, previousLeaf );\r\n previousLeaf = leaf;\r\n\r\n }\r\n }\r\n return previousLeaf;\r\n }\r\n } ), 'osg', 'RenderBin' );\r\n\r\n return RenderBin;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/RenderBin.js\n ** module id = 72\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Matrix',\r\n], function ( Matrix ) {\r\n\r\n 'use strict';\r\n\r\n\r\n var CacheUniformApply = function ( state, program ) {\r\n this._program = program;\r\n\r\n this.modelViewUniform = program._uniformsCache[ state.modelViewMatrix.name ];\r\n this.modelWorldUniform = program._uniformsCache[ state.modelWorldMatrix.name ];\r\n this.viewUniform = program._uniformsCache[ state.viewMatrix.name ];\r\n this.projectionUniform = program._uniformsCache[ state.projectionMatrix.name ];\r\n this.normalUniform = program._uniformsCache[ state.normalMatrix.name ];\r\n\r\n this.apply = undefined;\r\n this.tempMatrix = Matrix.create();\r\n this.Matrix = Matrix;\r\n this.generateUniformsApplyMethods();\r\n };\r\n\r\n CacheUniformApply.prototype = {\r\n\r\n\r\n generateUniformsApplyMethods: function () {\r\n\r\n var functionStr = [ '//generated by RenderLeaf\\n' ];\r\n functionStr.push( 'var gl = state.getGraphicContext();' );\r\n functionStr.push( 'var matrixModelViewChanged = state.applyModelViewMatrix( modelview );' );\r\n functionStr.push( 'state.applyProjectionMatrix( projection );' );\r\n\r\n if ( this.modelWorldUniform !== undefined ) {\r\n functionStr.push( 'if ( matrixModelViewChanged ) {' );\r\n functionStr.push( ' var modelWorldMatrix = state.modelWorldMatrix;' );\r\n functionStr.push( ' this.Matrix.copy(modelworld, modelWorldMatrix.get() );' );\r\n functionStr.push( ' modelWorldMatrix.dirty();' );\r\n functionStr.push( ' modelWorldMatrix.apply( gl, this.modelWorldUniform);' );\r\n functionStr.push( '};' );\r\n }\r\n\r\n if ( this.viewUniform !== undefined ) {\r\n functionStr.push( 'if ( matrixModelViewChanged ) {' );\r\n functionStr.push( ' var viewMatrix = state.viewMatrix;' );\r\n functionStr.push( ' this.Matrix.copy(view, viewMatrix.get() );' );\r\n functionStr.push( ' viewMatrix.dirty();' );\r\n functionStr.push( ' viewMatrix.apply( gl, this.viewUniform);' );\r\n functionStr.push( '};' );\r\n }\r\n\r\n // I am the evil, so please bother someone else\r\n /*jshint evil: true */\r\n var func = new Function( 'state', 'modelview', 'modelworld', 'view', 'projection', functionStr.join( '\\n' ) );\r\n /*jshint evil: false */\r\n\r\n this.apply = func;\r\n },\r\n\r\n generateUniformsApplyMethodsOld: function () {\r\n\r\n var functionStr = [ '//generated by RenderLeaf\\n' ];\r\n functionStr.push( 'var gl = state.getGraphicContext();' );\r\n\r\n if ( this.modelViewUniform !== undefined ) {\r\n functionStr.push( 'var modelViewMatrix = state.modelViewMatrix;' );\r\n functionStr.push( 'this.Matrix.copy(modelview, modelViewMatrix.get() );' );\r\n functionStr.push( 'modelViewMatrix.dirty();' );\r\n functionStr.push( 'modelViewMatrix.apply( gl, this.modelViewUniform);' );\r\n\r\n functionStr.push( 'state.applyModelViewMatrix( modelview );' );\r\n }\r\n\r\n if ( this.modelWorldUniform !== undefined ) {\r\n functionStr.push( 'var modelWorldMatrix = state.modelWorldMatrix;' );\r\n functionStr.push( 'this.Matrix.copy(modelworld, modelWorldMatrix.get() );' );\r\n functionStr.push( 'modelWorldMatrix.dirty();' );\r\n functionStr.push( 'modelWorldMatrix.apply( gl, this.modelWorldUniform);' );\r\n }\r\n\r\n if ( this.viewUniform !== undefined ) {\r\n functionStr.push( 'var viewMatrix = state.viewMatrix;' );\r\n functionStr.push( 'this.Matrix.copy(view, viewMatrix.get() );' );\r\n functionStr.push( 'viewMatrix.dirty();' );\r\n functionStr.push( 'viewMatrix.apply( gl, this.viewUniform);' );\r\n }\r\n\r\n if ( this.projectionUniform !== undefined ) {\r\n functionStr.push( 'var projectionMatrix = state.projectionMatrix;' );\r\n functionStr.push( 'this.Matrix.copy(projection, projectionMatrix.get() );' );\r\n functionStr.push( 'projectionMatrix.dirty();' );\r\n functionStr.push( 'projectionMatrix.apply( gl, this.projectionUniform);' );\r\n }\r\n\r\n if ( this.normalUniform !== undefined ) {\r\n functionStr.push( 'var normalMatrix = state.normalMatrix;' );\r\n functionStr.push( 'this.Matrix.copy( modelview, this.tempMatrix );' );\r\n functionStr.push( 'var normal = this.tempMatrix;' );\r\n functionStr.push( 'normal[ 12 ] = 0.0;' );\r\n functionStr.push( 'normal[ 13 ] = 0.0;' );\r\n functionStr.push( 'normal[ 14 ] = 0.0;' );\r\n\r\n functionStr.push( 'this.Matrix.inverse( normal, normal );' );\r\n functionStr.push( 'this.Matrix.transpose( normal, normal);' );\r\n\r\n functionStr.push( 'this.Matrix.copy(normal, normalMatrix.get() );' );\r\n functionStr.push( 'normalMatrix.dirty();' );\r\n functionStr.push( 'normalMatrix.apply( gl, this.normalUniform);' );\r\n }\r\n\r\n // I am the evil, so please bother someone else\r\n /*jshint evil: true */\r\n var func = new Function( 'state', 'modelview', 'modelworld', 'view', 'projection', 'normal', functionStr.join( '\\n' ) );\r\n /*jshint evil: false */\r\n\r\n this.apply = func;\r\n }\r\n\r\n };\r\n\r\n\r\n var RenderLeaf = function () {\r\n\r\n this._parent = undefined;\r\n this._geometry = undefined;\r\n this._depth = 0.0;\r\n\r\n this._projection = undefined;\r\n this._view = undefined;\r\n this._modelWorld = undefined;\r\n this._modelView = undefined;\r\n };\r\n\r\n RenderLeaf.prototype = {\r\n\r\n reset: function () {\r\n this._parent = undefined;\r\n this._geometry = undefined;\r\n this._depth = 0.0;\r\n\r\n this._projection = undefined;\r\n this._view = undefined;\r\n this._modelWorld = undefined;\r\n this._modelView = undefined;\r\n },\r\n\r\n init: function ( parent, geom, projection, view, modelView, modelWorld, depth ) {\r\n\r\n this._parent = parent;\r\n this._geometry = geom;\r\n this._depth = depth;\r\n\r\n this._projection = projection;\r\n this._view = view;\r\n this._modelWorld = modelWorld;\r\n this._modelView = modelView;\r\n\r\n },\r\n\r\n drawGeometry: ( function () {\r\n\r\n return function ( state ) {\r\n\r\n\r\n var program = state.getLastProgramApplied();\r\n var programInstanceID = program.getInstanceID();\r\n var cache = state.getCacheUniformsApplyRenderLeaf();\r\n var obj = cache[ programInstanceID ];\r\n\r\n if ( !obj ) {\r\n obj = new CacheUniformApply( state, program );\r\n cache[ programInstanceID ] = obj;\r\n }\r\n\r\n obj.apply( state, this._modelView, this._modelWorld, this._view, this._projection, this._normal );\r\n\r\n this._geometry.drawImplementation( state );\r\n\r\n };\r\n } )(),\r\n\r\n render: ( function () {\r\n var previousHash;\r\n\r\n return function ( state, previousLeaf ) {\r\n\r\n var prevRenderGraph;\r\n var prevRenderGraphParent;\r\n var rg;\r\n\r\n if ( previousLeaf !== undefined ) {\r\n\r\n // apply state if required.\r\n prevRenderGraph = previousLeaf._parent;\r\n prevRenderGraphParent = prevRenderGraph.parent;\r\n rg = this._parent;\r\n\r\n if ( prevRenderGraphParent !== rg.parent ) {\r\n\r\n rg.moveStateGraph( state, prevRenderGraphParent, rg.parent );\r\n\r\n // send state changes and matrix changes to OpenGL.\r\n\r\n state.applyStateSet( rg.stateset );\r\n previousHash = state.getStateSetStackHash();\r\n\r\n } else if ( rg !== prevRenderGraph ) {\r\n\r\n // send state changes and matrix changes to OpenGL.\r\n state.applyStateSet( rg.stateset );\r\n previousHash = state.getStateSetStackHash();\r\n\r\n } else {\r\n\r\n // in osg we call apply but actually we dont need\r\n // except if the stateSetStack changed.\r\n // for example if insert/remove StateSet has been used\r\n var hash = state.getStateSetStackHash();\r\n if ( previousHash !== hash ) {\r\n this._parent.moveStateGraph( state, undefined, this._parent.parent );\r\n state.applyStateSet( this._parent.stateset );\r\n previousHash = hash;\r\n }\r\n }\r\n\r\n } else {\r\n\r\n this._parent.moveStateGraph( state, undefined, this._parent.parent );\r\n state.applyStateSet( this._parent.stateset );\r\n previousHash = state.getStateSetStackHash();\r\n\r\n }\r\n\r\n this.drawGeometry( state );\r\n\r\n };\r\n } )()\r\n\r\n };\r\n\r\n return RenderLeaf;\r\n\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/RenderLeaf.js\n ** module id = 73\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n\r\n 'osg/Camera',\r\n 'osg/FrameBufferObject',\r\n 'osg/Notify',\r\n 'osg/RenderBin',\r\n\r\n], function ( MACROUTILS, Camera, FrameBufferObject, Notify, RenderBin ) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * From OpenSceneGraph http://www.openscenegraph.org\r\n * RenderStage base class. Used for encapsulate a complete stage in\r\n * rendering - setting up of viewport, the projection and model\r\n * matrices and rendering the RenderBin's enclosed with this RenderStage.\r\n * RenderStage also has a dependency list of other RenderStages, each\r\n * of which must be called before the rendering of this stage. These\r\n * 'pre' rendering stages are used for advanced rendering techniques\r\n * like multistage pixel shading or impostors.\r\n */\r\n var RenderStage = function () {\r\n RenderBin.call( this );\r\n this.positionedAttribute = [];\r\n this.clearDepth = 1.0;\r\n this.clearColor = [ 0.0, 0.0, 0.0, 1.0 ];\r\n /*jshint bitwise: false */\r\n this.clearMask = Camera.COLOR_BUFFER_BIT | Camera.DEPTH_BUFFER_BIT;\r\n /*jshint bitwise: true */\r\n this.camera = undefined;\r\n this.viewport = undefined;\r\n this.preRenderList = [];\r\n this.postRenderList = [];\r\n this._renderStage = this;\r\n };\r\n\r\n RenderStage.prototype = MACROUTILS.objectLibraryClass( MACROUTILS.objectInherit( RenderBin.prototype, {\r\n reset: function () {\r\n RenderBin.prototype.reset.call( this );\r\n this.preRenderList.length = 0;\r\n this.postRenderList.length = 0;\r\n },\r\n setClearDepth: function ( depth ) {\r\n this.clearDepth = depth;\r\n },\r\n getClearDepth: function () {\r\n return this.clearDepth;\r\n },\r\n setClearColor: function ( color ) {\r\n this.clearColor = color;\r\n },\r\n getClearColor: function () {\r\n return this.clearColor;\r\n },\r\n setClearMask: function ( mask ) {\r\n this.clearMask = mask;\r\n },\r\n getClearMask: function () {\r\n return this.clearMask;\r\n },\r\n setViewport: function ( vp ) {\r\n this.viewport = vp;\r\n },\r\n getViewport: function () {\r\n return this.viewport;\r\n },\r\n setCamera: function ( camera ) {\r\n this.camera = camera;\r\n },\r\n getCamera: function () {\r\n return this.camera;\r\n },\r\n getPositionedAttribute: function () {\r\n return this.positionedAttribute;\r\n },\r\n addPreRenderStage: function ( rs, order ) {\r\n for ( var i = 0, l = this.preRenderList.length; i < l; i++ ) {\r\n var render = this.preRenderList[ i ];\r\n if ( order < render.order ) {\r\n break;\r\n }\r\n }\r\n if ( i < this.preRenderList.length ) {\r\n this.preRenderList = this.preRenderList.splice( i, 0, {\r\n 'order': order,\r\n 'renderStage': rs\r\n } );\r\n } else {\r\n this.preRenderList.push( {\r\n 'order': order,\r\n 'renderStage': rs\r\n } );\r\n }\r\n },\r\n addPostRenderStage: function ( rs, order ) {\r\n for ( var i = 0, l = this.postRenderList.length; i < l; i++ ) {\r\n var render = this.postRenderList[ i ];\r\n if ( order < render.order ) {\r\n break;\r\n }\r\n }\r\n if ( i < this.postRenderList.length ) {\r\n this.postRenderList = this.postRenderList.splice( i, 0, {\r\n 'order': order,\r\n 'renderStage': rs\r\n } );\r\n } else {\r\n this.postRenderList.push( {\r\n 'order': order,\r\n 'renderStage': rs\r\n } );\r\n }\r\n },\r\n\r\n drawPreRenderStages: function ( state, previousRenderLeaf ) {\r\n var previousLeaf = previousRenderLeaf;\r\n for ( var i = 0, l = this.preRenderList.length; i < l; ++i ) {\r\n var sg = this.preRenderList[ i ].renderStage;\r\n previousLeaf = sg.draw( state, previousLeaf );\r\n }\r\n return previousLeaf;\r\n },\r\n\r\n draw: function ( state, previousRenderLeaf ) {\r\n var previousLeaf = this.drawPreRenderStages( state, previousRenderLeaf );\r\n previousLeaf = this.drawImplementation( state, previousLeaf );\r\n\r\n previousLeaf = this.drawPostRenderStages( state, previousLeaf );\r\n return previousLeaf;\r\n },\r\n\r\n sort: function () {\r\n for ( var i = 0, l = this.preRenderList.length; i < l; ++i ) {\r\n this.preRenderList[ i ].renderStage.sort();\r\n }\r\n\r\n RenderBin.prototype.sort.call( this );\r\n\r\n for ( var j = 0, k = this.postRenderList.length; j < k; ++j ) {\r\n this.postRenderList[ j ].renderStage.sort();\r\n }\r\n },\r\n\r\n drawPostRenderStages: function ( state, previousRenderLeaf ) {\r\n var previousLeaf = previousRenderLeaf;\r\n for ( var i = 0, l = this.postRenderList.length; i < l; ++i ) {\r\n var sg = this.postRenderList[ i ].renderStage;\r\n previousLeaf = sg.draw( state, previousLeaf );\r\n }\r\n return previousLeaf;\r\n },\r\n\r\n applyCamera: function ( state ) {\r\n var gl = state.getGraphicContext();\r\n if ( this.camera === undefined ) {\r\n gl.bindFramebuffer( gl.FRAMEBUFFER, null );\r\n return;\r\n }\r\n var viewport = this.camera.getViewport();\r\n var fbo = this.camera.frameBufferObject;\r\n\r\n if ( !fbo ) {\r\n fbo = new FrameBufferObject();\r\n this.camera.frameBufferObject = fbo;\r\n }\r\n\r\n if ( fbo.isDirty() ) {\r\n\r\n var attachments = this.camera.getAttachments();\r\n // we should use a map in camera to avoid to regenerate the keys\r\n // each time. But because we dont have a lot of camera I guess\r\n // it does not change a lot\r\n var keys = Object.keys( attachments );\r\n\r\n if ( keys.length ) {\r\n\r\n for ( var i = 0, l = keys.length; i < l; i++ ) {\r\n var key = keys[ i ];\r\n var a = attachments[ key ];\r\n\r\n var attach = {};\r\n attach.attachment = a.attachment;\r\n\r\n if ( a.texture === undefined ) { //renderbuffer\r\n\r\n attach.format = a.format;\r\n attach.width = viewport.width();\r\n attach.height = viewport.height();\r\n\r\n } else if ( a.texture !== undefined ) {\r\n\r\n attach.texture = a.texture;\r\n attach.textureTarget = a.textureTarget;\r\n\r\n if ( a.format ) {\r\n attach.format = a.format;\r\n }\r\n }\r\n\r\n fbo.setAttachment( attach );\r\n }\r\n }\r\n }\r\n fbo.apply( state );\r\n },\r\n\r\n drawImplementation: function ( state, previousRenderLeaf ) {\r\n var gl = state.getGraphicContext();\r\n\r\n this.applyCamera( state );\r\n\r\n if ( this.viewport === undefined ) {\r\n Notify.log( 'RenderStage does not have a valid viewport' );\r\n }\r\n\r\n state.applyAttribute( this.viewport );\r\n\r\n /*jshint bitwise: false */\r\n if ( this.clearMask & gl.COLOR_BUFFER_BIT ) {\r\n gl.clearColor( this.clearColor[ 0 ], this.clearColor[ 1 ], this.clearColor[ 2 ], this.clearColor[ 3 ] );\r\n }\r\n if ( this.clearMask & gl.DEPTH_BUFFER_BIT ) {\r\n gl.depthMask( true );\r\n gl.clearDepth( this.clearDepth );\r\n }\r\n /*jshint bitwise: true */\r\n\r\n gl.clear( this.clearMask );\r\n\r\n if ( this.positionedAttribute.length !== 0 ) {\r\n this.applyPositionedAttribute( state, this.positionedAttribute );\r\n }\r\n\r\n var previousLeaf = RenderBin.prototype.drawImplementation.call( this, state, previousRenderLeaf );\r\n\r\n return previousLeaf;\r\n }\r\n } ), 'osg', 'RenderStage' );\r\n\r\n return RenderStage;\r\n\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/RenderStage.js\n ** module id = 74\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Notify',\r\n 'osg/Utils',\r\n 'osg/Timer',\r\n 'osg/GLObject'\r\n], function ( Notify, MACROUTILS, Timer, GLObject ) {\r\n\r\n /**\r\n * Shader manage shader for vertex and fragment, you need both to create a glsl program.\r\n * @class Shader\r\n */\r\n var Shader = function ( type, text ) {\r\n GLObject.call( this );\r\n var t = type;\r\n if ( typeof ( type ) === 'string' ) {\r\n t = Shader[ type ];\r\n }\r\n this.type = t;\r\n this.setText( text );\r\n };\r\n\r\n Shader.VERTEX_SHADER = 0x8B31;\r\n Shader.FRAGMENT_SHADER = 0x8B30;\r\n\r\n // Debug Pink shader for when shader fails\r\n Shader.VS_DBG = 'attribute vec3 Vertex;uniform mat4 ModelViewMatrix;uniform mat4 ProjectionMatrix;void main(void) { gl_Position = ProjectionMatrix * ModelViewMatrix * vec4(Vertex, 1.0);}';\r\n Shader.FS_DBG = 'precision lowp float; void main(void) { gl_FragColor = vec4(1.0, 0.6, 0.6, 1.0);}';\r\n\r\n\r\n // static cache of glShaders flagged for deletion, which will actually\r\n // be deleted in the correct GL context.\r\n Shader._sDeletedGLShaderCache = new Map();\r\n\r\n // static method to delete Program \r\n Shader.deleteGLShader = function ( gl, shader ) {\r\n if ( !Shader._sDeletedGLShaderCache.has( gl ) )\r\n Shader._sDeletedGLShaderCache.set( gl, [] );\r\n Shader._sDeletedGLShaderCache.get( gl ).push( shader );\r\n };\r\n\r\n // static method to flush all the cached glShaders which need to be deleted in the GL context specified\r\n Shader.flushDeletedGLShaders = function ( gl, availableTime ) {\r\n // if no time available don't try to flush objects.\r\n if ( availableTime <= 0.0 ) return availableTime;\r\n if ( !Shader._sDeletedGLShaderCache.has( gl ) ) return availableTime;\r\n var elapsedTime = 0.0;\r\n var beginTime = Timer.instance().tick();\r\n var deleteList = Shader._sDeletedGLShaderCache.get( gl );\r\n var numShaders = deleteList.length;\r\n for ( var i = numShaders - 1; i >= 0 && elapsedTime < availableTime; i-- ) {\r\n gl.deleteShader( deleteList[ i ] );\r\n deleteList.splice( i, 1 );\r\n elapsedTime = Timer.instance().deltaS( beginTime, Timer.instance().tick() );\r\n }\r\n return availableTime -= elapsedTime;\r\n };\r\n\r\n /** @lends Shader.prototype */\r\n Shader.prototype = MACROUTILS.objectInherit( GLObject.prototype, {\r\n setText: function ( text ) {\r\n this.text = text;\r\n },\r\n getText: function () {\r\n return this.text;\r\n },\r\n // this is where it creates a fail safe shader that should work everywhere\r\n failSafe: function ( gl ) {\r\n this.shader = gl.createShader( this.type );\r\n gl.shaderSource( this.shader, this.type === Shader.VERTEX_SHADER ? Shader.VS_DBG : Shader.FS_DBG );\r\n gl.compileShader( this.shader );\r\n },\r\n // webgl shader compiler error to source contextualization\r\n // for better console log messages\r\n processErrors: function ( errors, source ) {\r\n // regex to extract error message and line from webgl compiler reporting\r\n var r = /ERROR: [\\d]+:([\\d]+): (.+)/gmi;\r\n // split sources in indexable per line array\r\n var lines = source.split( '\\n' );\r\n var i, m;\r\n\r\n // IE reporting is not the same\r\n if ( r.exec( errors ) === null ) {\r\n r = /Shader compilation errors\\n\\((\\d+)\\, \\d+\\): (.+)/gmi;\r\n }\r\n\r\n\r\n while ( ( m = r.exec( errors ) ) != null ) {\r\n if ( m.index === r.lastIndex ) {\r\n r.lastIndex++; // moving between errors\r\n }\r\n // get error line\r\n var line = parseInt( m[ 1 ] );\r\n\r\n // webgl error report.\r\n Notify.error( 'ERROR ' + m[ 2 ] + ' in line ' + line, false, true );\r\n\r\n // for context\r\n // log surrounding line priori to error with bof check\r\n for ( i = 2; i < 7 && ( 0 < line - i ); i++ ) {\r\n Notify.log( lines[ line - i ].replace( /^[ \\t]+/g, '' ), false, true );\r\n }\r\n\r\n // Warn adds a lovely /!\\ icon in front of the culprit line\r\n Notify.warn( lines[ line - 1 ].replace( /^[ \\t]+/g, '' ), false, true );\r\n\r\n // for context\r\n // surrounding line posterior to error (with eof check)\r\n for ( i = 0; i < 5 && ( lines.length > line + i ); i++ ) {\r\n Notify.log( lines[ line + i ].replace( /^[ \\t]+/g, '' ), false, true );\r\n }\r\n }\r\n },\r\n compile: function ( gl ) {\r\n if ( !this._gl ) this.setGraphicContext( gl );\r\n this.shader = gl.createShader( this.type );\r\n gl.shaderSource( this.shader, this.text );\r\n MACROUTILS.timeStamp( 'osgjs.metrics:compileShader' );\r\n gl.compileShader( this.shader );\r\n if ( !gl.getShaderParameter( this.shader, gl.COMPILE_STATUS ) && !gl.isContextLost() ) {\r\n\r\n var err = gl.getShaderInfoLog( this.shader );\r\n this.processErrors( err, this.text );\r\n\r\n\r\n var tmpText = '\\n' + this.text;\r\n var splittedText = tmpText.split( '\\n' );\r\n var newText = '\\n';\r\n for ( var i = 0, l = splittedText.length; i < l; ++i ) {\r\n newText += i + ' ' + splittedText[ i ] + '\\n';\r\n }\r\n // still logging whole source but folded\r\n Notify.log( 'can\\'t compile shader:\\n' + newText, true );\r\n\r\n return false;\r\n }\r\n return true;\r\n },\r\n releaseGLObjects: function () {\r\n if ( this._gl !== undefined ) {\r\n Shader.deleteGLShader( this._gl, this.shader );\r\n }\r\n this.shader = undefined;\r\n }\r\n } );\r\n\r\n Shader.create = function ( type, text ) {\r\n Notify.log( 'Shader.create is deprecated, use new Shader with the same arguments instead' );\r\n return new Shader( type, text );\r\n };\r\n\r\n return Shader;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/Shader.js\n ** module id = 75\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Notify',\r\n 'osg/StateAttribute',\r\n 'osg/Vec3',\r\n 'osg/Uniform',\r\n 'osg/BufferArray',\r\n 'osg/Geometry',\r\n 'osg/PrimitiveSet',\r\n 'osg/DrawArrays',\r\n 'osg/DrawElements',\r\n 'osg/Program',\r\n 'osg/Shader',\r\n 'osg/Utils'\r\n], function ( Notify, StateAttribute, Vec3, Uniform, BufferArray, Geometry, PrimitiveSet, DrawArrays, DrawElements, Program, Shader, MACROUTILS ) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * Create a Textured Box on the given center with given size\r\n * @name createTexturedBox\r\n */\r\n var createTexturedBoxGeometry = function ( cx, cy, cz,\r\n sx, sy, sz ) {\r\n\r\n var centerx = cx !== undefined ? cx : 0.0;\r\n var centery = cy !== undefined ? cy : 0.0;\r\n var centerz = cz !== undefined ? cz : 0.0;\r\n\r\n var sizex = sx !== undefined ? sx : 1.0;\r\n var sizey = sy !== undefined ? sy : 1.0;\r\n var sizez = sz !== undefined ? sz : 1.0;\r\n\r\n var g = new Geometry();\r\n var dx, dy, dz;\r\n dx = sizex / 2.0;\r\n dy = sizey / 2.0;\r\n dz = sizez / 2.0;\r\n\r\n var vertexes = new MACROUTILS.Float32Array( 72 );\r\n var uv = new MACROUTILS.Float32Array( 48 );\r\n var normal = new MACROUTILS.Float32Array( 72 );\r\n\r\n // -ve y plane\r\n vertexes[ 0 ] = centerx - dx;\r\n vertexes[ 1 ] = centery - dy;\r\n vertexes[ 2 ] = centerz + dz;\r\n normal[ 0 ] = 0.0;\r\n normal[ 1 ] = -1.0;\r\n normal[ 2 ] = 0.0;\r\n uv[ 0 ] = 0.0;\r\n uv[ 1 ] = 1.0;\r\n\r\n vertexes[ 3 ] = centerx - dx;\r\n vertexes[ 4 ] = centery - dy;\r\n vertexes[ 5 ] = centerz - dz;\r\n normal[ 3 ] = 0.0;\r\n normal[ 4 ] = -1.0;\r\n normal[ 5 ] = 0.0;\r\n uv[ 2 ] = 0.0;\r\n uv[ 3 ] = 0.0;\r\n\r\n vertexes[ 6 ] = centerx + dx;\r\n vertexes[ 7 ] = centery - dy;\r\n vertexes[ 8 ] = centerz - dz;\r\n normal[ 6 ] = 0.0;\r\n normal[ 7 ] = -1.0;\r\n normal[ 8 ] = 0.0;\r\n uv[ 4 ] = 1.0;\r\n uv[ 5 ] = 0.0;\r\n\r\n vertexes[ 9 ] = centerx + dx;\r\n vertexes[ 10 ] = centery - dy;\r\n vertexes[ 11 ] = centerz + dz;\r\n normal[ 9 ] = 0.0;\r\n normal[ 10 ] = -1.0;\r\n normal[ 11 ] = 0.0;\r\n uv[ 6 ] = 1.0;\r\n uv[ 7 ] = 1.0;\r\n\r\n\r\n // +ve y plane\r\n vertexes[ 12 ] = centerx + dx;\r\n vertexes[ 13 ] = centery + dy;\r\n vertexes[ 14 ] = centerz + dz;\r\n normal[ 12 ] = 0.0;\r\n normal[ 13 ] = 1.0;\r\n normal[ 14 ] = 0.0;\r\n uv[ 8 ] = 0.0;\r\n uv[ 9 ] = 1.0;\r\n\r\n vertexes[ 15 ] = centerx + dx;\r\n vertexes[ 16 ] = centery + dy;\r\n vertexes[ 17 ] = centerz - dz;\r\n normal[ 15 ] = 0.0;\r\n normal[ 16 ] = 1.0;\r\n normal[ 17 ] = 0.0;\r\n uv[ 10 ] = 0.0;\r\n uv[ 11 ] = 0.0;\r\n\r\n vertexes[ 18 ] = centerx - dx;\r\n vertexes[ 19 ] = centery + dy;\r\n vertexes[ 20 ] = centerz - dz;\r\n normal[ 18 ] = 0.0;\r\n normal[ 19 ] = 1.0;\r\n normal[ 20 ] = 0.0;\r\n uv[ 12 ] = 1.0;\r\n uv[ 13 ] = 0.0;\r\n\r\n vertexes[ 21 ] = centerx - dx;\r\n vertexes[ 22 ] = centery + dy;\r\n vertexes[ 23 ] = centerz + dz;\r\n normal[ 21 ] = 0.0;\r\n normal[ 22 ] = 1.0;\r\n normal[ 23 ] = 0.0;\r\n uv[ 14 ] = 1.0;\r\n uv[ 15 ] = 1.0;\r\n\r\n\r\n // +ve x plane\r\n vertexes[ 24 ] = centerx + dx;\r\n vertexes[ 25 ] = centery - dy;\r\n vertexes[ 26 ] = centerz + dz;\r\n normal[ 24 ] = 1.0;\r\n normal[ 25 ] = 0.0;\r\n normal[ 26 ] = 0.0;\r\n uv[ 16 ] = 0.0;\r\n uv[ 17 ] = 1.0;\r\n\r\n vertexes[ 27 ] = centerx + dx;\r\n vertexes[ 28 ] = centery - dy;\r\n vertexes[ 29 ] = centerz - dz;\r\n normal[ 27 ] = 1.0;\r\n normal[ 28 ] = 0.0;\r\n normal[ 29 ] = 0.0;\r\n uv[ 18 ] = 0.0;\r\n uv[ 19 ] = 0.0;\r\n\r\n vertexes[ 30 ] = centerx + dx;\r\n vertexes[ 31 ] = centery + dy;\r\n vertexes[ 32 ] = centerz - dz;\r\n normal[ 30 ] = 1.0;\r\n normal[ 31 ] = 0.0;\r\n normal[ 32 ] = 0.0;\r\n uv[ 20 ] = 1.0;\r\n uv[ 21 ] = 0.0;\r\n\r\n vertexes[ 33 ] = centerx + dx;\r\n vertexes[ 34 ] = centery + dy;\r\n vertexes[ 35 ] = centerz + dz;\r\n normal[ 33 ] = 1.0;\r\n normal[ 34 ] = 0.0;\r\n normal[ 35 ] = 0.0;\r\n uv[ 22 ] = 1.0;\r\n uv[ 23 ] = 1.0;\r\n\r\n // -ve x plane\r\n vertexes[ 36 ] = centerx - dx;\r\n vertexes[ 37 ] = centery + dy;\r\n vertexes[ 38 ] = centerz + dz;\r\n normal[ 36 ] = -1.0;\r\n normal[ 37 ] = 0.0;\r\n normal[ 38 ] = 0.0;\r\n uv[ 24 ] = 0.0;\r\n uv[ 25 ] = 1.0;\r\n\r\n vertexes[ 39 ] = centerx - dx;\r\n vertexes[ 40 ] = centery + dy;\r\n vertexes[ 41 ] = centerz - dz;\r\n normal[ 39 ] = -1.0;\r\n normal[ 40 ] = 0.0;\r\n normal[ 41 ] = 0.0;\r\n uv[ 26 ] = 0.0;\r\n uv[ 27 ] = 0.0;\r\n\r\n vertexes[ 42 ] = centerx - dx;\r\n vertexes[ 43 ] = centery - dy;\r\n vertexes[ 44 ] = centerz - dz;\r\n normal[ 42 ] = -1.0;\r\n normal[ 43 ] = 0.0;\r\n normal[ 44 ] = 0.0;\r\n uv[ 28 ] = 1.0;\r\n uv[ 29 ] = 0.0;\r\n\r\n vertexes[ 45 ] = centerx - dx;\r\n vertexes[ 46 ] = centery - dy;\r\n vertexes[ 47 ] = centerz + dz;\r\n normal[ 45 ] = -1.0;\r\n normal[ 46 ] = 0.0;\r\n normal[ 47 ] = 0.0;\r\n uv[ 30 ] = 1.0;\r\n uv[ 31 ] = 1.0;\r\n\r\n // top\r\n // +ve z plane\r\n vertexes[ 48 ] = centerx - dx;\r\n vertexes[ 49 ] = centery + dy;\r\n vertexes[ 50 ] = centerz + dz;\r\n normal[ 48 ] = 0.0;\r\n normal[ 49 ] = 0.0;\r\n normal[ 50 ] = 1.0;\r\n uv[ 32 ] = 0.0;\r\n uv[ 33 ] = 1.0;\r\n\r\n vertexes[ 51 ] = centerx - dx;\r\n vertexes[ 52 ] = centery - dy;\r\n vertexes[ 53 ] = centerz + dz;\r\n normal[ 51 ] = 0.0;\r\n normal[ 52 ] = 0.0;\r\n normal[ 53 ] = 1.0;\r\n uv[ 34 ] = 0.0;\r\n uv[ 35 ] = 0.0;\r\n\r\n vertexes[ 54 ] = centerx + dx;\r\n vertexes[ 55 ] = centery - dy;\r\n vertexes[ 56 ] = centerz + dz;\r\n normal[ 54 ] = 0.0;\r\n normal[ 55 ] = 0.0;\r\n normal[ 56 ] = 1.0;\r\n uv[ 36 ] = 1.0;\r\n uv[ 37 ] = 0.0;\r\n\r\n vertexes[ 57 ] = centerx + dx;\r\n vertexes[ 58 ] = centery + dy;\r\n vertexes[ 59 ] = centerz + dz;\r\n normal[ 57 ] = 0.0;\r\n normal[ 58 ] = 0.0;\r\n normal[ 59 ] = 1.0;\r\n uv[ 38 ] = 1.0;\r\n uv[ 39 ] = 1.0;\r\n\r\n // bottom\r\n // -ve z plane\r\n vertexes[ 60 ] = centerx + dx;\r\n vertexes[ 61 ] = centery + dy;\r\n vertexes[ 62 ] = centerz - dz;\r\n normal[ 60 ] = 0.0;\r\n normal[ 61 ] = 0.0;\r\n normal[ 62 ] = -1.0;\r\n uv[ 40 ] = 0.0;\r\n uv[ 41 ] = 1.0;\r\n\r\n vertexes[ 63 ] = centerx + dx;\r\n vertexes[ 64 ] = centery - dy;\r\n vertexes[ 65 ] = centerz - dz;\r\n normal[ 63 ] = 0.0;\r\n normal[ 64 ] = 0.0;\r\n normal[ 65 ] = -1.0;\r\n uv[ 42 ] = 0.0;\r\n uv[ 43 ] = 0.0;\r\n\r\n vertexes[ 66 ] = centerx - dx;\r\n vertexes[ 67 ] = centery - dy;\r\n vertexes[ 68 ] = centerz - dz;\r\n normal[ 66 ] = 0.0;\r\n normal[ 67 ] = 0.0;\r\n normal[ 68 ] = -1.0;\r\n uv[ 44 ] = 1.0;\r\n uv[ 45 ] = 0.0;\r\n\r\n vertexes[ 69 ] = centerx - dx;\r\n vertexes[ 70 ] = centery + dy;\r\n vertexes[ 71 ] = centerz - dz;\r\n normal[ 69 ] = 0.0;\r\n normal[ 70 ] = 0.0;\r\n normal[ 71 ] = -1.0;\r\n uv[ 46 ] = 1.0;\r\n uv[ 47 ] = 1.0;\r\n\r\n var indexes = new MACROUTILS.Uint16Array( 36 );\r\n indexes[ 0 ] = 0;\r\n indexes[ 1 ] = 1;\r\n indexes[ 2 ] = 2;\r\n indexes[ 3 ] = 0;\r\n indexes[ 4 ] = 2;\r\n indexes[ 5 ] = 3;\r\n\r\n indexes[ 6 ] = 4;\r\n indexes[ 7 ] = 5;\r\n indexes[ 8 ] = 6;\r\n indexes[ 9 ] = 4;\r\n indexes[ 10 ] = 6;\r\n indexes[ 11 ] = 7;\r\n\r\n indexes[ 12 ] = 8;\r\n indexes[ 13 ] = 9;\r\n indexes[ 14 ] = 10;\r\n indexes[ 15 ] = 8;\r\n indexes[ 16 ] = 10;\r\n indexes[ 17 ] = 11;\r\n\r\n indexes[ 18 ] = 12;\r\n indexes[ 19 ] = 13;\r\n indexes[ 20 ] = 14;\r\n indexes[ 21 ] = 12;\r\n indexes[ 22 ] = 14;\r\n indexes[ 23 ] = 15;\r\n\r\n indexes[ 24 ] = 16;\r\n indexes[ 25 ] = 17;\r\n indexes[ 26 ] = 18;\r\n indexes[ 27 ] = 16;\r\n indexes[ 28 ] = 18;\r\n indexes[ 29 ] = 19;\r\n\r\n indexes[ 30 ] = 20;\r\n indexes[ 31 ] = 21;\r\n indexes[ 32 ] = 22;\r\n indexes[ 33 ] = 20;\r\n indexes[ 34 ] = 22;\r\n indexes[ 35 ] = 23;\r\n\r\n g.getAttributes().Vertex = new BufferArray( BufferArray.ARRAY_BUFFER, vertexes, 3 );\r\n g.getAttributes().Normal = new BufferArray( BufferArray.ARRAY_BUFFER, normal, 3 );\r\n g.getAttributes().TexCoord0 = new BufferArray( BufferArray.ARRAY_BUFFER, uv, 2 );\r\n\r\n var primitive = new DrawElements( PrimitiveSet.TRIANGLES, new BufferArray( BufferArray.ELEMENT_ARRAY_BUFFER, indexes, 1 ) );\r\n g.getPrimitives().push( primitive );\r\n return g;\r\n };\r\n\r\n var createTexturedQuadGeometry = function ( cornerx, cornery, cornerz,\r\n wx, wy, wz,\r\n hx, hy, hz,\r\n l, b, r, t ) {\r\n\r\n if ( r === undefined && t === undefined ) {\r\n r = l;\r\n t = b;\r\n l = 0.0;\r\n b = 0.0;\r\n }\r\n\r\n var g = new Geometry();\r\n\r\n var vertexes = new MACROUTILS.Float32Array( 12 );\r\n vertexes[ 0 ] = cornerx + hx;\r\n vertexes[ 1 ] = cornery + hy;\r\n vertexes[ 2 ] = cornerz + hz;\r\n\r\n vertexes[ 3 ] = cornerx;\r\n vertexes[ 4 ] = cornery;\r\n vertexes[ 5 ] = cornerz;\r\n\r\n vertexes[ 6 ] = cornerx + wx;\r\n vertexes[ 7 ] = cornery + wy;\r\n vertexes[ 8 ] = cornerz + wz;\r\n\r\n vertexes[ 9 ] = cornerx + wx + hx;\r\n vertexes[ 10 ] = cornery + wy + hy;\r\n vertexes[ 11 ] = cornerz + wz + hz;\r\n\r\n if ( r === undefined ) {\r\n r = 1.0;\r\n }\r\n if ( t === undefined ) {\r\n t = 1.0;\r\n }\r\n\r\n var uvs = new MACROUTILS.Float32Array( 8 );\r\n uvs[ 0 ] = l;\r\n uvs[ 1 ] = t;\r\n\r\n uvs[ 2 ] = l;\r\n uvs[ 3 ] = b;\r\n\r\n uvs[ 4 ] = r;\r\n uvs[ 5 ] = b;\r\n\r\n uvs[ 6 ] = r;\r\n uvs[ 7 ] = t;\r\n\r\n var n = Vec3.cross( [ wx, wy, wz ], [ hx, hy, hz ], [ 0.0, 0.0, 0.0 ] );\r\n var normal = new MACROUTILS.Float32Array( 12 );\r\n normal[ 0 ] = n[ 0 ];\r\n normal[ 1 ] = n[ 1 ];\r\n normal[ 2 ] = n[ 2 ];\r\n\r\n normal[ 3 ] = n[ 0 ];\r\n normal[ 4 ] = n[ 1 ];\r\n normal[ 5 ] = n[ 2 ];\r\n\r\n normal[ 6 ] = n[ 0 ];\r\n normal[ 7 ] = n[ 1 ];\r\n normal[ 8 ] = n[ 2 ];\r\n\r\n normal[ 9 ] = n[ 0 ];\r\n normal[ 10 ] = n[ 1 ];\r\n normal[ 11 ] = n[ 2 ];\r\n\r\n\r\n var indexes = new MACROUTILS.Uint16Array( 6 );\r\n indexes[ 0 ] = 0;\r\n indexes[ 1 ] = 1;\r\n indexes[ 2 ] = 2;\r\n indexes[ 3 ] = 0;\r\n indexes[ 4 ] = 2;\r\n indexes[ 5 ] = 3;\r\n\r\n g.getAttributes().Vertex = new BufferArray( BufferArray.ARRAY_BUFFER, vertexes, 3 );\r\n g.getAttributes().Normal = new BufferArray( BufferArray.ARRAY_BUFFER, normal, 3 );\r\n g.getAttributes().TexCoord0 = new BufferArray( BufferArray.ARRAY_BUFFER, uvs, 2 );\r\n\r\n var primitive = new DrawElements( PrimitiveSet.TRIANGLES, new BufferArray( BufferArray.ELEMENT_ARRAY_BUFFER, indexes, 1 ) );\r\n g.getPrimitives().push( primitive );\r\n return g;\r\n };\r\n\r\n var createTexturedBox = function ( centerx, centery, centerz,\r\n sizex, sizey, sizez ) {\r\n Notify.log( 'createTexturedBox is deprecated use instead createTexturedBoxGeometry' );\r\n return createTexturedBoxGeometry( centerx, centery, centerz,\r\n sizex, sizey, sizez );\r\n };\r\n\r\n var createTexturedQuad = function ( cornerx, cornery, cornerz,\r\n wx, wy, wz,\r\n hx, hy, hz,\r\n l, b, r, t ) {\r\n Notify.log( 'createTexturedQuad is deprecated use instead createTexturedQuadGeometry' );\r\n return createTexturedQuadGeometry( cornerx, cornery, cornerz,\r\n wx, wy, wz,\r\n hx, hy, hz,\r\n l, b, r, t );\r\n };\r\n\r\n var createAxisGeometry = function ( size ) {\r\n if ( size === undefined ) {\r\n size = 5.0;\r\n }\r\n if ( createAxisGeometry.getShader === undefined ) {\r\n createAxisGeometry.getShader = function () {\r\n if ( createAxisGeometry.getShader.program === undefined ) {\r\n var vertexshader = [\r\n '#ifdef GL_ES',\r\n 'precision highp float;',\r\n '#endif',\r\n 'attribute vec3 Vertex;',\r\n 'attribute vec4 Color;',\r\n 'uniform mat4 ModelViewMatrix;',\r\n 'uniform mat4 ProjectionMatrix;',\r\n '',\r\n 'varying vec4 FragColor;',\r\n '',\r\n 'vec4 ftransform() {',\r\n 'return ProjectionMatrix * ModelViewMatrix * vec4(Vertex, 1.0);',\r\n '}',\r\n '',\r\n 'void main(void) {',\r\n 'gl_Position = ftransform();',\r\n 'FragColor = Color;',\r\n '}'\r\n ].join( '\\n' );\r\n\r\n var fragmentshader = [\r\n '#ifdef GL_ES',\r\n 'precision highp float;',\r\n '#endif',\r\n 'varying vec4 FragColor;',\r\n\r\n 'void main(void) {',\r\n 'gl_FragColor = FragColor;',\r\n '}'\r\n ].join( '\\n' );\r\n\r\n var program = new Program( new Shader( 'VERTEX_SHADER', vertexshader ),\r\n new Shader( 'FRAGMENT_SHADER', fragmentshader ) );\r\n createAxisGeometry.getShader.program = program;\r\n }\r\n return createAxisGeometry.getShader.program;\r\n };\r\n }\r\n\r\n var g = new Geometry();\r\n\r\n var vertexes = new MACROUTILS.Float32Array( 18 );\r\n vertexes[ 3 ] = size;\r\n vertexes[ 10 ] = size;\r\n vertexes[ 17 ] = size;\r\n\r\n var colors = new MACROUTILS.Float32Array( 24 );\r\n //red color\r\n colors[ 0 ] = colors[ 3 ] = 1.0;\r\n colors[ 4 ] = colors[ 4 + 3 ] = 1.0;\r\n //green color\r\n colors[ 4 * 2 + 1 ] = colors[ 4 * 2 + 3 ] = 1.0;\r\n colors[ 4 * 3 + 1 ] = colors[ 4 * 3 + 3 ] = 1.0;\r\n //blue color\r\n colors[ 4 * 4 + 2 ] = colors[ 4 * 4 + 3 ] = 1.0;\r\n colors[ 4 * 5 + 2 ] = colors[ 4 * 5 + 3 ] = 1.0;\r\n\r\n g.getAttributes().Vertex = new BufferArray( BufferArray.ARRAY_BUFFER, vertexes, 3 );\r\n g.getAttributes().Color = new BufferArray( BufferArray.ARRAY_BUFFER, colors, 4 );\r\n\r\n var primitive = new DrawArrays( PrimitiveSet.LINES, 0, 6 );\r\n g.getPrimitives().push( primitive );\r\n g.getOrCreateStateSet().setAttributeAndModes( createAxisGeometry.getShader() );\r\n\r\n return g;\r\n };\r\n\r\n /**\r\n * Create a Textured Sphere on the given center with given radius\r\n * @name createTexturedSphere\r\n * @author Darrell Esau\r\n */\r\n var createTexturedSphere = function ( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\r\n radius = radius || 50.0;\r\n\r\n phiStart = phiStart !== undefined ? phiStart : 0.0;\r\n phiLength = phiLength !== undefined ? phiLength : Math.PI * 2;\r\n\r\n thetaStart = thetaStart !== undefined ? thetaStart : 0.0;\r\n thetaLength = thetaLength !== undefined ? thetaLength : Math.PI;\r\n\r\n var segmentsX = Math.max( 3, Math.floor( widthSegments ) || 8 );\r\n var segmentsY = Math.max( 2, Math.floor( heightSegments ) || 6 );\r\n\r\n var useDrawArrays = ( ( segmentsX * segmentsY ) / 3 ) >= 65536;\r\n var nbPrim = useDrawArrays ? segmentsX * segmentsY * 6 : segmentsX * segmentsY * 4;\r\n var fullVerticesList = new MACROUTILS.Float32Array( nbPrim * 3 );\r\n var fullNormalsList = new MACROUTILS.Float32Array( nbPrim * 3 );\r\n var fullUVList = new MACROUTILS.Float32Array( nbPrim * 2 );\r\n var indexes = !useDrawArrays ? new MACROUTILS.Uint16Array( segmentsX * segmentsY * 6 ) : undefined;\r\n var vtxCount = 0;\r\n var triCount = 0;\r\n\r\n var v1 = new MACROUTILS.Float32Array( 3 );\r\n var v2 = new MACROUTILS.Float32Array( 3 );\r\n var v3 = new MACROUTILS.Float32Array( 3 );\r\n var v4 = new MACROUTILS.Float32Array( 3 );\r\n var n1 = new MACROUTILS.Float32Array( 3 );\r\n var n2 = new MACROUTILS.Float32Array( 3 );\r\n var n3 = new MACROUTILS.Float32Array( 3 );\r\n var n4 = new MACROUTILS.Float32Array( 3 );\r\n var uv1 = new MACROUTILS.Float32Array( 2 );\r\n var uv2 = new MACROUTILS.Float32Array( 2 );\r\n var uv3 = new MACROUTILS.Float32Array( 2 );\r\n var uv4 = new MACROUTILS.Float32Array( 2 );\r\n var getCoordAndUvSphere = function ( u, v, coord, norm, uv ) {\r\n coord[ 0 ] = -radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\r\n coord[ 1 ] = radius * Math.cos( thetaStart + v * thetaLength );\r\n coord[ 2 ] = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\r\n Vec3.normalize( coord, norm );\r\n uv[ 0 ] = u;\r\n uv[ 1 ] = 1 - v;\r\n };\r\n for ( var y = 0; y < segmentsY; y++ ) {\r\n for ( var x = 0; x < segmentsX; x++ ) {\r\n getCoordAndUvSphere( ( x + 1 ) / segmentsX, y / segmentsY, v1, n1, uv1 );\r\n getCoordAndUvSphere( x / segmentsX, y / segmentsY, v2, n2, uv2 );\r\n getCoordAndUvSphere( x / segmentsX, ( y + 1 ) / segmentsY, v3, n3, uv3 );\r\n getCoordAndUvSphere( ( x + 1 ) / segmentsX, ( y + 1 ) / segmentsY, v4, n4, uv4 );\r\n\r\n var idv = vtxCount * 3;\r\n fullVerticesList[ idv ] = v1[ 0 ];\r\n fullVerticesList[ idv + 1 ] = v1[ 1 ];\r\n fullVerticesList[ idv + 2 ] = v1[ 2 ];\r\n fullVerticesList[ idv + 3 ] = v2[ 0 ];\r\n fullVerticesList[ idv + 4 ] = v2[ 1 ];\r\n fullVerticesList[ idv + 5 ] = v2[ 2 ];\r\n fullVerticesList[ idv + 6 ] = v3[ 0 ];\r\n fullVerticesList[ idv + 7 ] = v3[ 1 ];\r\n fullVerticesList[ idv + 8 ] = v3[ 2 ];\r\n\r\n fullNormalsList[ idv ] = n1[ 0 ];\r\n fullNormalsList[ idv + 1 ] = n1[ 1 ];\r\n fullNormalsList[ idv + 2 ] = n1[ 2 ];\r\n fullNormalsList[ idv + 3 ] = n2[ 0 ];\r\n fullNormalsList[ idv + 4 ] = n2[ 1 ];\r\n fullNormalsList[ idv + 5 ] = n2[ 2 ];\r\n fullNormalsList[ idv + 6 ] = n3[ 0 ];\r\n fullNormalsList[ idv + 7 ] = n3[ 1 ];\r\n fullNormalsList[ idv + 8 ] = n3[ 2 ];\r\n\r\n var idu = vtxCount * 2;\r\n fullUVList[ idu ] = uv1[ 0 ];\r\n fullUVList[ idu + 1 ] = uv1[ 1 ];\r\n fullUVList[ idu + 2 ] = uv2[ 0 ];\r\n fullUVList[ idu + 3 ] = uv2[ 1 ];\r\n fullUVList[ idu + 4 ] = uv3[ 0 ];\r\n fullUVList[ idu + 5 ] = uv3[ 1 ];\r\n\r\n vtxCount += 3;\r\n if ( useDrawArrays ) {\r\n idv = vtxCount * 3;\r\n fullVerticesList[ idv ] = v1[ 0 ];\r\n fullVerticesList[ idv + 1 ] = v1[ 1 ];\r\n fullVerticesList[ idv + 2 ] = v1[ 2 ];\r\n fullVerticesList[ idv + 3 ] = v3[ 0 ];\r\n fullVerticesList[ idv + 4 ] = v3[ 1 ];\r\n fullVerticesList[ idv + 5 ] = v3[ 2 ];\r\n fullVerticesList[ idv + 6 ] = v4[ 0 ];\r\n fullVerticesList[ idv + 7 ] = v4[ 1 ];\r\n fullVerticesList[ idv + 8 ] = v4[ 2 ];\r\n\r\n fullNormalsList[ idv ] = n1[ 0 ];\r\n fullNormalsList[ idv + 1 ] = n1[ 1 ];\r\n fullNormalsList[ idv + 2 ] = n1[ 2 ];\r\n fullNormalsList[ idv + 3 ] = n3[ 0 ];\r\n fullNormalsList[ idv + 4 ] = n3[ 1 ];\r\n fullNormalsList[ idv + 5 ] = n3[ 2 ];\r\n fullNormalsList[ idv + 6 ] = n4[ 0 ];\r\n fullNormalsList[ idv + 7 ] = n4[ 1 ];\r\n fullNormalsList[ idv + 8 ] = n4[ 2 ];\r\n\r\n idu = vtxCount * 2;\r\n fullUVList[ idu ] = uv1[ 0 ];\r\n fullUVList[ idu + 1 ] = uv1[ 1 ];\r\n fullUVList[ idu + 2 ] = uv3[ 0 ];\r\n fullUVList[ idu + 3 ] = uv3[ 1 ];\r\n fullUVList[ idu + 4 ] = uv4[ 0 ];\r\n fullUVList[ idu + 5 ] = uv4[ 1 ];\r\n vtxCount += 3;\r\n } else {\r\n idv = vtxCount * 3;\r\n fullVerticesList[ idv ] = v4[ 0 ];\r\n fullVerticesList[ idv + 1 ] = v4[ 1 ];\r\n fullVerticesList[ idv + 2 ] = v4[ 2 ];\r\n\r\n fullNormalsList[ idv ] = n4[ 0 ];\r\n fullNormalsList[ idv + 1 ] = n4[ 1 ];\r\n fullNormalsList[ idv + 2 ] = n4[ 2 ];\r\n\r\n idu = vtxCount * 2;\r\n fullUVList[ idu ] = uv4[ 0 ];\r\n fullUVList[ idu + 1 ] = uv4[ 1 ];\r\n\r\n var iStart = triCount * 3;\r\n var tristart = vtxCount - 3;\r\n indexes[ iStart ] = tristart;\r\n indexes[ iStart + 1 ] = tristart + 1;\r\n indexes[ iStart + 2 ] = tristart + 2;\r\n indexes[ iStart + 3 ] = tristart;\r\n indexes[ iStart + 4 ] = tristart + 2;\r\n indexes[ iStart + 5 ] = tristart + 3;\r\n triCount += 2;\r\n vtxCount += 1;\r\n }\r\n }\r\n }\r\n\r\n var g = new Geometry();\r\n g.getAttributes().Vertex = new BufferArray( 'ARRAY_BUFFER', fullVerticesList, 3 );\r\n g.getAttributes().Normal = new BufferArray( 'ARRAY_BUFFER', fullNormalsList, 3 );\r\n g.getAttributes().TexCoord0 = new BufferArray( 'ARRAY_BUFFER', fullUVList, 2 );\r\n\r\n if ( useDrawArrays )\r\n g.getPrimitives().push( new DrawArrays( PrimitiveSet.TRIANGLES, 0, fullVerticesList.length / 3 ) );\r\n else\r\n g.getPrimitives().push( new DrawElements( PrimitiveSet.TRIANGLES, new BufferArray( 'ELEMENT_ARRAY_BUFFER', indexes, 1 ) ) );\r\n return g;\r\n };\r\n\r\n var createGridGeometry = function ( cx, cy, cz, wx, wy, wz, hx, hy, hz, res1, res2 ) {\r\n cx = cx !== undefined ? cx : -0.5;\r\n cy = cy !== undefined ? cy : -0.5;\r\n cz = cz !== undefined ? cz : 0.0;\r\n\r\n wx = wx !== undefined ? wx : 1.0;\r\n wy = wy !== undefined ? wy : 0.0;\r\n wz = wz !== undefined ? wz : 0.0;\r\n\r\n hx = hx !== undefined ? hx : 0.0;\r\n hy = hy !== undefined ? hy : 1.0;\r\n hz = hz !== undefined ? hz : 0.0;\r\n\r\n res1 = res1 !== undefined ? res1 : 5;\r\n res2 = res2 !== undefined ? res2 : res1;\r\n res1 += 2;\r\n res2 += 2;\r\n\r\n var g = new Geometry();\r\n var vertices = new Float32Array( ( res1 + res2 ) * 2 * 3 );\r\n var i = 0;\r\n var j = 0;\r\n var sx = wx / ( res1 - 1 );\r\n var sy = wy / ( res1 - 1 );\r\n var sz = wz / ( res1 - 1 );\r\n var ux = cx + wx + hx;\r\n var uy = cy + wy + hy;\r\n var uz = cz + wz + hz;\r\n for ( i = 0; i < res1; ++i ) {\r\n j = i * 6;\r\n vertices[ j ] = cx + sx * i;\r\n vertices[ j + 1 ] = cy + sy * i;\r\n vertices[ j + 2 ] = cz + sz * i;\r\n vertices[ j + 3 ] = ux - sx * ( res1 - i - 1 );\r\n vertices[ j + 4 ] = uy - sy * ( res1 - i - 1 );\r\n vertices[ j + 5 ] = uz - sz * ( res1 - i - 1 );\r\n }\r\n sx = hx / ( res2 - 1 );\r\n sy = hy / ( res2 - 1 );\r\n sz = hz / ( res2 - 1 );\r\n for ( i = 0; i < res2; ++i ) {\r\n j = ( res1 + i ) * 6;\r\n vertices[ j ] = cx + sx * i;\r\n vertices[ j + 1 ] = cy + sy * i;\r\n vertices[ j + 2 ] = cz + sz * i;\r\n vertices[ j + 3 ] = ux - sx * ( res2 - i - 1 );\r\n vertices[ j + 4 ] = uy - sy * ( res2 - i - 1 );\r\n vertices[ j + 5 ] = uz - sz * ( res2 - i - 1 );\r\n }\r\n g.getAttributes().Vertex = new BufferArray( BufferArray.ARRAY_BUFFER, vertices, 3 );\r\n var primitive = new DrawArrays( PrimitiveSet.LINES, 0, ( res1 + res2 ) * 2 );\r\n g.getPrimitives().push( primitive );\r\n return g;\r\n };\r\n\r\n return {\r\n createTexturedBoxGeometry: createTexturedBoxGeometry,\r\n createTexturedQuadGeometry: createTexturedQuadGeometry,\r\n createTexturedSphereGeometry: createTexturedSphere,\r\n createTexturedBox: createTexturedBox,\r\n createTexturedQuad: createTexturedQuad,\r\n createAxisGeometry: createAxisGeometry,\r\n createTexturedSphere: createTexturedSphere,\r\n createGridGeometry: createGridGeometry\r\n };\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/Shape.js\n ** module id = 76\n ** module chunks = 0 1\n **/","define( [], function () {\r\n\r\n var Stack = function () {\r\n this.globalDefault = undefined;\r\n this.lastApplied = undefined;\r\n this.asChanged = false;\r\n\r\n this._values = [];\r\n this._back = undefined;\r\n };\r\n\r\n Stack.prototype = {\r\n empty: function () {\r\n return this._values.length === 0;\r\n },\r\n values: function () {\r\n return this._values;\r\n },\r\n back: function () {\r\n return this._back;\r\n },\r\n push: function ( value ) {\r\n this._values.push( value );\r\n this._back = value;\r\n },\r\n pop: function () {\r\n var value = this._values.pop();\r\n this._back = this._values[ this._values.length - 1 ];\r\n return value;\r\n }\r\n };\r\n\r\n return Stack;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/Stack.js\n ** module id = 77\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Map',\r\n 'osg/Matrix',\r\n 'osg/Notify',\r\n 'osg/Object',\r\n 'osg/Program',\r\n 'osg/StateAttribute',\r\n 'osg/Stack',\r\n 'osg/Texture',\r\n 'osg/Uniform',\r\n 'osg/Utils'\r\n], function ( Map, Matrix, Notify, Object, Program, StateAttribute, Stack, Texture, Uniform, MACROUTILS ) {\r\n\r\n 'use strict';\r\n\r\n var State = function ( shaderGeneratorProxy ) {\r\n Object.call( this );\r\n\r\n this._graphicContext = undefined;\r\n this._shaderGeneratorProxy = shaderGeneratorProxy;\r\n\r\n if ( shaderGeneratorProxy === undefined )\r\n console.break();\r\n\r\n this.currentVBO = null;\r\n this.vertexAttribList = [];\r\n this.stateSets = new Stack();\r\n this._shaderGeneratorNames = new Stack();\r\n this.uniforms = new Map();\r\n\r\n this.textureAttributeMapList = [];\r\n\r\n this.attributeMap = new Map();\r\n\r\n this.modelWorldMatrix = Uniform.createMatrix4( Matrix.create(), 'ModelWorldMatrix' );\r\n this.viewMatrix = Uniform.createMatrix4( Matrix.create(), 'ViewMatrix' );\r\n this.modelViewMatrix = Uniform.createMatrix4( Matrix.create(), 'ModelViewMatrix' );\r\n this.projectionMatrix = Uniform.createMatrix4( Matrix.create(), 'ProjectionMatrix' );\r\n this.normalMatrix = Uniform.createMatrix4( Matrix.create(), 'NormalMatrix' );\r\n\r\n // track uniform for color array enabled\r\n var arrayColorEnable = new Stack();\r\n arrayColorEnable.globalDefault = Uniform.createFloat1( 0.0, 'ArrayColorEnabled' );\r\n\r\n this.uniforms.setMap( {\r\n ArrayColorEnabled: arrayColorEnable\r\n } );\r\n\r\n\r\n this._previousColorAttribPair = {};\r\n this.vertexAttribMap = {};\r\n this.vertexAttribMap._disable = [];\r\n this.vertexAttribMap._keys = [];\r\n\r\n this._frameStamp = undefined;\r\n\r\n // we dont use Map because in this use case with a few entries\r\n // {} is faster\r\n this._programCommonUniformsCache = {};\r\n\r\n // keep pointer on the last applied modelview matrix\r\n this._modelViewMatrix = undefined;\r\n // keep pointer on the last applied projection matrix\r\n this._projectionMatrix = undefined;\r\n\r\n\r\n // keep track of last applied program\r\n this._program = undefined;\r\n // inject a default program to initialize the stack Program\r\n this.applyAttribute( new Program() );\r\n\r\n };\r\n\r\n State.prototype = MACROUTILS.objectLibraryClass( MACROUTILS.objectInherit( Object.prototype, {\r\n\r\n getCacheUniformsApplyRenderLeaf: function () {\r\n return this._programCommonUniformsCache;\r\n },\r\n\r\n setGraphicContext: function ( graphicContext ) {\r\n this._graphicContext = graphicContext;\r\n },\r\n\r\n getGraphicContext: function () {\r\n return this._graphicContext;\r\n },\r\n\r\n getShaderGeneratorProxy: function () {\r\n return this._shaderGeneratorProxy;\r\n },\r\n\r\n pushStateSet: function ( stateset ) {\r\n this.stateSets.push( stateset );\r\n\r\n if ( stateset.attributeMap ) {\r\n this.pushAttributeMap( this.attributeMap, stateset.attributeMap );\r\n }\r\n\r\n if ( stateset.textureAttributeMapList ) {\r\n var list = stateset.textureAttributeMapList;\r\n for ( var textureUnit = 0, l = list.length; textureUnit < l; textureUnit++ ) {\r\n if ( !list[ textureUnit ] ) {\r\n continue;\r\n }\r\n\r\n var textureUnitAttributeMap = this.getOrCreateTextureAttributeMap( textureUnit );\r\n this.pushAttributeMap( textureUnitAttributeMap, list[ textureUnit ] );\r\n }\r\n }\r\n\r\n if ( stateset.uniforms ) {\r\n this.pushUniformsList( this.uniforms, stateset.uniforms );\r\n }\r\n var generatorName = stateset.getShaderGeneratorName();\r\n if ( generatorName !== undefined ) {\r\n this._shaderGeneratorNames.push( generatorName );\r\n }\r\n },\r\n\r\n getStateSetStackSize: function () {\r\n return this.stateSets.values().length;\r\n },\r\n\r\n insertStateSet: ( function () {\r\n var tmpStack = [];\r\n\r\n return function ( pos, stateSet ) {\r\n\r\n tmpStack.length = 0;\r\n var length = this.getStateSetStackSize();\r\n while ( length > pos ) {\r\n tmpStack.push( this.stateSets.back() );\r\n this.popStateSet();\r\n length--;\r\n }\r\n\r\n this.pushStateSet( stateSet );\r\n\r\n for ( var i = tmpStack.length - 1; i >= 0; i-- ) {\r\n this.pushStateSet( tmpStack[ i ] );\r\n }\r\n\r\n };\r\n } )(),\r\n\r\n removeStateSet: ( function () {\r\n var tmpStack = [];\r\n\r\n return function ( pos ) {\r\n\r\n var length = this.getStateSetStackSize();\r\n if ( pos >= length ) {\r\n Notify.warn( 'Warning State:removeStateSet ', pos, ' out of range' );\r\n return;\r\n }\r\n\r\n tmpStack.length = 0;\r\n\r\n // record the StateSet above the one we intend to remove\r\n while ( length - 1 > pos ) {\r\n tmpStack.push( this.stateSets.back() );\r\n this.popStateSet();\r\n length--;\r\n }\r\n\r\n // remove the intended StateSet as well\r\n this.popStateSet();\r\n\r\n // push back the original ones that were above the remove StateSet\r\n for ( var i = tmpStack.length - 1; i >= 0; i-- ) {\r\n this.pushStateSet( tmpStack[ i ] );\r\n }\r\n\r\n };\r\n } )(),\r\n\r\n\r\n // needed because we use a cache during the frame to avoid\r\n // applying uniform or operation. At each frame we need to\r\n // invalidate those informations\r\n resetCacheFrame: function () {\r\n this._modelViewMatrix = this._projectionMatrix = undefined;\r\n },\r\n\r\n\r\n // apply program if needed\r\n applyProgram: function ( program ) {\r\n if ( this._program === program ) return;\r\n this._program = program;\r\n this.getGraphicContext().useProgram( program );\r\n },\r\n\r\n applyModelViewMatrix: ( function () {\r\n\r\n var normal = Matrix.create();\r\n\r\n return function ( matrix ) {\r\n\r\n if ( this._modelViewMatrix === matrix ) return false;\r\n\r\n var program = this.getLastProgramApplied();\r\n\r\n var mu = this.modelViewMatrix;\r\n var mul = program._uniformsCache[ mu.name ];\r\n if ( mul ) {\r\n Matrix.copy( matrix, mu.get() );\r\n mu.dirty();\r\n mu.apply( this.getGraphicContext(), mul );\r\n }\r\n\r\n var sendNormal;\r\n if ( this._modelViewMatrix ) {\r\n sendNormal = false;\r\n // check if we need to push normal\r\n // test rotation component, if not diff\r\n // we dont need to send normal\r\n for ( var i = 0; i < 11; i++ ) {\r\n if ( matrix[ i ] !== this._modelViewMatrix[ i ] ) {\r\n sendNormal = true;\r\n break;\r\n }\r\n }\r\n } else {\r\n sendNormal = true;\r\n }\r\n\r\n if ( sendNormal ) {\r\n mu = this.normalMatrix;\r\n mul = program._uniformsCache[ mu.name ];\r\n if ( mul ) {\r\n Matrix.copy( matrix, normal );\r\n\r\n normal[ 12 ] = 0.0;\r\n normal[ 13 ] = 0.0;\r\n normal[ 14 ] = 0.0;\r\n\r\n Matrix.inverse( normal, normal );\r\n Matrix.transpose( normal, normal );\r\n\r\n Matrix.copy( normal, mu.get() );\r\n mu.dirty();\r\n mu.apply( this.getGraphicContext(), mul );\r\n }\r\n }\r\n\r\n this._modelViewMatrix = matrix;\r\n return true;\r\n };\r\n } )(),\r\n\r\n applyProjectionMatrix: function ( matrix ) {\r\n\r\n if ( this._projectionMatrix === matrix ) return;\r\n\r\n this._projectionMatrix = matrix;\r\n var program = this.getLastProgramApplied();\r\n var mu = this.projectionMatrix;\r\n\r\n var mul = program._uniformsCache[ mu.name ];\r\n Matrix.copy( matrix, mu.get() );\r\n mu.dirty();\r\n mu.apply( this.getGraphicContext(), mul );\r\n\r\n },\r\n\r\n applyStateSet: function ( stateset ) {\r\n this.pushStateSet( stateset );\r\n this.apply();\r\n this.popStateSet();\r\n },\r\n\r\n getStateSetStackHash: function () {\r\n var values = this.stateSets.values();\r\n var sum = 0;\r\n for ( var i = 0, l = values.length; i < l; i++ )\r\n sum += values[ i ].getInstanceID();\r\n return sum;\r\n },\r\n\r\n popAllStateSets: function () {\r\n while ( this.stateSets.values().length ) {\r\n this.popStateSet();\r\n }\r\n },\r\n\r\n popStateSet: function () {\r\n\r\n if ( this.stateSets.empty() ) return;\r\n\r\n var stateset = this.stateSets.pop();\r\n\r\n if ( stateset.attributeMap ) {\r\n this.popAttributeMap( this.attributeMap, stateset.attributeMap );\r\n }\r\n\r\n if ( stateset.textureAttributeMapList ) {\r\n var list = stateset.textureAttributeMapList;\r\n for ( var textureUnit = 0, l = list.length; textureUnit < l; textureUnit++ ) {\r\n if ( !list[ textureUnit ] ) {\r\n continue;\r\n }\r\n this.popAttributeMap( this.textureAttributeMapList[ textureUnit ], list[ textureUnit ] );\r\n }\r\n }\r\n\r\n if ( stateset.uniforms ) {\r\n this.popUniformsList( this.uniforms, stateset.uniforms );\r\n }\r\n\r\n if ( stateset.getShaderGeneratorName() !== undefined ) {\r\n this._shaderGeneratorNames.pop();\r\n }\r\n },\r\n\r\n haveAppliedAttribute: function ( attribute ) {\r\n\r\n var key = attribute.getTypeMember();\r\n var attributeStack = this.attributeMap[ key ];\r\n attributeStack.lastApplied = attribute;\r\n attributeStack.asChanged = true;\r\n\r\n },\r\n\r\n applyAttribute: function ( attribute ) {\r\n\r\n var key = attribute.getTypeMember();\r\n\r\n var attributeMap = this.attributeMap;\r\n var attributeStack = attributeMap[ key ];\r\n\r\n if ( !attributeStack ) {\r\n attributeStack = new Stack();\r\n attributeMap[ key ] = attributeStack;\r\n attributeMap[ key ].globalDefault = attribute.cloneType();\r\n this.attributeMap.dirty();\r\n }\r\n\r\n if ( attributeStack.lastApplied !== attribute ) {\r\n\r\n if ( attribute.apply ) {\r\n attribute.apply( this );\r\n }\r\n attributeStack.lastApplied = attribute;\r\n attributeStack.asChanged = true;\r\n }\r\n },\r\n\r\n applyTextureAttribute: function ( unit, attribute ) {\r\n var gl = this.getGraphicContext();\r\n gl.activeTexture( gl.TEXTURE0 + unit );\r\n var key = attribute.getTypeMember();\r\n\r\n\r\n if ( !this.textureAttributeMapList[ unit ] ) {\r\n this.textureAttributeMapList[ unit ] = new Map();\r\n }\r\n\r\n var textureUnitAttributeMap = this.getOrCreateTextureAttributeMap( unit );\r\n var attributeStack = textureUnitAttributeMap[ key ];\r\n\r\n if ( !attributeStack ) {\r\n\r\n attributeStack = new Stack();\r\n textureUnitAttributeMap[ key ] = attributeStack;\r\n textureUnitAttributeMap.dirty();\r\n attributeStack.globalDefault = attribute.cloneType();\r\n\r\n }\r\n\r\n if ( attributeStack.lastApplied !== attribute ) {\r\n\r\n if ( attribute.apply ) {\r\n attribute.apply( this, unit );\r\n }\r\n attributeStack.lastApplied = attribute;\r\n attributeStack.asChanged = true;\r\n }\r\n },\r\n\r\n getLastProgramApplied: function () {\r\n return this.attributeMap.Program.lastApplied;\r\n },\r\n\r\n apply: function () {\r\n\r\n var lastProgram = this.getLastProgramApplied();\r\n\r\n this.applyAttributeMap( this.attributeMap );\r\n this.applyTextureAttributeMapList( this.textureAttributeMapList );\r\n\r\n var generatedProgram = this._generateAndApplyProgram();\r\n\r\n if ( generatedProgram ) {\r\n // will cache uniform and apply them with the program\r\n\r\n this._applyGeneratedProgramUniforms( this.attributeMap.Program.lastApplied );\r\n\r\n } else {\r\n\r\n // custom program so we will iterate on uniform from the program and apply them\r\n // but in order to be able to use Attribute in the state graph we will check if\r\n // our program want them. It must be defined by the user\r\n this._applyCustomProgramUniforms( this.attributeMap.Program.lastApplied );\r\n\r\n }\r\n\r\n // reset reference of last applied matrix\r\n if ( lastProgram !== this.getLastProgramApplied() ) {\r\n this._modelViewMatrix = undefined;\r\n this._projectionMatrix = undefined;\r\n }\r\n },\r\n\r\n\r\n applyAttributeMap: function ( attributeMap ) {\r\n\r\n var attributeStack;\r\n var attributeMapKeys = attributeMap.getKeys();\r\n\r\n for ( var i = 0, l = attributeMapKeys.length; i < l; i++ ) {\r\n var key = attributeMapKeys[ i ];\r\n\r\n attributeStack = attributeMap[ key ];\r\n if ( !attributeStack || !attributeStack.asChanged ) {\r\n continue;\r\n }\r\n\r\n var attribute;\r\n if ( attributeStack.values().length === 0 ) {\r\n attribute = attributeStack.globalDefault;\r\n } else {\r\n attribute = attributeStack.back().object;\r\n }\r\n\r\n if ( attributeStack.lastApplied !== attribute ) {\r\n\r\n if ( attribute.apply )\r\n attribute.apply( this );\r\n\r\n attributeStack.lastApplied = attribute;\r\n\r\n }\r\n attributeStack.asChanged = false;\r\n\r\n }\r\n },\r\n\r\n getObjectPair: function ( uniform, value ) {\r\n return {\r\n object: uniform,\r\n value: value\r\n };\r\n },\r\n\r\n pushUniformsList: function ( uniformMap, stateSetUniformMap ) {\r\n /*jshint bitwise: false */\r\n var name;\r\n var uniform;\r\n\r\n var stateSetUniformMapKeys = stateSetUniformMap.getKeys();\r\n\r\n for ( var i = 0, l = stateSetUniformMapKeys.length; i < l; i++ ) {\r\n var key = stateSetUniformMapKeys[ i ];\r\n var uniformPair = stateSetUniformMap[ key ];\r\n uniform = uniformPair.getUniform();\r\n name = uniform.name;\r\n if ( uniformMap[ name ] === undefined ) {\r\n uniformMap[ name ] = new Stack();\r\n uniformMap[ name ].globalDefault = uniform;\r\n uniformMap.dirty();\r\n }\r\n var value = uniformPair.getValue();\r\n var stack = uniformMap[ name ];\r\n var length = stack.values().length;\r\n if ( length === 0 ) {\r\n stack.push( this.getObjectPair( uniform, value ) );\r\n } else if ( ( stack.back().value & StateAttribute.OVERRIDE ) && !( value & StateAttribute.PROTECTED ) ) {\r\n stack.push( stack.back() );\r\n } else {\r\n stack.push( this.getObjectPair( uniform, value ) );\r\n }\r\n }\r\n /*jshint bitwise: true */\r\n },\r\n\r\n popUniformsList: function ( uniformMap, stateSetUniformMap ) {\r\n\r\n var stateSetUniformMapKeys = stateSetUniformMap.getKeys();\r\n\r\n for ( var i = 0, l = stateSetUniformMapKeys.length; i < l; i++ ) {\r\n var key = stateSetUniformMapKeys[ i ];\r\n uniformMap[ key ].pop();\r\n }\r\n },\r\n\r\n\r\n // this funtion must called only if stack has changed\r\n // check applyTextureAttributeMapList\r\n _applyTextureAttributeStack: function ( gl, textureUnit, attributeStack ) {\r\n\r\n var attribute;\r\n if ( attributeStack.values().length === 0 ) {\r\n attribute = attributeStack.globalDefault;\r\n } else {\r\n attribute = attributeStack.back().object;\r\n }\r\n\r\n // if the the stack has changed but the last applied attribute is the same\r\n // then we dont need to apply it again\r\n if ( attributeStack.lastApplied !== attribute ) {\r\n gl.activeTexture( gl.TEXTURE0 + textureUnit );\r\n attribute.apply( this, textureUnit );\r\n attributeStack.lastApplied = attribute;\r\n }\r\n\r\n attributeStack.asChanged = false;\r\n },\r\n\r\n applyTextureAttributeMapList: function ( textureAttributesMapList ) {\r\n var gl = this._graphicContext;\r\n var textureAttributeMap;\r\n\r\n for ( var textureUnit = 0, l = textureAttributesMapList.length; textureUnit < l; textureUnit++ ) {\r\n textureAttributeMap = textureAttributesMapList[ textureUnit ];\r\n if ( !textureAttributeMap ) {\r\n continue;\r\n }\r\n\r\n\r\n var textureAttributeMapKeys = textureAttributeMap.getKeys();\r\n\r\n for ( var i = 0, lt = textureAttributeMapKeys.length; i < lt; i++ ) {\r\n var key = textureAttributeMapKeys[ i ];\r\n\r\n var attributeStack = textureAttributeMap[ key ];\r\n\r\n // skip if not stack or not changed in stack\r\n if ( !attributeStack || !attributeStack.asChanged ) continue;\r\n\r\n this._applyTextureAttributeStack( gl, textureUnit, attributeStack );\r\n // var attribute;\r\n // if ( attributeStack.values().length === 0 ) {\r\n // attribute = attributeStack.globalDefault;\r\n // } else {\r\n // attribute = attributeStack.back().object;\r\n // }\r\n // if ( attributeStack.asChanged ) {\r\n\r\n // gl.activeTexture( gl.TEXTURE0 + textureUnit );\r\n // attribute.apply( this, textureUnit );\r\n // attributeStack.lastApplied = attribute;\r\n // attributeStack.asChanged = false;\r\n\r\n // }\r\n }\r\n }\r\n },\r\n\r\n setGlobalDefaultValue: function ( attribute ) {\r\n Notify.log( 'setGlobalDefaultValue is deprecated, use instead setGlobalDefaultAttribute' );\r\n this.setGlobalDefaultAttribute( attribute );\r\n },\r\n\r\n setGlobalDefaultAttribute: function ( attribute ) {\r\n var typeMember = attribute.getTypeMember();\r\n var attributeMap = this.attributeMap;\r\n\r\n if ( attributeMap[ typeMember ] === undefined ) {\r\n attributeMap[ typeMember ] = new Stack();\r\n attributeMap.dirty();\r\n }\r\n\r\n attributeMap[ typeMember ].globalDefault = attribute;\r\n },\r\n\r\n getGlobalDefaultAttribute: function ( typeMember ) {\r\n var attributeMap = this.attributeMap;\r\n if ( attributeMap[ typeMember ] === undefined ) return undefined;\r\n\r\n return attributeMap[ typeMember ].globalDefault;\r\n },\r\n\r\n setGlobalDefaultTextureAttribute: function ( unit, attribute ) {\r\n var attributeMap = this.getOrCreateTextureAttributeMap( unit );\r\n\r\n var typeMember = attribute.getTypeMember();\r\n if ( attributeMap[ typeMember ] === undefined ) {\r\n attributeMap[ typeMember ] = new Stack();\r\n attributeMap.dirty();\r\n }\r\n\r\n var as = attributeMap[ typeMember ];\r\n as.globalDefault = attribute;\r\n },\r\n\r\n getGlobalDefaultTextureAttribute: function ( unit, typeMember ) {\r\n var attributeMap = this.getOrCreateTextureAttributeMap( unit );\r\n var as = attributeMap[ typeMember ];\r\n return as.globalDefault;\r\n },\r\n\r\n getOrCreateTextureAttributeMap: function ( unit ) {\r\n if ( !this.textureAttributeMapList[ unit ] ) this.textureAttributeMapList[ unit ] = new Map();\r\n return this.textureAttributeMapList[ unit ];\r\n },\r\n\r\n pushAttributeMap: function ( attributeMap, stateSetAttributeMap ) {\r\n /*jshint bitwise: false */\r\n var attributeStack;\r\n var stateSetAttributeMapKeys = stateSetAttributeMap.getKeys();\r\n\r\n for ( var i = 0, l = stateSetAttributeMapKeys.length; i < l; i++ ) {\r\n\r\n var type = stateSetAttributeMapKeys[ i ];\r\n var attributePair = stateSetAttributeMap[ type ];\r\n var attribute = attributePair.getAttribute();\r\n\r\n if ( attributeMap[ type ] === undefined ) {\r\n attributeMap[ type ] = new Stack();\r\n attributeMap[ type ].globalDefault = attribute.cloneType();\r\n\r\n attributeMap.dirty();\r\n }\r\n\r\n var value = attributePair.getValue();\r\n\r\n attributeStack = attributeMap[ type ];\r\n var length = attributeStack.values().length;\r\n if ( length === 0 ) {\r\n attributeStack.push( this.getObjectPair( attribute, value ) );\r\n } else if ( ( attributeStack.back().value & StateAttribute.OVERRIDE ) && !( value & StateAttribute.PROTECTED ) ) {\r\n attributeStack.push( attributeStack.back() );\r\n } else {\r\n attributeStack.push( this.getObjectPair( attribute, value ) );\r\n }\r\n\r\n attributeStack.asChanged = true;\r\n }\r\n /*jshint bitwise: true */\r\n },\r\n\r\n popAttributeMap: function ( attributeMap, stateSetAttributeMap ) {\r\n\r\n var attributeStack;\r\n var stateSetAttributeMapKeys = stateSetAttributeMap.getKeys();\r\n\r\n for ( var i = 0, l = stateSetAttributeMapKeys.length; i < l; i++ ) {\r\n\r\n var type = stateSetAttributeMapKeys[ i ];\r\n attributeStack = attributeMap[ type ];\r\n attributeStack.pop();\r\n attributeStack.asChanged = true;\r\n\r\n }\r\n },\r\n\r\n setIndexArray: function ( array ) {\r\n var gl = this._graphicContext;\r\n if ( this.currentIndexVBO !== array ) {\r\n array.bind( gl );\r\n this.currentIndexVBO = array;\r\n }\r\n if ( array.isDirty() ) {\r\n array.compile( gl );\r\n }\r\n },\r\n\r\n lazyDisablingOfVertexAttributes: function () {\r\n var keys = this.vertexAttribMap._keys;\r\n for ( var i = 0, l = keys.length; i < l; i++ ) {\r\n var attr = keys[ i ];\r\n if ( this.vertexAttribMap[ attr ] ) {\r\n this.vertexAttribMap._disable[ attr ] = true;\r\n }\r\n }\r\n },\r\n\r\n applyDisablingOfVertexAttributes: function () {\r\n var keys = this.vertexAttribMap._keys;\r\n for ( var i = 0, l = keys.length; i < l; i++ ) {\r\n if ( this.vertexAttribMap._disable[ keys[ i ] ] === true ) {\r\n var attr = keys[ i ];\r\n this._graphicContext.disableVertexAttribArray( attr );\r\n this.vertexAttribMap._disable[ attr ] = false;\r\n this.vertexAttribMap[ attr ] = false;\r\n }\r\n }\r\n\r\n var program = this.attributeMap.Program.lastApplied;\r\n\r\n if ( !program._uniformsCache.ArrayColorEnabled ||\r\n !program._attributesCache.Color ) return; // no color uniform or attribute used, exit\r\n\r\n\r\n var gl = this.getGraphicContext();\r\n\r\n var hasColorAttrib = false;\r\n\r\n // check if we have colorAttribute on the current geometry\r\n var color = program._attributesCache.Color;\r\n hasColorAttrib = this.vertexAttribMap[ color ];\r\n\r\n\r\n // check per program\r\n var previousColorAttrib = this._previousColorAttribPair[ program.getInstanceID() ];\r\n\r\n // no change with the same program -> exit\r\n if ( previousColorAttrib === hasColorAttrib ) return;\r\n\r\n this._previousColorAttribPair[ program.getInstanceID() ] = hasColorAttrib;\r\n\r\n // update uniform\r\n var uniform = this.uniforms.ArrayColorEnabled.globalDefault;\r\n\r\n if ( hasColorAttrib ) {\r\n uniform.get()[ 0 ] = 1.0;\r\n } else {\r\n uniform.get()[ 0 ] = 0.0;\r\n }\r\n uniform.dirty();\r\n uniform.apply( gl, program._uniformsCache.ArrayColorEnabled );\r\n\r\n },\r\n\r\n setVertexAttribArray: function ( attrib, array, normalize ) {\r\n var vertexAttribMap = this.vertexAttribMap;\r\n vertexAttribMap._disable[ attrib ] = false;\r\n var gl = this._graphicContext;\r\n var binded = false;\r\n if ( array.isDirty() ) {\r\n array.bind( gl );\r\n array.compile( gl );\r\n binded = true;\r\n }\r\n\r\n if ( vertexAttribMap[ attrib ] !== array ) {\r\n\r\n if ( !binded ) {\r\n array.bind( gl );\r\n }\r\n\r\n if ( !vertexAttribMap[ attrib ] ) {\r\n gl.enableVertexAttribArray( attrib );\r\n\r\n if ( vertexAttribMap[ attrib ] === undefined ) {\r\n vertexAttribMap._keys.push( attrib );\r\n }\r\n }\r\n\r\n vertexAttribMap[ attrib ] = array;\r\n gl.vertexAttribPointer( attrib, array._itemSize, gl.FLOAT, normalize, 0, 0 );\r\n }\r\n },\r\n\r\n\r\n _getActiveUniformsFromProgramAttributes: function ( program, activeUniformsList ) {\r\n\r\n var attributeMapStack = this.attributeMap;\r\n\r\n var attributeKeys = program.trackAttributes.attributeKeys;\r\n\r\n if ( attributeKeys.length > 0 ) {\r\n\r\n for ( var i = 0, l = attributeKeys.length; i < l; i++ ) {\r\n\r\n var key = attributeKeys[ i ];\r\n var attributeStack = attributeMapStack[ key ];\r\n if ( attributeStack === undefined ) {\r\n continue;\r\n }\r\n\r\n // we just need the uniform list and not the attribute itself\r\n var attribute = attributeStack.globalDefault;\r\n if ( attribute.getOrCreateUniforms === undefined ) {\r\n continue;\r\n }\r\n\r\n var uniformMap = attribute.getOrCreateUniforms();\r\n var uniformKeys = uniformMap.getKeys();\r\n\r\n for ( var a = 0, b = uniformKeys.length; a < b; a++ ) {\r\n activeUniformsList.push( uniformMap[ uniformKeys[ a ] ] );\r\n }\r\n }\r\n\r\n }\r\n },\r\n\r\n _getActiveUniformsFromProgramTextureAttributes: function ( program, activeUniformsList ) {\r\n\r\n var textureAttributeKeysList = program.trackAttributes.textureAttributeKeys;\r\n if ( textureAttributeKeysList === undefined ) return;\r\n\r\n for ( var unit = 0, nbUnit = textureAttributeKeysList.length; unit < nbUnit; unit++ ) {\r\n\r\n var textureAttributeKeys = textureAttributeKeysList[ unit ];\r\n if ( textureAttributeKeys === undefined ) continue;\r\n\r\n var unitTextureAttributeList = this.textureAttributeMapList[ unit ];\r\n if ( unitTextureAttributeList === undefined ) continue;\r\n\r\n for ( var i = 0, l = textureAttributeKeys.length; i < l; i++ ) {\r\n var key = textureAttributeKeys[ i ];\r\n\r\n var attributeStack = unitTextureAttributeList[ key ];\r\n if ( attributeStack === undefined ) {\r\n continue;\r\n }\r\n // we just need the uniform list and not the attribute itself\r\n var attribute = attributeStack.globalDefault;\r\n if ( attribute.getOrCreateUniforms === undefined ) {\r\n continue;\r\n }\r\n var uniformMap = attribute.getOrCreateUniforms();\r\n var uniformMapKeys = uniformMap.getKeys();\r\n\r\n for ( var a = 0, b = uniformMapKeys.length; a < b; a++ ) {\r\n activeUniformsList.push( uniformMap[ uniformMapKeys[ a ] ] );\r\n }\r\n }\r\n }\r\n },\r\n\r\n _cacheUniformsForCustomProgram: function ( program, activeUniformsList ) {\r\n\r\n this._getActiveUniformsFromProgramAttributes( program, activeUniformsList );\r\n\r\n this._getActiveUniformsFromProgramTextureAttributes( program, activeUniformsList );\r\n\r\n var gl = this._graphicContext;\r\n\r\n // now we have a list on uniforms we want to track but we will filter them to use only what is needed by our program\r\n // not that if you create a uniforms whith the same name of a tracked attribute, and it will override it\r\n var uniformsFinal = new Map();\r\n\r\n for ( var i = 0, l = activeUniformsList.length; i < l; i++ ) {\r\n var u = activeUniformsList[ i ];\r\n var loc = gl.getUniformLocation( program._program, u.name );\r\n if ( loc !== undefined && loc !== null ) {\r\n uniformsFinal[ u.name ] = u;\r\n }\r\n }\r\n uniformsFinal.dirty();\r\n program.trackUniforms = uniformsFinal;\r\n\r\n },\r\n\r\n _applyCustomProgramUniforms: ( function () {\r\n\r\n var activeUniformsList = [];\r\n\r\n return function ( program ) {\r\n\r\n // custom program so we will iterate on uniform from the program and apply them\r\n // but in order to be able to use Attribute in the state graph we will check if\r\n // our program want them. It must be defined by the user\r\n\r\n // first time we see attributes key, so we will keep a list of uniforms from attributes\r\n activeUniformsList.length = 0;\r\n\r\n // fill the program with cached active uniforms map from attributes and texture attributes\r\n if ( program.trackAttributes !== undefined && program.trackUniforms === undefined ) {\r\n this._cacheUniformsForCustomProgram( program, activeUniformsList );\r\n }\r\n\r\n var programUniformMap = program._uniformsCache;\r\n var programUniformKeys = programUniformMap.getKeys();\r\n var uniformMapStackContent = this.uniforms;\r\n\r\n var programTrackUniformMap;\r\n if ( program.trackUniforms )\r\n programTrackUniformMap = program.trackUniforms;\r\n\r\n var uniform;\r\n for ( var i = 0, l = programUniformKeys.length; i < l; i++ ) {\r\n var uniformKey = programUniformKeys[ i ];\r\n var location = programUniformMap[ uniformKey ];\r\n var uniformStack = uniformMapStackContent[ uniformKey ];\r\n\r\n if ( uniformStack === undefined ) {\r\n\r\n if ( programTrackUniformMap !== undefined ) {\r\n uniform = programTrackUniformMap[ uniformKey ];\r\n if ( uniform !== undefined ) {\r\n uniform.apply( this._graphicContext, location );\r\n }\r\n }\r\n\r\n } else {\r\n\r\n if ( uniformStack.values().length === 0 ) {\r\n uniform = uniformStack.globalDefault;\r\n } else {\r\n uniform = uniformStack.back().object;\r\n }\r\n uniform.apply( this._graphicContext, location );\r\n\r\n }\r\n }\r\n };\r\n } )(),\r\n\r\n\r\n // apply a generated program if necessary\r\n // It build a Shader from the shader generator\r\n // it apply for the following condition\r\n // the user has not put a Pogram in the stack or if he has he added one with OFF\r\n _generateAndApplyProgram: function () {\r\n\r\n var attributeMap = this.attributeMap;\r\n if ( attributeMap.Program !== undefined && attributeMap.Program.values().length !== 0 && attributeMap.Program.back().value !== StateAttribute.OFF )\r\n return undefined;\r\n\r\n // no custom program look into the stack of ShaderGenerator name\r\n // what we should use to generate a program\r\n\r\n var generatorName = this._shaderGeneratorNames.back();\r\n var shaderGenerator = this._shaderGeneratorProxy.getShaderGenerator( generatorName );\r\n\r\n var program = shaderGenerator.getOrCreateProgram( this );\r\n this.applyAttribute( program );\r\n return program;\r\n },\r\n\r\n _computeForeignUniforms: function ( programUniformMap, activeUniformMap ) {\r\n var uniformMapKeys = programUniformMap.getKeys();\r\n var uniformMap = programUniformMap;\r\n\r\n var foreignUniforms = [];\r\n for ( var i = 0, l = uniformMapKeys.length; i < l; i++ ) {\r\n var name = uniformMapKeys[ i ];\r\n var location = uniformMap[ name ];\r\n if ( location !== undefined && activeUniformMap[ name ] === undefined ) {\r\n // filter 'standard' uniform matrix that will be applied for all shader\r\n if ( name !== this.modelViewMatrix.name &&\r\n name !== this.modelWorldMatrix.name &&\r\n name !== this.viewMatrix.name &&\r\n name !== this.projectionMatrix.name &&\r\n name !== this.normalMatrix.name &&\r\n name !== 'ArrayColorEnabled' ) {\r\n foreignUniforms.push( name );\r\n }\r\n }\r\n }\r\n return foreignUniforms;\r\n },\r\n\r\n _removeUniformsNotRequiredByProgram: function ( activeUniformMap, programUniformMap ) {\r\n\r\n var activeUniformMapKeys = activeUniformMap.getKeys();\r\n\r\n for ( var i = 0, l = activeUniformMapKeys.length; i < l; i++ ) {\r\n var name = activeUniformMapKeys[ i ];\r\n var location = programUniformMap[ name ];\r\n if ( location === undefined || location === null ) {\r\n delete activeUniformMap[ name ];\r\n activeUniformMap.dirty();\r\n }\r\n }\r\n },\r\n\r\n\r\n\r\n _cacheUniformsForGeneratedProgram: function ( program ) {\r\n\r\n var foreignUniforms = this._computeForeignUniforms( program._uniformsCache, program.activeUniforms );\r\n program.foreignUniforms = foreignUniforms;\r\n\r\n\r\n // remove uniforms listed by attributes (getActiveUniforms) but not required by the program\r\n this._removeUniformsNotRequiredByProgram( program.activeUniforms, program._uniformsCache );\r\n\r\n },\r\n\r\n _applyGeneratedProgramUniforms: function ( program ) {\r\n\r\n // note that about TextureAttribute that need uniform on unit we would need to improve\r\n // the current uniformList ...\r\n\r\n // when we apply the shader for the first time, we want to compute the active uniforms for this shader and the list of uniforms not extracted from attributes called foreignUniforms\r\n\r\n // typically the following code will be executed once on the first execution of generated program\r\n\r\n var foreignUniformKeys = program.foreignUniforms;\r\n if ( !foreignUniformKeys ) {\r\n this._cacheUniformsForGeneratedProgram( program );\r\n foreignUniformKeys = program.foreignUniforms;\r\n }\r\n\r\n\r\n var programUniformMap = program._uniformsCache;\r\n var activeUniformMap = program.activeUniforms;\r\n\r\n\r\n // apply active uniforms\r\n // caching uniforms from attribtues make it impossible to overwrite uniform with a custom uniform instance not used in the attributes\r\n var i, l, name, location;\r\n var activeUniformKeys = activeUniformMap.getKeys();\r\n\r\n for ( i = 0, l = activeUniformKeys.length; i < l; i++ ) {\r\n\r\n name = activeUniformKeys[ i ];\r\n location = programUniformMap[ name ];\r\n activeUniformMap[ name ].apply( this._graphicContext, location );\r\n\r\n }\r\n\r\n var uniformMapStack = this.uniforms;\r\n\r\n // apply now foreign uniforms, it's uniforms needed by the program but not contains in attributes used to generate this program\r\n for ( i = 0, l = foreignUniformKeys.length; i < l; i++ ) {\r\n\r\n name = foreignUniformKeys[ i ];\r\n var uniformStack = uniformMapStack[ name ];\r\n location = programUniformMap[ name ];\r\n var uniform;\r\n\r\n if ( uniformStack !== undefined ) {\r\n\r\n if ( uniformStack.values().length === 0 ) {\r\n uniform = uniformStack.globalDefault;\r\n } else {\r\n uniform = uniformStack.back().object;\r\n }\r\n\r\n uniform.apply( this._graphicContext, location );\r\n }\r\n\r\n }\r\n }\r\n\r\n\r\n } ), 'osg', 'State' );\r\n\r\n return State;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/State.js\n ** module id = 78\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/Object'\r\n], function ( MACROUTILS, Object ) {\r\n\r\n 'use strict';\r\n\r\n var StateAttribute = function () {\r\n Object.call( this );\r\n this._dirty = true;\r\n };\r\n\r\n\r\n StateAttribute.prototype = MACROUTILS.objectLibraryClass( MACROUTILS.objectInherit( Object.prototype, {\r\n\r\n isDirty: function () {\r\n return this._dirty;\r\n },\r\n\r\n dirty: function () {\r\n this._dirty = true;\r\n },\r\n\r\n setDirty: function ( dirty ) {\r\n this._dirty = dirty;\r\n },\r\n\r\n getType: function () {\r\n return this.attributeType;\r\n },\r\n\r\n getTypeMember: function () {\r\n return this.attributeType;\r\n },\r\n\r\n apply: function () {},\r\n\r\n // getHash is used by the compiler to know if a change in a StateAttribute\r\n // must trigger a shader build\r\n // If you create your own attribute you will have to customize this function\r\n // a good rule is to that if you change uniform it should not rebuild a shader\r\n // but if you change a type or representation of your StateAttribute, then it should\r\n // if it impact the rendering.\r\n // check other attributes for examples\r\n getHash: function () {\r\n return this.getTypeMember();\r\n }\r\n\r\n } ), 'osg', 'StateAttribute' );\r\n\r\n StateAttribute.OFF = 0;\r\n StateAttribute.ON = 1;\r\n StateAttribute.OVERRIDE = 2;\r\n StateAttribute.PROTECTED = 4;\r\n StateAttribute.INHERIT = 8;\r\n\r\n return StateAttribute;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/StateAttribute.js\n ** module id = 79\n ** module chunks = 0 1\n **/","define( [\r\n 'osgUtil/osgPool'\r\n], function ( osgPool ) {\r\n\r\n 'use strict';\r\n\r\n var StateGraph = function () {\r\n this.depth = 0;\r\n this.children = {};\r\n this.children.keys = [];\r\n this.leafs = [];\r\n this.stateset = undefined;\r\n this.parent = undefined;\r\n };\r\n\r\n StateGraph.prototype = {\r\n clean: function () {\r\n this.leafs.splice( 0, this.leafs.length );\r\n this.stateset = undefined;\r\n this.parent = undefined;\r\n this.depth = 0;\r\n var key, keys = this.children.keys;\r\n for ( var i = 0, l = keys.length; i < l; i++ ) {\r\n key = keys[ i ];\r\n this.children[ key ].clean();\r\n osgPool.memoryPools.stateGraph.put( this.children[ key ] );\r\n }\r\n this.children = {};\r\n keys.splice( 0, keys.length );\r\n this.children.keys = keys;\r\n },\r\n getStateSet: function () {\r\n return this.stateset;\r\n },\r\n\r\n findOrInsert: function ( stateset ) {\r\n var sg;\r\n var stateSetID = stateset.getInstanceID();\r\n if ( !this.children[ stateSetID ] ) {\r\n\r\n //sg = new StateGraph();\r\n sg = osgPool.memoryPools.stateGraph.get();\r\n\r\n sg.parent = this;\r\n sg.depth = this.depth + 1;\r\n sg.stateset = stateset;\r\n this.children[ stateSetID ] = sg;\r\n this.children.keys.push( stateSetID );\r\n } else {\r\n sg = this.children[ stateSetID ];\r\n }\r\n return sg;\r\n },\r\n moveToRootStateGraph: function ( state, sgCurrent ) {\r\n // need to pop back all statesets and matrices.\r\n while ( sgCurrent ) {\r\n if ( sgCurrent.stateset ) {\r\n state.popStateSet();\r\n }\r\n sgCurrent = sgCurrent.parent;\r\n }\r\n },\r\n moveStateGraph: function ( state, sgCurrent, sgNew ) {\r\n var stack = [];\r\n var i, l;\r\n if ( sgNew === sgCurrent || sgNew === undefined ) {\r\n return;\r\n }\r\n\r\n if ( sgCurrent === undefined ) {\r\n // push stateset from sgNew to root, and apply\r\n // stateset from root to sgNew\r\n do {\r\n if ( sgNew.stateset !== undefined ) {\r\n stack.push( sgNew.stateset );\r\n }\r\n sgNew = sgNew.parent;\r\n } while ( sgNew );\r\n\r\n for ( i = stack.length - 1, l = 0; i >= l; --i ) {\r\n state.pushStateSet( stack[ i ] );\r\n }\r\n return;\r\n } else if ( sgCurrent.parent === sgNew.parent ) {\r\n // first handle the typical case which is two state groups\r\n // are neighbours.\r\n\r\n // state has changed so need to pop old state.\r\n if ( sgCurrent.stateset !== undefined ) {\r\n state.popStateSet();\r\n }\r\n // and push new state.\r\n if ( sgNew.stateset !== undefined ) {\r\n state.pushStateSet( sgNew.stateset );\r\n }\r\n return;\r\n }\r\n\r\n // need to pop back up to the same depth as the new state group.\r\n while ( sgCurrent.depth > sgNew.depth ) {\r\n if ( sgCurrent.stateset !== undefined ) {\r\n state.popStateSet();\r\n }\r\n sgCurrent = sgCurrent.parent;\r\n }\r\n\r\n // use return path to trace back steps to sgNew.\r\n stack = [];\r\n\r\n // need to pop back up to the same depth as the curr state group.\r\n while ( sgNew.depth > sgCurrent.depth ) {\r\n if ( sgNew.stateset !== undefined ) {\r\n stack.push( sgNew.stateset );\r\n }\r\n sgNew = sgNew.parent;\r\n }\r\n\r\n // now pop back up both parent paths until they agree.\r\n\r\n // DRT - 10/22/02\r\n // should be this to conform with above case where two StateGraph\r\n // nodes have the same parent\r\n while ( sgCurrent !== sgNew ) {\r\n if ( sgCurrent.stateset !== undefined ) {\r\n state.popStateSet();\r\n }\r\n sgCurrent = sgCurrent.parent;\r\n\r\n if ( sgNew.stateset !== undefined ) {\r\n stack.push( sgNew.stateset );\r\n }\r\n sgNew = sgNew.parent;\r\n }\r\n\r\n for ( i = stack.length - 1, l = 0; i >= l; --i ) {\r\n state.pushStateSet( stack[ i ] );\r\n }\r\n }\r\n };\r\n\r\n return StateGraph;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/StateGraph.js\n ** module id = 80\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Map',\r\n 'osg/Notify',\r\n 'osg/Object',\r\n 'osg/StateAttribute',\r\n 'osg/Utils',\r\n\r\n], function ( Map, Notify, Object, StateAttribute, MACROUTILS ) {\r\n\r\n 'use strict';\r\n\r\n /** Stores a set of modes and attributes which represent a set of OpenGL state.\r\n * Notice that a \\c StateSet contains just a subset of the whole OpenGL state.\r\n *

In OSG, each \\c Drawable and each \\c Node has a reference to a\r\n * \\c StateSet. These StateSets can be shared between\r\n * different Drawables and Nodes (that is, several\r\n * Drawables and Nodes can reference the same \\c StateSet).\r\n * Indeed, this practice is recommended whenever possible,\r\n * as this minimizes expensive state changes in the graphics pipeline.\r\n */\r\n var StateSet = function () {\r\n Object.call( this );\r\n\r\n this.attributeMap = new Map();\r\n\r\n this.textureAttributeMapList = [];\r\n\r\n this._binName = undefined;\r\n this._binNumber = 0;\r\n\r\n this._shaderGeneratorName = undefined;\r\n this._updateCallbackList = [];\r\n\r\n this.uniforms = new Map();\r\n\r\n };\r\n\r\n StateSet.AttributePair = function ( attr, value ) {\r\n this._object = attr;\r\n this._value = value;\r\n };\r\n\r\n StateSet.AttributePair.prototype = {\r\n getAttribute: function () {\r\n return this._object;\r\n },\r\n getUniform: function () {\r\n return this._object;\r\n },\r\n getValue: function () {\r\n return this._value;\r\n }\r\n };\r\n\r\n\r\n StateSet.prototype = MACROUTILS.objectLibraryClass( MACROUTILS.objectInherit( Object.prototype, {\r\n getAttributePair: function ( attribute, value ) {\r\n return new StateSet.AttributePair( attribute, value );\r\n },\r\n addUniform: function ( uniform, mode ) {\r\n if ( mode === undefined ) {\r\n mode = StateAttribute.ON;\r\n }\r\n\r\n var name = uniform.name;\r\n this.uniforms[ name ] = this.getAttributePair( uniform, mode );\r\n this.uniforms.dirty();\r\n },\r\n removeUniform: function ( uniform ) {\r\n this.uniforms.remove( uniform.getName() );\r\n },\r\n removeUniformByName: function ( uniformName ) {\r\n this.uniforms.remove( uniformName );\r\n },\r\n getUniform: function ( uniform ) {\r\n var uniformMap = this.uniforms;\r\n if ( uniformMap[ uniform ] ) return uniformMap[ uniform ].getAttribute();\r\n\r\n return undefined;\r\n },\r\n getUniformList: function () {\r\n return this.uniforms;\r\n },\r\n\r\n setTextureAttributeAndModes: function ( unit, attribute, mode ) {\r\n if ( mode === undefined ) {\r\n mode = StateAttribute.ON;\r\n }\r\n this._setTextureAttribute( unit, this.getAttributePair( attribute, mode ) );\r\n },\r\n setTextureAttributeAndMode: function ( unit, attribute, mode ) {\r\n Notify.log( 'StateSet.setTextureAttributeAndMode is deprecated, insteady use setTextureAttributeAndModes' );\r\n this.setTextureAttributeAndModes( unit, attribute, mode );\r\n },\r\n\r\n getNumTextureAttributeLists: function () {\r\n return this.textureAttributeMapList.length;\r\n },\r\n getTextureAttribute: function ( unit, attribute ) {\r\n if ( this.textureAttributeMapList[ unit ] === undefined ) return undefined;\r\n\r\n var textureMap = this.textureAttributeMapList[ unit ];\r\n if ( textureMap[ attribute ] === undefined ) return undefined;\r\n\r\n return textureMap[ attribute ].getAttribute();\r\n },\r\n\r\n removeTextureAttribute: function ( unit, attributeName ) {\r\n if ( this.textureAttributeMapList[ unit ] === undefined ) return;\r\n\r\n var textureAttributeMap = this.textureAttributeMapList[ unit ];\r\n if ( textureAttributeMap[ attributeName ] === undefined ) return;\r\n\r\n\r\n textureAttributeMap.remove( attributeName );\r\n this.textureAttributeMapList[ unit ].dirty();\r\n },\r\n\r\n getAttribute: function ( attributeType ) {\r\n if ( this.attributeMap[ attributeType ] === undefined ) {\r\n return undefined;\r\n }\r\n return this.attributeMap[ attributeType ].getAttribute();\r\n },\r\n\r\n setAttributeAndModes: function ( attribute, mode ) {\r\n if ( mode === undefined ) {\r\n mode = StateAttribute.ON;\r\n }\r\n this._setAttribute( this.getAttributePair( attribute, mode ) );\r\n },\r\n\r\n setAttributeAndMode: function ( attribute, mode ) {\r\n Notify.log( 'StateSet.setAttributeAndMode is deprecated, insteady use setAttributeAndModes' );\r\n this.setAttributeAndModes( attribute, mode );\r\n },\r\n\r\n setAttribute: function ( attribute, mode ) {\r\n if ( mode === undefined ) {\r\n mode = StateAttribute.ON;\r\n }\r\n this._setAttribute( this.getAttributePair( attribute, mode ) );\r\n },\r\n\r\n // TODO: check if it's an attribute type or a attribute to remove it\r\n removeAttribute: function ( attributeName ) {\r\n\r\n if ( this.attributeMap[ attributeName ] !== undefined ) {\r\n delete this.attributeMap[ attributeName ];\r\n this.attributeMap.dirty();\r\n }\r\n },\r\n\r\n setRenderingHint: function ( hint ) {\r\n if ( hint === 'OPAQUE_BIN' ) {\r\n this.setRenderBinDetails( 0, 'RenderBin' );\r\n } else if ( hint === 'TRANSPARENT_BIN' ) {\r\n this.setRenderBinDetails( 10, 'DepthSortedBin' );\r\n } else {\r\n this.setRenderBinDetails( 0, '' );\r\n }\r\n },\r\n\r\n getUpdateCallbackList: function () {\r\n return this._updateCallbackList;\r\n },\r\n removeUpdateCallback: function ( cb ) {\r\n var arrayIdx = this._updateCallbackList.indexOf( cb );\r\n if ( arrayIdx !== -1 )\r\n this._updateCallbackList.splice( arrayIdx, 1 );\r\n },\r\n addUpdateCallback: function ( cb ) {\r\n this._updateCallbackList.push( cb );\r\n },\r\n hasUpdateCallback: function ( cb ) {\r\n return this._updateCallbackList.indexOf( cb ) !== -1;\r\n },\r\n\r\n setRenderBinDetails: function ( num, binName ) {\r\n this._binNumber = num;\r\n this._binName = binName;\r\n },\r\n getAttributeMap: function () {\r\n return this.attributeMap;\r\n },\r\n getBinNumber: function () {\r\n return this._binNumber;\r\n },\r\n getBinName: function () {\r\n return this._binName;\r\n },\r\n setBinNumber: function ( binNum ) {\r\n this._binNumber = binNum;\r\n },\r\n setBinName: function ( binName ) {\r\n this._binName = binName;\r\n },\r\n getAttributeList: function () {\r\n var attributeMap = this.attributeMap;\r\n var attributeMapKeys = attributeMap.getKeys();\r\n\r\n var l = attributeMapKeys.length;\r\n var list = [];\r\n for ( var i = 0; i < l; i++ ) {\r\n list.push( attributeMap[ attributeMapKeys[ i ] ] );\r\n }\r\n return list;\r\n },\r\n setShaderGeneratorName: function ( generatorName ) {\r\n this._shaderGeneratorName = generatorName;\r\n },\r\n getShaderGeneratorName: function () {\r\n return this._shaderGeneratorName;\r\n },\r\n releaseGLObjects: function () {\r\n for ( var i = 0, j = this.textureAttributeMapList.length; i < j; i++ ) {\r\n this.getTextureAttribute( i, 'Texture' ).releaseGLObjects();\r\n }\r\n var list = this.getAttributeList();\r\n for ( i = 0, j = list.length; i < j; i++ ) {\r\n // Remove only if we have releaseGLObject method. \r\n if ( list[ i ]._object.releaseGLObjects ) {\r\n list[ i ]._object.releaseGLObjects();\r\n }\r\n }\r\n },\r\n _getUniformMap: function () {\r\n return this.uniforms;\r\n },\r\n\r\n // for internal use, you should not call it directly\r\n _setTextureAttribute: function ( unit, attributePair ) {\r\n\r\n if ( this.textureAttributeMapList[ unit ] === undefined ) {\r\n this.textureAttributeMapList[ unit ] = new Map();\r\n }\r\n\r\n var name = attributePair.getAttribute().getTypeMember();\r\n var textureUnitAttributeMap = this.textureAttributeMapList[ unit ];\r\n\r\n textureUnitAttributeMap[ name ] = attributePair;\r\n textureUnitAttributeMap.dirty();\r\n\r\n },\r\n\r\n // for internal use, you should not call it directly\r\n _setAttribute: function ( attributePair ) {\r\n\r\n var name = attributePair.getAttribute().getTypeMember();\r\n this.attributeMap[ name ] = attributePair;\r\n this.attributeMap.dirty();\r\n\r\n }\r\n\r\n } ), 'osg', 'StateSet' );\r\n\r\n return StateSet;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/StateSet.js\n ** module id = 81\n ** module chunks = 0 1\n **/","define( [\r\n 'q',\r\n 'osg/Notify',\r\n 'osg/Utils',\r\n 'osg/StateAttribute',\r\n 'osg/Uniform',\r\n 'osg/Image',\r\n 'osg/GLObject',\r\n 'osgDB/ReaderParser',\r\n 'osg/Map',\r\n 'osg/TextureManager'\r\n], function ( Q, Notify, MACROUTILS, StateAttribute, Uniform, Image, GLObject, ReaderParser, CustomMap, TextureManager ) {\r\n\r\n 'use strict';\r\n\r\n // helper\r\n var isPowerOf2 = function ( x ) {\r\n /*jshint bitwise: false */\r\n return ( ( x !== 0 ) && ( ( x & ( ~x + 1 ) ) === x ) );\r\n /*jshint bitwise: true */\r\n };\r\n\r\n\r\n var checkAndFixEnum = function ( mode, fallback ) {\r\n var value = Texture[ mode ];\r\n if ( value === undefined ) {\r\n Notify.warn( 'bad Texture enum argument ' + mode + '\\n' + 'fallback to ' + fallback );\r\n return fallback;\r\n }\r\n return value;\r\n };\r\n\r\n /**\r\n * Texture encapsulate webgl texture object\r\n * @class Texture\r\n * Not that dirty here is mainly for texture binding\r\n * any dirty will cause re-bind\r\n * hint: don't dirty a texture attached to a camera/framebuffer\r\n * it will end blank\r\n * @inherits StateAttribute\r\n */\r\n var Texture = function () {\r\n StateAttribute.call( this );\r\n GLObject.call( this );\r\n this.setDefaultParameters();\r\n this._dirtyMipmap = true;\r\n this._applyTexImage2DCallbacks = [];\r\n this._textureObject = undefined;\r\n\r\n this._textureNull = true;\r\n };\r\n\r\n Texture.UNPACK_COLORSPACE_CONVERSION_WEBGL = 0x9243;\r\n Texture.UNPACK_FLIP_Y_WEBGL = 0x9240;\r\n Texture.BROWSER_DEFAULT_WEBGL = 0x9244;\r\n Texture.NONE = 0x0;\r\n\r\n Texture.DEPTH_COMPONENT = 0x1902;\r\n Texture.ALPHA = 0x1906;\r\n Texture.RGB = 0x1907;\r\n Texture.RGBA = 0x1908;\r\n Texture.LUMINANCE = 0x1909;\r\n Texture.LUMINANCE_ALPHA = 0x190A;\r\n\r\n // filter mode\r\n Texture.LINEAR = 0x2601;\r\n Texture.NEAREST = 0x2600;\r\n Texture.NEAREST_MIPMAP_NEAREST = 0x2700;\r\n Texture.LINEAR_MIPMAP_NEAREST = 0x2701;\r\n Texture.NEAREST_MIPMAP_LINEAR = 0x2702;\r\n Texture.LINEAR_MIPMAP_LINEAR = 0x2703;\r\n // filter anisotropy\r\n Texture.TEXTURE_MAX_ANISOTROPY_EXT = 0x84FE;\r\n Texture.MAX_TEXTURE_MAX_ANISOTROPY_EXT = 0x84FF;\r\n\r\n // wrap mode\r\n Texture.CLAMP_TO_EDGE = 0x812F;\r\n Texture.REPEAT = 0x2901;\r\n Texture.MIRRORED_REPEAT = 0x8370;\r\n\r\n // target\r\n Texture.TEXTURE_2D = 0x0DE1;\r\n Texture.TEXTURE_CUBE_MAP = 0x8513;\r\n Texture.TEXTURE_BINDING_CUBE_MAP = 0x8514;\r\n Texture.TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515;\r\n Texture.TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516;\r\n Texture.TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517;\r\n Texture.TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518;\r\n Texture.TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519;\r\n Texture.TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851A;\r\n Texture.MAX_CUBE_MAP_TEXTURE_SIZE = 0x851C;\r\n\r\n Texture.UNSIGNED_BYTE = 0x1401;\r\n Texture.FLOAT = 0x1406;\r\n Texture.HALF_FLOAT_OES = Texture.HALF_FLOAT = 0x8D61;\r\n\r\n Texture._sTextureManager = new Map();\r\n\r\n // Getter for textureManager\r\n Texture.getTextureManager = function ( gl ) {\r\n if ( !Texture._sTextureManager.has( gl ) )\r\n Texture._sTextureManager.set( gl, new TextureManager() );\r\n return Texture._sTextureManager.get( gl );\r\n };\r\n\r\n Texture.getEnumFromString = function ( v ) {\r\n var value = v;\r\n if ( typeof ( value ) === 'string' ) {\r\n value = checkAndFixEnum( value, v );\r\n }\r\n return value;\r\n };\r\n\r\n Texture.prototype = MACROUTILS.objectLibraryClass( MACROUTILS.objectInherit( GLObject.prototype, MACROUTILS.objectInherit( StateAttribute.prototype, {\r\n attributeType: 'Texture',\r\n\r\n cloneType: function () {\r\n return new Texture();\r\n },\r\n\r\n getOrCreateUniforms: function ( unit ) {\r\n if ( Texture.uniforms === undefined ) {\r\n Texture.uniforms = [];\r\n }\r\n if ( Texture.uniforms[ unit ] === undefined ) {\r\n var name = this.getType() + unit;\r\n var uniformMap = new CustomMap();\r\n var uniform = Uniform.createInt1( unit, name );\r\n uniformMap.setMap( {\r\n texture: uniform\r\n } );\r\n\r\n uniform.dirty();\r\n Texture.uniforms[ unit ] = uniformMap;\r\n }\r\n\r\n // uniform for an texture attribute should directly in Texture.uniforms[unit]\r\n // and not in Texture.uniforms[unit][Texture0]\r\n\r\n // Why it's in Texture.uniforms[unit]['texture'] :\r\n // a 'texture' is a texture attribute but you also have old texenv\r\n // that are texture attribute because they are applied on a texture unit.\r\n // I admit that currently we dont have this or we used to but we dont have it anymore.\r\n // It's the same design than osg.\r\n // We could imagine for example a TextureGreyScale texture attributes,\r\n // that would transform the input texture\r\n // on unit X into greyscale used in the shader.\r\n\r\n return Texture.uniforms[ unit ];\r\n },\r\n\r\n setDefaultParameters: function () {\r\n this._image = undefined;\r\n this._magFilter = Texture.LINEAR;\r\n this._minFilter = Texture.LINEAR;\r\n this._maxAnisotropy = 1.0;\r\n this._wrapS = Texture.CLAMP_TO_EDGE;\r\n this._wrapT = Texture.CLAMP_TO_EDGE;\r\n this._textureWidth = 0;\r\n this._textureHeight = 0;\r\n this._unrefImageDataAfterApply = false;\r\n this._internalFormat = undefined;\r\n this._dirtyMipmap = true;\r\n this._textureTarget = Texture.TEXTURE_2D;\r\n this._type = Texture.UNSIGNED_BYTE;\r\n\r\n this._flipY = true;\r\n this._colorSpaceConversion = Texture.NONE; //Texture.BROWSER_DEFAULT_WEBGL;\r\n },\r\n\r\n // check https://www.khronos.org/registry/webgl/specs/latest/1.0/#PIXEL_STORAGE_PARAMETERS\r\n setColorSpaceConversion: function ( enumValue ) {\r\n this._colorSpaceConversion = enumValue;\r\n },\r\n\r\n setFlipY: function ( bool ) {\r\n this._flipY = bool;\r\n },\r\n\r\n\r\n getTextureTarget: function () {\r\n return this._textureTarget;\r\n },\r\n getTextureObject: function () {\r\n return this._textureObject;\r\n },\r\n setTextureSize: function ( w, h ) {\r\n if ( w !== undefined ) this._textureWidth = w;\r\n if ( h !== undefined ) this._textureHeight = h;\r\n\r\n this._textureNull = false;\r\n },\r\n\r\n init: function ( state ) {\r\n if ( !this._gl ) this.setGraphicContext( state.getGraphicContext() );\r\n if ( !this._textureObject ) {\r\n this._textureObject = Texture.getTextureManager( this._gl ).generateTextureObject( this._gl,\r\n this,\r\n this._textureTarget,\r\n this._internalFormat,\r\n this._textureWidth,\r\n this._textureHeight );\r\n\r\n this.dirty();\r\n this._dirtyTextureObject = false;\r\n this._textureNull = false;\r\n }\r\n },\r\n\r\n addApplyTexImage2DCallback: function ( callback ) {\r\n var index = this._applyTexImage2DCallbacks.indexOf( callback );\r\n if ( index < 0 ) {\r\n this._applyTexImage2DCallbacks.push( callback );\r\n }\r\n },\r\n removeApplyTexImage2DCallback: function ( callback ) {\r\n var index = this._applyTexImage2DCallbacks.indexOf( callback );\r\n if ( index >= 0 ) {\r\n this._applyTexImage2DCallbacks.splice( index, 1 );\r\n }\r\n },\r\n getWidth: function () {\r\n return this._textureWidth;\r\n },\r\n getHeight: function () {\r\n return this._textureHeight;\r\n },\r\n\r\n releaseGLObjects: function () {\r\n if ( this._textureObject !== undefined && this._textureObject !== null && this._gl !== undefined ) {\r\n Texture.getTextureManager( this._gl ).releaseTextureObject( this._textureObject );\r\n }\r\n this._textureObject = undefined;\r\n },\r\n\r\n getWrapT: function () {\r\n return this._wrapT;\r\n },\r\n getWrapS: function () {\r\n return this._wrapS;\r\n },\r\n\r\n setWrapS: function ( value ) {\r\n\r\n if ( typeof ( value ) === 'string' ) {\r\n\r\n this._wrapS = checkAndFixEnum( value, Texture.CLAMP_TO_EDGE );\r\n\r\n } else {\r\n\r\n this._wrapS = value;\r\n }\r\n\r\n this.dirtyTextureParameters();\r\n\r\n },\r\n\r\n setWrapT: function ( value ) {\r\n\r\n if ( typeof ( value ) === 'string' ) {\r\n\r\n this._wrapT = checkAndFixEnum( value, Texture.CLAMP_TO_EDGE );\r\n\r\n } else {\r\n\r\n this._wrapT = value;\r\n }\r\n\r\n this.dirtyTextureParameters();\r\n },\r\n\r\n // TODO CP:\r\n // we should split dirty texture object of parameters\r\n // dirty parameters only regenarate parameter\r\n // dirty texture object needs to release a texture and\r\n // re allocate one\r\n dirtyTextureParameters: function () {\r\n this.dirty(); // make everything dirty for now\r\n this.dirtyMipmap();\r\n this.dirtyTextureObject();\r\n },\r\n\r\n dirtyTextureObject: function () {\r\n this._dirtyTextureObject = true;\r\n this.dirtyMipmap();\r\n this.dirty(); // make everything dirty for now\r\n },\r\n\r\n\r\n getMinFilter: function () {\r\n return this._minFilter;\r\n },\r\n getMagFilter: function () {\r\n return this._magFilter;\r\n },\r\n\r\n // https://www.opengl.org/registry/specs/EXT/texture_filter_anisotropic.txt\r\n setMaxAnisotropy: function ( multiplier ) {\r\n this._maxAnisotropy = multiplier;\r\n this.dirtyTextureParameters();\r\n },\r\n\r\n getMaxAnisotropy: function () {\r\n return this._maxAnisotropy;\r\n },\r\n\r\n // some value enable mipmapping\r\n setMinFilter: function ( value ) {\r\n if ( typeof ( value ) === 'string' ) {\r\n this._minFilter = checkAndFixEnum( value, Texture.LINEAR );\r\n } else {\r\n this._minFilter = value;\r\n }\r\n this.dirtyTextureParameters();\r\n },\r\n\r\n // Either Linear or nearest.\r\n setMagFilter: function ( value ) {\r\n\r\n if ( typeof ( value ) === 'string' ) {\r\n this._magFilter = checkAndFixEnum( value, Texture.LINEAR );\r\n } else {\r\n this._magFilter = value;\r\n }\r\n this.dirtyTextureParameters();\r\n },\r\n\r\n setImage: function ( img, imageFormat ) {\r\n\r\n var image = img;\r\n if ( img instanceof window.Image ||\r\n img instanceof HTMLCanvasElement ||\r\n img instanceof Uint8Array ) {\r\n image = new Image( img );\r\n }\r\n\r\n this._image = image;\r\n this.setImageFormat( imageFormat );\r\n if ( image ) {\r\n if ( image.getWidth && image.getHeight ) {\r\n this.setTextureSize( image.getWidth(), image.getHeight() );\r\n } else if ( image.width && image.height ) {\r\n this.setTextureSize( image.width, image.height );\r\n }\r\n }\r\n this._textureNull = false;\r\n this.dirty();\r\n },\r\n\r\n getImage: function () {\r\n return this._image;\r\n },\r\n\r\n setImageFormat: function ( imageFormat ) {\r\n if ( imageFormat ) {\r\n if ( typeof ( imageFormat ) === 'string' ) {\r\n imageFormat = Texture[ imageFormat ];\r\n }\r\n this._imageFormat = imageFormat;\r\n } else {\r\n this._imageFormat = Texture.RGBA;\r\n }\r\n },\r\n\r\n setType: function ( value ) {\r\n Notify.log( 'Texture.setType is deprecated, use instead Texture.setInternalFormatType' );\r\n this.setInternalFormatType( value );\r\n },\r\n\r\n setInternalFormatType: function ( value ) {\r\n if ( typeof ( value ) === 'string' ) {\r\n this._type = Texture[ value ];\r\n } else {\r\n this._type = value;\r\n }\r\n },\r\n getInternalFormatType: function () {\r\n return this._type;\r\n },\r\n\r\n setUnrefImageDataAfterApply: function ( bool ) {\r\n this._unrefImageDataAfterApply = bool;\r\n },\r\n\r\n setInternalFormat: function ( formatSource ) {\r\n var format = formatSource;\r\n if ( format ) {\r\n if ( typeof ( format ) === 'string' ) {\r\n format = Texture[ format ];\r\n }\r\n } else {\r\n format = Texture.RGBA;\r\n }\r\n\r\n this._internalFormat = format;\r\n },\r\n\r\n getInternalFormat: function () {\r\n return this._internalFormat;\r\n },\r\n\r\n isDirtyMipmap: function () {\r\n return this._dirtyMipmap;\r\n },\r\n // Will cause the mipmaps to be regenerated on the next bind of the texture\r\n // Nothing will be done if the minFilter is not of the form XXX_MIPMAP_XXX\r\n dirtyMipmap: function () {\r\n this._dirtyMipmap = true;\r\n },\r\n\r\n applyFilterParameter: function ( gl, target ) {\r\n\r\n\r\n var powerOfTwo = isPowerOf2( this._textureWidth ) && isPowerOf2( this._textureHeight );\r\n if ( !powerOfTwo ) {\r\n // NPOT non support in webGL explained here\r\n // https://www.khronos.org/webgl/wiki/WebGL_and_OpenGL_Differences#Non-Power_of_Two_Texture_Support\r\n // so disabling mipmap...\r\n this._wrapT = Texture.CLAMP_TO_EDGE;\r\n this._wrapS = Texture.CLAMP_TO_EDGE;\r\n\r\n if ( this._minFilter === Texture.LINEAR_MIPMAP_LINEAR ||\r\n this._minFilter === Texture.LINEAR_MIPMAP_NEAREST ) {\r\n this._minFilter = Texture.LINEAR;\r\n }\r\n }\r\n gl.texParameteri( target, gl.TEXTURE_MAG_FILTER, this._magFilter );\r\n gl.texParameteri( target, gl.TEXTURE_MIN_FILTER, this._minFilter );\r\n\r\n\r\n // handle extension EXT_texture_filter_anisotropic\r\n if ( this._maxAnisotropy > 1.0 && Texture.ANISOTROPIC_SUPPORT_EXT ) {\r\n var multiplier = this._maxAnisotropy < Texture.ANISOTROPIC_SUPPORT_MAX ? this._maxAnisotropy : Texture.ANISOTROPIC_SUPPORT_MAX;\r\n gl.texParameterf( target, Texture.TEXTURE_MAX_ANISOTROPY_EXT, multiplier );\r\n }\r\n\r\n gl.texParameteri( target, gl.TEXTURE_WRAP_S, this._wrapS );\r\n gl.texParameteri( target, gl.TEXTURE_WRAP_T, this._wrapT );\r\n\r\n },\r\n\r\n generateMipmap: function ( gl, target ) {\r\n\r\n if ( this.hasMipmapFilter() ) {\r\n gl.generateMipmap( target );\r\n }\r\n this._dirtyMipmap = false;\r\n },\r\n\r\n // return true if contains a mipmap filter\r\n hasMipmapFilter: function () {\r\n return ( this._minFilter === Texture.NEAREST_MIPMAP_NEAREST ||\r\n this._minFilter === Texture.LINEAR_MIPMAP_NEAREST ||\r\n this._minFilter === Texture.NEAREST_MIPMAP_LINEAR ||\r\n this._minFilter === Texture.LINEAR_MIPMAP_LINEAR );\r\n },\r\n\r\n applyTexImage2D: function ( gl ) {\r\n var args = Array.prototype.slice.call( arguments, 1 );\r\n MACROUTILS.timeStamp( 'osgjs.metrics:Texture.texImage2d' );\r\n\r\n // use parameters of pixel store\r\n gl.pixelStorei( gl.UNPACK_FLIP_Y_WEBGL, this._flipY );\r\n gl.pixelStorei( gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, this._colorSpaceConversion );\r\n\r\n gl.texImage2D.apply( gl, args );\r\n\r\n // call a callback when upload is done if there is one\r\n var numCallback = this._applyTexImage2DCallbacks.length;\r\n if ( numCallback > 0 ) {\r\n for ( var i = 0, l = numCallback; i < l; i++ ) {\r\n this._applyTexImage2DCallbacks[ i ].call( this );\r\n }\r\n }\r\n },\r\n\r\n computeTextureFormat: function () {\r\n if ( !this._internalFormat ) {\r\n this._internalFormat = this._imageFormat || Texture.RGBA;\r\n this._imageFormat = this._internalFormat;\r\n } else {\r\n this._imageFormat = this._internalFormat;\r\n }\r\n\r\n },\r\n\r\n applyImage: function ( gl, image ) {\r\n\r\n if ( image.isTypedArray() ) {\r\n this.applyTexImage2D( gl,\r\n this._textureTarget,\r\n 0,\r\n this._internalFormat,\r\n this._textureWidth,\r\n this._textureHeight,\r\n 0,\r\n this._internalFormat,\r\n this._type,\r\n this._image.getImage() );\r\n } else {\r\n this.applyTexImage2D( gl,\r\n this._textureTarget,\r\n 0,\r\n this._internalFormat,\r\n this._internalFormat,\r\n this._type,\r\n image.getImage() );\r\n }\r\n image.setDirty( false );\r\n\r\n },\r\n\r\n apply: function ( state ) {\r\n\r\n var gl = state.getGraphicContext();\r\n // if need to release the texture\r\n if ( this._dirtyTextureObject ) {\r\n this.releaseGLObjects();\r\n this._dirtyTextureObject = false;\r\n }\r\n\r\n if ( this._textureObject !== undefined && !this.isDirty() ) {\r\n this._textureObject.bind( gl );\r\n // If we have modified the texture via Rtt or texSubImage2D and _need_ updated mipmaps,\r\n // then we must regenerate the mipmaps explicitely.\r\n // In all other cases, don't set this flag because it can be costly\r\n if ( this.isDirtyMipmap() ) {\r\n this.generateMipmap( gl, this._textureTarget );\r\n }\r\n\r\n // image update like video\r\n if ( this._image !== undefined && this._image.isDirty() ) {\r\n this.applyImage( gl, this._image );\r\n }\r\n\r\n } else if ( this._textureNull ) {\r\n\r\n gl.bindTexture( this._textureTarget, null );\r\n\r\n } else {\r\n\r\n var image = this._image;\r\n if ( image !== undefined ) {\r\n\r\n // when data is ready we will upload it to the gpu\r\n if ( image.isReady() ) {\r\n\r\n // must be called before init\r\n this.computeTextureFormat();\r\n\r\n var imgWidth = image.getWidth() || this._textureWidth;\r\n var imgHeight = image.getHeight() || this._textureHeight;\r\n\r\n this.setTextureSize( imgWidth, imgHeight );\r\n\r\n if ( !this._textureObject ) {\r\n this.init( state );\r\n }\r\n\r\n this._textureObject.bind( gl );\r\n\r\n this.applyImage( gl, this._image );\r\n this.applyFilterParameter( gl, this._textureTarget );\r\n this.generateMipmap( gl, this._textureTarget );\r\n\r\n if ( this._unrefImageDataAfterApply ) {\r\n this._image = undefined;\r\n }\r\n\r\n this.setDirty( false );\r\n\r\n } else {\r\n gl.bindTexture( this._textureTarget, null );\r\n }\r\n\r\n } else if ( this._textureHeight !== 0 && this._textureWidth !== 0 ) {\r\n\r\n // must be called before init\r\n this.computeTextureFormat();\r\n\r\n if ( !this._textureObject ) {\r\n this.init( state );\r\n }\r\n this._textureObject.bind( gl );\r\n this.applyTexImage2D( gl, this._textureTarget, 0, this._internalFormat, this._textureWidth, this._textureHeight, 0, this._internalFormat, this._type, null );\r\n\r\n this.applyFilterParameter( gl, this._textureTarget );\r\n this.generateMipmap( gl, this._textureTarget );\r\n this.setDirty( false );\r\n }\r\n }\r\n }\r\n } ) ), 'osg', 'Texture' );\r\n\r\n MACROUTILS.setTypeID( Texture );\r\n\r\n Texture.textureNull = new Texture();\r\n\r\n Texture.createFromImage = function ( image, format ) {\r\n var a = new Texture();\r\n a.setImage( image, format );\r\n return a;\r\n };\r\n\r\n Texture.createFromCanvas = function ( canvas, format ) {\r\n return Texture.createFromImage( canvas, format );\r\n };\r\n\r\n Texture.create = function ( url ) {\r\n Notify.log( 'Texture.create is deprecated, use Texture.createFromURL instead' );\r\n return Texture.createFromURL( url );\r\n };\r\n\r\n Texture.createFromURL = function ( imageSource, format ) {\r\n Notify.log( 'Texture.createFromURL is deprecated, use instead osgDB.readImageURL' );\r\n var texture = new Texture();\r\n Q.when( ReaderParser.readImage( imageSource ) ).then(\r\n function ( img ) {\r\n texture.setImage( img, format );\r\n }\r\n );\r\n return texture;\r\n };\r\n\r\n\r\n return Texture;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/Texture.js\n ** module id = 82\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/Image',\r\n 'osg/Notify',\r\n 'osg/Texture'\r\n\r\n], function ( MACROUTILS, Image, Notify, Texture ) {\r\n\r\n 'use strict';\r\n\r\n var FaceImage = function () {\r\n this._image = undefined;\r\n this._format = undefined;\r\n this._dirty = true;\r\n this._mipmap = [];\r\n };\r\n\r\n FaceImage.prototype = {\r\n\r\n useOrCreateImage: function ( img ) {\r\n\r\n var image = img;\r\n if ( image instanceof( Image ) === false ) {\r\n image = new Image( img );\r\n }\r\n return image;\r\n },\r\n\r\n release: function () {\r\n this._mipmap.length = 0;\r\n this._image = undefined;\r\n },\r\n\r\n getImage: function () {\r\n return this._image;\r\n },\r\n\r\n isDirty: function () {\r\n return this._dirty;\r\n },\r\n\r\n setDirty: function ( b ) {\r\n this._dirty = b;\r\n },\r\n\r\n getFormat: function () {\r\n return this._format;\r\n },\r\n\r\n getMipmap: function () {\r\n return this._mipmap;\r\n },\r\n\r\n hasMipmap: function () {\r\n return this._mipmap.length > 1;\r\n },\r\n\r\n // img can be an image or an array of image if specify the\r\n // all mipmap levels\r\n setImage: function ( img, imageFormat ) {\r\n\r\n if ( typeof ( imageFormat ) === 'string' ) {\r\n imageFormat = Texture[ imageFormat ];\r\n }\r\n\r\n if ( imageFormat === undefined ) {\r\n imageFormat = Texture.RGBA;\r\n }\r\n\r\n if ( Array.isArray( img ) ) {\r\n for ( var i = 0; i < img.length; i++ ) {\r\n this._mipmap.push( this.useOrCreateImage( img[ i ] ) );\r\n }\r\n } else {\r\n this._mipmap.push( this.useOrCreateImage( img ) );\r\n }\r\n\r\n this._image = this._mipmap[ 0 ];\r\n this._format = imageFormat;\r\n this._dirty = true;\r\n }\r\n };\r\n\r\n\r\n /**\r\n * TextureCubeMap\r\n * @class TextureCubeMap\r\n * @inherits Texture\r\n */\r\n var TextureCubeMap = function () {\r\n\r\n Texture.call( this );\r\n this._images = {};\r\n\r\n // pre allocated all textures faces slots\r\n for ( var i = 0; i < 6; i++ ) {\r\n this._images[ Texture.TEXTURE_CUBE_MAP_POSITIVE_X + i ] = new FaceImage();\r\n }\r\n\r\n };\r\n\r\n /** @lends TextureCubeMap.prototype */\r\n TextureCubeMap.prototype = MACROUTILS.objectLibraryClass( MACROUTILS.objectInherit( Texture.prototype, {\r\n\r\n setDefaultParameters: function () {\r\n Texture.prototype.setDefaultParameters.call( this );\r\n this._textureTarget = Texture.TEXTURE_CUBE_MAP;\r\n\r\n this._flipY = false;\r\n },\r\n\r\n cloneType: function () {\r\n return new TextureCubeMap();\r\n },\r\n\r\n setImage: function ( face, img, imageFormat ) {\r\n\r\n if ( typeof ( face ) === 'string' ) {\r\n face = Texture[ face ];\r\n }\r\n\r\n this._images[ face ].setImage( img, imageFormat );\r\n\r\n this.setImageFormat( imageFormat );\r\n this.setTextureSize( this._images[ face ].getImage().getWidth(), this._images[ face ].getImage().getHeight() );\r\n\r\n this._textureNull = false;\r\n this.dirty();\r\n },\r\n\r\n getImage: function ( face ) {\r\n return this._images[ face ].getImage();\r\n },\r\n\r\n initCubemapContent: function ( gl ) {\r\n\r\n var internalFormat = this._internalFormat;\r\n\r\n this.applyTexImage2D( gl, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 0, internalFormat, this._textureWidth, this._textureHeight, 0, internalFormat, this._type, null );\r\n\r\n this.applyTexImage2D( gl, gl.TEXTURE_CUBE_MAP_NEGATIVE_X, 0, internalFormat, this._textureWidth, this._textureHeight, 0, internalFormat, this._type, null );\r\n\r\n this.applyTexImage2D( gl, gl.TEXTURE_CUBE_MAP_POSITIVE_Y, 0, internalFormat, this._textureWidth, this._textureHeight, 0, internalFormat, this._type, null );\r\n\r\n this.applyTexImage2D( gl, gl.TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, internalFormat, this._textureWidth, this._textureHeight, 0, internalFormat, this._type, null );\r\n\r\n this.applyTexImage2D( gl, gl.TEXTURE_CUBE_MAP_POSITIVE_Z, 0, internalFormat, this._textureWidth, this._textureHeight, 0, internalFormat, this._type, null );\r\n\r\n this.applyTexImage2D( gl, gl.TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, internalFormat, this._textureWidth, this._textureHeight, 0, internalFormat, this._type, null );\r\n\r\n return true;\r\n },\r\n\r\n\r\n // handle mipmap logic, if images for mipmap are provided or not\r\n generateMipmap: function ( gl, target ) {\r\n\r\n if ( !this.hasMipmapFilter() ) return;\r\n\r\n // manual mipmap provided\r\n if ( this._images[ Texture.TEXTURE_CUBE_MAP_POSITIVE_X ].hasMipmap() ) {\r\n\r\n for ( var face = 0; face < 6; face++ ) {\r\n var faceImage = this._images[ Texture.TEXTURE_CUBE_MAP_POSITIVE_X + face ];\r\n if ( !faceImage.hasMipmap() ) {\r\n Notify.error( 'mipmap not set correctly for TextureCubemap' );\r\n }\r\n\r\n var internalFormat = this._internalFormat;\r\n for ( var level = 1; level < faceImage.getMipmap().length; level++ ) {\r\n var size = faceImage.getMipmap()[ level ].getWidth();\r\n\r\n this.applyTexImage2D( gl, gl.TEXTURE_CUBE_MAP_POSITIVE_X + face, level, internalFormat, size, size, 0, internalFormat, this._type, faceImage.getMipmap()[ level ].getImage() );\r\n }\r\n }\r\n\r\n } else {\r\n\r\n // automatic mipmap\r\n gl.generateMipmap( target );\r\n }\r\n\r\n this._dirtyMipmap = false;\r\n },\r\n\r\n applyImageTarget: function ( gl, internalFormat, target ) {\r\n\r\n var faceImage = this._images[ target ];\r\n\r\n if ( !faceImage.getImage() )\r\n return 0;\r\n\r\n if ( !faceImage.getImage().isReady() ) {\r\n return 0;\r\n }\r\n\r\n if ( !faceImage.isDirty() )\r\n return 1;\r\n\r\n this.setTextureSize( faceImage.getImage().getWidth(), faceImage.getImage().getHeight() );\r\n\r\n faceImage.setDirty( false );\r\n\r\n if ( faceImage.getImage().isTypedArray() ) {\r\n this.applyTexImage2D( gl,\r\n target,\r\n 0,\r\n internalFormat,\r\n this._textureWidth,\r\n this._textureHeight,\r\n 0,\r\n internalFormat,\r\n this._type,\r\n faceImage.getImage().getImage() );\r\n } else {\r\n this.applyTexImage2D( gl,\r\n target,\r\n 0,\r\n internalFormat,\r\n internalFormat,\r\n this._type,\r\n faceImage.getImage().getImage() );\r\n }\r\n\r\n // release here only if no mipmap\r\n if ( this._unrefImageDataAfterApply &&\r\n !( this.hasMipmap() && faceImage.hasMipmap() ) ) {\r\n\r\n faceImage.release();\r\n }\r\n\r\n return 1;\r\n },\r\n\r\n\r\n initCubemapContentImage: function ( gl ) {\r\n var internalFormat = this._internalFormat;\r\n var valid = 0;\r\n valid += this.applyImageTarget( gl, internalFormat, gl.TEXTURE_CUBE_MAP_POSITIVE_X );\r\n valid += this.applyImageTarget( gl, internalFormat, gl.TEXTURE_CUBE_MAP_NEGATIVE_X );\r\n\r\n valid += this.applyImageTarget( gl, internalFormat, gl.TEXTURE_CUBE_MAP_POSITIVE_Y );\r\n valid += this.applyImageTarget( gl, internalFormat, gl.TEXTURE_CUBE_MAP_NEGATIVE_Y );\r\n\r\n valid += this.applyImageTarget( gl, internalFormat, gl.TEXTURE_CUBE_MAP_POSITIVE_Z );\r\n valid += this.applyImageTarget( gl, internalFormat, gl.TEXTURE_CUBE_MAP_NEGATIVE_Z );\r\n\r\n if ( valid === 6 )\r\n return true;\r\n\r\n return false;\r\n },\r\n\r\n\r\n\r\n apply: function ( state ) {\r\n\r\n var gl = state.getGraphicContext();\r\n // if need to release the texture\r\n if ( this._dirtyTextureObject )\r\n this.releaseGLObjects();\r\n\r\n if ( this._textureObject !== undefined && !this.isDirty() ) {\r\n this._textureObject.bind( gl );\r\n\r\n // If we have modified the texture via Rtt or texSubImage2D and _need_ updated mipmaps,\r\n // then we must regenerate the mipmaps explicitely.\r\n // In all other cases, don't set this flag because it can be costly\r\n if ( this.isDirtyMipmap() ) {\r\n this.generateMipmap( gl, this._textureTarget );\r\n }\r\n\r\n } else if ( this._textureNull ) {\r\n\r\n gl.bindTexture( this._textureTarget, null );\r\n\r\n } else {\r\n\r\n if ( !this._textureObject ) {\r\n\r\n // must be called before init\r\n this.computeTextureFormat();\r\n\r\n this.init( state );\r\n }\r\n this._textureObject.bind( gl );\r\n\r\n var valid;\r\n\r\n // no images it's must be a cubemap filled from rtt\r\n if ( !this._images[ Texture.TEXTURE_CUBE_MAP_POSITIVE_X ].getImage() ) {\r\n\r\n valid = this.initCubemapContent( gl );\r\n\r\n } else {\r\n\r\n valid = this.initCubemapContentImage( gl );\r\n\r\n }\r\n\r\n if ( valid ) {\r\n this.setDirty( false );\r\n this.applyFilterParameter( gl, this._textureTarget );\r\n this.generateMipmap( gl, this._textureTarget );\r\n }\r\n } // render to cubemap not yet implemented\r\n }\r\n\r\n } ), 'osg', 'TextureCubeMap' );\r\n\r\n MACROUTILS.setTypeID( TextureCubeMap );\r\n\r\n return TextureCubeMap;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/TextureCubeMap.js\n ** module id = 83\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/Node',\r\n 'osg/Matrix',\r\n 'osg/Vec3',\r\n 'osg/TransformEnums'\r\n], function ( MACROUTILS, Node, Matrix, Vec3, TransformEnums ) {\r\n\r\n 'use strict';\r\n /**\r\n * Transform - base class for Transform type node ( Camera, MatrixTransform )\r\n * @class Transform\r\n * @inherits Node\r\n */\r\n var Transform = function () {\r\n Node.call( this );\r\n this.referenceFrame = TransformEnums.RELATIVE_RF;\r\n };\r\n\r\n /** @lends Transform.prototype */\r\n Transform.prototype = MACROUTILS.objectInherit( Node.prototype, {\r\n setReferenceFrame: function ( value ) {\r\n this.referenceFrame = value;\r\n },\r\n getReferenceFrame: function () {\r\n return this.referenceFrame;\r\n },\r\n\r\n\r\n computeBound: ( function () {\r\n var matrix = Matrix.create();\r\n return function ( bSphere ) {\r\n Node.prototype.computeBound.call( this, bSphere );\r\n if ( !bSphere.valid() ) {\r\n return bSphere;\r\n }\r\n Matrix.makeIdentity( matrix );\r\n // local to local world (not Global World)\r\n this.computeLocalToWorldMatrix( matrix );\r\n Matrix.transformBoundingSphere( matrix, bSphere, bSphere );\r\n return bSphere;\r\n };\r\n } )()\r\n } );\r\n\r\n return Transform;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/Transform.js\n ** module id = 84\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Vec3',\r\n 'osg/PrimitiveSet'\r\n], function ( Vec3, PrimitiveSet ) {\r\n\r\n // This class can be used to visit all the triangles of a geometry\r\n // You feed it with a callback that will be called for each triangle\r\n // (with the 3 indexes of vertices as arguments)\r\n var TriangleIndexFunctor = function ( geom, cb ) {\r\n this._geom = geom;\r\n this._cb = cb;\r\n };\r\n\r\n TriangleIndexFunctor.prototype = {\r\n applyDrawElementsTriangles: function ( count, indexes ) {\r\n var cb = this._cb;\r\n for ( var i = 0; i < count; i += 3 ) {\r\n cb( indexes[ i ], indexes[ i + 1 ], indexes[ i + 2 ] );\r\n }\r\n },\r\n\r\n applyDrawElementsTriangleStrip: function ( count, indexes ) {\r\n var cb = this._cb;\r\n for ( var i = 2, j = 0; i < count; ++i, ++j ) {\r\n if ( i % 2 ) cb( indexes[ j ], indexes[ j + 2 ], indexes[ j + 1 ] );\r\n else cb( indexes[ j ], indexes[ j + 1 ], indexes[ j + 2 ] );\r\n }\r\n },\r\n\r\n applyDrawElementsTriangleFan: function ( count, indexes ) {\r\n var cb = this._cb;\r\n var first = indexes[ 0 ];\r\n for ( var i = 2, j = 1; i < count; ++i, ++j ) {\r\n cb( first, indexes[ j ], indexes[ j + 1 ] );\r\n }\r\n },\r\n\r\n applyDrawArraysTriangles: function ( first, count ) {\r\n var cb = this._cb;\r\n for ( var i = 2, pos = first; i < count; i += 3, pos += 3 ) {\r\n cb( pos, pos + 1, pos + 2 );\r\n }\r\n },\r\n\r\n applyDrawArraysTriangleStrip: function ( first, count ) {\r\n var cb = this._cb;\r\n for ( var i = 2, pos = first; i < count; ++i, ++pos ) {\r\n if ( i % 2 ) cb( pos, pos + 2, pos + 1 );\r\n else cb( pos, pos + 1, pos + 2 );\r\n }\r\n },\r\n\r\n applyDrawArraysTriangleFan: function ( first, count ) {\r\n var cb = this._cb;\r\n for ( var i = 2, pos = first + 1; i < count; ++i, ++pos ) {\r\n cb( first, pos, pos + 1 );\r\n }\r\n },\r\n\r\n apply: function () {\r\n var geom = this._geom;\r\n var primitives = geom.primitives;\r\n if ( !primitives )\r\n return;\r\n var nbPrimitives = primitives.length;\r\n for ( var i = 0; i < nbPrimitives; i++ ) {\r\n var primitive = primitives[ i ];\r\n if ( primitive.getIndices !== undefined ) {\r\n var indexes = primitive.indices.getElements();\r\n switch ( primitive.getMode() ) {\r\n case PrimitiveSet.TRIANGLES:\r\n this.applyDrawElementsTriangles( primitive.getCount(), indexes );\r\n break;\r\n case PrimitiveSet.TRIANGLE_STRIP:\r\n this.applyDrawElementsTriangleStrip( primitive.getCount(), indexes );\r\n break;\r\n case PrimitiveSet.TRIANGLE_FAN:\r\n this.applyDrawElementsTriangleFan( primitive.getCount(), indexes );\r\n break;\r\n }\r\n } else { // draw array\r\n switch ( primitive.getMode() ) {\r\n case PrimitiveSet.TRIANGLES:\r\n this.applyDrawArraysTriangles( primitive.getFirst(), primitive.getCount() );\r\n break;\r\n case PrimitiveSet.TRIANGLE_STRIP:\r\n this.applyDrawArraysTriangleStrip( primitive.getFirst(), primitive.getCount() );\r\n break;\r\n case PrimitiveSet.TRIANGLE_FAN:\r\n this.applyDrawArraysTriangleFan( primitive.getFirst(), primitive.getCount() );\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n return TriangleIndexFunctor;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/TriangleIndexFunctor.js\n ** module id = 85\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils'\r\n], function ( MACROUTILS ) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * Uniform manage variable used in glsl shader.\r\n * @class Uniform\r\n */\r\n var Uniform = function () {\r\n this.transpose = false;\r\n this._dirty = true;\r\n this.name = '';\r\n this.type = undefined;\r\n };\r\n\r\n Uniform.isUniform = function ( obj ) {\r\n if ( typeof obj === 'object' && Object.getPrototypeOf( obj ) === Uniform.prototype ) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n /** @lends Uniform.prototype */\r\n Uniform.prototype = {\r\n getName: function () {\r\n return this.name;\r\n },\r\n getType: function () {\r\n return this.type;\r\n },\r\n\r\n get: function () { // call dirty if you update this array outside\r\n return this.data;\r\n },\r\n set: function ( array ) {\r\n this.data = array;\r\n this.dirty();\r\n },\r\n dirty: function () {\r\n this._dirty = true;\r\n },\r\n apply: function ( gl, location ) {\r\n if ( this._dirty ) {\r\n this.update.call( this.glData, this.data );\r\n this._dirty = false;\r\n }\r\n this.glCall( gl, location, this.glData );\r\n },\r\n applyMatrix: function ( gl, location ) {\r\n if ( this._dirty ) {\r\n this.update.call( this.glData, this.data );\r\n this._dirty = false;\r\n }\r\n this.glCall( gl, location, this.transpose, this.glData );\r\n },\r\n update: function ( array ) {\r\n for ( var i = 0, l = array.length; i < l; ++i ) { // FF not traced maybe short\r\n this[ i ] = array[ i ];\r\n }\r\n },\r\n\r\n _updateArray: function ( array ) {\r\n for ( var i = 0, l = array.length; i < l; ++i ) { // FF not traced maybe short\r\n this[ i ] = array[ i ];\r\n }\r\n },\r\n\r\n _updateFloat1: function ( f ) {\r\n this[ 0 ] = f[ 0 ];\r\n },\r\n _updateFloat2: function ( f ) {\r\n this[ 0 ] = f[ 0 ];\r\n this[ 1 ] = f[ 1 ];\r\n },\r\n _updateFloat3: function ( f ) {\r\n this[ 0 ] = f[ 0 ];\r\n this[ 1 ] = f[ 1 ];\r\n this[ 2 ] = f[ 2 ];\r\n },\r\n _updateFloat4: function ( f ) {\r\n this[ 0 ] = f[ 0 ];\r\n this[ 1 ] = f[ 1 ];\r\n this[ 2 ] = f[ 2 ];\r\n this[ 3 ] = f[ 3 ];\r\n },\r\n _updateFloat9: function ( f ) {\r\n this[ 0 ] = f[ 0 ];\r\n this[ 1 ] = f[ 1 ];\r\n this[ 2 ] = f[ 2 ];\r\n this[ 3 ] = f[ 3 ];\r\n this[ 4 ] = f[ 4 ];\r\n this[ 5 ] = f[ 5 ];\r\n this[ 6 ] = f[ 6 ];\r\n this[ 7 ] = f[ 7 ];\r\n this[ 8 ] = f[ 8 ];\r\n },\r\n _updateFloat16: function ( f ) {\r\n this[ 0 ] = f[ 0 ];\r\n this[ 1 ] = f[ 1 ];\r\n this[ 2 ] = f[ 2 ];\r\n this[ 3 ] = f[ 3 ];\r\n this[ 4 ] = f[ 4 ];\r\n this[ 5 ] = f[ 5 ];\r\n this[ 6 ] = f[ 6 ];\r\n this[ 7 ] = f[ 7 ];\r\n this[ 8 ] = f[ 8 ];\r\n this[ 9 ] = f[ 9 ];\r\n this[ 10 ] = f[ 10 ];\r\n this[ 11 ] = f[ 11 ];\r\n this[ 12 ] = f[ 12 ];\r\n this[ 13 ] = f[ 13 ];\r\n this[ 14 ] = f[ 14 ];\r\n this[ 15 ] = f[ 15 ];\r\n }\r\n };\r\n\r\n Uniform.createFloat1 = function ( data, uniformName ) {\r\n var value = data;\r\n var name = uniformName;\r\n if ( name === undefined ) {\r\n name = value;\r\n value = [ 0 ];\r\n }\r\n var uniform = new Uniform();\r\n\r\n // if we aleardy have an array because called from array version then dont generate\r\n // an array of array\r\n if ( !Array.isArray( value ) )\r\n value = [ value ];\r\n\r\n uniform.data = value;\r\n uniform.glCall = function ( gl, location, glData ) {\r\n gl.uniform1fv( location, glData );\r\n };\r\n uniform.glData = new MACROUTILS.Float32Array( uniform.data );\r\n uniform.update = Uniform.prototype._updateFloat1;\r\n uniform.set = function ( value ) {\r\n if ( value.length === undefined ) {\r\n this.data[ 0 ] = value;\r\n } else {\r\n this.data = value;\r\n }\r\n this.dirty();\r\n };\r\n\r\n uniform.name = name;\r\n uniform.type = 'float';\r\n return uniform;\r\n };\r\n Uniform.createFloat = Uniform.createFloat1;\r\n Uniform[ 'float' ] = Uniform.createFloat1;\r\n Uniform.createFloatArray = function ( array, name ) {\r\n var u = Uniform.createFloat.call( this, array, name );\r\n u.update = Uniform.prototype._updateArray;\r\n return u;\r\n };\r\n\r\n Uniform.createFloat2 = function ( data, uniformName ) {\r\n var value = data;\r\n var name = uniformName;\r\n if ( name === undefined ) {\r\n name = value;\r\n value = [ 0, 0 ];\r\n }\r\n var uniform = new Uniform();\r\n uniform.data = value;\r\n uniform.glCall = function ( gl, location, glData ) {\r\n gl.uniform2fv( location, glData );\r\n };\r\n uniform.glData = new MACROUTILS.Float32Array( uniform.data );\r\n uniform.update = Uniform.prototype._updateFloat2;\r\n uniform.name = name;\r\n uniform.type = 'vec2';\r\n return uniform;\r\n };\r\n Uniform.vec2 = Uniform.createFloat2;\r\n Uniform.createFloat2Array = function ( array, name ) {\r\n var u = Uniform.createFloat2.call( this, array, name );\r\n u.update = Uniform.prototype._updateArray;\r\n return u;\r\n };\r\n\r\n Uniform.createFloat3 = function ( data, uniformName ) {\r\n var value = data;\r\n var name = uniformName;\r\n if ( name === undefined ) {\r\n name = value;\r\n value = [ 0, 0, 0 ];\r\n }\r\n var uniform = new Uniform();\r\n uniform.data = value;\r\n uniform.glCall = function ( gl, location, glData ) {\r\n gl.uniform3fv( location, glData );\r\n };\r\n uniform.glData = new MACROUTILS.Float32Array( uniform.data );\r\n uniform.update = Uniform.prototype._updateFloat3;\r\n uniform.name = name;\r\n uniform.type = 'vec3';\r\n return uniform;\r\n };\r\n Uniform.vec3 = Uniform.createFloat3;\r\n Uniform.createFloat3Array = function ( array, name ) {\r\n var u = Uniform.createFloat3.call( this, array, name );\r\n u.update = Uniform.prototype._updateArray;\r\n return u;\r\n };\r\n\r\n Uniform.createFloat4 = function ( data, uniformName ) {\r\n var value = data;\r\n var name = uniformName;\r\n if ( name === undefined ) {\r\n name = value;\r\n value = [ 0, 0, 0, 0 ];\r\n }\r\n var uniform = new Uniform();\r\n uniform.data = value;\r\n uniform.glCall = function ( gl, location, glData ) {\r\n gl.uniform4fv( location, glData );\r\n };\r\n uniform.glData = new MACROUTILS.Float32Array( uniform.data );\r\n uniform.update = Uniform.prototype._updateFloat4;\r\n uniform.name = name;\r\n uniform.type = 'vec4';\r\n return uniform;\r\n };\r\n Uniform.vec4 = Uniform.createFloat4;\r\n Uniform.createFloat4Array = function ( array, name ) {\r\n var u = Uniform.createFloat4.call( this, array, name );\r\n u.update = Uniform.prototype._updateArray;\r\n return u;\r\n };\r\n\r\n Uniform.createInt1 = function ( data, uniformName ) {\r\n var value = data;\r\n var name = uniformName;\r\n if ( name === undefined ) {\r\n name = value;\r\n value = [ 0 ];\r\n }\r\n var uniform = new Uniform();\r\n\r\n // if we aleardy have an array because called from array version then dont generate\r\n // an array of array\r\n if ( !Array.isArray( value ) )\r\n value = [ value ];\r\n\r\n uniform.data = value;\r\n uniform.glCall = function ( gl, location, glData ) {\r\n gl.uniform1iv( location, glData );\r\n };\r\n uniform.set = function ( value ) {\r\n if ( value.length === undefined ) {\r\n this.data[ 0 ] = value;\r\n } else {\r\n this.data = value;\r\n }\r\n this.dirty();\r\n };\r\n\r\n uniform.glData = new MACROUTILS.Int32Array( uniform.data );\r\n uniform.name = name;\r\n uniform.type = 'int';\r\n return uniform;\r\n };\r\n Uniform[ 'int' ] = Uniform.createInt1;\r\n Uniform.createInt = Uniform.createInt1;\r\n Uniform.createIntArray = function ( array, name ) {\r\n var u = Uniform.createInt.call( this, array, name );\r\n u.update = Uniform.prototype._updateArray;\r\n return u;\r\n };\r\n\r\n\r\n Uniform.createInt2 = function ( data, uniformName ) {\r\n var value = data;\r\n var name = uniformName;\r\n if ( name === undefined ) {\r\n name = value;\r\n value = [ 0, 0 ];\r\n }\r\n var uniform = new Uniform();\r\n uniform.data = value;\r\n uniform.glCall = function ( gl, location, glData ) {\r\n gl.uniform2iv( location, glData );\r\n };\r\n uniform.glData = new MACROUTILS.Int32Array( uniform.data );\r\n uniform.name = name;\r\n uniform.type = 'vec2i';\r\n return uniform;\r\n };\r\n Uniform.vec2i = Uniform.createInt2;\r\n Uniform.createInt2Array = function ( array, name ) {\r\n var u = Uniform.createInt2.call( this, array, name );\r\n u.update = Uniform.prototype._updateArray;\r\n return u;\r\n };\r\n\r\n Uniform.createInt3 = function ( data, uniformName ) {\r\n var value = data;\r\n var name = uniformName;\r\n if ( name === undefined ) {\r\n name = value;\r\n value = [ 0, 0, 0 ];\r\n }\r\n var uniform = new Uniform();\r\n uniform.data = value;\r\n uniform.glCall = function ( gl, location, glData ) {\r\n gl.uniform3iv( location, glData );\r\n };\r\n uniform.glData = new MACROUTILS.Int32Array( uniform.data );\r\n uniform.name = name;\r\n uniform.type = 'vec3i';\r\n return uniform;\r\n };\r\n Uniform.vec3i = Uniform.createInt3;\r\n Uniform.createInt3Array = function ( array, name ) {\r\n var u = Uniform.createInt3.call( this, array, name );\r\n u.update = Uniform.prototype._updateArray;\r\n return u;\r\n };\r\n\r\n Uniform.createInt4 = function ( data, uniformName ) {\r\n var value = data;\r\n var name = uniformName;\r\n if ( name === undefined ) {\r\n name = value;\r\n value = [ 0, 0, 0, 0 ];\r\n }\r\n var uniform = new Uniform();\r\n uniform.data = value;\r\n uniform.glCall = function ( gl, location, glData ) {\r\n gl.uniform4iv( location, glData );\r\n };\r\n uniform.glData = new MACROUTILS.Int32Array( uniform.data );\r\n uniform.name = name;\r\n uniform.type = 'vec4i';\r\n return uniform;\r\n };\r\n Uniform.vec4i = Uniform.createInt4;\r\n\r\n Uniform.createInt4Array = function ( array, name ) {\r\n var u = Uniform.createInt4.call( this, array, name );\r\n u.update = Uniform.prototype._updateArray;\r\n return u;\r\n };\r\n\r\n Uniform.createMatrix2 = function ( data, uniformName ) {\r\n var value = data;\r\n var name = uniformName;\r\n if ( name === undefined ) {\r\n name = value;\r\n value = [ 1, 0, 0, 1 ];\r\n }\r\n var uniform = new Uniform();\r\n uniform.data = value;\r\n uniform.glCall = function ( gl, location, transpose, glData ) {\r\n gl.uniformMatrix2fv( location, transpose, glData );\r\n };\r\n uniform.apply = uniform.applyMatrix;\r\n uniform.transpose = false;\r\n uniform.glData = new MACROUTILS.Float32Array( uniform.data );\r\n uniform.update = Uniform.prototype._updateFloat4;\r\n uniform.name = name;\r\n uniform.type = 'mat2';\r\n return uniform;\r\n };\r\n Uniform.createMat2 = Uniform.createMatrix2;\r\n Uniform.mat2 = Uniform.createMat2;\r\n\r\n Uniform.createMatrix3 = function ( data, uniformName ) {\r\n var value = data;\r\n var name = uniformName;\r\n if ( name === undefined ) {\r\n name = value;\r\n value = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ];\r\n }\r\n var uniform = new Uniform();\r\n uniform.data = value;\r\n uniform.glCall = function ( gl, location, transpose, glData ) {\r\n gl.uniformMatrix3fv( location, transpose, glData );\r\n };\r\n uniform.apply = uniform.applyMatrix;\r\n uniform.transpose = false;\r\n uniform.glData = new MACROUTILS.Float32Array( uniform.data );\r\n uniform.update = Uniform.prototype._updateFloat9;\r\n uniform.name = name;\r\n uniform.type = 'mat3';\r\n return uniform;\r\n };\r\n Uniform.createMat3 = Uniform.createMatrix3;\r\n Uniform.mat3 = Uniform.createMatrix3;\r\n\r\n Uniform.createMatrix4 = function ( data, uniformName ) {\r\n var value = data;\r\n var name = uniformName;\r\n if ( name === undefined ) {\r\n name = value;\r\n value = [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ];\r\n }\r\n var uniform = new Uniform();\r\n uniform.data = value;\r\n uniform.glCall = function ( gl, location, transpose, glData ) {\r\n gl.uniformMatrix4fv( location, transpose, glData );\r\n };\r\n uniform.apply = uniform.applyMatrix;\r\n uniform.transpose = false;\r\n uniform.glData = new MACROUTILS.Float32Array( uniform.data );\r\n uniform.update = Uniform.prototype._updateFloat16;\r\n uniform.name = name;\r\n uniform.type = 'mat4';\r\n return uniform;\r\n };\r\n Uniform.createMat4 = Uniform.createMatrix4;\r\n Uniform.mat4 = Uniform.createMatrix4;\r\n\r\n return Uniform;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/Uniform.js\n ** module id = 86\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/NodeVisitor',\r\n], function ( MACROUTILS, NodeVisitor ) {\r\n\r\n 'use strict';\r\n\r\n var UpdateVisitor = function () {\r\n NodeVisitor.call( this );\r\n this.visitorType = NodeVisitor.UPDATE_VISITOR;\r\n };\r\n\r\n UpdateVisitor.prototype = MACROUTILS.objectInherit( NodeVisitor.prototype, {\r\n\r\n apply: function ( node ) {\r\n\r\n // a way to avoid extra call is to implement getNumChildrenRequiringUpdateTraversal\r\n // and stateset.requiresUpdateTraversal()\r\n\r\n\r\n // handle callback in stateset\r\n var stateSet = node.getStateSet();\r\n if ( stateSet ) {\r\n var updateCallbackList = stateSet.getUpdateCallbackList();\r\n\r\n if ( updateCallbackList.length )\r\n for ( var i = 0, l = updateCallbackList.length; i < l; i++ )\r\n updateCallbackList[ i ].update( stateSet, this );\r\n }\r\n\r\n // handle callback in nodes\r\n var ncs = node.getUpdateCallbackList();\r\n if ( ncs.length )\r\n for ( var j = 0, m = ncs.length; j < m; j++ ) {\r\n if ( !ncs[ j ].update( node, this ) ) {\r\n return;\r\n }\r\n }\r\n\r\n this.traverse( node );\r\n }\r\n } );\r\n\r\n return UpdateVisitor;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/UpdateVisitor.js\n ** module id = 87\n ** module chunks = 0 1\n **/","define( [\r\n 'osgUtil/osgPool',\r\n 'osg/StateGraph',\r\n 'osg/Timer',\r\n 'osg/Notify'\r\n], function ( osgPool, StateGraph, Timer, Notify ) {\r\n\r\n // make the warning about StateGraph desappear\r\n Object.keys( StateGraph );\r\n\r\n var Utils = {};\r\n\r\n Utils.init = function () {\r\n var StateGraphClass = require( 'osg/StateGraph' );\r\n osgPool.memoryPools.stateGraph = new osgPool.OsgObjectMemoryPool( StateGraphClass ).grow( 50 );\r\n };\r\n\r\n Utils.isArray = function ( obj ) {\r\n Notify.log( 'isArray is deprecated, use instead Array.isArray' );\r\n return Array.isArray( obj );\r\n };\r\n\r\n Utils.extend = function () {\r\n // Save a reference to some core methods\r\n var toString = Object.prototype.toString,\r\n hasOwnPropertyFunc = Object.prototype.hasOwnProperty;\r\n\r\n var isFunction = function ( obj ) {\r\n return toString.call( obj ) === '[object Function]';\r\n };\r\n var isArray = Utils.isArray;\r\n var isPlainObject = function ( obj ) {\r\n // Must be an Object.\r\n // Because of IE, we also have to check the presence of the constructor property.\r\n // Make sure that DOM nodes and window objects don't pass through, as well\r\n if ( !obj || toString.call( obj ) !== '[object Object]' || obj.nodeType || obj.setInterval ) {\r\n return false;\r\n }\r\n\r\n // Not own constructor property must be Object\r\n if ( obj.constructor && !hasOwnPropertyFunc.call( obj, 'constructor' ) && !hasOwnPropertyFunc.call( obj.constructor.prototype, 'isPrototypeOf' ) ) {\r\n return false;\r\n }\r\n\r\n // Own properties are enumerated firstly, so to speed up,\r\n // if last one is own, then all properties are own.\r\n\r\n var key;\r\n for ( key in obj ) {}\r\n\r\n return key === undefined || hasOwnPropertyFunc.call( obj, key );\r\n };\r\n\r\n // copy reference to target object\r\n var target = arguments[ 0 ] || {},\r\n i = 1,\r\n length = arguments.length,\r\n deep = false,\r\n options, name, src, copy;\r\n\r\n // Handle a deep copy situation\r\n if ( typeof target === 'boolean' ) {\r\n deep = target;\r\n target = arguments[ 1 ] || {};\r\n // skip the boolean and the target\r\n i = 2;\r\n }\r\n\r\n // Handle case when target is a string or something (possible in deep copy)\r\n if ( typeof target !== 'object' && !isFunction( target ) ) {\r\n target = {};\r\n }\r\n\r\n // extend jQuery itself if only one argument is passed\r\n if ( length === i ) {\r\n target = this;\r\n --i;\r\n }\r\n\r\n for ( ; i < length; i++ ) {\r\n // Only deal with non-null/undefined values\r\n if ( ( options = arguments[ i ] ) !== null ) {\r\n // Extend the base object\r\n for ( name in options ) {\r\n src = target[ name ];\r\n copy = options[ name ];\r\n\r\n // Prevent never-ending loop\r\n if ( target === copy ) {\r\n continue;\r\n }\r\n\r\n // Recurse if we're merging object literal values or arrays\r\n if ( deep && copy && ( isPlainObject( copy ) || isArray( copy ) ) ) {\r\n var clone = src && ( isPlainObject( src ) || isArray( src ) ) ? src : isArray( copy ) ? [] : {};\r\n\r\n // Never move original objects, clone them\r\n target[ name ] = Utils.extend( deep, clone, copy );\r\n\r\n // Don't bring in undefined values\r\n } else if ( copy !== undefined ) {\r\n target[ name ] = copy;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Return the modified object\r\n return target;\r\n };\r\n\r\n Utils.objectInherit = function ( base /*, extras*/ ) {\r\n function F() {}\r\n F.prototype = base;\r\n var obj = new F();\r\n\r\n // let augment object with multiple arguement\r\n for ( var i = 1; i < arguments.length; i++ ) {\r\n Utils.objectMix( obj, arguments[ i ], false );\r\n }\r\n return obj;\r\n };\r\n Utils.objectInehrit = function () {\r\n console.warn( 'please use objectInherit instead of objectInehrit' );\r\n };\r\n\r\n Utils.objectMix = function ( obj, properties, test ) {\r\n for ( var key in properties ) {\r\n if ( !( test && obj[ key ] ) ) {\r\n obj[ key ] = properties[ key ];\r\n }\r\n }\r\n return obj;\r\n };\r\n\r\n Utils.objectType = {};\r\n Utils.objectType.type = 0;\r\n Utils.objectType.generate = function ( arg ) {\r\n var t = Utils.objectType.type;\r\n Utils.objectType[ t ] = arg;\r\n Utils.objectType[ arg ] = t;\r\n Utils.objectType.type += 1;\r\n return t;\r\n };\r\n\r\n Utils.objectLibraryClass = function ( object, libName, className ) {\r\n object.className = function () {\r\n return className;\r\n };\r\n object.libraryName = function () {\r\n return libName;\r\n };\r\n var libraryClassName = libName + '::' + className;\r\n object.libraryClassName = function () {\r\n return libraryClassName;\r\n };\r\n\r\n return object;\r\n };\r\n Utils.setTypeID = function ( classObject ) {\r\n var className = classObject.prototype.className();\r\n var typeID = Utils.objectType.generate( className );\r\n var getTypeID = function () {\r\n return typeID;\r\n };\r\n classObject.typeID = classObject.prototype.typeID = typeID;\r\n classObject.getTypeID = classObject.prototype.getTypeID = getTypeID;\r\n };\r\n\r\n Utils.Float32Array = typeof Float32Array !== 'undefined' ? Float32Array : null;\r\n Utils.Int32Array = typeof Int32Array !== 'undefined' ? Int32Array : null;\r\n Utils.Uint8Array = typeof Uint8Array !== 'undefined' ? Uint8Array : null;\r\n Utils.Uint16Array = typeof Uint16Array !== 'undefined' ? Uint16Array : null;\r\n Utils.Uint32Array = typeof Uint32Array !== 'undefined' ? Uint32Array : null;\r\n\r\n Utils.timeStamp = function () {\r\n\r\n var fn = Notify.console.timeStamp || Notify.console.markTimeline || function () {};\r\n return fn.apply( Notify.console, arguments );\r\n\r\n };\r\n\r\n var times = {};\r\n\r\n Utils.time = function () {\r\n\r\n var fn = Notify.console.time || function ( name ) {\r\n times[ name ] = Timer.instance().tick();\r\n };\r\n return fn.apply( Notify.console, arguments );\r\n\r\n };\r\n\r\n Utils.timeEnd = function () {\r\n\r\n var fn = Notify.console.timeEnd || function ( name ) {\r\n\r\n if ( times[ name ] === undefined )\r\n return;\r\n\r\n var duration = Timer.instance().deltaM( times[ name ], Timer.instance().tick() );\r\n\r\n Notify.debug( name + ': ' + duration + 'ms' );\r\n times[ name ] = undefined;\r\n\r\n };\r\n return fn.apply( Notify.console, arguments );\r\n\r\n };\r\n\r\n Utils.profile = ( function () {\r\n\r\n var fn = Notify.console.profile || function () {};\r\n return function () {\r\n return fn.apply( Notify.console, arguments );\r\n };\r\n\r\n } )();\r\n\r\n Utils.profileEnd = ( function () {\r\n\r\n var fn = Notify.console.profileEnd || function () {};\r\n return function () {\r\n return fn.apply( Notify.console, arguments );\r\n };\r\n\r\n } )();\r\n\r\n return Utils;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/Utils.js\n ** module id = 88\n ** module chunks = 0 1\n **/","define( [], function () {\r\n\r\n 'use strict';\r\n\r\n /** @class Vec2 Operations */\r\n var Vec2 = {\r\n create: function () {\r\n return [ 0.0, 0.0 ];\r\n },\r\n\r\n copy: function ( a, r ) {\r\n r[ 0 ] = a[ 0 ];\r\n r[ 1 ] = a[ 1 ];\r\n return r;\r\n },\r\n\r\n set: function ( a, b, r ) {\r\n r[ 0 ] = a;\r\n r[ 1 ] = b;\r\n return r;\r\n },\r\n\r\n valid: function ( a ) {\r\n if ( isNaN( a[ 0 ] ) ) {\r\n return false;\r\n }\r\n if ( isNaN( a[ 1 ] ) ) {\r\n return false;\r\n }\r\n return true;\r\n },\r\n\r\n mult: function ( a, b, r ) {\r\n r[ 0 ] = a[ 0 ] * b;\r\n r[ 1 ] = a[ 1 ] * b;\r\n return r;\r\n },\r\n\r\n length2: function ( a ) {\r\n return a[ 0 ] * a[ 0 ] + a[ 1 ] * a[ 1 ];\r\n },\r\n\r\n length: function ( a ) {\r\n return Math.sqrt( a[ 0 ] * a[ 0 ] + a[ 1 ] * a[ 1 ] );\r\n },\r\n\r\n distance2: function ( a, b ) {\r\n var x = a[ 0 ] - b[ 0 ];\r\n var y = a[ 1 ] - b[ 1 ];\r\n return x * x + y * y;\r\n },\r\n\r\n distance: function ( a, b ) {\r\n var x = a[ 0 ] - b[ 0 ];\r\n var y = a[ 1 ] - b[ 1 ];\r\n return Math.sqrt( x * x + y * y );\r\n },\r\n\r\n /**\r\n normalize an Array of 2 elements and write it in r\r\n */\r\n normalize: function ( a, r ) {\r\n var norm = this.length2( a );\r\n if ( norm > 0.0 ) {\r\n var inv = 1.0 / Math.sqrt( norm );\r\n r[ 0 ] = a[ 0 ] * inv;\r\n r[ 1 ] = a[ 1 ] * inv;\r\n } else {\r\n r[ 0 ] = a[ 0 ];\r\n r[ 1 ] = a[ 1 ];\r\n }\r\n return r;\r\n },\r\n\r\n /**\r\n Compute the dot product\r\n */\r\n dot: function ( a, b ) {\r\n return a[ 0 ] * b[ 0 ] + a[ 1 ] * b[ 1 ];\r\n },\r\n\r\n /**\r\n Compute a - b and put the result in r\r\n */\r\n sub: function ( a, b, r ) {\r\n r[ 0 ] = a[ 0 ] - b[ 0 ];\r\n r[ 1 ] = a[ 1 ] - b[ 1 ];\r\n return r;\r\n },\r\n\r\n add: function ( a, b, r ) {\r\n r[ 0 ] = a[ 0 ] + b[ 0 ];\r\n r[ 1 ] = a[ 1 ] + b[ 1 ];\r\n return r;\r\n },\r\n\r\n neg: function ( a, r ) {\r\n r[ 0 ] = -a[ 0 ];\r\n r[ 1 ] = -a[ 1 ];\r\n return r;\r\n },\r\n\r\n lerp: function ( t, a, b, r ) {\r\n var tmp = 1.0 - t;\r\n r[ 0 ] = a[ 0 ] * tmp + t * b[ 0 ];\r\n r[ 1 ] = a[ 1 ] * tmp + t * b[ 1 ];\r\n return r;\r\n }\r\n\r\n };\r\n\r\n return Vec2;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/Vec2.js\n ** module id = 89\n ** module chunks = 0 1\n **/","define( [], function () {\r\n\r\n 'use strict';\r\n\r\n /** @class Vec3 Operations */\r\n var Vec3 = {\r\n\r\n create: function () {\r\n return [ 0.0, 0.0, 0.0 ];\r\n },\r\n\r\n init: function ( a ) {\r\n a[ 0 ] = 0.0;\r\n a[ 1 ] = 0.0;\r\n a[ 2 ] = 0.0;\r\n return a;\r\n },\r\n\r\n set: function ( a, b, c, r ) {\r\n r[ 0 ] = a;\r\n r[ 1 ] = b;\r\n r[ 2 ] = c;\r\n return r;\r\n },\r\n\r\n copy: function ( a, r ) {\r\n r[ 0 ] = a[ 0 ];\r\n r[ 1 ] = a[ 1 ];\r\n r[ 2 ] = a[ 2 ];\r\n return r;\r\n },\r\n\r\n cross: function ( a, b, r ) {\r\n var x = a[ 1 ] * b[ 2 ] - a[ 2 ] * b[ 1 ];\r\n var y = a[ 2 ] * b[ 0 ] - a[ 0 ] * b[ 2 ];\r\n var z = a[ 0 ] * b[ 1 ] - a[ 1 ] * b[ 0 ];\r\n r[ 0 ] = x;\r\n r[ 1 ] = y;\r\n r[ 2 ] = z;\r\n return r;\r\n },\r\n\r\n valid: function ( a ) {\r\n if ( isNaN( a[ 0 ] ) ) {\r\n return false;\r\n }\r\n if ( isNaN( a[ 1 ] ) ) {\r\n return false;\r\n }\r\n if ( isNaN( a[ 2 ] ) ) {\r\n return false;\r\n }\r\n return true;\r\n },\r\n\r\n mult: function ( a, b, r ) {\r\n r[ 0 ] = a[ 0 ] * b;\r\n r[ 1 ] = a[ 1 ] * b;\r\n r[ 2 ] = a[ 2 ] * b;\r\n return r;\r\n },\r\n\r\n length2: function ( a ) {\r\n return a[ 0 ] * a[ 0 ] + a[ 1 ] * a[ 1 ] + a[ 2 ] * a[ 2 ];\r\n },\r\n\r\n length: function ( a ) {\r\n return Math.sqrt( a[ 0 ] * a[ 0 ] + a[ 1 ] * a[ 1 ] + a[ 2 ] * a[ 2 ] );\r\n },\r\n\r\n distance2: function ( a, b ) {\r\n var x = a[ 0 ] - b[ 0 ];\r\n var y = a[ 1 ] - b[ 1 ];\r\n var z = a[ 2 ] - b[ 2 ];\r\n return x * x + y * y + z * z;\r\n },\r\n\r\n distance: function ( a, b ) {\r\n var x = a[ 0 ] - b[ 0 ];\r\n var y = a[ 1 ] - b[ 1 ];\r\n var z = a[ 2 ] - b[ 2 ];\r\n return Math.sqrt( x * x + y * y + z * z );\r\n },\r\n\r\n normalize: function ( a, r ) {\r\n var norm = this.length2( a );\r\n if ( norm > 0.0 ) {\r\n var inv = 1.0 / Math.sqrt( norm );\r\n r[ 0 ] = a[ 0 ] * inv;\r\n r[ 1 ] = a[ 1 ] * inv;\r\n r[ 2 ] = a[ 2 ] * inv;\r\n } else {\r\n r[ 0 ] = a[ 0 ];\r\n r[ 1 ] = a[ 1 ];\r\n r[ 2 ] = a[ 2 ];\r\n }\r\n return r;\r\n },\r\n\r\n dot: function ( a, b ) {\r\n return a[ 0 ] * b[ 0 ] + a[ 1 ] * b[ 1 ] + a[ 2 ] * b[ 2 ];\r\n },\r\n\r\n sub: function ( a, b, r ) {\r\n r[ 0 ] = a[ 0 ] - b[ 0 ];\r\n r[ 1 ] = a[ 1 ] - b[ 1 ];\r\n r[ 2 ] = a[ 2 ] - b[ 2 ];\r\n return r;\r\n },\r\n\r\n add: function ( a, b, r ) {\r\n r[ 0 ] = a[ 0 ] + b[ 0 ];\r\n r[ 1 ] = a[ 1 ] + b[ 1 ];\r\n r[ 2 ] = a[ 2 ] + b[ 2 ];\r\n return r;\r\n },\r\n\r\n neg: function ( a, r ) {\r\n r[ 0 ] = -a[ 0 ];\r\n r[ 1 ] = -a[ 1 ];\r\n r[ 2 ] = -a[ 2 ];\r\n return r;\r\n },\r\n\r\n lerp: function ( t, a, b, r ) {\r\n r[ 0 ] = a[ 0 ] + ( b[ 0 ] - a[ 0 ] ) * t;\r\n r[ 1 ] = a[ 1 ] + ( b[ 1 ] - a[ 1 ] ) * t;\r\n r[ 2 ] = a[ 2 ] + ( b[ 2 ] - a[ 2 ] ) * t;\r\n return r;\r\n }\r\n\r\n };\r\n\r\n Vec3.zero = [ 0.0, 0.0, 0.0 ];\r\n Vec3.infinity = [ Infinity, Infinity, Infinity ];\r\n Vec3.negativeInfinity = [ -Infinity, -Infinity, -Infinity ];\r\n\r\n return Vec3;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/Vec3.js\n ** module id = 90\n ** module chunks = 0 1\n **/","define( [], function () {\r\n\r\n 'use strict';\r\n\r\n /** @class Vec4 Operations */\r\n var Vec4 = {\r\n\r\n create: function () {\r\n return [ 0.0, 0.0, 0.0, 0.0 ];\r\n },\r\n\r\n init: function ( a ) {\r\n a[ 0 ] = 0.0;\r\n a[ 1 ] = 0.0;\r\n a[ 2 ] = 0.0;\r\n a[ 3 ] = 0.0;\r\n return a;\r\n },\r\n\r\n set: function ( a, b, c, d, r ) {\r\n r[ 0 ] = a;\r\n r[ 1 ] = b;\r\n r[ 2 ] = c;\r\n r[ 3 ] = d;\r\n return r;\r\n },\r\n\r\n dot: function ( a, b ) {\r\n return a[ 0 ] * b[ 0 ] + a[ 1 ] * b[ 1 ] + a[ 2 ] * b[ 2 ] + a[ 3 ] * b[ 3 ];\r\n },\r\n\r\n copy: function ( a, r ) {\r\n r[ 0 ] = a[ 0 ];\r\n r[ 1 ] = a[ 1 ];\r\n r[ 2 ] = a[ 2 ];\r\n r[ 3 ] = a[ 3 ];\r\n return r;\r\n },\r\n\r\n sub: function ( a, b, r ) {\r\n r[ 0 ] = a[ 0 ] - b[ 0 ];\r\n r[ 1 ] = a[ 1 ] - b[ 1 ];\r\n r[ 2 ] = a[ 2 ] - b[ 2 ];\r\n r[ 3 ] = a[ 3 ] - b[ 3 ];\r\n return r;\r\n },\r\n\r\n mult: function ( a, b, r ) {\r\n r[ 0 ] = a[ 0 ] * b;\r\n r[ 1 ] = a[ 1 ] * b;\r\n r[ 2 ] = a[ 2 ] * b;\r\n r[ 3 ] = a[ 3 ] * b;\r\n return r;\r\n },\r\n\r\n add: function ( a, b, r ) {\r\n r[ 0 ] = a[ 0 ] + b[ 0 ];\r\n r[ 1 ] = a[ 1 ] + b[ 1 ];\r\n r[ 2 ] = a[ 2 ] + b[ 2 ];\r\n r[ 3 ] = a[ 3 ] + b[ 3 ];\r\n return r;\r\n },\r\n\r\n neg: function ( a, r ) {\r\n r[ 0 ] = -a[ 0 ];\r\n r[ 1 ] = -a[ 1 ];\r\n r[ 2 ] = -a[ 2 ];\r\n r[ 3 ] = -a[ 3 ];\r\n return r;\r\n },\r\n\r\n lerp: function ( t, a, b, r ) {\r\n var tmp = 1.0 - t;\r\n r[ 0 ] = a[ 0 ] * tmp + t * b[ 0 ];\r\n r[ 1 ] = a[ 1 ] * tmp + t * b[ 1 ];\r\n r[ 2 ] = a[ 2 ] * tmp + t * b[ 2 ];\r\n r[ 3 ] = a[ 3 ] * tmp + t * b[ 3 ];\r\n return r;\r\n }\r\n };\r\n\r\n return Vec4;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/Vec4.js\n ** module id = 91\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/StateAttribute',\r\n 'osg/Matrix'\r\n], function ( MACROUTILS, StateAttribute, Matrix ) {\r\n\r\n var Viewport = function ( x, y, w, h ) {\r\n StateAttribute.call( this );\r\n\r\n if ( x === undefined ) {\r\n x = 0;\r\n }\r\n if ( y === undefined ) {\r\n y = 0;\r\n }\r\n if ( w === undefined ) {\r\n w = 800;\r\n }\r\n if ( h === undefined ) {\r\n h = 600;\r\n }\r\n\r\n this._x = x;\r\n this._y = y;\r\n this._width = w;\r\n this._height = h;\r\n this._dirty = true;\r\n };\r\n\r\n Viewport.prototype = MACROUTILS.objectLibraryClass( MACROUTILS.objectInherit( StateAttribute.prototype, {\r\n attributeType: 'Viewport',\r\n cloneType: function () {\r\n return new Viewport();\r\n },\r\n apply: function ( state ) {\r\n var gl = state.getGraphicContext();\r\n gl.viewport( this._x, this._y, this._width, this._height );\r\n this._dirty = false;\r\n },\r\n setViewport: function ( x, y, width, height ) {\r\n this._x = x;\r\n this._y = y;\r\n this._width = width;\r\n this._height = height;\r\n this.dirty();\r\n },\r\n x: function () {\r\n return this._x;\r\n },\r\n y: function () {\r\n return this._y;\r\n },\r\n width: function () {\r\n return this._width;\r\n },\r\n height: function () {\r\n return this._height;\r\n },\r\n computeWindowMatrix: ( function () {\r\n var translate = Matrix.create();\r\n var scale = Matrix.create();\r\n return function () {\r\n // res = Matrix offset * Matrix scale * Matrix translate\r\n Matrix.makeTranslate( 1.0, 1.0, 1.0, translate );\r\n Matrix.makeScale( 0.5 * this._width, 0.5 * this._height, 0.5, scale );\r\n var offset = Matrix.makeTranslate( this._x, this._y, 0.0, Matrix.create() );\r\n //return Matrix.mult(Matrix.mult(translate, scale, translate), offset, offset);\r\n return Matrix.preMult( offset, Matrix.preMult( scale, translate ) );\r\n };\r\n } )()\r\n } ), 'osg', 'Viewport' );\r\n\r\n return Viewport;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/Viewport.js\n ** module id = 92\n ** module chunks = 0 1\n **/","define( [], function () {\r\n\r\n /**\r\n * Authors:\r\n * Tuan.kuranes Jerome Etienne \r\n */\r\n\r\n var osgPool = {};\r\n osgPool.memoryPools = {};\r\n\r\n /*\r\n * TODO: Add stats & reports for developper per application finer calibration (max, min, average)\r\n * TODO: Debug Mode: check if not putting object twice, etc.\r\n * USAGE: osg.memoryPools.stateGraph = new OsgObjectMemoryPool(osg.StateGraph).grow(50);\r\n */\r\n osgPool.OsgObjectMemoryPool = function ( ObjectClassName ) {\r\n return {\r\n _memPool: [],\r\n reset: function () {\r\n this._memPool = [];\r\n return this;\r\n },\r\n put: function ( obj ) {\r\n this._memPool.push( obj );\r\n },\r\n get: function () {\r\n if ( this._memPool.length > 0 ) return this._memPool.pop();\r\n this.grow();\r\n return this.get();\r\n },\r\n grow: function ( sizeAdd ) {\r\n if ( sizeAdd === undefined ) sizeAdd = ( this._memPool.length > 0 ) ? this._memPool.length * 2 : 20;\r\n var i = this._memPool.length;\r\n while ( i++ < sizeAdd ) this._memPool.push( new ObjectClassName() );\r\n return this;\r\n }\r\n };\r\n };\r\n\r\n /*\r\n * TODO: the same for TypedArrays.\r\n * TODO: Add stats reports for developper per application finer calibration (max, min, average)\r\n * TODO: Debug Mode: check if not putting object twice, etc.\r\n * USAGE: osg.memoryPools.arrayPool = new OsgArrayMemoryPool();\r\n * mymatrix = osg.memoryPools.arrayPool.get(16);\r\n * // do use matrix, etc..\r\n * osg.memoryPools.arrayPool.put(mymatrix);\r\n */\r\n osgPool.OsgArrayMemoryPool = function () {\r\n return {\r\n _mempoolofPools: [],\r\n reset: function () {\r\n this._memPoolofPools = {};\r\n return this;\r\n },\r\n put: function ( obj ) {\r\n if ( !this._memPoolofPools[ obj.length ] )\r\n this._memPoolofPools[ obj.length ] = [];\r\n this._memPoolofPools[ obj.length ].push( obj );\r\n },\r\n get: function ( arraySize ) {\r\n if ( !this._memPoolofPools[ arraySize ] )\r\n this._memPoolofPools[ arraySize ] = [];\r\n else if ( this._memPoolofPools.length > 0 )\r\n return this._memPool.pop();\r\n this.grow( arraySize );\r\n return this.get();\r\n },\r\n grow: function ( arraySize, sizeAdd ) {\r\n if ( sizeAdd === undefined ) sizeAdd = ( this._memPool.length > 0 ) ? this._memPool.length * 2 : 20;\r\n var i = this._memPool.length;\r\n while ( i++ < sizeAdd ) this._memPool.push( new Array( arraySize ) );\r\n return this;\r\n }\r\n };\r\n };\r\n\r\n return osgPool;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgUtil/osgPool.js\n ** module id = 93\n ** module chunks = 0 1\n **/","define( [], function () {\r\n\r\n return {\r\n RELATIVE_RF: 0,\r\n ABSOLUTE_RF: 1\r\n };\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/TransformEnums.js\n ** module id = 94\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Texture'\r\n], function ( Texture ) {\r\n\r\n 'use strict';\r\n\r\n var WebGLCaps = function ( gl ) {\r\n this._gl = gl;\r\n this._checkRTT = {};\r\n this._webGLExtensions = {};\r\n this._webGLParameters = {};\r\n this._webGLShaderMaxInt = 'NONE';\r\n this._webGLShaderMaxFloat = 'NONE';\r\n };\r\n\r\n WebGLCaps.prototype = {\r\n init: function () {\r\n this.initWebGLParameters();\r\n this.initWebGLExtensions();\r\n },\r\n getWebGLParameter: function ( str ) {\r\n return this._webGLParameters[ str ];\r\n },\r\n getWebGLParameters: function () {\r\n return this._webGLParameters;\r\n },\r\n getShaderMaxPrecisionFloat: function () {\r\n return this._webGLParameters.MAX_SHADER_PRECISION_FLOAT;\r\n },\r\n getShaderMaxPrecisionInt: function () {\r\n return this._webGLParameters.MAX_SHADER_PRECISION_INT;\r\n },\r\n checkRTTSupport: function ( typeFloat, typeTexture ) {\r\n var gl = this._gl;\r\n if ( gl === undefined )\r\n return false;\r\n var key = typeFloat + ',' + typeTexture;\r\n if ( this._checkRTT[ key ] !== undefined )\r\n return this._checkRTT[ key ];\r\n // from http://codeflow.org/entries/2013/feb/22/how-to-write-portable-webgl/#how-can-i-detect-if-i-can-render-to-floating-point-textures\r\n\r\n // setup the texture\r\n var texture = gl.createTexture();\r\n gl.bindTexture( gl.TEXTURE_2D, texture );\r\n gl.texImage2D( gl.TEXTURE_2D, 0, gl.RGBA, 2, 2, 0, gl.RGBA, typeFloat, null );\r\n gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, typeTexture );\r\n gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, typeTexture );\r\n\r\n // setup the framebuffer\r\n var framebuffer = gl.createFramebuffer();\r\n gl.bindFramebuffer( gl.FRAMEBUFFER, framebuffer );\r\n gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0 );\r\n\r\n // check the framebuffer\r\n var status = this._checkRTT[ key ] = gl.checkFramebufferStatus( gl.FRAMEBUFFER ) === gl.FRAMEBUFFER_COMPLETE;\r\n\r\n // cleanup\r\n gl.deleteTexture( texture );\r\n gl.deleteFramebuffer( framebuffer );\r\n gl.bindTexture( gl.TEXTURE_2D, null );\r\n gl.bindFramebuffer( gl.FRAMEBUFFER, null );\r\n\r\n return status;\r\n },\r\n hasRTTLinearHalfFloat: function () {\r\n return this._webGLExtensions[ 'OES_texture_half_float_linear' ] && this.checkRTTSupport( Texture.HALF_FLOAT, Texture.LINEAR );\r\n },\r\n hasRTTLinearFloat: function () {\r\n return this._webGLExtensions[ 'OES_texture_float_linear' ] && this.checkRTTSupport( Texture.FLOAT, Texture.LINEAR );\r\n },\r\n hasRTTHalfFloat: function () {\r\n return this._webGLExtensions[ 'OES_texture_half_float' ] && this.checkRTTSupport( Texture.HALF_FLOAT, Texture.NEAREST );\r\n },\r\n hasRTTFloat: function () {\r\n return this._webGLExtensions[ 'OES_texture_float' ] && this.checkRTTSupport( Texture.FLOAT, Texture.NEAREST );\r\n },\r\n initWebGLParameters: function () {\r\n var gl = this._gl;\r\n if ( gl === undefined )\r\n return;\r\n\r\n var limits = [\r\n 'MAX_COMBINED_TEXTURE_IMAGE_UNITS',\r\n 'MAX_CUBE_MAP_TEXTURE_SIZE',\r\n 'MAX_FRAGMENT_UNIFORM_VECTORS',\r\n 'MAX_RENDERBUFFER_SIZE',\r\n 'MAX_TEXTURE_IMAGE_UNITS',\r\n 'MAX_TEXTURE_SIZE',\r\n 'MAX_VARYING_VECTORS',\r\n 'MAX_VERTEX_ATTRIBS',\r\n 'MAX_VERTEX_TEXTURE_IMAGE_UNITS',\r\n 'MAX_VERTEX_UNIFORM_VECTORS',\r\n 'MAX_VIEWPORT_DIMS',\r\n 'SHADING_LANGUAGE_VERSION',\r\n 'VERSION',\r\n 'VENDOR',\r\n 'RENDERER',\r\n 'ALIASED_LINE_WIDTH_RANGE',\r\n 'ALIASED_POINT_SIZE_RANGE',\r\n 'RED_BITS',\r\n 'GREEN_BITS',\r\n 'BLUE_BITS',\r\n 'ALPHA_BITS',\r\n 'DEPTH_BITS',\r\n 'STENCIL_BITS'\r\n ];\r\n var params = this._webGLParameters;\r\n for ( var i = 0, len = limits.length; i < len; ++i ) {\r\n var par = limits[ i ];\r\n params[ par ] = gl.getParameter( gl[ par ] );\r\n }\r\n\r\n //shader precisions for float\r\n if ( gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision !== 0 ) {\r\n params.MAX_SHADER_PRECISION_FLOAT = 'high';\r\n } else if ( gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision !== 0 ) {\r\n params.MAX_SHADER_PRECISION_FLOAT = 'medium';\r\n } else if ( gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.LOW_FLOAT ).precision !== 0 ) {\r\n params.MAX_SHADER_PRECISION_FLOAT = 'low';\r\n } else {\r\n params.MAX_SHADER_PRECISION_FLOAT = 'none';\r\n }\r\n\r\n //shader precisions for float\r\n if ( gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_INT ).precision !== 0 ) {\r\n params.MAX_SHADER_PRECISION_INT = 'high';\r\n } else if ( gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_INT ).precision !== 0 ) {\r\n params.MAX_SHADER_PRECISION_INT = 'medium';\r\n } else if ( gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.LOW_INT ).precision !== 0 ) {\r\n params.MAX_SHADER_PRECISION_INT = 'low';\r\n } else {\r\n params.MAX_SHADER_PRECISION_INT = 'none';\r\n }\r\n\r\n // TODO ?\r\n // try to compile a small shader to test the spec is respected\r\n },\r\n getWebGLExtension: function ( str ) {\r\n return this._webGLExtensions[ str ];\r\n },\r\n getWebGLExtensions: function () {\r\n return this._webGLExtensions;\r\n },\r\n initWebGLExtensions: function () {\r\n var gl = this._gl;\r\n if ( gl === undefined )\r\n return;\r\n var supported = gl.getSupportedExtensions();\r\n var ext = this._webGLExtensions;\r\n // we load all the extensions\r\n for ( var i = 0, len = supported.length; i < len; ++i ) {\r\n var sup = supported[ i ];\r\n ext[ sup ] = gl.getExtension( sup );\r\n }\r\n\r\n var anisoExt = this.getWebGLExtension( 'EXT_texture_filter_anisotropic' );\r\n if ( anisoExt ) {\r\n Texture.ANISOTROPIC_SUPPORT_EXT = true;\r\n Texture.ANISOTROPIC_SUPPORT_MAX = gl.getParameter( anisoExt.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\r\n }\r\n\r\n }\r\n };\r\n\r\n\r\n return WebGLCaps;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/WebGLCaps.js\n ** module id = 95\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osgGA/Manipulator',\r\n 'osgGA/OrbitManipulator',\r\n 'osg/Matrix',\r\n 'osg/Vec2',\r\n 'osg/Vec3',\r\n 'osgGA/FirstPersonManipulatorMouseKeyboardController',\r\n 'osgGA/FirstPersonManipulatorOculusController',\r\n 'osgGA/FirstPersonManipulatorDeviceOrientationController'\r\n], function ( MACROUTILS, Manipulator, OrbitManipulator, Matrix, Vec2, Vec3, FirstPersonManipulatorMouseKeyboardController, FirstPersonManipulatorOculusController, FirstPersonManipulatorDeviceOrientationController ) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * Authors:\r\n * Matt Fontaine \r\n * Cedric Pinson \r\n */\r\n\r\n /**\r\n * FirstPersonManipulator\r\n * @class\r\n */\r\n var FirstPersonManipulator = function () {\r\n Manipulator.call( this );\r\n this.init();\r\n };\r\n\r\n FirstPersonManipulator.AvailableControllerList = [ 'StandardMouseKeyboard', 'Oculus', 'DeviceOrientation' ];\r\n FirstPersonManipulator.ControllerList = [ 'StandardMouseKeyboard', 'Oculus', 'DeviceOrientation' ];\r\n\r\n /** @lends FirstPersonManipulator.prototype */\r\n FirstPersonManipulator.prototype = MACROUTILS.objectInherit( Manipulator.prototype, {\r\n computeHomePosition: function ( useBoundingBox ) {\r\n var bs = this.getHomeBound( useBoundingBox );\r\n if ( !bs ) return;\r\n\r\n this._radius = this.getHomeDistance( bs );\r\n var cen = bs.center();\r\n Vec3.mult( this._direction, -this._radius, this._eye );\r\n Vec3.add( cen, this._eye, this._eye );\r\n this.setTarget( cen );\r\n },\r\n init: function () {\r\n this._direction = [ 0.0, 1.0, 0.0 ];\r\n this._eye = [ 0.0, 25.0, 10.0 ];\r\n this._up = [ 0.0, 0.0, 1.0 ];\r\n this._distance = 1.0;\r\n this._forward = new OrbitManipulator.Interpolator( 1 );\r\n this._side = new OrbitManipulator.Interpolator( 1 );\r\n this._lookPosition = new OrbitManipulator.Interpolator( 2 );\r\n this._stepFactor = 1.0; // meaning radius*stepFactor to move\r\n this._target = [ 0.0, 0.0, 0.0 ];\r\n this._angleVertical = 0.0;\r\n this._angleHorizontal = 0.0;\r\n\r\n // tmp value use for computation\r\n this._tmpComputeRotation1 = Matrix.create();\r\n this._tmpComputeRotation2 = Matrix.create();\r\n this._tmpComputeRotation3 = Matrix.create();\r\n this._tmpGetTargetDir = [ 0.0, 0.0, 0.0 ];\r\n\r\n this._rotBase = Matrix.create();\r\n\r\n var self = this;\r\n\r\n this._controllerList = {};\r\n FirstPersonManipulator.ControllerList.forEach( function ( value ) {\r\n if ( FirstPersonManipulator[ value ] !== undefined ) {\r\n self._controllerList[ value ] = new FirstPersonManipulator[ value ]( self );\r\n }\r\n } );\r\n\r\n },\r\n\r\n getEyePosition: function ( eye ) {\r\n eye[ 0 ] = this._eye[ 0 ];\r\n eye[ 1 ] = this._eye[ 1 ];\r\n eye[ 2 ] = this._eye[ 2 ];\r\n return eye;\r\n },\r\n\r\n setEyePosition: function ( eye ) {\r\n this._eye[ 0 ] = eye[ 0 ];\r\n this._eye[ 1 ] = eye[ 1 ];\r\n this._eye[ 2 ] = eye[ 2 ];\r\n return this;\r\n },\r\n\r\n getTarget: function ( pos ) {\r\n var dir = Vec3.mult( this._direction, this._distance, this._tmpGetTargetDir );\r\n Vec3.add( this._eye, dir, pos );\r\n return pos;\r\n },\r\n\r\n setTarget: function ( pos ) {\r\n this._target[ 0 ] = pos[ 0 ];\r\n this._target[ 1 ] = pos[ 1 ];\r\n this._target[ 2 ] = pos[ 2 ];\r\n var dir = this._tmpGetTargetDir;\r\n Vec3.sub( pos, this._eye, dir );\r\n dir[ 2 ] = 0.0;\r\n Vec3.normalize( dir, dir );\r\n this._angleHorizontal = Math.acos( dir[ 1 ] );\r\n if ( dir[ 0 ] < 0.0 ) {\r\n this._angleHorizontal = -this._angleHorizontal;\r\n }\r\n Vec3.sub( pos, this._eye, dir );\r\n Vec3.normalize( dir, dir );\r\n\r\n this._angleVertical = -Math.asin( dir[ 2 ] );\r\n Vec3.copy( dir, this._direction );\r\n },\r\n\r\n getLookPositionInterpolator: function () {\r\n return this._lookPosition;\r\n },\r\n getSideInterpolator: function () {\r\n return this._side;\r\n },\r\n getFowardInterpolator: function () {\r\n return this._forward;\r\n },\r\n\r\n computeRotation: ( function () {\r\n var upy = [ 0.0, 1.0, 0.0 ];\r\n var upz = [ 0.0, 0.0, 1.0 ];\r\n return function ( dx, dy ) {\r\n this._angleVertical += dy * 0.01;\r\n this._angleHorizontal -= dx * 0.01;\r\n\r\n var first = this._tmpComputeRotation1;\r\n var second = this._tmpComputeRotation2;\r\n var rotMat = this._tmpComputeRotation3;\r\n Matrix.makeRotate( -this._angleVertical, 1.0, 0.0, 0.0, first );\r\n Matrix.makeRotate( -this._angleHorizontal, 0.0, 0.0, 1.0, second );\r\n Matrix.mult( second, first, rotMat );\r\n\r\n // TOTO refactor the way the rotation matrix is managed\r\n Matrix.preMult( rotMat, this._rotBase );\r\n\r\n Matrix.transformVec3( rotMat, upy, this._direction );\r\n Vec3.normalize( this._direction, this._direction );\r\n\r\n Matrix.transformVec3( rotMat, upz, this._up );\r\n };\r\n } )(),\r\n reset: function () {\r\n this.init();\r\n },\r\n setDistance: function ( d ) {\r\n this._distance = d;\r\n },\r\n getDistance: function () {\r\n return this._distance;\r\n },\r\n setStepFactor: function ( t ) {\r\n this._stepFactor = t;\r\n },\r\n\r\n update: ( function () {\r\n var vec = [ 0.0, 0.0 ];\r\n return function ( nv ) {\r\n var t = nv.getFrameStamp().getSimulationTime();\r\n if ( this._lastUpdate === undefined ) {\r\n this._lastUpdate = t;\r\n }\r\n var dt = t - this._lastUpdate;\r\n this._lastUpdate = t;\r\n\r\n this._forward.update();\r\n this._side.update();\r\n var delta = this._lookPosition.update();\r\n\r\n this.computeRotation( -delta[ 0 ] * 0.5, -delta[ 1 ] * 0.5 );\r\n\r\n vec[ 0 ] = this._forward.getCurrent()[ 0 ];\r\n vec[ 1 ] = this._side.getCurrent()[ 0 ];\r\n if ( Vec2.length( vec ) > 1.0 ) {\r\n Vec2.normalize( vec, vec );\r\n }\r\n var factor = this._distance;\r\n if ( this._distance < 1e-3 ) {\r\n factor = 1.0;\r\n }\r\n this.moveForward( vec[ 0 ] * factor * this._stepFactor * dt );\r\n this.strafe( vec[ 1 ] * factor * this._stepFactor * dt );\r\n\r\n Vec3.add( this._eye, this._direction, this._target );\r\n\r\n Matrix.makeLookAt( this._eye, this._target, this._up, this._inverseMatrix );\r\n };\r\n } )(),\r\n setRotationBaseFromQuat: function ( quat ) {\r\n Matrix.makeRotateFromQuat( quat, this._rotBase );\r\n },\r\n\r\n moveForward: ( function () {\r\n var tmp = [ 0.0, 0.0, 0.0 ];\r\n return function ( distance ) {\r\n Vec3.normalize( this._direction, tmp );\r\n Vec3.mult( tmp, distance, tmp );\r\n Vec3.add( this._eye, tmp, this._eye );\r\n };\r\n } )(),\r\n\r\n strafe: ( function () {\r\n var tmp = [ 0.0, 0.0, 0.0 ];\r\n return function ( distance ) {\r\n Vec3.cross( this._direction, this._up, tmp );\r\n Vec3.normalize( tmp, tmp );\r\n Vec3.mult( tmp, distance, tmp );\r\n Vec3.add( this._eye, tmp, this._eye );\r\n };\r\n } )()\r\n } );\r\n\r\n ( function ( module ) {\r\n module.StandardMouseKeyboard = FirstPersonManipulatorMouseKeyboardController;\r\n } )( FirstPersonManipulator );\r\n\r\n ( function ( module ) {\r\n module.Oculus = FirstPersonManipulatorOculusController;\r\n } )( FirstPersonManipulator );\r\n\r\n ( function ( module ) {\r\n module.DeviceOrientation = FirstPersonManipulatorDeviceOrientationController;\r\n } )( FirstPersonManipulator );\r\n\r\n return FirstPersonManipulator;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgGA/FirstPersonManipulator.js\n ** module id = 96\n ** module chunks = 0 1\n **/","define( [], function () {\r\n\r\n var FirstPersonManipulatorMouseKeyboardController = function ( manipulator ) {\r\n this._manipulator = manipulator;\r\n this.init();\r\n };\r\n\r\n FirstPersonManipulatorMouseKeyboardController.prototype = {\r\n init: function () {\r\n this.releaseButton();\r\n this._delay = 0.15;\r\n this._stepFactor = 1.0; // meaning radius*stepFactor to move\r\n },\r\n setEventProxy: function ( proxy ) {\r\n this._eventProxy = proxy;\r\n },\r\n setManipulator: function ( manipulator ) {\r\n this._manipulator = manipulator;\r\n\r\n // we always want to sync speed of controller with manipulator\r\n this._manipulator.setStepFactor( this._stepFactor );\r\n },\r\n\r\n pushButton: function () {\r\n this._buttonup = false;\r\n },\r\n releaseButton: function () {\r\n this._buttonup = true;\r\n },\r\n\r\n mousedown: function ( ev ) {\r\n var pos = this._eventProxy.getPositionRelativeToCanvas( ev );\r\n var manipulator = this._manipulator;\r\n manipulator.getLookPositionInterpolator().set( pos[ 0 ], pos[ 1 ] );\r\n this.pushButton();\r\n },\r\n mouseup: function ( /*ev */) {\r\n this.releaseButton();\r\n },\r\n mouseout: function ( /*ev */) {\r\n this.releaseButton();\r\n },\r\n mousemove: function ( ev ) {\r\n if ( this._buttonup === true ) {\r\n return;\r\n }\r\n\r\n var pos = this._eventProxy.getPositionRelativeToCanvas( ev );\r\n this._manipulator.getLookPositionInterpolator().setDelay( this._delay );\r\n this._manipulator.getLookPositionInterpolator().setTarget( pos[ 0 ], pos[ 1 ] );\r\n },\r\n mousewheel: function ( ev, intDelta /*, deltaX, deltaY */ ) {\r\n ev.preventDefault();\r\n this._stepFactor = Math.min( Math.max( 0.001, this._stepFactor + intDelta * 0.01 ), 4.0 );\r\n this._manipulator.setStepFactor( this._stepFactor );\r\n },\r\n\r\n keydown: function ( event ) {\r\n var manipulator = this._manipulator;\r\n if ( event.keyCode === 32 ) {\r\n manipulator.computeHomePosition();\r\n event.preventDefault();\r\n } else if ( event.keyCode === 87 || event.keyCode === 90 || event.keyCode === 38 ) { // w/z/up\r\n manipulator.getFowardInterpolator().setDelay( this._delay );\r\n manipulator.getFowardInterpolator().setTarget( 1 );\r\n event.preventDefault();\r\n return false;\r\n } else if ( event.keyCode === 83 || event.keyCode === 40 ) { // S/down\r\n manipulator.getFowardInterpolator().setDelay( this._delay );\r\n manipulator.getFowardInterpolator().setTarget( -1 );\r\n event.preventDefault();\r\n return false;\r\n } else if ( event.keyCode === 68 || event.keyCode === 39 ) { // D/right\r\n manipulator.getSideInterpolator().setDelay( this._delay );\r\n manipulator.getSideInterpolator().setTarget( 1 );\r\n event.preventDefault();\r\n return false;\r\n } else if ( event.keyCode === 65 || event.keyCode === 81 || event.keyCode === 37 ) { // a/q/left\r\n manipulator.getSideInterpolator().setDelay( this._delay );\r\n manipulator.getSideInterpolator().setTarget( -1 );\r\n event.preventDefault();\r\n return false;\r\n }\r\n return undefined;\r\n },\r\n\r\n keyup: function ( event ) {\r\n var manipulator = this._manipulator;\r\n if ( event.keyCode === 87 || event.keyCode === 90 || event.keyCode === 38 || // w/z/up\r\n event.keyCode === 83 || event.keyCode === 40 ) { // S/down\r\n manipulator.getFowardInterpolator().setDelay( this._delay );\r\n manipulator.getFowardInterpolator().setTarget( 0 );\r\n return false;\r\n } else if ( event.keyCode === 68 || event.keyCode === 39 || // D/right\r\n event.keyCode === 65 || event.keyCode === 81 || event.keyCode === 37 ) { // a/q/left\r\n manipulator.getSideInterpolator().setDelay( this._delay );\r\n manipulator.getSideInterpolator().setTarget( 0 );\r\n return false;\r\n }\r\n return undefined;\r\n }\r\n\r\n };\r\n\r\n return FirstPersonManipulatorMouseKeyboardController;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgGA/FirstPersonManipulatorMouseKeyboardController.js\n ** module id = 97\n ** module chunks = 0 1\n **/","define( [], function () {\r\n\r\n 'use strict';\r\n\r\n var FirstPersonManipulatorOculusController = function ( manipulator ) {\r\n this._manipulator = manipulator;\r\n this.init();\r\n };\r\n\r\n FirstPersonManipulatorOculusController.prototype = {\r\n init: function () {},\r\n update: function ( quaternion ) {\r\n\r\n this._manipulator.setRotationBaseFromQuat( quaternion );\r\n },\r\n\r\n };\r\n\r\n return FirstPersonManipulatorOculusController;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgGA/FirstPersonManipulatorOculusController.js\n ** module id = 98\n ** module chunks = 0 1\n **/","define( [ 'osg/Quat' ], function ( Quat ) {\r\n\r\n var FirstPersonManipulatorDeviceOrientationController = function ( manipulator ) {\r\n this._manipulator = manipulator;\r\n this.init();\r\n };\r\n\r\n var degtorad = Math.PI / 180.0; // Degree-to-Radian conversion\r\n\r\n FirstPersonManipulatorDeviceOrientationController.prototype = {\r\n init: function () {\r\n this._stepFactor = 1.0; // meaning radius*stepFactor to move\r\n this._quat = Quat.create();\r\n },\r\n update: function ( deviceOrientation, screenOrientation ) {\r\n\r\n // If the user goes in landscape mode, he rotates his device with a certain angle\r\n // around the Z axis counterclockwise and the DeviceOrientation contains this rotation\r\n // To compensate this, we apply a rotation of the same angle in the opposite way\r\n\r\n computeQuaternion( this._quat, deviceOrientation, screenOrientation );\r\n this._manipulator.setRotationBaseFromQuat( this._quat );\r\n },\r\n\r\n };\r\n var computeQuaternion = ( function () {\r\n\r\n var screenTransform = Quat.create();\r\n var worldTransform = [ -Math.sqrt( 0.5 ), 0, 0, Math.sqrt( 0.5 ) ]; // - PI/2 around the x-axis\r\n var minusHalfAngle = 0;\r\n\r\n return function ( quat, deviceOrientation, screenOrientation ) {\r\n\r\n var alpha = deviceOrientation.alpha * degtorad;\r\n var beta = deviceOrientation.beta * degtorad;\r\n var gamma = deviceOrientation.gamma * degtorad;\r\n var screenAngle = screenOrientation * degtorad;\r\n\r\n setQuatFromEuler( quat, beta, alpha, -gamma, 'YXZ' );\r\n\r\n minusHalfAngle = -screenAngle / 2.0;\r\n screenTransform[ 1 ] = Math.sin( minusHalfAngle );\r\n screenTransform[ 3 ] = Math.cos( minusHalfAngle );\r\n\r\n Quat.mult( quat, screenTransform, quat );\r\n Quat.mult( quat, worldTransform, quat );\r\n\r\n var yTemp = quat[ 1 ];\r\n quat[ 1 ] = -quat[ 2 ];\r\n quat[ 2 ] = yTemp;\r\n\r\n return quat;\r\n };\r\n\r\n } )();\r\n\r\n var setQuatFromEuler = function ( quat, x, y, z, order ) {\r\n\r\n // http://www.mathworks.com/matlabcentral/fileexchange/\r\n // 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\r\n // content/SpinCalc.m\r\n\r\n var c1 = Math.cos( x / 2 );\r\n var c2 = Math.cos( y / 2 );\r\n var c3 = Math.cos( z / 2 );\r\n var s1 = Math.sin( x / 2 );\r\n var s2 = Math.sin( y / 2 );\r\n var s3 = Math.sin( z / 2 );\r\n\r\n if ( order === 'XYZ' ) {\r\n\r\n quat[ 0 ] = s1 * c2 * c3 + c1 * s2 * s3;\r\n quat[ 1 ] = c1 * s2 * c3 - s1 * c2 * s3;\r\n quat[ 2 ] = c1 * c2 * s3 + s1 * s2 * c3;\r\n quat[ 3 ] = c1 * c2 * c3 - s1 * s2 * s3;\r\n\r\n } else if ( order === 'YXZ' ) {\r\n\r\n quat[ 0 ] = s1 * c2 * c3 + c1 * s2 * s3;\r\n quat[ 1 ] = c1 * s2 * c3 - s1 * c2 * s3;\r\n quat[ 2 ] = c1 * c2 * s3 - s1 * s2 * c3;\r\n quat[ 3 ] = c1 * c2 * c3 + s1 * s2 * s3;\r\n\r\n } else if ( order === 'ZXY' ) {\r\n\r\n quat[ 0 ] = s1 * c2 * c3 - c1 * s2 * s3;\r\n quat[ 1 ] = c1 * s2 * c3 + s1 * c2 * s3;\r\n quat[ 2 ] = c1 * c2 * s3 + s1 * s2 * c3;\r\n quat[ 3 ] = c1 * c2 * c3 - s1 * s2 * s3;\r\n\r\n } else if ( order === 'ZYX' ) {\r\n\r\n quat[ 0 ] = s1 * c2 * c3 - c1 * s2 * s3;\r\n quat[ 1 ] = c1 * s2 * c3 + s1 * c2 * s3;\r\n quat[ 2 ] = c1 * c2 * s3 - s1 * s2 * c3;\r\n quat[ 3 ] = c1 * c2 * c3 + s1 * s2 * s3;\r\n\r\n } else if ( order === 'YZX' ) {\r\n\r\n quat[ 0 ] = s1 * c2 * c3 + c1 * s2 * s3;\r\n quat[ 1 ] = c1 * s2 * c3 + s1 * c2 * s3;\r\n quat[ 2 ] = c1 * c2 * s3 - s1 * s2 * c3;\r\n quat[ 3 ] = c1 * c2 * c3 - s1 * s2 * s3;\r\n\r\n } else if ( order === 'XZY' ) {\r\n\r\n quat[ 0 ] = s1 * c2 * c3 - c1 * s2 * s3;\r\n quat[ 1 ] = c1 * s2 * c3 - s1 * c2 * s3;\r\n quat[ 2 ] = c1 * c2 * s3 + s1 * s2 * c3;\r\n quat[ 3 ] = c1 * c2 * c3 + s1 * s2 * s3;\r\n\r\n }\r\n };\r\n\r\n return FirstPersonManipulatorDeviceOrientationController;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgGA/FirstPersonManipulatorDeviceOrientationController.js\n ** module id = 99\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/BoundingSphere',\r\n 'osg/ComputeBoundsVisitor',\r\n 'osg/Matrix'\r\n], function ( BoundingSphere, ComputeBoundsVisitor, Matrix ) {\r\n\r\n 'use strict';\r\n\r\n // Base class for Camera / User manipulator\r\n // flags is a bitfield use to enable options\r\n var Manipulator = function ( flags ) {\r\n this._flags = flags;\r\n if ( this._flags === undefined )\r\n this._flags = Manipulator.DEFAULT_SETTINGS;\r\n\r\n this._controllerList = {};\r\n this._inverseMatrix = Matrix.create();\r\n this._camera = undefined;\r\n this._node = undefined;\r\n this._frustum = {};\r\n };\r\n\r\n Manipulator.prototype = {\r\n setCamera: function ( c ) {\r\n this._camera = c;\r\n },\r\n getCamera: function () {\r\n return this._camera;\r\n },\r\n setNode: function ( node ) {\r\n this._node = node;\r\n },\r\n getHomeBound: function ( useBoundingBox ) {\r\n if ( !this._node )\r\n return;\r\n\r\n var bs;\r\n if ( useBoundingBox || this._flags & Manipulator.COMPUTE_HOME_USING_BBOX ) {\r\n bs = new BoundingSphere();\r\n var visitor = new ComputeBoundsVisitor();\r\n this._node.accept( visitor );\r\n var bb = visitor.getBoundingBox();\r\n\r\n if ( bb.valid() )\r\n bs.expandByBoundingBox( bb );\r\n } else {\r\n bs = this._node.getBound();\r\n }\r\n return bs;\r\n },\r\n getHomeDistance: function ( bs ) {\r\n var frustum = this._frustum;\r\n var dist = bs.radius();\r\n if ( this._camera && Matrix.getFrustum( this._camera.getProjectionMatrix(), frustum ) ) {\r\n var vertical2 = Math.abs( frustum.right - frustum.left ) / frustum.zNear / 2;\r\n var horizontal2 = Math.abs( frustum.top - frustum.bottom ) / frustum.zNear / 2;\r\n dist /= Math.sin( Math.atan2( horizontal2 < vertical2 ? horizontal2 : vertical2, 1 ) );\r\n } else {\r\n dist *= 1.5;\r\n }\r\n return dist;\r\n },\r\n // eg: var currentTime = nv.getFrameStamp().getSimulationTime();\r\n update: function ( /*nv*/) {},\r\n\r\n getInverseMatrix: function () {\r\n return this._inverseMatrix;\r\n },\r\n\r\n getControllerList: function () {\r\n return this._controllerList;\r\n }\r\n };\r\n\r\n Manipulator.COMPUTE_HOME_USING_BBOX = 0x02;\r\n Manipulator.DEFAULT_SETTINGS = 0;\r\n\r\n return Manipulator;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgGA/Manipulator.js\n ** module id = 100\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/Vec3',\r\n 'osg/Matrix',\r\n 'osgGA/Manipulator',\r\n 'osgGA/OrbitManipulatorLeapMotionController',\r\n 'osgGA/OrbitManipulatorMouseKeyboardController',\r\n 'osgGA/OrbitManipulatorHammerController',\r\n 'osgGA/OrbitManipulatorGamePadController',\r\n 'osgGA/OrbitManipulatorDeviceOrientationController',\r\n 'osgGA/OrbitManipulatorOculusController',\r\n\r\n], function ( MACROUTILS, Vec3, Matrix, Manipulator, OrbitManipulatorLeapMotionController, OrbitManipulatorMouseKeyboardController, OrbitManipulatorHammerController, OrbitManipulatorGamePadController, OrbitManipulatorDeviceOrientationController, OrbitManipulatorOculusController ) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * OrbitManipulator\r\n * @class\r\n */\r\n var OrbitManipulator = function () {\r\n Manipulator.call( this );\r\n this._homePosition = [ 0.0, 0.0, 0.0 ];\r\n this._frustum = {};\r\n this.init();\r\n };\r\n\r\n OrbitManipulator.Interpolator = function ( size, delay ) {\r\n this._current = new Array( size );\r\n this._target = new Array( size );\r\n this._delta = new Array( size );\r\n this._delay = ( delay !== undefined ) ? delay : 0.15;\r\n this._reset = false;\r\n this.reset();\r\n };\r\n OrbitManipulator.Interpolator.prototype = {\r\n setDelay: function ( delay ) {\r\n this._delay = delay;\r\n },\r\n reset: function () {\r\n for ( var i = 0, l = this._current.length; i < l; i++ ) {\r\n this._current[ i ] = this._target[ i ] = 0;\r\n }\r\n this._reset = true;\r\n },\r\n update: function () {\r\n for ( var i = 0, l = this._current.length; i < l; i++ ) {\r\n var d = ( this._target[ i ] - this._current[ i ] ) * this._delay;\r\n this._delta[ i ] = d;\r\n this._current[ i ] += d;\r\n }\r\n return this._delta;\r\n },\r\n set: function () {\r\n for ( var i = 0, l = this._current.length; i < l; i++ ) {\r\n this._current[ i ] = this._target[ i ] = arguments[ i ];\r\n }\r\n this._reset = false;\r\n },\r\n isReset: function () {\r\n return this._reset;\r\n },\r\n getCurrent: function () {\r\n return this._current;\r\n },\r\n setTarget: function () {\r\n for ( var i = 0, l = this._target.length; i < l; i++ ) {\r\n if ( this._reset ) {\r\n this._target[ i ] = this._current[ i ] = arguments[ i ];\r\n } else {\r\n this._target[ i ] = arguments[ i ];\r\n }\r\n }\r\n this._reset = false;\r\n },\r\n addTarget: function () {\r\n for ( var i = 0; i < arguments.length; i++ ) {\r\n this._target[ i ] += arguments[ i ];\r\n }\r\n },\r\n getTarget: function () {\r\n return this._target;\r\n },\r\n getDelta: function () {\r\n return this._delta;\r\n }\r\n };\r\n\r\n OrbitManipulator.AvailableControllerList = [ 'StandardMouseKeyboard',\r\n 'LeapMotion',\r\n 'GamePad',\r\n 'Hammer',\r\n 'DeviceOrientation',\r\n 'Oculus',\r\n ];\r\n\r\n OrbitManipulator.ControllerList = [ 'StandardMouseKeyboard',\r\n 'LeapMotion',\r\n 'GamePad',\r\n 'Hammer',\r\n 'DeviceOrientation',\r\n 'Oculus',\r\n ];\r\n\r\n /** @lends OrbitManipulator.prototype */\r\n OrbitManipulator.prototype = MACROUTILS.objectInherit( Manipulator.prototype, {\r\n init: function () {\r\n this._distance = 25.0;\r\n this._target = [ 0.0, 0.0, 0.0 ];\r\n this._upz = [ 0.0, 0.0, 1.0 ];\r\n Vec3.init( this._target );\r\n\r\n var rot1 = Matrix.makeRotate( -Math.PI, 0.0, 0.0, 1.0, Matrix.create() );\r\n var rot2 = Matrix.makeRotate( Math.PI / 10.0, 1.0, 0.0, 0.0, Matrix.create() );\r\n this._rotation = Matrix.create();\r\n Matrix.mult( rot1, rot2, this._rotation );\r\n this._time = 0.0;\r\n this._rotBase = Matrix.create();\r\n\r\n this._rotate = new OrbitManipulator.Interpolator( 2 );\r\n this._pan = new OrbitManipulator.Interpolator( 2 );\r\n this._zoom = new OrbitManipulator.Interpolator( 1 );\r\n this._zoom.reset = function () {\r\n OrbitManipulator.Interpolator.prototype.reset.call( this );\r\n this._start = 0.0;\r\n };\r\n\r\n this._buttonup = true;\r\n\r\n this._scale = 10.0;\r\n this._maxDistance = Infinity;\r\n this._minDistance = 1e-10;\r\n this._scaleMouseMotion = 1.0;\r\n\r\n this._inverseMatrix = Matrix.create();\r\n this._rotateKey = 65; // a\r\n this._zoomKey = 83; // s\r\n this._panKey = 68; // d\r\n\r\n // instance of controller\r\n var self = this;\r\n\r\n OrbitManipulator.ControllerList.forEach( function ( value ) {\r\n if ( OrbitManipulator[ value ] !== undefined ) {\r\n self._controllerList[ value ] = new OrbitManipulator[ value ]( self );\r\n }\r\n } );\r\n },\r\n reset: function () {\r\n this.init();\r\n },\r\n setTarget: function ( target ) {\r\n Vec3.copy( target, this._target );\r\n var eyePos = [ 0.0, 0.0, 0.0 ];\r\n this.getEyePosition( eyePos );\r\n this._distance = Vec3.distance( eyePos, target );\r\n },\r\n setEyePosition: ( function () {\r\n var f = [ 0.0, 0.0, 0.0 ];\r\n var s = [ 0.0, 0.0, 0.0 ];\r\n var u = [ 0.0, 0.0, 0.0 ];\r\n return function ( eye ) {\r\n var result = this._rotation;\r\n var center = this._target;\r\n\r\n Vec3.sub( eye, center, f );\r\n Vec3.normalize( f, f );\r\n\r\n Vec3.cross( f, this._upz, s );\r\n Vec3.normalize( s, s );\r\n\r\n Vec3.cross( s, f, u );\r\n Vec3.normalize( u, u );\r\n\r\n // s[0], f[0], u[0], 0.0,\r\n // s[1], f[1], u[1], 0.0,\r\n // s[2], f[2], u[2], 0.0,\r\n // 0, 0, 0, 1.0\r\n result[ 0 ] = s[ 0 ];\r\n result[ 1 ] = f[ 0 ];\r\n result[ 2 ] = u[ 0 ];\r\n result[ 3 ] = 0.0;\r\n result[ 4 ] = s[ 1 ];\r\n result[ 5 ] = f[ 1 ];\r\n result[ 6 ] = u[ 1 ];\r\n result[ 7 ] = 0.0;\r\n result[ 8 ] = s[ 2 ];\r\n result[ 9 ] = f[ 2 ];\r\n result[ 10 ] = u[ 2 ];\r\n result[ 11 ] = 0.0;\r\n result[ 12 ] = 0;\r\n result[ 13 ] = 0;\r\n result[ 14 ] = 0;\r\n result[ 15 ] = 1.0;\r\n\r\n this._distance = Vec3.distance( eye, center );\r\n };\r\n } )(),\r\n computeHomePosition: function ( useBoundingBox ) {\r\n var bs = this.getHomeBound( useBoundingBox );\r\n if ( !bs ) return;\r\n this.setDistance( this.getHomeDistance( bs ) );\r\n this.setTarget( bs.center() );\r\n },\r\n\r\n getHomePosition: function () {\r\n\r\n if ( this._node !== undefined ) {\r\n\r\n var target = this._target;\r\n var distance = this.getDistance();\r\n\r\n this.computeEyePosition( target, distance, this._homePosition );\r\n }\r\n return this._homePosition;\r\n },\r\n\r\n setMaxDistance: function ( d ) {\r\n this._maxDistance = d;\r\n },\r\n setMinDistance: function ( d ) {\r\n this._minDistance = d;\r\n },\r\n setDistance: function ( d ) {\r\n this._distance = d;\r\n },\r\n getDistance: function () {\r\n return this._distance;\r\n },\r\n setRotationBaseFromQuat: function ( quat ) {\r\n Matrix.makeRotateFromQuat( quat, this._rotBase );\r\n },\r\n computePan: ( function () {\r\n var inv = Matrix.create();\r\n var x = [ 0.0, 0.0, 0.0 ];\r\n var y = [ 0.0, 0.0, 0.0 ];\r\n return function ( dx, dy ) {\r\n var proj = this._camera.getProjectionMatrix();\r\n // modulate panning speed with verticalFov value\r\n // if it's an orthographic we don't change the panning speed\r\n // TODO : manipulators in osgjs don't support well true orthographic camera anyway because they\r\n // manage the view matrix (and you need to edit the projection matrix to 'zoom' for true ortho camera) \r\n var vFov = proj[ 15 ] === 1 ? 1.0 : 2.00 / proj[ 5 ];\r\n dy *= this._distance * vFov;\r\n dx *= this._distance * vFov;\r\n\r\n Matrix.inverse( this._rotation, inv );\r\n x[ 0 ] = Matrix.get( inv, 0, 0 );\r\n x[ 1 ] = Matrix.get( inv, 0, 1 );\r\n x[ 2 ] = Matrix.get( inv, 0, 2 );\r\n Vec3.normalize( x, x );\r\n\r\n y[ 0 ] = Matrix.get( inv, 2, 0 );\r\n y[ 1 ] = Matrix.get( inv, 2, 1 );\r\n y[ 2 ] = Matrix.get( inv, 2, 2 );\r\n Vec3.normalize( y, y );\r\n\r\n Vec3.mult( x, -dx, x );\r\n Vec3.mult( y, dy, y );\r\n Vec3.add( this._target, x, this._target );\r\n Vec3.add( this._target, y, this._target );\r\n };\r\n } )(),\r\n computeRotation: ( function () {\r\n var of = Matrix.create();\r\n var r = Matrix.create();\r\n var r2 = Matrix.create();\r\n var inv = Matrix.create();\r\n var tmp = [ 0.0, 0.0, 0.0 ];\r\n var tmpDist = [ 0.0, 0.0, 0.0 ];\r\n return function ( dx, dy ) {\r\n Matrix.makeRotate( -dx / 10.0, 0.0, 0.0, 1.0, of );\r\n Matrix.mult( this._rotation, of, r );\r\n\r\n Matrix.makeRotate( -dy / 10.0, 1.0, 0.0, 0.0, of );\r\n Matrix.mult( of, r, r2 );\r\n\r\n // test that the eye is not too up and not too down to not kill\r\n // the rotation matrix\r\n Matrix.inverse( r2, inv );\r\n tmpDist[ 1 ] = this._distance;\r\n Matrix.transformVec3( inv, tmpDist, tmp );\r\n\r\n Vec3.neg( tmp, tmp );\r\n Vec3.normalize( tmp, tmp );\r\n\r\n var p = Vec3.dot( tmp, this._upz );\r\n if ( Math.abs( p ) > 0.95 ) {\r\n //discard rotation on y\r\n Matrix.copy( r, this._rotation );\r\n return;\r\n }\r\n Matrix.copy( r2, this._rotation );\r\n };\r\n } )(),\r\n computeZoom: function ( dz ) {\r\n this.zoom( dz );\r\n },\r\n\r\n zoom: function ( ratio ) {\r\n var newValue = this._distance * ratio;\r\n if ( this._minDistance > 0.0 ) {\r\n if ( newValue < this._minDistance ) {\r\n newValue = this._minDistance;\r\n }\r\n }\r\n if ( this._maxDistance > 0.0 ) {\r\n if ( newValue > this._maxDistance ) {\r\n newValue = this._maxDistance;\r\n }\r\n }\r\n this._distance = newValue;\r\n },\r\n\r\n getRotateInterpolator: function () {\r\n return this._rotate;\r\n },\r\n getPanInterpolator: function () {\r\n return this._pan;\r\n },\r\n getZoomInterpolator: function () {\r\n return this._zoom;\r\n },\r\n getTarget: function ( target ) {\r\n Vec3.copy( this._target, target );\r\n return target;\r\n },\r\n getEyePosition: function ( eye ) {\r\n this.computeEyePosition( this._target, this._distance, eye );\r\n return eye;\r\n },\r\n\r\n computeEyePosition: ( function () {\r\n var tmpDist = [ 0.0, 0.0, 0.0 ];\r\n var tmpInverse = Matrix.create();\r\n return function ( target, distance, eye ) {\r\n Matrix.inverse( this._rotation, tmpInverse );\r\n tmpDist[ 1 ] = distance;\r\n Matrix.transformVec3( tmpInverse, tmpDist, eye );\r\n Vec3.add( target, eye, eye );\r\n };\r\n } )(),\r\n\r\n update: ( function () {\r\n var eye = [ 0.0, 0.0, 0.0 ];\r\n return function ( nv ) {\r\n var t = nv.getFrameStamp().getSimulationTime();\r\n if ( this._lastUpdate === undefined ) {\r\n this._lastUpdate = t;\r\n }\r\n //var dt = t - this._lastUpdate;\r\n this._lastUpdate = t;\r\n\r\n var delta;\r\n var mouseFactor = 0.1;\r\n delta = this._rotate.update();\r\n this.computeRotation( -delta[ 0 ] * mouseFactor * this._scaleMouseMotion, -delta[ 1 ] * mouseFactor * this._scaleMouseMotion );\r\n\r\n\r\n var panFactor = 0.002;\r\n delta = this._pan.update();\r\n this.computePan( -delta[ 0 ] * panFactor, -delta[ 1 ] * panFactor );\r\n\r\n\r\n delta = this._zoom.update();\r\n this.computeZoom( 1.0 + delta[ 0 ] / 10.0 );\r\n\r\n var target = this._target;\r\n var distance = this._distance;\r\n\r\n /* 1. Works but bypass other manipulators */\r\n // Matrix.copy( this._rotBase, this._inverseMatrix );\r\n\r\n /* 2. Works but gets broken by other manipulators */\r\n Matrix.inverse( this._rotation, this._inverseMatrix );\r\n Matrix.postMult( this._rotBase, this._inverseMatrix );\r\n\r\n /* 3. Doesnt' work */\r\n // Matrix.preMult( this._rotBase, this._rotation );\r\n // Matrix.inverse( this._rotBase, this._inverseMatrix );\r\n\r\n Vec3.set( 0.0, distance, 0.0, eye );\r\n Matrix.transformVec3( this._inverseMatrix, eye, eye );\r\n\r\n Matrix.makeLookAt( Vec3.add( target, eye, eye ), target, this._upz, this._inverseMatrix );\r\n };\r\n } )()\r\n } );\r\n\r\n ( function ( module ) {\r\n module.LeapMotion = OrbitManipulatorLeapMotionController;\r\n } )( OrbitManipulator );\r\n\r\n ( function ( module ) {\r\n module.StandardMouseKeyboard = OrbitManipulatorMouseKeyboardController;\r\n } )( OrbitManipulator );\r\n\r\n ( function ( module ) {\r\n module.Hammer = OrbitManipulatorHammerController;\r\n } )( OrbitManipulator );\r\n\r\n ( function ( module ) {\r\n module.GamePad = OrbitManipulatorGamePadController;\r\n } )( OrbitManipulator );\r\n\r\n ( function ( module ) {\r\n module.DeviceOrientation = OrbitManipulatorDeviceOrientationController;\r\n } )( OrbitManipulator );\r\n\r\n ( function ( module ) {\r\n module.Oculus = OrbitManipulatorOculusController;\r\n } )( OrbitManipulator );\r\n\r\n return OrbitManipulator;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgGA/OrbitManipulator.js\n ** module id = 101\n ** module chunks = 0 1\n **/","define( [], function () {\r\n\r\n 'use strict';\r\n\r\n var OrbitManipulatorGamePadController = function ( manipulator ) {\r\n this._manipulator = manipulator;\r\n this.init();\r\n };\r\n\r\n OrbitManipulatorGamePadController.prototype = {\r\n init: function () {\r\n this._delay = 0.15;\r\n this._threshold = 0.08;\r\n this._mode = 0;\r\n this._padFactor = 10.0;\r\n this._zoomFactor = 0.5;\r\n this._rotateFactor = 5.0;\r\n },\r\n\r\n\r\n addPan: function ( pan, x, y ) {\r\n pan.setDelay( this._delay );\r\n pan.addTarget( x * this._padFactor, y * this._padFactor );\r\n },\r\n\r\n addZoom: function ( zoom, z ) {\r\n zoom.setDelay( this._delay );\r\n zoom.addTarget( z * this._zoomFactor );\r\n },\r\n\r\n addRotate: function ( rotate, x, y ) {\r\n rotate.setDelay( this._delay );\r\n //var rotateTarget = rotate.getTarget();\r\n rotate.addTarget( x * this._rotateFactor, y * this._rotateFactor );\r\n },\r\n\r\n gamepadaxes: function ( axes ) {\r\n\r\n // Block badly balanced controllers\r\n var AXIS_THRESHOLD = 0.005;\r\n\r\n //var rotateTarget, panTarget;\r\n var rotate = this._manipulator.getRotateInterpolator();\r\n var zoom = this._manipulator.getZoomInterpolator();\r\n var pan = this._manipulator.getPanInterpolator();\r\n // Regular gamepads\r\n if ( axes.length === 4 ) {\r\n\r\n if ( Math.abs( axes[ 0 ] ) > AXIS_THRESHOLD || Math.abs( axes[ 1 ] ) > AXIS_THRESHOLD ) {\r\n this.addRotate( rotate, -axes[ 0 ], axes[ 1 ] );\r\n }\r\n if ( Math.abs( axes[ 3 ] ) > AXIS_THRESHOLD ) {\r\n this.addZoom( zoom, -axes[ 3 ] );\r\n }\r\n\r\n //SpaceNavigator & 6-axis controllers\r\n } else if ( axes.length >= 5 ) {\r\n //Notify.log(axes);\r\n if ( Math.abs( axes[ 0 ] ) > AXIS_THRESHOLD || Math.abs( axes[ 1 ] ) > AXIS_THRESHOLD ) {\r\n this.addPan( pan, -axes[ 0 ], axes[ 1 ] );\r\n }\r\n\r\n if ( Math.abs( axes[ 2 ] ) > AXIS_THRESHOLD ) {\r\n this.addZoom( zoom, -axes[ 2 ] );\r\n }\r\n\r\n if ( Math.abs( axes[ 3 ] ) > AXIS_THRESHOLD || Math.abs( axes[ 4 ] ) > AXIS_THRESHOLD ) {\r\n this.addRotate( rotate, axes[ 4 ], axes[ 3 ] );\r\n }\r\n }\r\n\r\n },\r\n\r\n gamepadbuttondown: function ( event /*, pressed */ ) {\r\n // Buttons 12 to 15 are the d-pad.\r\n if ( event.button >= 12 && event.button <= 15 ) {\r\n var pan = this._manipulator.getPanInterpolator();\r\n var panTarget = pan.getTarget();\r\n var delta = {\r\n 12: [ 0, -1 ],\r\n 13: [ 0, 1 ],\r\n 14: [ -1, 0 ],\r\n 15: [ 1, 0 ]\r\n }[ event.button ];\r\n pan.setDelay( this._delay );\r\n pan.setTarget( panTarget[ 0 ] - delta[ 0 ] * 10, panTarget[ 1 ] + delta[ 1 ] * 10 );\r\n }\r\n },\r\n\r\n update: function ( gm ) {\r\n if ( !gm ) {\r\n return;\r\n }\r\n\r\n var axis = gm.axes;\r\n var buttons = gm.buttons;\r\n\r\n this.gamepadaxes( axis );\r\n\r\n // Dummy event wrapper\r\n var emptyFunc = function () {};\r\n for ( var i = 0; i < buttons.length; i++ ) {\r\n if ( buttons[ i ] ) {\r\n this.gamepadbuttondown( {\r\n preventDefault: emptyFunc,\r\n gamepad: gm,\r\n button: i\r\n }, !!buttons[ i ] );\r\n }\r\n }\r\n }\r\n };\r\n return OrbitManipulatorGamePadController;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgGA/OrbitManipulatorGamePadController.js\n ** module id = 102\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Notify'\r\n], function ( Notify ) {\r\n\r\n var OrbitManipulatorHammerController = function ( manipulator ) {\r\n this._manipulator = manipulator;\r\n this.init();\r\n };\r\n\r\n OrbitManipulatorHammerController.prototype = {\r\n init: function () {\r\n this._panFactorX = 1.0;\r\n this._panFactorY = -this._panFactorX;\r\n\r\n this._rotateFactorX = 0.6;\r\n this._rotateFactorY = -this._rotateFactorX;\r\n this._zoomFactor = 5.0;\r\n\r\n this._pan = false;\r\n this._delay = 0.15;\r\n },\r\n setEventProxy: function ( proxy ) {\r\n if ( proxy === undefined || ( proxy !== undefined && proxy === this._eventProxy ) ) {\r\n return;\r\n }\r\n this._eventProxy = proxy;\r\n var self = this;\r\n var hammer = proxy;\r\n var computeTouches = function ( event ) {\r\n if ( event.pointers !== undefined )\r\n return event.pointers.length;\r\n return 1; // mouse\r\n };\r\n\r\n var dragCB = function ( ev ) {\r\n return 'touches ' + computeTouches( ev ) + ' distance ' + ev.distance + ' x ' + ev.deltaX + ' y ' + ev.deltaY;\r\n };\r\n // Set a minimal thresold on pinch event, to be detected after pan\r\n hammer.get( 'pinch' ).set( {\r\n threshold: 0.1\r\n } );\r\n // Let the pan be detected with two fingers.\r\n hammer.get( 'pan' ).set( {\r\n threshold: 0,\r\n pointers: 0\r\n } );\r\n hammer.get( 'pinch' ).recognizeWith( hammer.get( 'pan' ) );\r\n\r\n hammer.on( 'panstart ', function ( event ) {\r\n var manipulator = self._manipulator;\r\n if ( !manipulator || self._transformStarted ) {\r\n return;\r\n }\r\n var gesture = event;\r\n if ( computeTouches( gesture ) === 2 ) {\r\n self._pan = true;\r\n }\r\n\r\n self._dragStarted = true;\r\n if ( self._pan ) {\r\n manipulator.getPanInterpolator().reset();\r\n manipulator.getPanInterpolator().set( event.center.x * self._panFactorX, event.center.y * self._panFactorY );\r\n } else {\r\n manipulator.getRotateInterpolator().reset();\r\n manipulator.getRotateInterpolator().set( event.center.x * self._rotateFactorX, event.center.y * self._rotateFactorY );\r\n }\r\n Notify.debug( 'drag start, ' + dragCB( gesture ) );\r\n } );\r\n\r\n hammer.on( 'panmove', function ( event ) {\r\n var manipulator = self._manipulator;\r\n if ( !manipulator ) {\r\n return;\r\n }\r\n if ( !self._dragStarted ) {\r\n return;\r\n }\r\n var gesture = event;\r\n if ( self._pan ) {\r\n manipulator.getPanInterpolator().setTarget( event.center.x * self._panFactorX, event.center.y * self._panFactorY );\r\n Notify.debug( 'pan, ' + dragCB( gesture ) );\r\n } else {\r\n manipulator.getRotateInterpolator().setDelay( self._delay );\r\n manipulator.getRotateInterpolator().setTarget( event.center.x * self._rotateFactorX, event.center.y * self._rotateFactorY );\r\n Notify.debug( 'rotate, ' + dragCB( gesture ) );\r\n }\r\n } );\r\n\r\n hammer.on( 'panend', function ( event ) {\r\n var manipulator = self._manipulator;\r\n if ( !manipulator || !self._dragStarted ) {\r\n return;\r\n }\r\n self._dragStarted = false;\r\n var gesture = event;\r\n self._pan = false;\r\n Notify.debug( 'drag end, ' + dragCB( gesture ) );\r\n } );\r\n\r\n var toucheScale;\r\n\r\n hammer.on( 'pinchstart', function ( event ) {\r\n var manipulator = self._manipulator;\r\n if ( !manipulator ) {\r\n return;\r\n }\r\n self._transformStarted = true;\r\n var gesture = event;\r\n\r\n toucheScale = gesture.scale;\r\n manipulator.getZoomInterpolator().reset();\r\n manipulator.getZoomInterpolator().set( toucheScale );\r\n event.preventDefault();\r\n Notify.debug( 'zoom start, ' + dragCB( gesture ) );\r\n } );\r\n\r\n hammer.on( 'pinchend', function ( event ) {\r\n self._transformStarted = false;\r\n Notify.debug( 'zoom end, ' + dragCB( event ) );\r\n } );\r\n\r\n hammer.on( 'pinchin pinchout', function ( event ) {\r\n var manipulator = self._manipulator;\r\n if ( !manipulator || !self._transformStarted ) {\r\n return;\r\n }\r\n var gesture = event;\r\n var scale = ( gesture.scale - toucheScale ) * self._zoomFactor;\r\n toucheScale = gesture.scale;\r\n var target = manipulator.getZoomInterpolator().getTarget()[ 0 ];\r\n manipulator.getZoomInterpolator().setTarget( target - scale );\r\n Notify.debug( 'zoom, ' + dragCB( gesture ) );\r\n } );\r\n\r\n },\r\n setManipulator: function ( manipulator ) {\r\n this._manipulator = manipulator;\r\n }\r\n };\r\n return OrbitManipulatorHammerController;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgGA/OrbitManipulatorHammerController.js\n ** module id = 103\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Notify',\r\n 'osg/Vec3'\r\n], function ( Notify, Vec3 ) {\r\n\r\n var OrbitManipulatorLeapMotionController = function ( manipulator ) {\r\n this._manipulator = manipulator;\r\n this.init();\r\n };\r\n\r\n var ModeConfig = {\r\n 'rotate': {\r\n dtx: -1.2 * 1.2,\r\n dty: -0.9 * 1.2,\r\n dtz: -0.1,\r\n delay: 0.05,\r\n method: 'getRotateInterpolator'\r\n },\r\n 'pan': {\r\n dtx: -1.2 * 1.2,\r\n dty: -0.9 * 1.2,\r\n delay: 0.05,\r\n method: 'getPanInterpolator'\r\n },\r\n 'zoom': {\r\n dtx: 0.0,\r\n dty: -0.5,\r\n delay: 0.05,\r\n method: 'getZoomInterpolator'\r\n },\r\n 'zoom-twohands': {\r\n dtx: -0.05,\r\n dty: 0.0,\r\n delay: 0.05,\r\n method: 'getZoomInterpolator'\r\n }\r\n };\r\n\r\n OrbitManipulatorLeapMotionController.prototype = {\r\n init: function () {\r\n this._virtualCursor = [ 0.0, 0.0 ];\r\n this._targetPosition = [ 0.0, 0.0 ];\r\n this._previousFrame = undefined;\r\n this._displacement = [ 0.0, 0.0 ];\r\n this._top = [ 0, 1, 0 ];\r\n this._motion = [ 0.0, 0.0 ];\r\n this._delay = 0.05;\r\n this._threshold = 0.08;\r\n this._directionDotThreshold = 0.5;\r\n this._mode = 'rotate';\r\n },\r\n\r\n update: function ( frame ) {\r\n if ( !this._previousFrame ) {\r\n this._previousFrame = frame;\r\n }\r\n\r\n // no fingers ? return\r\n if ( frame.fingers.length === 0 ) {\r\n return;\r\n }\r\n\r\n var deltaFrame = this._previousFrame.translation( frame );\r\n\r\n this._previousFrame = frame;\r\n\r\n if ( frame.hands.length === 0 ) {\r\n return;\r\n }\r\n\r\n // filter noise\r\n if ( Math.abs( deltaFrame[ 0 ] ) < this._threshold &&\r\n Math.abs( deltaFrame[ 1 ] ) < this._threshold ) {\r\n return;\r\n }\r\n\r\n var mode = this._mode;\r\n var dist = 0;\r\n\r\n // scale is when there two hands with but with two hand with more than 1 fingers\r\n if ( frame.gestures.length > 0 ) {\r\n for ( var i = 0; i < frame.gestures.length; i++ ) {\r\n var gesture = frame.gestures[ i ];\r\n if ( gesture.type === 'circle' ) {\r\n this._manipulator.computeHomePosition();\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if ( frame.hands.length === 1 ) {\r\n if ( frame.hands[ 0 ].fingers.length >= 3 ) {\r\n mode = 'zoom';\r\n dist = frame.hands[ 0 ].palmPosition[ 1 ] / 10.0;\r\n dist = Math.max( dist - 4, 0.01 );\r\n\r\n } else if ( frame.hands[ 0 ].fingers.length > 1 ) {\r\n mode = 'pan';\r\n } else {\r\n // by default onw hand moving means rotation\r\n mode = 'rotate';\r\n }\r\n } else if ( frame.hands.length === 2 ) {\r\n var d0 = Math.abs( Vec3.dot( frame.hands[ 0 ].palmNormal, this._top ) ),\r\n d1 = Math.abs( Vec3.dot( frame.hands[ 1 ].palmNormal, this._top ) );\r\n\r\n // two hands : zoom\r\n if ( d0 < this._directionDotThreshold && d1 < this._directionDotThreshold ) {\r\n mode = 'zoom-twohands';\r\n } else {\r\n // if hands flat do nothing\r\n mode = undefined;\r\n this._handsDistanceOld = undefined;\r\n }\r\n }\r\n var zoom = this._manipulator.getZoomInterpolator();\r\n\r\n if ( mode === undefined ) {\r\n return;\r\n }\r\n // change mode reset counter and skip this frame\r\n if ( mode !== this._mode ) {\r\n Notify.info( 'Switch to mode ' + mode );\r\n\r\n this._motion[ 0 ] = 0;\r\n this._motion[ 1 ] = 0;\r\n this._mode = mode;\r\n\r\n if ( mode === 'zoom' || mode === 'zoom-twohands' ) {\r\n if ( zoom.isReset() ) {\r\n zoom._start = 1.0;\r\n zoom.set( 0.0 );\r\n }\r\n }\r\n return;\r\n }\r\n\r\n var dtx, dty, dtz;\r\n dtx = ModeConfig[ mode ].dtx;\r\n dty = ModeConfig[ mode ].dty;\r\n dtz = ModeConfig[ mode ].dtz;\r\n\r\n this._motion[ 0 ] += deltaFrame[ 0 ] * dtx;\r\n this._motion[ 1 ] += deltaFrame[ 1 ] * dty;\r\n\r\n var delay = ModeConfig[ mode ].delay;\r\n\r\n // we use the mode enum to get the good method\r\n var method = ModeConfig[ mode ].method;\r\n this._manipulator[ method ]().setDelay( delay );\r\n\r\n if ( mode === 'zoom' ) {\r\n Notify.log( dist );\r\n zoom.setTarget( dist );\r\n } else if ( mode === 'zoom-twohands' ) { // two hands zoom\r\n // distance between two hands\r\n var handsDistance = Vec3.distance( frame.hands[ 0 ].palmPosition, frame.hands[ 1 ].palmPosition );\r\n\r\n if ( this._handsDistanceOld !== undefined ) {\r\n // compare distance with lastframe and zoom if they get nearer, unzoom if they separate\r\n var vel = dtx * ( handsDistance - this._handsDistanceOld );\r\n\r\n dist = zoom._target;\r\n dist[ 0 ] += vel;\r\n }\r\n this._handsDistanceOld = handsDistance;\r\n } else {\r\n if ( mode === 'rotate' ) {\r\n dist = zoom._target[ 0 ];\r\n dist += deltaFrame[ 2 ] * dtz;\r\n dist = Math.max( dist, 0.01 );\r\n zoom.setTarget( dist );\r\n }\r\n this._manipulator[ method ]().addTarget( this._motion[ 0 ], this._motion[ 1 ] );\r\n }\r\n\r\n this._motion[ 1 ] = this._motion[ 0 ] = 0;\r\n }\r\n };\r\n return OrbitManipulatorLeapMotionController;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgGA/OrbitManipulatorLeapMotionController.js\n ** module id = 104\n ** module chunks = 0 1\n **/","define( [\r\n 'osgGA/OrbitManipulatorEnums'\r\n], function ( OrbitManipulatorEnums ) {\r\n\r\n var OrbitManipulatorMouseKeyboardController = function ( manipulator ) {\r\n this._manipulator = manipulator;\r\n this.init();\r\n };\r\n\r\n OrbitManipulatorMouseKeyboardController.prototype = {\r\n init: function () {\r\n this.releaseButton();\r\n this._rotateKey = 65; // a\r\n this._zoomKey = 83; // s\r\n this._panKey = 68; // d\r\n\r\n this._mode = undefined;\r\n this._delay = 0.15;\r\n },\r\n getMode: function () {\r\n return this._mode;\r\n },\r\n setMode: function ( mode ) {\r\n this._mode = mode;\r\n },\r\n setEventProxy: function ( proxy ) {\r\n this._eventProxy = proxy;\r\n },\r\n setManipulator: function ( manipulator ) {\r\n this._manipulator = manipulator;\r\n },\r\n mousemove: function ( ev ) {\r\n if ( this._buttonup === true ) {\r\n return;\r\n }\r\n var pos = this._eventProxy.getPositionRelativeToCanvas( ev );\r\n var manipulator = this._manipulator;\r\n if ( isNaN( pos[ 0 ] ) === false && isNaN( pos[ 1 ] ) === false ) {\r\n\r\n var mode = this.getMode();\r\n if ( mode === OrbitManipulatorEnums.ROTATE ) {\r\n manipulator.getRotateInterpolator().setDelay( this._delay );\r\n manipulator.getRotateInterpolator().setTarget( pos[ 0 ], pos[ 1 ] );\r\n\r\n } else if ( mode === OrbitManipulatorEnums.PAN ) {\r\n manipulator.getPanInterpolator().setTarget( pos[ 0 ], pos[ 1 ] );\r\n\r\n } else if ( mode === OrbitManipulatorEnums.ZOOM ) {\r\n var zoom = manipulator.getZoomInterpolator();\r\n if ( zoom.isReset() ) {\r\n zoom._start = pos[ 1 ];\r\n zoom.set( 0.0 );\r\n }\r\n var dy = pos[ 1 ] - zoom._start;\r\n zoom._start = pos[ 1 ];\r\n var v = zoom.getTarget()[ 0 ];\r\n zoom.setTarget( v - dy / 20.0 );\r\n }\r\n }\r\n\r\n ev.preventDefault();\r\n },\r\n mousedown: function ( ev ) {\r\n var manipulator = this._manipulator;\r\n var mode = this.getMode();\r\n if ( mode === undefined ) {\r\n if ( ev.button === 0 ) {\r\n if ( ev.shiftKey ) {\r\n this.setMode( OrbitManipulatorEnums.PAN );\r\n } else if ( ev.ctrlKey ) {\r\n this.setMode( OrbitManipulatorEnums.ZOOM );\r\n } else {\r\n this.setMode( OrbitManipulatorEnums.ROTATE );\r\n }\r\n } else {\r\n this.setMode( OrbitManipulatorEnums.PAN );\r\n }\r\n }\r\n\r\n this.pushButton();\r\n\r\n var pos = this._eventProxy.getPositionRelativeToCanvas( ev );\r\n mode = this.getMode();\r\n if ( mode === OrbitManipulatorEnums.ROTATE ) {\r\n manipulator.getRotateInterpolator().reset();\r\n manipulator.getRotateInterpolator().set( pos[ 0 ], pos[ 1 ] );\r\n } else if ( mode === OrbitManipulatorEnums.PAN ) {\r\n manipulator.getPanInterpolator().reset();\r\n manipulator.getPanInterpolator().set( pos[ 0 ], pos[ 1 ] );\r\n } else if ( mode === OrbitManipulatorEnums.ZOOM ) {\r\n manipulator.getZoomInterpolator()._start = pos[ 1 ];\r\n manipulator.getZoomInterpolator().set( 0.0 );\r\n }\r\n ev.preventDefault();\r\n },\r\n mouseup: function ( /*ev */) {\r\n this.releaseButton();\r\n this.setMode( undefined );\r\n },\r\n mouseout: function ( /*ev */) {\r\n this.releaseButton();\r\n this.setMode( undefined );\r\n },\r\n mousewheel: function ( ev, intDelta /*, deltaX, deltaY */ ) {\r\n var manipulator = this._manipulator;\r\n ev.preventDefault();\r\n var zoomTarget = manipulator.getZoomInterpolator().getTarget()[ 0 ] - intDelta;\r\n manipulator.getZoomInterpolator().setTarget( zoomTarget );\r\n },\r\n\r\n pushButton: function () {\r\n this._buttonup = false;\r\n },\r\n releaseButton: function () {\r\n this._buttonup = true;\r\n },\r\n\r\n keydown: function ( ev ) {\r\n if ( ev.keyCode === 32 ) {\r\n this._manipulator.computeHomePosition();\r\n ev.preventDefault();\r\n } else if ( ev.keyCode === this._panKey &&\r\n this.getMode() !== OrbitManipulatorEnums.PAN ) {\r\n this.setMode( OrbitManipulatorEnums.PAN );\r\n this._manipulator.getPanInterpolator().reset();\r\n this.pushButton();\r\n ev.preventDefault();\r\n } else if ( ev.keyCode === this._zoomKey &&\r\n this.getMode() !== OrbitManipulatorEnums.ZOOM ) {\r\n this.setMode( OrbitManipulatorEnums.ZOOM );\r\n this._manipulator.getZoomInterpolator().reset();\r\n this.pushButton();\r\n ev.preventDefault();\r\n } else if ( ev.keyCode === this._rotateKey &&\r\n this.getMode() !== OrbitManipulatorEnums.ROTATE ) {\r\n this.setMode( OrbitManipulatorEnums.ROTATE );\r\n this._manipulator.getRotateInterpolator().reset();\r\n this.pushButton();\r\n ev.preventDefault();\r\n }\r\n\r\n },\r\n\r\n keyup: function ( ev ) {\r\n if ( ev.keyCode === this._panKey ) {\r\n this.mouseup( ev );\r\n } else if ( ev.keyCode === this._rotateKey ) {\r\n this.mouseup( ev );\r\n } else if ( ev.keyCode === this._rotateKey ) {\r\n this.mouseup( ev );\r\n }\r\n this.setMode( undefined );\r\n }\r\n\r\n };\r\n return OrbitManipulatorMouseKeyboardController;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgGA/OrbitManipulatorMouseKeyboardController.js\n ** module id = 105\n ** module chunks = 0 1\n **/","define( [ 'osg/Quat' ], function ( Quat ) {\r\n\r\n 'use strict';\r\n\r\n var OrbitManipulatorDeviceOrientationController = function ( manipulator ) {\r\n this._manipulator = manipulator;\r\n this.init();\r\n };\r\n\r\n var degtorad = Math.PI / 180.0; // Degree-to-Radian conversion\r\n\r\n OrbitManipulatorDeviceOrientationController.prototype = {\r\n init: function () {\r\n this._stepFactor = 1.0; // meaning radius*stepFactor to move\r\n this._quat = Quat.create();\r\n },\r\n update: function ( deviceOrientation, screenOrientation ) {\r\n\r\n // If the user goes in landscape mode, he rotates his device with a certain angle\r\n // around the Z axis counterclockwise and the DeviceOrientation contains this rotation\r\n // To compensate this, we apply a rotation of the same angle in the opposite way\r\n\r\n computeQuaternion( this._quat, deviceOrientation, screenOrientation );\r\n this._manipulator.setRotationBaseFromQuat( this._quat );\r\n },\r\n\r\n };\r\n var computeQuaternion = ( function () {\r\n\r\n var screenTransform = Quat.create();\r\n var worldTransform = [ -Math.sqrt( 0.5 ), 0, 0, Math.sqrt( 0.5 ) ]; // - PI/2 around the x-axis\r\n var minusHalfAngle = 0;\r\n\r\n return function ( quat, deviceOrientation, screenOrientation ) {\r\n\r\n var alpha = deviceOrientation.alpha * degtorad;\r\n var beta = deviceOrientation.beta * degtorad;\r\n var gamma = deviceOrientation.gamma * degtorad;\r\n var screenAngle = screenOrientation * degtorad;\r\n\r\n setQuatFromEuler( quat, beta, alpha, -gamma, 'YXZ' );\r\n\r\n minusHalfAngle = -screenAngle / 2.0;\r\n screenTransform[ 1 ] = Math.sin( minusHalfAngle );\r\n screenTransform[ 2 ] = Math.cos( minusHalfAngle );\r\n\r\n Quat.mult( quat, screenTransform, quat );\r\n Quat.mult( quat, worldTransform, quat );\r\n\r\n var yTemp = quat[ 1 ];\r\n quat[ 1 ] = -quat[ 2 ];\r\n quat[ 2 ] = yTemp;\r\n\r\n return quat;\r\n };\r\n\r\n } )();\r\n\r\n var setQuatFromEuler = function ( quat, x, y, z, order ) {\r\n\r\n // http://www.mathworks.com/matlabcentral/fileexchange/\r\n // 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\r\n // content/SpinCalc.m\r\n\r\n var c1 = Math.cos( x / 2 );\r\n var c2 = Math.cos( y / 2 );\r\n var c3 = Math.cos( z / 2 );\r\n var s1 = Math.sin( x / 2 );\r\n var s2 = Math.sin( y / 2 );\r\n var s3 = Math.sin( z / 2 );\r\n\r\n if ( order === 'XYZ' ) {\r\n\r\n quat[ 0 ] = s1 * c2 * c3 + c1 * s2 * s3;\r\n quat[ 1 ] = c1 * s2 * c3 - s1 * c2 * s3;\r\n quat[ 2 ] = c1 * c2 * s3 + s1 * s2 * c3;\r\n quat[ 3 ] = c1 * c2 * c3 - s1 * s2 * s3;\r\n\r\n } else if ( order === 'YXZ' ) {\r\n\r\n quat[ 0 ] = s1 * c2 * c3 + c1 * s2 * s3;\r\n quat[ 1 ] = c1 * s2 * c3 - s1 * c2 * s3;\r\n quat[ 2 ] = c1 * c2 * s3 - s1 * s2 * c3;\r\n quat[ 3 ] = c1 * c2 * c3 + s1 * s2 * s3;\r\n\r\n } else if ( order === 'ZXY' ) {\r\n\r\n quat[ 0 ] = s1 * c2 * c3 - c1 * s2 * s3;\r\n quat[ 1 ] = c1 * s2 * c3 + s1 * c2 * s3;\r\n quat[ 2 ] = c1 * c2 * s3 + s1 * s2 * c3;\r\n quat[ 3 ] = c1 * c2 * c3 - s1 * s2 * s3;\r\n\r\n } else if ( order === 'ZYX' ) {\r\n\r\n quat[ 0 ] = s1 * c2 * c3 - c1 * s2 * s3;\r\n quat[ 1 ] = c1 * s2 * c3 + s1 * c2 * s3;\r\n quat[ 2 ] = c1 * c2 * s3 - s1 * s2 * c3;\r\n quat[ 3 ] = c1 * c2 * c3 + s1 * s2 * s3;\r\n\r\n } else if ( order === 'YZX' ) {\r\n\r\n quat[ 0 ] = s1 * c2 * c3 + c1 * s2 * s3;\r\n quat[ 1 ] = c1 * s2 * c3 + s1 * c2 * s3;\r\n quat[ 2 ] = c1 * c2 * s3 - s1 * s2 * c3;\r\n quat[ 3 ] = c1 * c2 * c3 - s1 * s2 * s3;\r\n\r\n } else if ( order === 'XZY' ) {\r\n\r\n quat[ 0 ] = s1 * c2 * c3 - c1 * s2 * s3;\r\n quat[ 1 ] = c1 * s2 * c3 - s1 * c2 * s3;\r\n quat[ 2 ] = c1 * c2 * s3 + s1 * s2 * c3;\r\n quat[ 3 ] = c1 * c2 * c3 + s1 * s2 * s3;\r\n\r\n }\r\n };\r\n\r\n return OrbitManipulatorDeviceOrientationController;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgGA/OrbitManipulatorDeviceOrientationController.js\n ** module id = 106\n ** module chunks = 0 1\n **/","define( [], function () {\r\n\r\n 'use strict';\r\n\r\n var OrbitManipulatorOculusController = function ( manipulator ) {\r\n this._manipulator = manipulator;\r\n this.init();\r\n };\r\n\r\n OrbitManipulatorOculusController.prototype = {\r\n init: function () {},\r\n update: function ( quaternion ) {\r\n\r\n this._manipulator.setRotationBaseFromQuat( quaternion );\r\n },\r\n\r\n };\r\n\r\n return OrbitManipulatorOculusController;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgGA/OrbitManipulatorOculusController.js\n ** module id = 107\n ** module chunks = 0 1\n **/","define( [], function () {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * OrbitManipulator\r\n * @class\r\n */\r\n var SwitchManipulator = function () {\r\n this._manipulatorList = [];\r\n this._currentManipulator = undefined;\r\n };\r\n\r\n /** @lends SwitchManipulator.prototype */\r\n SwitchManipulator.prototype = {\r\n getCamera: function () {\r\n return this.getCurrentManipulator().getCamera();\r\n },\r\n setCamera: function ( cam ) {\r\n var cbList = this.getManipulatorList();\r\n for ( var i = 0, nb = cbList.length; i < nb; ++i )\r\n cbList[ i ].setCamera( cam );\r\n },\r\n update: function ( nv ) {\r\n var manipulator = this.getCurrentManipulator();\r\n if ( manipulator !== undefined ) {\r\n return manipulator.update( nv );\r\n }\r\n return undefined;\r\n },\r\n getNode: function () {\r\n // we should add an accessor in the osgjs manipulator\r\n return this.getCurrentManipulator()._node;\r\n },\r\n setNode: function ( node ) {\r\n var cbList = this.getManipulatorList();\r\n for ( var i = 0, nb = cbList.length; i < nb; ++i )\r\n cbList[ i ].setNode( node );\r\n },\r\n getControllerList: function () {\r\n return this.getCurrentManipulator().getControllerList();\r\n },\r\n getNumManipulator: function () {\r\n return this._manipulatorList.length;\r\n },\r\n addManipulator: function ( manipulator ) {\r\n this._manipulatorList.push( manipulator );\r\n if ( this._currentManipulator === undefined ) {\r\n this.setManipulatorIndex( 0 );\r\n }\r\n },\r\n getManipulatorList: function () {\r\n return this._manipulatorList;\r\n },\r\n setManipulatorIndex: function ( index ) {\r\n this._currentManipulator = index;\r\n },\r\n getCurrentManipulatorIndex: function () {\r\n return this._currentManipulator;\r\n },\r\n getCurrentManipulator: function () {\r\n return this._manipulatorList[ this._currentManipulator ];\r\n },\r\n reset: function () {\r\n this.getCurrentManipulator().reset();\r\n },\r\n computeHomePosition: function ( useBoundingBox ) {\r\n var manipulator = this.getCurrentManipulator();\r\n if ( manipulator !== undefined ) {\r\n manipulator.computeHomePosition( useBoundingBox );\r\n }\r\n },\r\n getInverseMatrix: function () {\r\n var manipulator = this.getCurrentManipulator();\r\n if ( manipulator !== undefined ) {\r\n return manipulator.getInverseMatrix();\r\n }\r\n },\r\n getHomeBound: function ( useBoundingBox ) {\r\n this.getCurrentManipulator().getHomeBound( useBoundingBox );\r\n },\r\n getHomeDistance: function ( bs ) {\r\n this.getCurrentManipulator().getHomeDistance( bs );\r\n }\r\n };\r\n\r\n return SwitchManipulator;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgGA/SwitchManipulator.js\n ** module id = 108\n ** module chunks = 0 1\n **/","define( [], function () {\r\n\r\n return {\r\n ROTATE: 0,\r\n PAN: 1,\r\n ZOOM: 2\r\n };\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgGA/OrbitManipulatorEnums.js\n ** module id = 109\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/Object'\r\n], function ( MACROUTILS, Object ) {\r\n\r\n /**\r\n * Animation\r\n * @class Animation\r\n */\r\n var Animation = function () {\r\n Object.call( this );\r\n this._channels = [];\r\n };\r\n\r\n /** @lends Animation.prototype */\r\n Animation.prototype = MACROUTILS.objectInherit( Object.prototype, {\r\n getChannels: function () {\r\n return this._channels;\r\n },\r\n getDuration: function () {\r\n var tmin = 1e5;\r\n var tmax = -1e5;\r\n for ( var i = 0, l = this._channels.length; i < l; i++ ) {\r\n var channel = this._channels[ i ];\r\n tmin = Math.min( tmin, channel.getStartTime() );\r\n tmax = Math.max( tmax, channel.getEndTime() );\r\n }\r\n return tmax - tmin;\r\n }\r\n\r\n } );\r\n\r\n return Animation;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgAnimation/Animation.js\n ** module id = 110\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Notify',\r\n 'osg/Utils',\r\n 'osg/Object'\r\n], function ( Notify, MACROUTILS, Object ) {\r\n\r\n /**\r\n * AnimationUpdateCallback\r\n * @class AnimationUpdateCallback\r\n */\r\n var AnimationUpdateCallback = function () {};\r\n\r\n /** @lends AnimationUpdateCallback.prototype */\r\n AnimationUpdateCallback.prototype = MACROUTILS.objectInherit( Object.prototype, {\r\n\r\n linkChannel: function () {},\r\n linkAnimation: function ( anim ) {\r\n var name = this.getName();\r\n if ( name.length === 0 ) {\r\n Notify.log( 'no name on an update callback, discard' );\r\n return 0;\r\n }\r\n var nbLinks = 0;\r\n var channels = anim.getChannels();\r\n for ( var i = 0, l = channels.length; i < l; i++ ) {\r\n var channel = channels[ i ];\r\n if ( channel.getTargetName() === name ) {\r\n this.linkChannel( channel );\r\n nbLinks++;\r\n }\r\n }\r\n return nbLinks;\r\n }\r\n } );\r\n\r\n return AnimationUpdateCallback;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgAnimation/AnimationUpdateCallback.js\n ** module id = 111\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Notify',\r\n 'osg/Utils',\r\n 'osg/Object'\r\n], function ( Notify, MACROUTILS, Object ) {\r\n\r\n /**\r\n * BasicAnimationManager\r\n * @class BasicAnimationManager\r\n */\r\n var BasicAnimationManager = function () {\r\n Object.call( this );\r\n this._animations = {};\r\n\r\n this._actives = {};\r\n this._actives._keys = [];\r\n\r\n this._lastUpdate = undefined;\r\n this._targets = [];\r\n };\r\n\r\n /** @lends BasicAnimationManager.prototype */\r\n BasicAnimationManager.prototype = MACROUTILS.objectInherit( Object.prototype, {\r\n _updateAnimation: function ( animationParameter, t, priority ) {\r\n var duration = animationParameter.duration;\r\n var weight = animationParameter.weight;\r\n var animation = animationParameter.anim;\r\n var start = animationParameter.start;\r\n var loop = animationParameter.loop;\r\n\r\n if ( loop > 0 ) {\r\n var playedTimes = t - start;\r\n if ( playedTimes >= loop * duration ) {\r\n return true;\r\n }\r\n }\r\n\r\n t = ( t - start ) % duration;\r\n var callback = animationParameter.callback;\r\n if ( callback ) {\r\n callback( t );\r\n }\r\n\r\n var channels = animation.getChannels();\r\n for ( var i = 0, l = channels.length; i < l; i++ ) {\r\n var channel = channels[ i ];\r\n channel.update( t, weight, priority );\r\n }\r\n return false;\r\n },\r\n update: function ( node, nv ) {\r\n var t = nv.getFrameStamp().getSimulationTime();\r\n this.updateManager( t );\r\n return true;\r\n },\r\n updateManager: function ( t ) {\r\n\r\n var targets = this._targets;\r\n for ( var i = 0, l = targets.length; i < l; i++ ) {\r\n targets[ i ].reset();\r\n }\r\n if ( this._actives._keys.length > 0 ) {\r\n var pri = this._actives._keys.length - 1;\r\n while ( pri >= 0 ) {\r\n var layer = this._actives[ pri ];\r\n var keys = this._actives[ pri ]._keys;\r\n var removes = [];\r\n for ( var ai = 0, al = keys.length; ai < al; ai++ ) {\r\n var key = keys[ ai ];\r\n var anim = layer[ key ];\r\n if ( anim.start === undefined ) {\r\n anim.start = t;\r\n }\r\n var remove = this._updateAnimation( anim, t, pri );\r\n if ( remove ) {\r\n removes.push( ai );\r\n }\r\n }\r\n\r\n // remove finished animation\r\n for ( var j = removes.length - 1; j >= 0; j-- ) {\r\n var k = keys[ j ];\r\n keys.splice( j, 1 );\r\n delete layer[ k ];\r\n }\r\n\r\n pri--;\r\n }\r\n }\r\n },\r\n\r\n stopAll: function () {},\r\n isPlaying: function ( name ) {\r\n if ( this._actives._keys.length > 0 ) {\r\n var pri = this._actives._keys.length - 1;\r\n while ( pri >= 0 ) {\r\n if ( this._actives[ pri ][ name ] ) {\r\n return true;\r\n }\r\n pri--;\r\n }\r\n }\r\n return false;\r\n },\r\n stopAnimation: function ( name ) {\r\n if ( this._actives._keys.length > 0 ) {\r\n var pri = this._actives._keys.length - 1;\r\n var filterFunction = function ( element /*, index , array */ ) {\r\n return element !== '_keys';\r\n };\r\n while ( pri >= 0 ) {\r\n if ( this._actives[ pri ][ name ] ) {\r\n delete this._actives[ pri ][ name ];\r\n this._actives[ pri ]._keys = window.Object.keys( this._actives[ pri ] ).filter( filterFunction );\r\n return;\r\n }\r\n pri--;\r\n }\r\n }\r\n },\r\n playAnimationObject: function ( obj ) {\r\n if ( obj.name === undefined ) {\r\n return;\r\n }\r\n\r\n var anim = this._animations[ obj.name ];\r\n if ( anim === undefined ) {\r\n Notify.info( 'no animation ' + obj.name + ' found' );\r\n return;\r\n }\r\n\r\n if ( this.isPlaying( obj.name ) ) {\r\n return;\r\n }\r\n\r\n if ( obj.priority === undefined ) {\r\n obj.priority = 0;\r\n }\r\n\r\n if ( obj.weight === undefined ) {\r\n obj.weight = 1.0;\r\n }\r\n\r\n if ( obj.timeFactor === undefined ) {\r\n obj.timeFactor = 1.0;\r\n }\r\n\r\n if ( obj.loop === undefined ) {\r\n obj.loop = 0;\r\n }\r\n\r\n if ( this._actives[ obj.priority ] === undefined ) {\r\n this._actives[ obj.priority ] = {};\r\n this._actives[ obj.priority ]._keys = [];\r\n this._actives._keys.push( obj.priority ); // = window.Object.keys(this._actives);\r\n }\r\n\r\n obj.start = undefined;\r\n obj.duration = anim.getDuration();\r\n obj.anim = anim;\r\n this._actives[ obj.priority ][ obj.name ] = obj;\r\n this._actives[ obj.priority ]._keys.push( obj.name );\r\n },\r\n\r\n playAnimation: function ( name, priority, weight ) {\r\n var animName = name;\r\n if ( typeof name === 'object' ) {\r\n if ( name.getName === undefined ) {\r\n return this.playAnimationObject( name );\r\n } else {\r\n animName = name.getName();\r\n }\r\n }\r\n var obj = {\r\n 'name': animName,\r\n 'priority': priority,\r\n 'weight': weight\r\n };\r\n\r\n return this.playAnimationObject( obj );\r\n },\r\n\r\n registerAnimation: function ( anim ) {\r\n this._animations[ anim.getName() ] = anim;\r\n this.buildTargetList();\r\n },\r\n getAnimationMap: function () {\r\n return this._animations;\r\n },\r\n buildTargetList: function () {\r\n this._targets.length = 0;\r\n var keys = window.Object.keys( this._animations );\r\n for ( var i = 0, l = keys.length; i < l; i++ ) {\r\n var a = this._animations[ keys[ i ] ];\r\n var channels = a.getChannels();\r\n for ( var c = 0, lc = channels.length; c < lc; c++ ) {\r\n var channel = channels[ c ];\r\n this._targets.push( channel.getTarget() );\r\n }\r\n }\r\n }\r\n\r\n } );\r\n\r\n return BasicAnimationManager;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgAnimation/BasicAnimationManager.js\n ** module id = 112\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/Object'\r\n], function ( MACROUTILS, Object ) {\r\n\r\n /**\r\n * Channel is responsible to interpolate keys\r\n * @class Channel\r\n */\r\n var Channel = function ( sampler, target ) {\r\n Object.call( this );\r\n this._sampler = sampler;\r\n this._target = target;\r\n this._targetName = undefined;\r\n this._data = {\r\n 'value': undefined,\r\n 'key': 0\r\n };\r\n };\r\n\r\n /** @lends Channel.prototype */\r\n Channel.prototype = MACROUTILS.objectInherit( Object.prototype, {\r\n getKeyframes: function () {\r\n return this._sampler.getKeyframes();\r\n },\r\n setKeyframes: function ( keys ) {\r\n this._sampler.setKeyframes( keys );\r\n },\r\n getStartTime: function () {\r\n return this._sampler.getStartTime();\r\n },\r\n getEndTime: function () {\r\n return this._sampler.getEndTime();\r\n },\r\n getSampler: function () {\r\n return this._sampler;\r\n },\r\n setSampler: function ( sampler ) {\r\n this._sampler = sampler;\r\n },\r\n getTarget: function () {\r\n return this._target;\r\n },\r\n setTarget: function ( target ) {\r\n this._target = target;\r\n },\r\n setTargetName: function ( name ) {\r\n this._targetName = name;\r\n },\r\n getTargetName: function () {\r\n return this._targetName;\r\n },\r\n update: function ( t, weight, priority ) {\r\n weight = weight || 1.0;\r\n priority = priority || 0.0;\r\n\r\n // skip if weight == 0\r\n if ( weight < 1e-4 )\r\n return;\r\n var data = this._data;\r\n this._sampler.getValueAt( t, data );\r\n this._target.update.call( this._target, weight, data.value, priority );\r\n },\r\n reset: function () {\r\n this._target.reset();\r\n }\r\n } );\r\n\r\n return Channel;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgAnimation/Channel.js\n ** module id = 113\n ** module chunks = 0 1\n **/","define( [], function () {\r\n\r\n var easeOutQuad = function ( t ) {\r\n return -( t * ( t - 2.0 ) );\r\n };\r\n var easeInQuad = function ( t ) {\r\n return ( t * t );\r\n };\r\n var easeOutCubic = function ( t ) {\r\n t = t - 1.0;\r\n return ( t * t * t + 1 );\r\n };\r\n var easeInCubic = function ( t ) {\r\n return ( t * t * t );\r\n };\r\n var easeOutQuart = function ( t ) {\r\n t = t - 1;\r\n return -( t * t * t * t - 1 );\r\n };\r\n var easeInQuart = function ( t ) {\r\n return ( t * t * t * t );\r\n };\r\n var easeOutElastic = function ( t ) {\r\n return Math.pow( 2.0, -10.0 * t ) * Math.sin( ( t - 0.3 / 4.0 ) * ( 2.0 * Math.PI ) / 0.3 ) + 1.0;\r\n };\r\n //osgAnimation.EaseInElastic = function(t) { return ; };\r\n var easeOutBounce = function ( t ) {\r\n if ( t < ( 1 / 2.75 ) ) {\r\n return ( 7.5625 * t * t );\r\n } else if ( t < ( 2 / 2.75 ) ) {\r\n return ( 7.5625 * ( t -= ( 1.5 / 2.75 ) ) * t + 0.75 );\r\n } else if ( t < ( 2.5 / 2.75 ) ) {\r\n return ( 7.5625 * ( t -= ( 2.25 / 2.75 ) ) * t + 0.9375 );\r\n } else {\r\n return ( 7.5625 * ( t -= ( 2.625 / 2.75 ) ) * t + 0.984375 );\r\n }\r\n };\r\n\r\n return {\r\n easeOutQuad: easeOutQuad,\r\n easeInQuad: easeInQuad,\r\n easeOutCubic: easeOutCubic,\r\n easeInCubic: easeInCubic,\r\n easeOutQuart: easeOutQuart,\r\n easeInQuart: easeInQuart,\r\n easeOutElastic: easeOutElastic,\r\n easeOutBounce: easeOutBounce,\r\n EaseOutQuad: easeOutQuad,\r\n EaseInQuad: easeInQuad,\r\n EaseOutCubic: easeOutCubic,\r\n EaseInCubic: easeInCubic,\r\n EaseOutQuart: easeOutQuart,\r\n EaseInQuart: easeInQuart,\r\n EaseOutElastic: easeOutElastic,\r\n EaseOutBounce: easeOutBounce\r\n };\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgAnimation/Easing.js\n ** module id = 114\n ** module chunks = 0 1\n **/","define( [\r\n 'osgAnimation/Channel',\r\n 'osgAnimation/Sampler',\r\n 'osgAnimation/Interpolator',\r\n 'osgAnimation/FloatTarget'\r\n], function ( Channel, Sampler, Interpolator, FloatTarget ) {\r\n\r\n var FloatLerpChannel = function ( keys, target ) {\r\n var sampler = new Sampler();\r\n if ( !keys ) {\r\n keys = [];\r\n }\r\n if ( !target ) {\r\n target = new FloatTarget();\r\n }\r\n Channel.call( this, sampler, target );\r\n sampler.setInterpolator( Interpolator.FloatLerpInterpolator );\r\n this.setKeyframes( keys );\r\n this._data.value = target.getValue();\r\n };\r\n\r\n FloatLerpChannel.prototype = Channel.prototype;\r\n\r\n return FloatLerpChannel;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgAnimation/FloatLerpChannel.js\n ** module id = 115\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osgAnimation/Target'\r\n], function ( MACROUTILS, Target ) {\r\n\r\n var FloatTarget = function ( value ) {\r\n Target.call( this );\r\n this._target = [ value ];\r\n };\r\n\r\n FloatTarget.prototype = MACROUTILS.objectInherit( Target.prototype, {\r\n update: function ( weight, val, priority ) {\r\n if ( this._weight || this._priorityWeight ) {\r\n\r\n if ( this._lastPriority !== priority ) {\r\n // change in priority\r\n // add to weight with the same previous priority cumulated weight\r\n this._weight += this._priorityWeight * ( 1.0 - this._weight );\r\n this._priorityWeight = 0;\r\n this._lastPriority = priority;\r\n }\r\n\r\n this._priorityWeight += weight;\r\n var t = ( 1.0 - this._weight ) * weight / this._priorityWeight;\r\n this._target += ( val - this._target ) * t;\r\n } else {\r\n\r\n this._priorityWeight = weight;\r\n this._lastPriority = priority;\r\n this._target = val;\r\n }\r\n }\r\n } );\r\n\r\n return FloatTarget;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgAnimation/FloatTarget.js\n ** module id = 116\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Quat'\r\n], function ( Quat ) {\r\n\r\n /**\r\n * Interpolator provide interpolation function to sampler\r\n */\r\n var Vec3LerpInterpolator = function ( keys, t, result ) {\r\n var keyStart;\r\n var startTime;\r\n var keyEnd = keys[ keys.length - 1 ];\r\n var endTime = keyEnd.t;\r\n if ( t >= endTime ) {\r\n result.key = 0;\r\n result.value[ 0 ] = keyEnd[ 0 ];\r\n result.value[ 1 ] = keyEnd[ 1 ];\r\n result.value[ 2 ] = keyEnd[ 2 ];\r\n return;\r\n } else {\r\n keyStart = keys[ 0 ];\r\n startTime = keyStart.t;\r\n\r\n if ( t <= startTime ) {\r\n result.key = 0;\r\n result.value[ 0 ] = keyStart[ 0 ];\r\n result.value[ 1 ] = keyStart[ 1 ];\r\n result.value[ 2 ] = keyStart[ 2 ];\r\n return;\r\n }\r\n }\r\n\r\n var i1 = result.key;\r\n while ( keys[ i1 + 1 ].t < t ) {\r\n i1++;\r\n }\r\n var i2 = i1 + 1;\r\n\r\n var t1 = keys[ i1 ].t;\r\n var x1 = keys[ i1 ][ 0 ];\r\n var y1 = keys[ i1 ][ 1 ];\r\n var z1 = keys[ i1 ][ 2 ];\r\n\r\n var t2 = keys[ i2 ].t;\r\n var x2 = keys[ i2 ][ 0 ];\r\n var y2 = keys[ i2 ][ 1 ];\r\n var z2 = keys[ i2 ][ 2 ];\r\n\r\n var r = ( t - t1 ) / ( t2 - t1 );\r\n\r\n result.value[ 0 ] = x1 + ( x2 - x1 ) * r;\r\n result.value[ 1 ] = y1 + ( y2 - y1 ) * r;\r\n result.value[ 2 ] = z1 + ( z2 - z1 ) * r;\r\n result.key = i1;\r\n };\r\n\r\n var QuatLerpInterpolator = function ( keys, t, result ) {\r\n var keyStart;\r\n var startTime;\r\n var keyEnd = keys[ keys.length - 1 ];\r\n var endTime = keyEnd.t;\r\n if ( t >= endTime ) {\r\n result.key = 0;\r\n result.value[ 0 ] = keyEnd[ 0 ];\r\n result.value[ 1 ] = keyEnd[ 1 ];\r\n result.value[ 2 ] = keyEnd[ 2 ];\r\n result.value[ 3 ] = keyEnd[ 3 ];\r\n return;\r\n } else {\r\n keyStart = keys[ 0 ];\r\n startTime = keyStart.t;\r\n\r\n if ( t <= startTime ) {\r\n result.key = 0;\r\n result.value[ 0 ] = keyStart[ 0 ];\r\n result.value[ 1 ] = keyStart[ 1 ];\r\n result.value[ 2 ] = keyStart[ 2 ];\r\n result.value[ 3 ] = keyStart[ 3 ];\r\n return;\r\n }\r\n }\r\n\r\n var i1 = result.key;\r\n while ( keys[ i1 + 1 ].t < t ) {\r\n i1++;\r\n }\r\n var i2 = i1 + 1;\r\n\r\n var t1 = keys[ i1 ].t;\r\n var x1 = keys[ i1 ][ 0 ];\r\n var y1 = keys[ i1 ][ 1 ];\r\n var z1 = keys[ i1 ][ 2 ];\r\n var w1 = keys[ i1 ][ 3 ];\r\n\r\n var t2 = keys[ i2 ].t;\r\n var x2 = keys[ i2 ][ 0 ];\r\n var y2 = keys[ i2 ][ 1 ];\r\n var z2 = keys[ i2 ][ 2 ];\r\n var w2 = keys[ i2 ][ 3 ];\r\n\r\n var r = ( t - t1 ) / ( t2 - t1 );\r\n\r\n result.value[ 0 ] = x1 + ( x2 - x1 ) * r;\r\n result.value[ 1 ] = y1 + ( y2 - y1 ) * r;\r\n result.value[ 2 ] = z1 + ( z2 - z1 ) * r;\r\n result.value[ 3 ] = w1 + ( w2 - w1 ) * r;\r\n result.key = i1;\r\n };\r\n\r\n var QuatSlerpInterpolator = function ( keys, t, result ) {\r\n var keyStart;\r\n var startTime;\r\n var keyEnd = keys[ keys.length - 1 ];\r\n var endTime = keyEnd.t;\r\n if ( t >= endTime ) {\r\n result.key = 0;\r\n result.value[ 0 ] = keyEnd[ 0 ];\r\n result.value[ 1 ] = keyEnd[ 1 ];\r\n result.value[ 2 ] = keyEnd[ 2 ];\r\n result.value[ 3 ] = keyEnd[ 3 ];\r\n return;\r\n } else {\r\n keyStart = keys[ 0 ];\r\n startTime = keyStart.t;\r\n\r\n if ( t <= startTime ) {\r\n result.key = 0;\r\n result.value[ 0 ] = keyStart[ 0 ];\r\n result.value[ 1 ] = keyStart[ 1 ];\r\n result.value[ 2 ] = keyStart[ 2 ];\r\n result.value[ 3 ] = keyStart[ 3 ];\r\n return;\r\n }\r\n }\r\n\r\n var i1 = result.key;\r\n while ( keys[ i1 + 1 ].t < t ) {\r\n i1++;\r\n }\r\n var i2 = i1 + 1;\r\n\r\n var t1 = keys[ i1 ].t;\r\n var t2 = keys[ i2 ].t;\r\n var r = ( t - t1 ) / ( t2 - t1 );\r\n\r\n Quat.slerp( r, keys[ i1 ], keys[ i2 ], result.value );\r\n result.key = i1;\r\n };\r\n\r\n /**\r\n * Interpolator provide interpolation function to sampler\r\n */\r\n var FloatLerpInterpolator = function ( keys, t, result ) {\r\n var keyStart;\r\n var startTime;\r\n var keyEnd = keys[ keys.length - 1 ];\r\n var endTime = keyEnd.t;\r\n if ( t >= endTime ) {\r\n result.key = 0;\r\n result.value = keyEnd[ 0 ];\r\n return;\r\n } else {\r\n keyStart = keys[ 0 ];\r\n startTime = keyStart.t;\r\n\r\n if ( t <= startTime ) {\r\n result.key = 0;\r\n result.value = keyStart[ 0 ];\r\n return;\r\n }\r\n }\r\n\r\n var i1 = result.key;\r\n while ( keys[ i1 + 1 ].t < t ) {\r\n i1++;\r\n }\r\n var i2 = i1 + 1;\r\n\r\n var t1 = keys[ i1 ].t;\r\n var x1 = keys[ i1 ][ 0 ];\r\n\r\n var t2 = keys[ i2 ].t;\r\n var x2 = keys[ i2 ][ 0 ];\r\n\r\n var r = ( t - t1 ) / ( t2 - t1 );\r\n result.value = x1 + ( x2 - x1 ) * r;\r\n result.key = i1;\r\n };\r\n\r\n /**\r\n * Interpolator provide interpolation function to sampler\r\n */\r\n var FloatStepInterpolator = function ( keys, t, result ) {\r\n var keyStart;\r\n var startTime;\r\n var keyEnd = keys[ keys.length - 1 ];\r\n var endTime = keyEnd.t;\r\n if ( t >= endTime ) {\r\n result.key = 0;\r\n result.value = keyEnd[ 0 ];\r\n return;\r\n } else {\r\n keyStart = keys[ 0 ];\r\n startTime = keyStart.t;\r\n\r\n if ( t <= startTime ) {\r\n result.key = 0;\r\n result.value = keyStart[ 0 ];\r\n return;\r\n }\r\n }\r\n\r\n var i1 = result.key;\r\n while ( keys[ i1 + 1 ].t < t ) {\r\n i1++;\r\n }\r\n //var i2 = i1 + 1;\r\n\r\n //var t1 = keys[ i1 ].t;\r\n var x1 = keys[ i1 ][ 0 ];\r\n result.value = x1;\r\n result.key = i1;\r\n };\r\n\r\n return {\r\n Vec3LerpInterpolator: Vec3LerpInterpolator,\r\n QuatLerpInterpolator: QuatLerpInterpolator,\r\n QuatSlerpInterpolator: QuatSlerpInterpolator,\r\n FloatLerpInterpolator: FloatLerpInterpolator,\r\n FloatStepInterpolator: FloatStepInterpolator\r\n };\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgAnimation/Interpolator.js\n ** module id = 117\n ** module chunks = 0 1\n **/","define( [], function () {\r\n\r\n var createVec3Keyframe = function ( t, array ) {\r\n var k = array.slice( 0 );\r\n k.t = t;\r\n return k;\r\n };\r\n\r\n var createQuatKeyframe = function ( t, array ) {\r\n var k = array.slice( 0 );\r\n k.t = t;\r\n return k;\r\n };\r\n\r\n var createFloatKeyframe = function ( t, value ) {\r\n var k = [ value ];\r\n k.t = t;\r\n return k;\r\n };\r\n\r\n return {\r\n createVec3Keyframe: createVec3Keyframe,\r\n createQuatKeyframe: createQuatKeyframe,\r\n createFloatKeyframe: createFloatKeyframe\r\n };\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgAnimation/Keyframe.js\n ** module id = 118\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Notify',\r\n 'osg/Utils',\r\n 'osg/NodeVisitor',\r\n 'osg/Object',\r\n 'osgAnimation/AnimationUpdateCallback'\r\n], function ( Notify, MACROUTILS, NodeVisitor, Object, AnimationUpdateCallback ) {\r\n\r\n\r\n /**\r\n * LinkVisitor search for animationUpdateCallback and link animation data\r\n * @class LinkVisitor\r\n */\r\n var LinkVisitor = function () {\r\n NodeVisitor.call( this );\r\n this._animations = undefined;\r\n this._nbLinkTarget = 0;\r\n };\r\n\r\n /** @lends LinkVisitor.prototype */\r\n LinkVisitor.prototype = MACROUTILS.objectInherit( NodeVisitor.prototype, {\r\n setAnimationMap: function ( anims ) {\r\n this._animations = anims;\r\n this._animationKeys = window.Object.keys( anims );\r\n },\r\n\r\n apply: function ( node ) {\r\n var cbs = node.getUpdateCallbackList();\r\n for ( var i = 0, l = cbs.length; i < l; i++ ) {\r\n var cb = cbs[ i ];\r\n if ( cb instanceof AnimationUpdateCallback ) {\r\n this.link( cb );\r\n }\r\n }\r\n this.traverse( node );\r\n },\r\n\r\n link: function ( animCallback ) {\r\n var result = 0;\r\n var anims = this._animations;\r\n var animKeys = this._animationKeys;\r\n for ( var i = 0, l = animKeys.length; i < l; i++ ) {\r\n var key = animKeys[ i ];\r\n var anim = anims[ key ];\r\n result += animCallback.linkAnimation( anim );\r\n }\r\n this._nbLinkedTarget += result;\r\n Notify.info( 'linked ' + result + ' for \"' + animCallback.getName() + '\"' );\r\n }\r\n\r\n } );\r\n\r\n return LinkVisitor;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgAnimation/LinkVisitor.js\n ** module id = 119\n ** module chunks = 0 1\n **/","define( [\r\n 'osgAnimation/Channel',\r\n 'osgAnimation/Sampler',\r\n 'osgAnimation/Interpolator',\r\n 'osgAnimation/QuatTarget',\r\n 'osg/Quat'\r\n], function ( Channel, Sampler, Interpolator, QuatTarget, Quat ) {\r\n\r\n var QuatLerpChannel = function ( keys, target ) {\r\n var sampler = new Sampler();\r\n if ( !keys ) {\r\n keys = [];\r\n }\r\n if ( !target ) {\r\n target = new QuatTarget();\r\n }\r\n Channel.call( this, sampler, target );\r\n sampler.setInterpolator( Interpolator.QuatLerpInterpolator );\r\n this.setKeyframes( keys );\r\n this._data.value = Quat.copy( target.getValue(), Quat.create() );\r\n };\r\n\r\n QuatLerpChannel.prototype = Channel.prototype;\r\n\r\n return QuatLerpChannel;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgAnimation/QuatLerpChannel.js\n ** module id = 120\n ** module chunks = 0 1\n **/","define( [\r\n 'osgAnimation/Channel',\r\n 'osgAnimation/QuatLerpChannel',\r\n 'osgAnimation/Interpolator'\r\n], function ( Channel, QuatLerpChannel, Interpolator ) {\r\n\r\n\r\n var QuatSlerpChannel = function ( keys, target ) {\r\n QuatLerpChannel.call( this, keys, target );\r\n this.getSampler().setInterpolator( Interpolator.QuatSlerpInterpolator );\r\n };\r\n\r\n QuatSlerpChannel.prototype = Channel.prototype;\r\n\r\n return QuatSlerpChannel;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgAnimation/QuatSlerpChannel.js\n ** module id = 121\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osgAnimation/Target',\r\n 'osg/Quat'\r\n], function ( MACROUTILS, Target, Quat ) {\r\n\r\n\r\n var QuatTarget = function () {\r\n Target.call( this );\r\n this._target = Quat.create();\r\n };\r\n QuatTarget.prototype = MACROUTILS.objectInherit( Target.prototype, {\r\n update: function ( weight, val, priority ) {\r\n if ( this._weight || this._priorityWeight ) {\r\n\r\n if ( this._lastPriority !== priority ) {\r\n // change in priority\r\n // add to weight with the same previous priority cumulated weight\r\n this._weight += this._priorityWeight * ( 1.0 - this._weight );\r\n this._priorityWeight = 0;\r\n this._lastPriority = priority;\r\n }\r\n\r\n this._priorityWeight += weight;\r\n var t = ( 1.0 - this._weight ) * weight / this._priorityWeight;\r\n Quat.lerp( t, this._target, val, this._target );\r\n Quat.normalize( this._target, this._target );\r\n\r\n } else {\r\n\r\n this._priorityWeight = weight;\r\n this._lastPriority = priority;\r\n Quat.copy( val, this._target );\r\n }\r\n }\r\n } );\r\n\r\n return QuatTarget;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgAnimation/QuatTarget.js\n ** module id = 122\n ** module chunks = 0 1\n **/","define( [], function () {\r\n\r\n /**\r\n * Sampler is responsible to interpolate keys\r\n * @class Sampler\r\n */\r\n var Sampler = function ( keys, interpolator ) {\r\n if ( !keys ) {\r\n keys = [];\r\n }\r\n this._keys = keys;\r\n this._interpolator = interpolator;\r\n };\r\n\r\n /** @lends Sampler.prototype */\r\n Sampler.prototype = {\r\n\r\n getKeyframes: function () {\r\n return this._keys;\r\n },\r\n setKeyframes: function ( keys ) {\r\n this._keys = keys;\r\n },\r\n setInterpolator: function ( interpolator ) {\r\n this._interpolator = interpolator;\r\n },\r\n getInterpolator: function () {\r\n return this._interpolator;\r\n },\r\n getStartTime: function () {\r\n if ( this._keys.length === 0 ) {\r\n return undefined;\r\n }\r\n return this._keys[ 0 ].t;\r\n },\r\n getEndTime: function () {\r\n if ( this._keys.length === 0 ) {\r\n return undefined;\r\n }\r\n return this._keys[ this._keys.length - 1 ].t;\r\n },\r\n\r\n // result contains the keyIndex where to start, this key\r\n // will be updated when calling the Interpolator\r\n // result.value will contain the interpolation result\r\n // { 'value': undefined, 'keyIndex': 0 };\r\n getValueAt: function ( t, result ) {\r\n // reset the key if invalid\r\n if ( this._keys[ result.key ].t > t ) {\r\n result.key = 0;\r\n }\r\n this._interpolator( this._keys, t, result );\r\n }\r\n };\r\n\r\n return Sampler;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgAnimation/Sampler.js\n ** module id = 123\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/Object',\r\n 'osg/Matrix',\r\n 'osgAnimation/QuatTarget',\r\n 'osg/Quat'\r\n], function ( MACROUTILS, Object, Matrix, QuatTarget, Quat ) {\r\n\r\n /**\r\n * StackedQuaternion\r\n * @class StackedQuaternion\r\n */\r\n var StackedQuaternion = function ( name, quat ) {\r\n Object.call( this );\r\n if ( !quat ) {\r\n quat = Quat.create();\r\n }\r\n this._quaternion = quat;\r\n this._target = undefined;\r\n this._matrixTmp = Matrix.create();\r\n this.setName( name );\r\n };\r\n\r\n /** @lends StackedQuaternion.prototype */\r\n StackedQuaternion.prototype = MACROUTILS.objectInherit( Object.prototype, {\r\n setQuaternion: function ( q ) {\r\n Quat.copy( q, this._quaternion );\r\n },\r\n setTarget: function ( target ) {\r\n this._target = target;\r\n },\r\n getTarget: function () {\r\n return this._target;\r\n },\r\n update: function () {\r\n if ( this._target !== undefined ) {\r\n Quat.copy( this._target.getValue(), this._quaternion );\r\n }\r\n },\r\n getOrCreateTarget: function () {\r\n if ( !this._target ) {\r\n this._target = new QuatTarget( this._quaternion );\r\n }\r\n return this._target;\r\n },\r\n applyToMatrix: function ( m ) {\r\n var mtmp = this._matrixTmp;\r\n Matrix.setRotateFromQuat( mtmp, this._quaternion );\r\n Matrix.preMult( m, mtmp );\r\n }\r\n } );\r\n\r\n return StackedQuaternion;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgAnimation/StackedQuaternion.js\n ** module id = 124\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/Object',\r\n 'osg/Matrix',\r\n 'osgAnimation/Vec3Target',\r\n 'osgAnimation/FloatTarget',\r\n 'osg/Vec3',\r\n 'osg/Quat'\r\n], function ( MACROUTILS, Object, Matrix, Vec3Target, FloatTarget, Vec3, Quat ) {\r\n\r\n\r\n /**\r\n * StackedRotateAxis\r\n * @class StackedRotateAxis\r\n */\r\n var StackedRotateAxis = function ( name, axis, angle ) {\r\n Object.call( this );\r\n if ( !axis ) {\r\n axis = [ 1.0, 0.0, 0.0 ];\r\n }\r\n if ( !angle ) {\r\n angle = 0.0;\r\n }\r\n this._axis = axis;\r\n this._angle = angle;\r\n this._target = undefined;\r\n this.setName( name );\r\n\r\n this._matrixTmp = Matrix.create();\r\n this._quatTmp = Matrix.create();\r\n };\r\n\r\n /** @lends StackedRotateAxis.prototype */\r\n StackedRotateAxis.prototype = MACROUTILS.objectInherit( Object.prototype, {\r\n setAxis: function ( axis ) {\r\n Vec3.copy( axis, this._axis );\r\n },\r\n setAngle: function ( angle ) {\r\n this._angle = angle;\r\n },\r\n setTarget: function ( target ) {\r\n this._target = target;\r\n },\r\n getTarget: function () {\r\n return this._target;\r\n },\r\n update: function () {\r\n if ( this._target !== undefined ) {\r\n this._angle = this._target.getValue();\r\n }\r\n },\r\n getOrCreateTarget: function () {\r\n if ( !this._target ) {\r\n this._target = new FloatTarget( this._angle );\r\n }\r\n return this._target;\r\n },\r\n applyToMatrix: function ( m ) {\r\n var axis = this._axis;\r\n var qtmp = this._quatTmp;\r\n var mtmp = this._matrixTmp;\r\n\r\n Quat.makeRotate( this._angle, axis[ 0 ], axis[ 1 ], axis[ 2 ], qtmp );\r\n Matrix.setRotateFromQuat( mtmp, qtmp );\r\n Matrix.preMult( m, mtmp );\r\n }\r\n\r\n } );\r\n\r\n return StackedRotateAxis;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgAnimation/StackedRotateAxis.js\n ** module id = 125\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/Object',\r\n 'osg/Matrix',\r\n 'osgAnimation/Vec3Target',\r\n 'osg/Vec3'\r\n], function ( MACROUTILS, Object, Matrix, Vec3Target, Vec3 ) {\r\n\r\n\r\n /**\r\n * StackedTranslate\r\n * @class StackedTranslate\r\n */\r\n var StackedTranslate = function ( name, translate ) {\r\n Object.call( this );\r\n if ( !translate ) {\r\n translate = [ 0, 0, 0 ];\r\n }\r\n this._translate = translate;\r\n this._target = undefined;\r\n this.setName( name );\r\n };\r\n\r\n /** @lends StackedTranslate.prototype */\r\n StackedTranslate.prototype = MACROUTILS.objectInherit( Object.prototype, {\r\n setTranslate: function ( translate ) {\r\n Vec3.copy( translate, this._translate );\r\n },\r\n setTarget: function ( target ) {\r\n this._target = target;\r\n },\r\n getTarget: function () {\r\n return this._target;\r\n },\r\n update: function () {\r\n if ( this._target !== undefined ) {\r\n Vec3.copy( this._target.getValue(), this._translate );\r\n }\r\n },\r\n getOrCreateTarget: function () {\r\n if ( !this._target ) {\r\n this._target = new Vec3Target( this._translate );\r\n }\r\n return this._target;\r\n },\r\n applyToMatrix: function ( m ) {\r\n Matrix.preMultTranslate( m, this._translate );\r\n }\r\n } );\r\n\r\n return StackedTranslate;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgAnimation/StackedTranslate.js\n ** module id = 126\n ** module chunks = 0 1\n **/","define( [], function () {\r\n\r\n /**\r\n * Target keep internal data of element to animate, and some function to merge them\r\n * @class Target\r\n */\r\n var Target = function () {\r\n this._weight = 0;\r\n this._priorityWeight = 0;\r\n this._count = 0;\r\n this._lastPriority = 0;\r\n this._target = undefined;\r\n };\r\n\r\n Target.prototype = {\r\n reset: function () {\r\n this._weight = 0;\r\n this._priorityWeight = 0;\r\n },\r\n getValue: function () {\r\n return this._target;\r\n }\r\n };\r\n\r\n return Target;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgAnimation/Target.js\n ** module id = 127\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/Notify',\r\n 'osg/Matrix',\r\n 'osgAnimation/AnimationUpdateCallback'\r\n], function ( MACROUTILS, Notify, Matrix, AnimationUpdateCallback ) {\r\n\r\n /**\r\n * UpdateMatrixTransform\r\n * @class UpdateMatrixTransform\r\n */\r\n var UpdateMatrixTransform = function () {\r\n AnimationUpdateCallback.call( this );\r\n this._stackedTransforms = [];\r\n };\r\n\r\n /** @lends AnimationUpdateCallback.prototype */\r\n UpdateMatrixTransform.prototype = MACROUTILS.objectInherit( AnimationUpdateCallback.prototype, {\r\n getStackedTransforms: function () {\r\n return this._stackedTransforms;\r\n },\r\n update: function ( node /*, nv */ ) {\r\n\r\n // not optimized, we could avoid operation the animation did not change\r\n // the content of the transform element\r\n var matrix = node.getMatrix();\r\n Matrix.makeIdentity( matrix );\r\n var transforms = this._stackedTransforms;\r\n for ( var i = 0, l = transforms.length; i < l; i++ ) {\r\n var transform = transforms[ i ];\r\n transform.update();\r\n transform.applyToMatrix( matrix );\r\n }\r\n return true;\r\n },\r\n linkChannel: function ( channel ) {\r\n var channelName = channel.getName();\r\n var transforms = this._stackedTransforms;\r\n for ( var i = 0, l = transforms.length; i < l; i++ ) {\r\n var transform = transforms[ i ];\r\n var elementName = transform.getName();\r\n if ( channelName.length > 0 && elementName === channelName ) {\r\n var target = transform.getOrCreateTarget();\r\n if ( target ) {\r\n channel.setTarget( target );\r\n return true;\r\n }\r\n }\r\n }\r\n Notify.log( 'can\\'t link channel ' + channelName + ', does not contain a symbolic name that can be linked to TransformElements' );\r\n return false;\r\n }\r\n\r\n } );\r\n\r\n return UpdateMatrixTransform;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgAnimation/UpdateMatrixTransform.js\n ** module id = 128\n ** module chunks = 0 1\n **/","define( [\r\n 'osgAnimation/Channel',\r\n 'osgAnimation/Sampler',\r\n 'osgAnimation/Interpolator',\r\n 'osgAnimation/Vec3Target',\r\n 'osg/Vec3'\r\n], function ( Channel, Sampler, Interpolator, Vec3Target, Vec3 ) {\r\n\r\n var Vec3LerpChannel = function ( keys, target ) {\r\n var sampler = new Sampler();\r\n if ( !keys ) {\r\n keys = [];\r\n }\r\n if ( !target ) {\r\n target = new Vec3Target();\r\n }\r\n Channel.call( this, sampler, target );\r\n sampler.setInterpolator( Interpolator.Vec3LerpInterpolator );\r\n this.setKeyframes( keys );\r\n this._data.value = Vec3.copy( target.getValue(), [ 0.0, 0.0, 0.0 ] );\r\n };\r\n\r\n Vec3LerpChannel.prototype = Channel.prototype;\r\n\r\n return Vec3LerpChannel;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgAnimation/Vec3LerpChannel.js\n ** module id = 129\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osgAnimation/Target',\r\n 'osg/Vec3'\r\n], function ( MACROUTILS, Target, Vec3 ) {\r\n\r\n var Vec3Target = function () {\r\n Target.call( this );\r\n this._target = [ 0, 0, 0 ];\r\n };\r\n Vec3Target.prototype = MACROUTILS.objectInherit( Target.prototype, {\r\n update: function ( weight, val, priority ) {\r\n if ( this._weight || this._priorityWeight ) {\r\n\r\n if ( this._lastPriority !== priority ) {\r\n // change in priority\r\n // add to weight with the same previous priority cumulated weight\r\n this._weight += this._priorityWeight * ( 1.0 - this._weight );\r\n this._priorityWeight = 0;\r\n this._lastPriority = priority;\r\n }\r\n\r\n this._priorityWeight += weight;\r\n var t = ( 1.0 - this._weight ) * weight / this._priorityWeight;\r\n Vec3.lerp( t, this._target, val, this._target );\r\n } else {\r\n\r\n this._priorityWeight = weight;\r\n this._lastPriority = priority;\r\n Vec3.copy( val, this._target );\r\n }\r\n }\r\n } );\r\n\r\n return Vec3Target;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgAnimation/Vec3Target.js\n ** module id = 130\n ** module chunks = 0 1\n **/","define( [\r\n 'q',\r\n 'osg/Utils',\r\n 'osgNameSpace',\r\n 'osgDB/ReaderParser',\r\n 'osgDB/Options',\r\n 'osg/Notify',\r\n 'osg/Image',\r\n 'osg/BufferArray',\r\n 'osg/DrawArrays',\r\n 'osg/DrawArrayLengths',\r\n 'osg/DrawElements',\r\n 'osg/PrimitiveSet'\r\n], function ( Q, MACROUTILS, osgNameSpace, ReaderParser, Options, Notify, Image, BufferArray, DrawArrays, DrawArrayLengths, DrawElements, PrimitiveSet ) {\r\n\r\n 'use strict';\r\n\r\n\r\n\r\n\r\n var Input = function ( json, identifier ) {\r\n this._json = json;\r\n var map = identifier;\r\n if ( map === undefined ) {\r\n map = {};\r\n }\r\n this._identifierMap = map;\r\n this._objectRegistry = {};\r\n // this._progressXHRCallback = undefined;\r\n // this._prefixURL = '';\r\n // this.setImageLoadingOptions( {\r\n // promise: true,\r\n // onload: undefined\r\n // } );\r\n\r\n this.setOptions( MACROUTILS.objectMix( {}, Options ) );\r\n\r\n // {\r\n // prefixURL: '',\r\n // progressXHRCallback: undefined,\r\n // readImageURL: undefined,\r\n // imageLoadingUsePromise: undefined,\r\n // imageOnload: undefined,\r\n // };\r\n };\r\n\r\n\r\n // keep one instance of image fallback\r\n if ( !Input.imageFallback ) {\r\n Input.imageFallback = ( function () {\r\n var fallback = new window.Image();\r\n fallback.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQIW2P8DwQACgAD/il4QJ8AAAAASUVORK5CYII=';\r\n return fallback;\r\n } )();\r\n }\r\n\r\n Input.prototype = {\r\n\r\n setOptions: function ( options ) {\r\n this._defaultOptions = options;\r\n },\r\n getOptions: function () {\r\n return this._defaultOptions;\r\n },\r\n setProgressXHRCallback: function ( func ) {\r\n this._defaultOptions.progressXHRCallback = func;\r\n },\r\n setReadNodeURLCallback: function ( func ) {\r\n this._defaultOptions.readNodeURL = func;\r\n },\r\n // used to override the type from pathname\r\n // typically if you want to create proxy object\r\n registerObject: function ( fullyQualifiedObjectname, constructor ) {\r\n this._objectRegistry[ fullyQualifiedObjectname ] = constructor;\r\n },\r\n\r\n getJSON: function () {\r\n return this._json;\r\n },\r\n\r\n setJSON: function ( json ) {\r\n this._json = json;\r\n return this;\r\n },\r\n\r\n setPrefixURL: function ( prefix ) {\r\n this._defaultOptions.prefixURL = prefix;\r\n },\r\n\r\n getPrefixURL: function () {\r\n return this._defaultOptions.prefixURL;\r\n },\r\n\r\n computeURL: function ( url ) {\r\n\r\n if ( typeof this._defaultOptions.prefixURL === 'string' &&\r\n this._defaultOptions.prefixURL.length > 0 ) {\r\n\r\n return this._defaultOptions.prefixURL + url;\r\n }\r\n\r\n return url;\r\n },\r\n\r\n\r\n requestFile: function ( url, options ) {\r\n\r\n var defer = Q.defer();\r\n\r\n var req = new XMLHttpRequest();\r\n req.open( 'GET', url, true );\r\n\r\n // handle responseType\r\n if ( options && options.responseType )\r\n req.responseType = options.responseType;\r\n\r\n if ( options && options.progress ) {\r\n req.addEventListener( 'progress', options.progress, false );\r\n }\r\n\r\n req.addEventListener( 'error', function () {\r\n defer.reject();\r\n }, false );\r\n\r\n req.addEventListener( 'load', function ( /*oEvent */) {\r\n\r\n if ( req.responseType === 'arraybuffer' )\r\n defer.resolve( req.response );\r\n else\r\n defer.resolve( req.responseText );\r\n\r\n } );\r\n\r\n req.send( null );\r\n return defer.promise;\r\n },\r\n\r\n getObjectWrapper: function ( path ) {\r\n if ( this._objectRegistry[ path ] !== undefined ) {\r\n return new( this._objectRegistry[ path ] )();\r\n }\r\n\r\n var scope = osgNameSpace;\r\n var splittedPath = path.split( '.' );\r\n for ( var i = 0, l = splittedPath.length; i < l; i++ ) {\r\n var obj = scope[ splittedPath[ i ] ];\r\n if ( obj === undefined ) {\r\n return undefined;\r\n }\r\n scope = obj;\r\n }\r\n var ClassName = scope;\r\n // create the new obj\r\n return new( ClassName )();\r\n },\r\n\r\n fetchImage: function ( image, url, options, defer ) {\r\n var checkInlineImage = 'data:image/';\r\n // crossOrigin does not work for inline data image\r\n var isInlineImage = ( url.substring( 0, checkInlineImage.length ) === checkInlineImage );\r\n var img = new window.Image();\r\n img.onerror = function () {\r\n Notify.warn( 'warning use white texture as fallback instead of ' + url );\r\n image.setImage( Input.imageFallback );\r\n if ( defer ) {\r\n defer.resolve( image );\r\n }\r\n };\r\n\r\n if ( !isInlineImage && options.imageCrossOrigin ) {\r\n img.crossOrigin = options.imageCrossOrigin;\r\n }\r\n\r\n img.onload = function () {\r\n\r\n if ( defer ) {\r\n if ( options.imageOnload ) options.imageOnload.call( image );\r\n defer.resolve( image );\r\n } else if ( options.imageOnload )\r\n options.imageOnload.call( image );\r\n\r\n };\r\n\r\n image.setURL( url );\r\n image.setImage( img );\r\n\r\n img.src = url;\r\n return image;\r\n },\r\n\r\n readImageURL: function ( url, options ) {\r\n\r\n if ( options === undefined ) {\r\n options = this._defaultOptions;\r\n }\r\n\r\n // hook reader\r\n if ( options.readImageURL ) {\r\n // be carefull if you plan to call hook the call and after\r\n // call the original readImageURL, you will need to remove\r\n // from options the readImageURL if you dont want an infinte\r\n // recursion call\r\n return options.readImageURL.call( this, url, options );\r\n }\r\n\r\n // if image is on inline image skip url computation\r\n if ( url.substr( 0, 10 ) !== 'data:image' ) {\r\n url = this.computeURL( url );\r\n }\r\n\r\n\r\n var image = new Image();\r\n if ( options.imageLoadingUsePromise !== true ) {\r\n return this.fetchImage( image, url, options );\r\n }\r\n\r\n var defer = Q.defer();\r\n this.fetchImage( image, url, options, defer );\r\n\r\n return defer.promise;\r\n },\r\n\r\n\r\n readNodeURL: function ( url, opt ) {\r\n\r\n var options = opt;\r\n if ( options === undefined ) {\r\n options = this._defaultOptions;\r\n }\r\n\r\n // hook reader\r\n if ( options.readNodeURL ) {\r\n // be carefull if you plan to call hook the call and after\r\n // call the original readNodeURL, you will need to remove\r\n // from options the readNodeURL if you dont want an infinte\r\n // recursion call\r\n return options.readNodeURL.call( this, url, options );\r\n }\r\n\r\n url = this.computeURL( url );\r\n\r\n var defer = Q.defer();\r\n\r\n // copy because we are going to modify it to have relative prefix to load assets\r\n options = MACROUTILS.objectMix( {}, options );\r\n\r\n // automatic prefix if non specfied\r\n if ( !!!options.prefixURL ) {\r\n var prefix = this.getPrefixURL();\r\n var index = url.lastIndexOf( '/' );\r\n if ( index !== -1 ) {\r\n prefix = url.substring( 0, index + 1 );\r\n }\r\n options.prefixURL = prefix;\r\n }\r\n\r\n var self = this;\r\n\r\n var ReaderParser = require( 'osgDB/ReaderParser' );\r\n\r\n var readSceneGraph = function ( data ) {\r\n\r\n ReaderParser.parseSceneGraph( data, options )\r\n .then( function ( child ) {\r\n defer.resolve( child );\r\n Notify.log( 'loaded ' + url );\r\n } ).fail( function ( error ) {\r\n defer.reject( error );\r\n } );\r\n };\r\n\r\n var ungzipFile = function ( file ) {\r\n\r\n function pad( n ) {\r\n return n.length < 2 ? '0' + n : n;\r\n }\r\n\r\n function uintToString( uintArray ) {\r\n var str = '';\r\n for ( var i = 0, len = uintArray.length; i < len; ++i ) {\r\n str += ( '%' + pad( uintArray[ i ].toString( 16 ) ) );\r\n }\r\n str = decodeURIComponent( str );\r\n return str;\r\n }\r\n\r\n\r\n var unpacked = self._unzipTypedArray( file );\r\n\r\n var typedArray = new Uint8Array( unpacked );\r\n var str = uintToString( typedArray );\r\n return str;\r\n };\r\n\r\n\r\n // try to get the file as responseText to parse JSON\r\n var fileTextPromise = self.requestFile( url );\r\n fileTextPromise.then( function ( str ) {\r\n\r\n var data;\r\n try {\r\n\r\n data = JSON.parse( str );\r\n\r\n } catch ( error ) { // can't parse try with ungzip code path\r\n\r\n Notify.error( 'cant parse url ' + url + ' try to gunzip' );\r\n\r\n }\r\n\r\n // we have the json, read it\r\n if ( data )\r\n return readSceneGraph( data );\r\n\r\n\r\n // no data try with gunzip\r\n var fileGzipPromise = self.requestFile( url, {\r\n responseType: 'arraybuffer'\r\n } );\r\n fileGzipPromise.then( function ( file ) {\r\n\r\n var str = ungzipFile( file );\r\n data = JSON.parse( str );\r\n readSceneGraph( data );\r\n\r\n } ).fail( function ( status ) {\r\n\r\n Notify.error( 'cant read file ' + url + ' status ' + status );\r\n defer.reject();\r\n\r\n } ).done();\r\n\r\n return true;\r\n\r\n } ).fail( function ( status ) {\r\n\r\n Notify.error( 'cant get file ' + url + ' status ' + status );\r\n defer.reject();\r\n\r\n } ).done();\r\n\r\n return defer.promise;\r\n },\r\n\r\n _unzipTypedArray: function ( binary ) {\r\n\r\n var typedArray = new Uint8Array( binary );\r\n\r\n // check magic number 1f8b\r\n if ( typedArray[ 0 ] === 0x1f && typedArray[ 1 ] === 0x8b ) {\r\n var zlib = require( 'zlib' );\r\n\r\n if ( !zlib ) {\r\n Notify.error( 'osg failed to use a gunzip.min.js to uncompress a gz file.\\n You can add this vendors to enable this feature or adds the good header in your gzip file served by your server' );\r\n }\r\n\r\n var zdec = new zlib.Gunzip( typedArray );\r\n var result = zdec.decompress();\r\n return result.buffer;\r\n }\r\n\r\n return binary;\r\n },\r\n\r\n readBinaryArrayURL: function ( url, options ) {\r\n\r\n if ( options === undefined ) {\r\n options = this._defaultOptions;\r\n }\r\n\r\n if ( options.readBinaryArrayURL ) {\r\n return options.readBinaryArrayURL.call( this, url, options );\r\n }\r\n\r\n url = this.computeURL( url );\r\n\r\n\r\n if ( this._identifierMap[ url ] !== undefined ) {\r\n return this._identifierMap[ url ];\r\n }\r\n var defer = Q.defer();\r\n\r\n var filePromise = this.requestFile( url, {\r\n responseType: 'arraybuffer',\r\n progress: this._defaultOptions.progressXHRCallback\r\n } );\r\n\r\n\r\n filePromise.then( function ( file ) {\r\n\r\n var buffer = this._unzipTypedArray( file );\r\n this._identifierMap[ url ] = buffer;\r\n defer.resolve( buffer );\r\n\r\n }.bind( this ) ).fail( function ( // error\r\n ) {\r\n\r\n defer.reject();\r\n\r\n } ).done();\r\n\r\n this._identifierMap[ url ] = defer.promise;\r\n return defer.promise;\r\n },\r\n\r\n initializeBufferArray: function ( vb, type, buf, options ) {\r\n if ( options === undefined )\r\n options = this.getOptions();\r\n if ( options.initializeBufferArray )\r\n return options.initializeBufferArray.call( this, vb, type, buf );\r\n\r\n var url = vb.File;\r\n var defer = Q.defer();\r\n Q.when( this.readBinaryArrayURL( url ) ).then( function ( array ) {\r\n\r\n var typedArray;\r\n // manage endianness\r\n var bigEndian;\r\n ( function () {\r\n var a = new Uint8Array( [ 0x12, 0x34 ] );\r\n var b = new Uint16Array( a.buffer );\r\n bigEndian = ( ( b[ 0 ] ).toString( 16 ) === '1234' );\r\n } )();\r\n\r\n var offset = 0;\r\n if ( vb.Offset !== undefined ) {\r\n offset = vb.Offset;\r\n }\r\n\r\n var bytesPerElement = MACROUTILS[ type ].BYTES_PER_ELEMENT;\r\n var nbItems = vb.Size;\r\n var nbCoords = buf.getItemSize();\r\n var totalSizeInBytes = nbItems * bytesPerElement * nbCoords;\r\n\r\n if ( bigEndian ) {\r\n Notify.log( 'big endian detected' );\r\n var TypedArray = MACROUTILS[ type ];\r\n var tmpArray = new TypedArray( nbItems * nbCoords );\r\n var data = new DataView( array, offset, totalSizeInBytes );\r\n var i = 0,\r\n l = tmpArray.length;\r\n if ( type === 'Uint16Array' ) {\r\n for ( ; i < l; i++ ) {\r\n tmpArray[ i ] = data.getUint16( i * bytesPerElement, true );\r\n }\r\n } else if ( type === 'Float32Array' ) {\r\n for ( ; i < l; i++ ) {\r\n tmpArray[ i ] = data.getFloat32( i * bytesPerElement, true );\r\n }\r\n }\r\n typedArray = tmpArray;\r\n data = null;\r\n } else {\r\n typedArray = new MACROUTILS[ type ]( array, offset, nbCoords * nbItems );\r\n }\r\n\r\n buf.setElements( typedArray );\r\n defer.resolve( buf );\r\n } );\r\n return defer;\r\n },\r\n\r\n readBufferArray: function ( options ) {\r\n var jsonObj = this.getJSON();\r\n\r\n var uniqueID = jsonObj.UniqueID;\r\n var osgjsObject;\r\n if ( uniqueID !== undefined ) {\r\n osgjsObject = this._identifierMap[ uniqueID ];\r\n if ( osgjsObject !== undefined ) {\r\n return osgjsObject;\r\n }\r\n }\r\n\r\n if ( options === undefined )\r\n options = this.getOptions();\r\n if ( options.readBufferArray )\r\n return options.readBufferArray.call( this );\r\n\r\n var check = function ( o ) {\r\n if ( ( o.Elements !== undefined || o.Array !== undefined ) &&\r\n o.ItemSize !== undefined &&\r\n o.Type ) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n if ( !check( jsonObj ) ) {\r\n return undefined;\r\n }\r\n\r\n var obj, defer;\r\n\r\n // inline array\r\n if ( jsonObj.Elements !== undefined ) {\r\n obj = new BufferArray( BufferArray[ jsonObj.Type ], jsonObj.Elements, jsonObj.ItemSize );\r\n\r\n } else if ( jsonObj.Array !== undefined ) {\r\n\r\n var buf = new BufferArray( BufferArray[ jsonObj.Type ] );\r\n buf.setItemSize( jsonObj.ItemSize );\r\n\r\n var vb, type;\r\n if ( jsonObj.Array.Float32Array !== undefined ) {\r\n vb = jsonObj.Array.Float32Array;\r\n type = 'Float32Array';\r\n } else if ( jsonObj.Array.Uint16Array !== undefined ) {\r\n vb = jsonObj.Array.Uint16Array;\r\n type = 'Uint16Array';\r\n } else if ( jsonObj.Array.Uint8Array !== undefined ) {\r\n vb = jsonObj.Array.Uint8Array;\r\n type = 'Uint8Array';\r\n } else {\r\n Notify.warn( 'Typed Array ' + window.Object.keys( jsonObj.Array )[ 0 ] );\r\n type = 'Float32Array';\r\n }\r\n\r\n if ( vb !== undefined ) {\r\n if ( vb.File !== undefined ) {\r\n defer = this.initializeBufferArray( vb, type, buf );\r\n } else if ( vb.Elements !== undefined ) {\r\n buf.setElements( new MACROUTILS[ type ]( vb.Elements ) );\r\n }\r\n }\r\n obj = buf;\r\n }\r\n\r\n if ( uniqueID !== undefined ) {\r\n this._identifierMap[ uniqueID ] = obj;\r\n }\r\n\r\n if ( defer !== undefined ) {\r\n return defer.promise;\r\n }\r\n return obj;\r\n },\r\n\r\n readUserDataContainer: function () {\r\n var jsonObj = this.getJSON();\r\n var osgjsObject;\r\n var uniqueID = jsonObj.UniqueID;\r\n if ( uniqueID !== undefined ) {\r\n osgjsObject = this._identifierMap[ uniqueID ];\r\n if ( osgjsObject !== undefined ) {\r\n return osgjsObject.Values;\r\n }\r\n }\r\n\r\n this._identifierMap[ uniqueID ] = jsonObj;\r\n return jsonObj.Values;\r\n },\r\n\r\n readPrimitiveSet: function () {\r\n var jsonObj = this.getJSON();\r\n var uniqueID;\r\n var osgjsObject;\r\n\r\n var obj;\r\n var defer;\r\n var mode;\r\n var first, count;\r\n var drawElementPrimitive = jsonObj.DrawElementUShort || jsonObj.DrawElementUByte || jsonObj.DrawElementUInt || jsonObj.DrawElementsUShort || jsonObj.DrawElementsUByte || jsonObj.DrawElementsUInt || undefined;\r\n if ( drawElementPrimitive ) {\r\n\r\n uniqueID = drawElementPrimitive.UniqueID;\r\n if ( uniqueID !== undefined ) {\r\n osgjsObject = this._identifierMap[ uniqueID ];\r\n if ( osgjsObject !== undefined ) {\r\n return osgjsObject;\r\n }\r\n }\r\n\r\n defer = Q.defer();\r\n var jsonArray = drawElementPrimitive.Indices;\r\n var prevJson = jsonObj;\r\n\r\n mode = drawElementPrimitive.Mode;\r\n if ( !mode ) {\r\n mode = PrimitiveSet.TRIANGLES;\r\n } else {\r\n mode = PrimitiveSet[ mode ];\r\n }\r\n obj = new DrawElements( mode );\r\n\r\n this.setJSON( jsonArray );\r\n Q.when( this.readBufferArray() ).then(\r\n function ( array ) {\r\n obj.setIndices( array );\r\n defer.resolve( obj );\r\n } );\r\n this.setJSON( prevJson );\r\n }\r\n\r\n var drawArrayPrimitive = jsonObj.DrawArray || jsonObj.DrawArrays;\r\n if ( drawArrayPrimitive ) {\r\n\r\n uniqueID = drawArrayPrimitive.UniqueID;\r\n if ( uniqueID !== undefined ) {\r\n osgjsObject = this._identifierMap[ uniqueID ];\r\n if ( osgjsObject !== undefined ) {\r\n return osgjsObject;\r\n }\r\n }\r\n\r\n mode = drawArrayPrimitive.Mode || drawArrayPrimitive.mode;\r\n first = drawArrayPrimitive.First !== undefined ? drawArrayPrimitive.First : drawArrayPrimitive.first;\r\n count = drawArrayPrimitive.Count !== undefined ? drawArrayPrimitive.Count : drawArrayPrimitive.count;\r\n var drawArray = new DrawArrays( PrimitiveSet[ mode ], first, count );\r\n obj = drawArray;\r\n }\r\n\r\n var drawArrayLengthsPrimitive = jsonObj.DrawArrayLengths || undefined;\r\n if ( drawArrayLengthsPrimitive ) {\r\n\r\n uniqueID = drawArrayLengthsPrimitive.UniqueID;\r\n if ( uniqueID !== undefined ) {\r\n osgjsObject = this._identifierMap[ uniqueID ];\r\n if ( osgjsObject !== undefined ) {\r\n return osgjsObject;\r\n }\r\n }\r\n\r\n mode = drawArrayLengthsPrimitive.Mode;\r\n first = drawArrayLengthsPrimitive.First;\r\n var array = drawArrayLengthsPrimitive.ArrayLengths;\r\n var drawArrayLengths = new DrawArrayLengths( PrimitiveSet[ mode ], first, array );\r\n obj = drawArrayLengths;\r\n }\r\n\r\n if ( uniqueID !== undefined ) {\r\n this._identifierMap[ uniqueID ] = obj;\r\n }\r\n\r\n if ( defer ) {\r\n return defer.promise;\r\n }\r\n return obj;\r\n },\r\n\r\n\r\n readObject: function () {\r\n\r\n var jsonObj = this.getJSON();\r\n var prop = window.Object.keys( jsonObj )[ 0 ];\r\n if ( !prop ) {\r\n Notify.warn( 'can\\'t find property for object ' + jsonObj );\r\n return undefined;\r\n }\r\n\r\n var uniqueID = jsonObj[ prop ].UniqueID;\r\n var osgjsObject;\r\n if ( uniqueID !== undefined ) {\r\n osgjsObject = this._identifierMap[ uniqueID ];\r\n if ( osgjsObject !== undefined ) {\r\n return osgjsObject;\r\n }\r\n }\r\n\r\n var obj = this.getObjectWrapper( prop );\r\n if ( !obj ) {\r\n Notify.warn( 'can\\'t instanciate object ' + prop );\r\n return undefined;\r\n }\r\n var ReaderParser = require( 'osgDB/ReaderParser' );\r\n var scope = ReaderParser.ObjectWrapper.serializers;\r\n var splittedPath = prop.split( '.' );\r\n for ( var i = 0, l = splittedPath.length; i < l; i++ ) {\r\n var reader = scope[ splittedPath[ i ] ];\r\n if ( reader === undefined ) {\r\n Notify.warn( 'can\\'t find function to read object ' + prop + ' - undefined' );\r\n return undefined;\r\n }\r\n scope = reader;\r\n }\r\n\r\n var promise = scope( this.setJSON( jsonObj[ prop ] ), obj );\r\n\r\n if ( uniqueID !== undefined ) {\r\n this._identifierMap[ uniqueID ] = obj;\r\n obj._uniqueID = uniqueID;\r\n }\r\n return promise;\r\n }\r\n };\r\n\r\n return Input;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgDB/Input.js\n ** module id = 131\n ** module chunks = 0 1\n **/","define( [\r\n 'q',\r\n 'require',\r\n 'osgDB/Input',\r\n 'osg/Notify',\r\n 'osg/Utils',\r\n 'osg/Texture',\r\n 'osg/Uniform',\r\n 'osg/BlendFunc',\r\n 'osg/Geometry',\r\n 'osg/BufferArray',\r\n 'osg/PrimitiveSet',\r\n 'osg/DrawArrays',\r\n 'osg/DrawElements',\r\n 'osg/StateSet',\r\n 'osg/Node',\r\n 'osg/Matrix',\r\n 'osg/MatrixTransform',\r\n 'osg/Projection'\r\n], function ( Q, require, Input, Notify, MACROUTILS, Texture, Uniform, BlendFunc, Geometry, BufferArray, PrimitiveSet, DrawArrays, DrawElements, StateSet, Node, Matrix, MatrixTransform, Projection ) {\r\n\r\n\r\n var ReaderParser = {};\r\n\r\n ReaderParser.ObjectWrapper = {};\r\n ReaderParser.ObjectWrapper.serializers = {};\r\n\r\n ReaderParser.readImage = function ( url, options ) {\r\n return ReaderParser.registry().readImageURL( url, options );\r\n };\r\n ReaderParser.readImageURL = ReaderParser.readImage; // alias\r\n\r\n ReaderParser.readNodeURL = function ( url, options ) {\r\n return ReaderParser.registry().readNodeURL( url, options );\r\n };\r\n\r\n ReaderParser.registry = function () {\r\n var Input = require( 'osgDB/Input' );\r\n if ( ReaderParser.registry._input === undefined ) {\r\n ReaderParser.registry._input = new Input();\r\n }\r\n return ReaderParser.registry._input;\r\n };\r\n\r\n ReaderParser.parseSceneGraph = function ( node, options ) {\r\n if ( node.Version !== undefined && node.Version > 0 ) {\r\n MACROUTILS.time( 'osgjs.metric:ReaderParser.parseSceneGraph' );\r\n\r\n var getPropertyValue = function ( o ) {\r\n var props = window.Object.keys( o );\r\n for ( var i = 0, l = props.length; i < l; i++ ) {\r\n if ( props[ i ] !== 'Generator' && props[ i ] !== 'Version' ) {\r\n return props[ i ];\r\n }\r\n }\r\n return undefined;\r\n };\r\n\r\n var key = getPropertyValue( node );\r\n if ( key ) {\r\n var obj = {};\r\n obj[ key ] = node[ key ];\r\n var Input = require( 'osgDB/Input' );\r\n var input = new Input( obj );\r\n\r\n // copy global options and override with user options\r\n var opt = MACROUTILS.objectMix( MACROUTILS.objectMix( {}, ReaderParser.registry().getOptions() ), options || {} );\r\n input.setOptions( opt );\r\n var object = input.readObject();\r\n MACROUTILS.timeEnd( 'osgjs.metric:ReaderParser.parseSceneGraph' );\r\n return object;\r\n } else {\r\n Notify.log( 'can\\'t parse scenegraph ' + node );\r\n }\r\n } else {\r\n MACROUTILS.time( 'osgjs.metric:ReaderParser.parseSceneGraphDeprecated' );\r\n var nodeOld = ReaderParser.parseSceneGraphDeprecated( node );\r\n MACROUTILS.timeEnd( 'osgjs.metric:ReaderParser.parseSceneGraphDeprecated' );\r\n return nodeOld;\r\n }\r\n return undefined;\r\n };\r\n\r\n ReaderParser.parseSceneGraphDeprecated = function ( node ) {\r\n var getFieldBackwardCompatible = function ( field, json ) {\r\n var value = json[ field ];\r\n if ( value === undefined ) {\r\n value = json[ field.toLowerCase() ];\r\n }\r\n return value;\r\n };\r\n var setName = function ( osgjs, json ) {\r\n var name = getFieldBackwardCompatible( 'Name', json );\r\n if ( name && osgjs.setName !== undefined ) {\r\n osgjs.setName( name );\r\n }\r\n };\r\n\r\n var setMaterial = function ( osgjs, json ) {\r\n setName( osgjs, json );\r\n osgjs.setAmbient( getFieldBackwardCompatible( 'Ambient', json ) );\r\n osgjs.setDiffuse( getFieldBackwardCompatible( 'Diffuse', json ) );\r\n osgjs.setEmission( getFieldBackwardCompatible( 'Emission', json ) );\r\n osgjs.setSpecular( getFieldBackwardCompatible( 'Specular', json ) );\r\n osgjs.setShininess( getFieldBackwardCompatible( 'Shininess', json ) );\r\n };\r\n\r\n var setBlendFunc = function ( osgjs, json ) {\r\n setName( osgjs, json );\r\n osgjs.setSourceRGB( json.SourceRGB );\r\n osgjs.setSourceAlpha( json.SourceAlpha );\r\n osgjs.setDestinationRGB( json.DestinationRGB );\r\n osgjs.setDestinationAlpha( json.DestinationAlpha );\r\n };\r\n\r\n var setTexture = function ( osgjs, json ) {\r\n var magFilter = json.MagFilter || json[ 'mag_filter' ] || undefined;\r\n if ( magFilter ) {\r\n osgjs.setMagFilter( magFilter );\r\n }\r\n var minFilter = json.MinFilter || json[ 'min_filter' ] || undefined;\r\n if ( minFilter ) {\r\n osgjs.setMinFilter( minFilter );\r\n }\r\n var wrapT = json.WrapT || json[ 'wrap_t' ] || undefined;\r\n if ( wrapT ) {\r\n osgjs.setWrapT( wrapT );\r\n }\r\n var wrapS = json.WrapS || json[ 'wrap_s' ] || undefined;\r\n if ( wrapS ) {\r\n osgjs.setWrapS( wrapS );\r\n }\r\n var file = getFieldBackwardCompatible( 'File', json );\r\n Q.when( ReaderParser.readImage( file ) ).then(\r\n function ( img ) {\r\n osgjs.setImage( img );\r\n } );\r\n };\r\n\r\n var setStateSet = function ( osgjs, json ) {\r\n setName( osgjs, json );\r\n var textures = getFieldBackwardCompatible( 'Textures', json ) || getFieldBackwardCompatible( 'TextureAttributeList', json ) || undefined;\r\n if ( textures ) {\r\n for ( var t = 0, tl = textures.length; t < tl; t++ ) {\r\n var file = getFieldBackwardCompatible( 'File', textures[ t ] );\r\n if ( !file ) {\r\n Notify.log( 'no texture on unit ' + t + ' skip it' );\r\n continue;\r\n }\r\n var Texture = require( 'osg/Texture' );\r\n var tex = new Texture();\r\n setTexture( tex, textures[ t ] );\r\n\r\n osgjs.setTextureAttributeAndModes( t, tex );\r\n osgjs.addUniform( Uniform.createInt1( t, 'Texture' + t ) );\r\n }\r\n }\r\n\r\n var blendfunc = getFieldBackwardCompatible( 'BlendFunc', json );\r\n if ( blendfunc ) {\r\n var newblendfunc = new BlendFunc();\r\n setBlendFunc( newblendfunc, blendfunc );\r\n osgjs.setAttributeAndModes( newblendfunc );\r\n }\r\n\r\n var material = getFieldBackwardCompatible( 'Material', json );\r\n if ( material ) {\r\n var Material = require( 'osg/Material' );\r\n var newmaterial = new Material();\r\n setMaterial( newmaterial, material );\r\n osgjs.setAttributeAndModes( newmaterial );\r\n }\r\n };\r\n\r\n\r\n var newnode;\r\n var children = node.children;\r\n var primitives = node.primitives || node.Primitives || undefined;\r\n var attributes = node.attributes || node.Attributes || undefined;\r\n if ( primitives || attributes ) {\r\n newnode = new Geometry();\r\n\r\n setName( newnode, node );\r\n\r\n MACROUTILS.extend( newnode, node ); // we should not do that\r\n node = newnode;\r\n node.primitives = primitives; // we should not do that\r\n node.attributes = attributes; // we should not do that\r\n\r\n for ( var p = 0, lp = primitives.length; p < lp; p++ ) {\r\n var mode = primitives[ p ].mode;\r\n if ( primitives[ p ].indices ) {\r\n var array = primitives[ p ].indices;\r\n array = new BufferArray( BufferArray[ array.type ], array.elements, array.itemSize );\r\n if ( !mode ) {\r\n mode = 'TRIANGLES';\r\n } else {\r\n mode = PrimitiveSet[ mode ];\r\n }\r\n primitives[ p ] = new DrawElements( mode, array );\r\n } else {\r\n mode = PrimitiveSet[ mode ];\r\n var first = primitives[ p ].first;\r\n var count = primitives[ p ].count;\r\n primitives[ p ] = new DrawArrays( mode, first, count );\r\n }\r\n }\r\n\r\n for ( var key in attributes ) {\r\n if ( attributes.hasOwnProperty( key ) ) {\r\n var attributeArray = attributes[ key ];\r\n attributes[ key ] = new BufferArray( attributeArray.type, attributeArray.elements, attributeArray.itemSize );\r\n }\r\n }\r\n }\r\n\r\n var stateset = getFieldBackwardCompatible( 'StateSet', node );\r\n if ( stateset ) {\r\n var newstateset = new StateSet();\r\n setStateSet( newstateset, stateset );\r\n node.stateset = newstateset;\r\n }\r\n\r\n var matrix = node.matrix || node.Matrix || undefined;\r\n if ( matrix ) {\r\n newnode = new MatrixTransform();\r\n setName( newnode, node );\r\n\r\n MACROUTILS.extend( newnode, node );\r\n Matrix.copy( matrix, newnode.getMatrix() );\r\n node = newnode;\r\n }\r\n\r\n var projection = node.projection || node.Projection || undefined;\r\n if ( projection ) {\r\n newnode = new Projection();\r\n setName( newnode, node );\r\n MACROUTILS.extend( newnode, node );\r\n Matrix.copy( projection, newnode.setProjectionMatrix() );\r\n node = newnode;\r\n }\r\n\r\n // default type\r\n if ( node.typeID === undefined ) {\r\n newnode = new Node();\r\n setName( newnode, node );\r\n MACROUTILS.extend( newnode, node );\r\n node = newnode;\r\n }\r\n\r\n\r\n if ( children ) {\r\n // disable children, it will be processed in the end\r\n node.children = [];\r\n\r\n for ( var child = 0, childLength = children.length; child < childLength; child++ ) {\r\n node.addChild( ReaderParser.parseSceneGraphDeprecated( children[ child ] ) );\r\n }\r\n }\r\n\r\n return node;\r\n };\r\n\r\n return ReaderParser;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgDB/ReaderParser.js\n ** module id = 132\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Notify',\r\n 'osg/Utils',\r\n 'osg/Node',\r\n 'osg/Depth',\r\n 'osg/Texture',\r\n 'osg/Camera',\r\n 'osg/FrameBufferObject',\r\n 'osg/Viewport',\r\n 'osg/Matrix',\r\n 'osg/Uniform',\r\n 'osg/StateSet',\r\n 'osg/Program',\r\n 'osg/Shader',\r\n 'osg/Shape',\r\n 'osg/TransformEnums',\r\n 'osg/Vec2',\r\n 'osg/Vec3'\r\n], function ( Notify, MACROUTILS, Node, Depth, Texture, Camera, FrameBufferObject, Viewport, Matrix, Uniform, StateSet, Program, Shader, Shape, TransformEnums, Vec2, Vec3 ) {\r\n\r\n 'use strict';\r\n\r\n /*\r\n Composer is an helper to create post fx. The idea is to push one or more textures into a pipe of shader filter.\r\n\r\n how to use it:\r\n\r\n // example how to blur a texture and render it to screen\r\n var myTexture; // imagine it's your texture you want to process\r\n var composer = new Composer();\r\n composer.addPass(new Composer.Filter.InputTexture(myTexture));\r\n composer.addPass(new Composer.Filter.HBlur(5));\r\n composer.addPass(new Composer.Filter.VBlur(5));\r\n composer.renderToScreen(1200, 900);\r\n composer.build(); // if you dont build manually it will be done in the scenegraph while upading\r\n rootnode.addChild(composer);\r\n\r\n // now you can imagine to some process and use the result as input texture for a geometry\r\n var myTexture; // imagine it's your texture you want to process\r\n var myResultTexture = new Texture(); // imagine it's your texture you want to process\r\n myResultTexture.setTextureSize(1200,900);\r\n var composer = new Composer();\r\n composer.addPass(new Composer.Filter.InputTexture(myTexture));\r\n composer.addPass(new Composer.Filter.HBlur(5));\r\n composer.addPass(new Composer.Filter.VBlur(5), resultTexture);\r\n\r\n myGeometry.getStateSet().setTextureAttributeAndModes(0, resultTexture);\r\n rootnode.addChild(composer);\r\n\r\n */\r\n\r\n var Composer = function () {\r\n Node.call( this );\r\n this._stack = [];\r\n this._renderToScreen = false;\r\n this._dirty = false;\r\n var UpdateCallback = function () {\r\n\r\n };\r\n UpdateCallback.prototype = {\r\n update: function ( node /*, nv */ ) {\r\n if ( node.isDirty() ) {\r\n node.build();\r\n }\r\n }\r\n };\r\n this.setUpdateCallback( new UpdateCallback() );\r\n this.getOrCreateStateSet().setAttributeAndModes( new Depth( 'DISABLE' ) );\r\n };\r\n\r\n Composer.prototype = MACROUTILS.objectInherit( Node.prototype, {\r\n dirty: function () {\r\n for ( var i = 0, l = this._stack.length; i < l; i++ ) {\r\n this._stack[ i ].filter.dirty();\r\n }\r\n },\r\n\r\n // addPass support different signature\r\n // addPass(filter) -> the filter will be done on a texture of the same size than the previous pass\r\n // addPass(filter, textureWidth, textureHeight) -> the filter will be done on a texture width and height\r\n // addPass(filter, texture) -> the filter will be done on the giver texture using its width and height\r\n addPass: function ( filter, arg0, arg1 ) {\r\n\r\n // when arg0 is a texture\r\n // arg1 is the target, can be TEXTURE_2D ( by default ) or\r\n // a cubemape's face like TEXTURE_CUBE_MAP_POSITIVE_X, ...\r\n if ( arg0 instanceof Texture ) {\r\n\r\n this._stack.push( {\r\n filter: filter,\r\n texture: arg0,\r\n textureTarget: arg1 || Texture.TEXTURE_2D\r\n } );\r\n\r\n } else if ( arg0 !== undefined && arg1 !== undefined ) {\r\n\r\n this._stack.push( {\r\n filter: filter,\r\n width: Math.floor( arg0 ),\r\n height: Math.floor( arg1 )\r\n } );\r\n\r\n } else {\r\n\r\n this._stack.push( {\r\n filter: filter\r\n } );\r\n\r\n }\r\n },\r\n renderToScreen: function ( w, h ) {\r\n this._renderToScreen = true;\r\n this._renderToScreenWidth = w;\r\n this._renderToScreenHeight = h;\r\n },\r\n\r\n isDirty: function () {\r\n for ( var i = 0, l = this._stack.length; i < l; i++ ) {\r\n if ( this._stack[ i ].filter.isDirty() ) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n\r\n build: function () {\r\n\r\n var root = this;\r\n this.removeChildren();\r\n var lastTextureResult;\r\n var self = this;\r\n\r\n this._stack.forEach( function ( element, i, array ) {\r\n\r\n if ( element.filter.isDirty() ) {\r\n element.filter.build();\r\n }\r\n\r\n var stateSet = element.filter.getStateSet();\r\n var w, h;\r\n\r\n if ( element.texture !== undefined ) {\r\n\r\n w = element.texture.getWidth();\r\n h = element.texture.getHeight();\r\n\r\n } else if ( element.width !== undefined && element.height !== undefined ) {\r\n\r\n w = element.width;\r\n h = element.height;\r\n\r\n } else {\r\n\r\n // get width from Texture0\r\n var inputTexture = stateSet.getTextureAttribute( 0, 'Texture' );\r\n if ( inputTexture === undefined ) {\r\n Notify.warn( 'Composer can\\'t find any information to setup texture output size' );\r\n }\r\n w = inputTexture.getWidth();\r\n h = inputTexture.getHeight();\r\n }\r\n\r\n // is it the last filter and we want to render to screen ?\r\n var lastFilterRenderToScreen = ( i === array.length - 1 &&\r\n self._renderToScreen === true );\r\n\r\n // check if we have something to do\r\n // else we will just translate stateset to the next filter\r\n // this part exist to manage the Composer.Filter.InputTexture that setup the first texture unit\r\n if ( !lastFilterRenderToScreen ) {\r\n if ( stateSet.getAttribute( 'Program' ) === undefined ) {\r\n array[ i + 1 ].filter.getStateSet().setTextureAttributeAndModes( 0, stateSet.getTextureAttribute( 0, 'Texture' ) );\r\n return;\r\n }\r\n }\r\n\r\n // check if we want to render on screen\r\n var camera = new Camera();\r\n camera.setStateSet( element.filter.getStateSet() );\r\n\r\n var texture;\r\n var quad;\r\n if ( lastFilterRenderToScreen === true ) {\r\n w = self._renderToScreenWidth;\r\n h = self._renderToScreenHeight;\r\n } else {\r\n camera.setRenderOrder( Camera.PRE_RENDER, 0 );\r\n texture = element.texture;\r\n var textureTarget = element.textureTarget;\r\n if ( texture === undefined ) {\r\n texture = new Texture();\r\n texture.setTextureSize( w, h );\r\n textureTarget = Texture.TEXTURE_2D;\r\n }\r\n camera.attachTexture( FrameBufferObject.COLOR_ATTACHMENT0, texture, textureTarget );\r\n }\r\n\r\n var vp = new Viewport( 0, 0, w, h );\r\n camera.setReferenceFrame( TransformEnums.ABSOLUTE_RF );\r\n camera.setViewport( vp );\r\n Matrix.makeOrtho( -w / 2, w / 2, -h / 2, h / 2, -5, 5, camera.getProjectionMatrix() );\r\n\r\n quad = Shape.createTexturedQuadGeometry( -w / 2, -h / 2, 0,\r\n w, 0, 0,\r\n 0, h, 0 );\r\n\r\n if ( element.filter.buildGeometry !== undefined )\r\n quad = element.filter.buildGeometry( quad );\r\n\r\n quad.setName( 'composer layer' );\r\n\r\n lastTextureResult = texture;\r\n\r\n // assign the result texture to the next stateset\r\n if ( i + 1 < array.length ) {\r\n array[ i + 1 ].filter.getStateSet().setTextureAttributeAndModes( 0, lastTextureResult );\r\n }\r\n\r\n camera.addChild( quad );\r\n element.filter.getStateSet().addUniform( Uniform.createFloat2( [ w, h ], 'RenderSize' ) );\r\n camera.setName( 'Composer Pass' + i );\r\n root.addChild( camera );\r\n } );\r\n this._resultTexture = lastTextureResult;\r\n }\r\n } );\r\n\r\n Composer.Filter = function () {\r\n this._stateSet = new StateSet();\r\n this._dirty = true;\r\n };\r\n\r\n Composer.Filter.prototype = {\r\n getStateSet: function () {\r\n return this._stateSet;\r\n },\r\n getOrCreateStateSet: function () {\r\n return this._stateSet;\r\n },\r\n dirty: function () {\r\n this._dirty = true;\r\n },\r\n isDirty: function () {\r\n return this._dirty;\r\n }\r\n };\r\n\r\n\r\n Composer.Filter.defaultVertexShader = [\r\n '#ifdef GL_ES',\r\n 'precision highp float;',\r\n '#endif',\r\n 'attribute vec3 Vertex;',\r\n 'attribute vec2 TexCoord0;',\r\n 'varying vec2 FragTexCoord0;',\r\n 'uniform mat4 ModelViewMatrix;',\r\n 'uniform mat4 ProjectionMatrix;',\r\n 'void main(void) {',\r\n ' gl_Position = ProjectionMatrix * ModelViewMatrix * vec4(Vertex,1.0);',\r\n ' FragTexCoord0 = TexCoord0;',\r\n '}',\r\n ''\r\n ].join( '\\n' );\r\n\r\n Composer.Filter.defaultFragmentShaderHeader = [\r\n '#ifdef GL_ES',\r\n 'precision highp float;',\r\n '#endif',\r\n 'varying vec2 FragTexCoord0;',\r\n 'uniform vec2 RenderSize;',\r\n 'uniform sampler2D Texture0;',\r\n ''\r\n ].join( '\\n' );\r\n\r\n Composer.Filter.shaderUtils = [\r\n 'vec4 packFloatTo4x8(in float v) {',\r\n 'vec4 enc = vec4(1.0, 255.0, 65025.0, 160581375.0) * v;',\r\n 'enc = fract(enc);',\r\n 'enc -= enc.yzww * vec4(1.0/255.0,1.0/255.0,1.0/255.0,0.0);',\r\n 'return enc;',\r\n '}',\r\n\r\n ' ',\r\n 'vec4 pack2FloatTo4x8(in vec2 val) {',\r\n ' const vec2 bitSh = vec2(256.0, 1.0);',\r\n ' const vec2 bitMsk = vec2(0.0, 1.0/256.0);',\r\n ' vec2 res1 = fract(val.x * bitSh);',\r\n ' res1 -= res1.xx * bitMsk;',\r\n ' vec2 res2 = fract(val.y * bitSh);',\r\n ' res2 -= res2.xx * bitMsk;',\r\n ' return vec4(res1.x,res1.y,res2.x,res2.y);',\r\n '}',\r\n ' ',\r\n 'float unpack4x8ToFloat( vec4 rgba ) {',\r\n ' return dot( rgba, vec4(1.0, 1.0/255.0, 1.0/65025.0, 1.0/160581375.0) );',\r\n '}',\r\n ' ',\r\n 'vec2 unpack4x8To2Float(in vec4 val) {',\r\n ' const vec2 unshift = vec2(1.0/256.0, 1.0);',\r\n ' return vec2(dot(val.xy, unshift), dot(val.zw, unshift));',\r\n '}',\r\n\r\n 'vec2 encodeNormal (vec3 n)',\r\n '{',\r\n ' float f = sqrt(8.0*n.z+8.0);',\r\n ' return n.xy / f + 0.5;',\r\n '}',\r\n\r\n 'vec3 decodeNormal (vec2 enc)',\r\n '{',\r\n ' vec2 fenc = enc*4.0-2.0;',\r\n ' float f = dot(fenc,fenc);',\r\n ' float g = sqrt(1.0-f/4.0);',\r\n ' vec3 n;',\r\n ' n.xy = fenc*g;',\r\n ' n.z = 1.0-f/2.0;',\r\n ' return n;',\r\n '}',\r\n ''\r\n ].join( '\\n' );\r\n\r\n Composer.Filter.Helper = {\r\n pascalCache: [\r\n [ 1 ]\r\n ],\r\n getOrCreatePascalCoefficients: function ( kernelSize ) {\r\n kernelSize = kernelSize === undefined ? 5 : Math.min( kernelSize, 128 );\r\n var cache = Composer.Filter.Helper.pascalCache;\r\n if ( cache[ kernelSize ] )\r\n return cache[ kernelSize ];\r\n for ( var j = cache.length - 1; j < kernelSize; j++ ) {\r\n var currentRow = cache[ j ];\r\n var currentRowSize = currentRow.length;\r\n\r\n var nextRow = new Array( currentRowSize );\r\n nextRow[ 0 ] = 1.0;\r\n nextRow[ currentRowSize ] = 1.0;\r\n\r\n // unnormalized pascal\r\n var sum = j === cache.length - 1 ? Math.pow( 2, j ) : 1.0;\r\n for ( var p = 0; p < currentRowSize - 1; p++ )\r\n nextRow[ p + 1 ] = ( currentRow[ p ] + currentRow[ p + 1 ] ) * sum;\r\n // normalized array\r\n sum = Math.pow( 2, j + 1 );\r\n for ( var k = 0; k < currentRowSize + 1; k++ )\r\n nextRow[ k ] /= sum;\r\n cache.push( nextRow );\r\n }\r\n return cache[ kernelSize ];\r\n }\r\n };\r\n\r\n Composer.Filter.Custom = function ( fragmentShader, uniforms ) {\r\n Composer.Filter.call( this );\r\n this._fragmentShader = fragmentShader;\r\n this._uniforms = uniforms;\r\n this._vertexShader = Composer.Filter.defaultVertexShader;\r\n };\r\n\r\n Composer.Filter.Custom.prototype = MACROUTILS.objectInherit( Composer.Filter.prototype, {\r\n build: function () {\r\n\r\n var program = new Program(\r\n new Shader( 'VERTEX_SHADER', this._vertexShader ),\r\n new Shader( 'FRAGMENT_SHADER', this._fragmentShader ) );\r\n\r\n if ( this._uniforms ) {\r\n var unitIndex = 0;\r\n\r\n var r = this._fragmentShader.match( /uniform\\s+\\w+\\s+\\w+/g );\r\n if ( r !== null ) {\r\n for ( var i = 0, l = r.length; i < l; i++ ) {\r\n var match = r[ i ].match( /uniform\\s+(\\w+)\\s+(\\w+)/ );\r\n var uniformType = match[ 1 ];\r\n var uniformName = match[ 2 ];\r\n var uniform;\r\n\r\n if ( this._uniforms[ uniformName ] !== undefined ) {\r\n var uniformValue = this._uniforms[ uniformName ];\r\n if ( uniformType.search( 'sampler' ) !== -1 ) {\r\n this._stateSet.setTextureAttributeAndModes( unitIndex, uniformValue );\r\n uniform = Uniform.createInt1( unitIndex, uniformName );\r\n unitIndex++;\r\n this._stateSet.addUniform( uniform );\r\n } else {\r\n if ( Uniform.isUniform( uniformValue ) ) {\r\n uniform = uniformValue;\r\n } else {\r\n uniform = Uniform[ uniformType ]( this._uniforms[ uniformName ], uniformName );\r\n }\r\n this._stateSet.addUniform( uniform );\r\n }\r\n }\r\n }\r\n }\r\n }\r\n this._stateSet.setAttributeAndModes( program );\r\n this._dirty = false;\r\n }\r\n } );\r\n\r\n\r\n\r\n Composer.Filter.AverageHBlur = function ( nbSamplesOpt, linear ) {\r\n Composer.Filter.call( this );\r\n this._noLinear = linear === false;\r\n if ( nbSamplesOpt === undefined ) {\r\n this.setBlurSize( 5 );\r\n } else {\r\n this.setBlurSize( nbSamplesOpt );\r\n }\r\n this._pixelSize = 1.0;\r\n };\r\n\r\n Composer.Filter.AverageHBlur.prototype = MACROUTILS.objectInherit( Composer.Filter.prototype, {\r\n setBlurSize: function ( nbSamples ) {\r\n if ( nbSamples % 2 !== 1 ) {\r\n nbSamples += 1;\r\n }\r\n this._nbSamples = nbSamples;\r\n this.dirty();\r\n },\r\n setPixelSize: function ( value ) {\r\n this._pixelSize = value;\r\n this.dirty();\r\n },\r\n\r\n getUVOffset: function ( value ) {\r\n return 'vec2(float(' + value + ')/RenderSize[0], 0.0);';\r\n },\r\n getShaderBlurKernel: function () {\r\n var nbSamples = this._nbSamples;\r\n\r\n\r\n var kernel = [];\r\n\r\n kernel.push( ' pixel = texture2D(Texture0, FragTexCoord0 );' );\r\n kernel.push( ' if (pixel.w == 0.0) { gl_FragColor = pixel; return; }' );\r\n kernel.push( ' vec2 offset;' );\r\n var i;\r\n var numTexBlurStep = Math.floor( nbSamples / 2 );\r\n if ( numTexBlurStep % 2 !== 0 ) {\r\n nbSamples += 1;\r\n numTexBlurStep = Math.floor( nbSamples / 2 );\r\n }\r\n var numFinalSample = numTexBlurStep * 2.0 + 1.0;\r\n var weight = 1.0 / numFinalSample;\r\n if ( this._noLinear ) {\r\n for ( i = 0; i < numTexBlurStep; i++ ) {\r\n kernel.push( ' offset = ' + this.getUVOffset( ( i + 1 ) * this._pixelSize ) );\r\n kernel.push( ' pixel += texture2D(Texture0, FragTexCoord0 + offset);' );\r\n kernel.push( ' pixel += texture2D(Texture0, FragTexCoord0 - offset);' );\r\n }\r\n kernel.push( ' pixel *= float(' + weight + ');' );\r\n\r\n //console.log( 'N: Sum = ' + ( weight + numTexBlurStep * weight * 2 ) );\r\n //console.log( 'N: nbSample = ' + nbSamples + ' texBlurStep= ' + numTexBlurStep + ' finalSample= ' + numFinalSample );\r\n //console.log( 'N: w = ' + weight );\r\n\r\n } else {\r\n // using bilinear HW to divide texfetch by 2\r\n var offset, offsetIdx;\r\n var idx = 1;\r\n var weightTwo = ( 1.0 - weight ) / ( numTexBlurStep * 2.0 );\r\n // first pixel not same weight as others\r\n kernel.push( ' pixel *= float(' + weight + ');' );\r\n kernel.push( ' vec4 pixelLin = vec4(0.0);' );\r\n\r\n for ( i = 0; i < numTexBlurStep; i += 2 ) {\r\n\r\n offsetIdx = idx + 0.5; // ((i*weight + (i+1)*weight)/(weight+weight)) === (2i + 1) / 2 = i + 0.5\r\n idx += 2;\r\n offset = this.getUVOffset( offsetIdx * this._pixelSize );\r\n\r\n kernel.push( ' offset = ' + offset );\r\n\r\n kernel.push( ' pixelLin += texture2D(Texture0, FragTexCoord0 + offset);' );\r\n kernel.push( ' pixelLin += texture2D(Texture0, FragTexCoord0 - offset);' );\r\n }\r\n kernel.push( ' pixel += pixelLin * float(' + weightTwo * 2 + ');' );\r\n\r\n //console.log( 'L: Sum = ' + ( weight + numTexBlurStep * weightTwo * 2 ) );\r\n //console.log( 'L: nbSample = ' + nbSamples + ' texBlurStep= ' + numTexBlurStep + ' finalSample= ' + numFinalSample );\r\n //console.log( 'N: w = ' + weight + ' numTexBlurStep ' + numTexBlurStep + ' * w2 = ' + weightTwo );\r\n\r\n }\r\n return kernel;\r\n },\r\n build: function () {\r\n\r\n var tex = this._stateSet.getTextureAttribute( 0, 'Texture' );\r\n if ( tex && !this._noLinear ) {\r\n tex.setMinFilter( 'LINEAR' );\r\n tex.setMagFilter( 'LINEAR' );\r\n } else {\r\n this._noLinear = true;\r\n }\r\n\r\n //var nbSamples = this._nbSamples;\r\n var vtx = Composer.Filter.defaultVertexShader;\r\n var fgt = [\r\n Composer.Filter.defaultFragmentShaderHeader,\r\n 'uniform float width;',\r\n\r\n 'void main (void)',\r\n '{',\r\n ' vec4 pixel;',\r\n this.getShaderBlurKernel().join( '\\n' ),\r\n ' gl_FragColor = vec4(pixel);',\r\n '}',\r\n ''\r\n ].join( '\\n' );\r\n\r\n var program = new Program(\r\n new Shader( 'VERTEX_SHADER', vtx ),\r\n new Shader( 'FRAGMENT_SHADER', fgt ) );\r\n\r\n if ( this._stateSet.getUniform( 'Texture0' ) === undefined ) {\r\n this._stateSet.addUniform( Uniform.createInt1( 0, 'Texture0' ) );\r\n }\r\n\r\n\r\n this._stateSet.setAttributeAndModes( program );\r\n this._dirty = false;\r\n }\r\n } );\r\n\r\n\r\n Composer.Filter.AverageVBlur = function ( nbSamplesOpt, linear ) {\r\n Composer.Filter.AverageHBlur.call( this, nbSamplesOpt, linear );\r\n };\r\n Composer.Filter.AverageVBlur.prototype = MACROUTILS.objectInherit( Composer.Filter.AverageHBlur.prototype, {\r\n getUVOffset: function ( value ) {\r\n return 'vec2(0.0, float(' + value + ')/RenderSize[1]);';\r\n }\r\n } );\r\n\r\n Composer.Filter.BilateralHBlur = function ( options ) {\r\n Composer.Filter.call( this );\r\n\r\n if ( options === undefined ) {\r\n options = {};\r\n }\r\n\r\n var nbSamplesOpt = options.nbSamples;\r\n var depthTexture = options.depthTexture;\r\n var radius = options.radius;\r\n\r\n if ( nbSamplesOpt === undefined ) {\r\n this.setBlurSize( 5 );\r\n } else {\r\n this.setBlurSize( nbSamplesOpt );\r\n }\r\n this._depthTexture = depthTexture;\r\n this._radius = Uniform.createFloat( 1.0, 'radius' );\r\n this._pixelSize = Uniform.createFloat( 1.0, 'pixelSize' );\r\n this.setRadius( radius );\r\n };\r\n\r\n Composer.Filter.BilateralHBlur.prototype = MACROUTILS.objectInherit( Composer.Filter.prototype, {\r\n setBlurSize: function ( nbSamples ) {\r\n if ( nbSamples % 2 !== 1 ) {\r\n nbSamples += 1;\r\n }\r\n //Notify.log('BlurSize ' + nbSamples);\r\n this._nbSamples = nbSamples;\r\n this.dirty();\r\n },\r\n setPixelSize: function ( value ) {\r\n this._pixelSize.get()[ 0 ] = value;\r\n this._pixelSize.dirty();\r\n },\r\n setRadius: function ( radius ) {\r\n this._radius.get()[ 0 ] = radius; // *2.0;\r\n this._radius.dirty();\r\n },\r\n getUVOffset: function ( value ) {\r\n return 'vec2(0.0, float(' + value + ') * pixelSize )/RenderSize[1];';\r\n },\r\n getShaderBlurKernel: function () {\r\n var nbSamples = this._nbSamples;\r\n var kernel = [];\r\n kernel.push( ' pixel = texture2D(Texture0, FragTexCoord0 );' );\r\n kernel.push( ' if (pixel.w <= 0.0001) { gl_FragColor = vec4(1.0); return; }' );\r\n kernel.push( ' vec2 offset, tmpUV;' );\r\n kernel.push( ' depth = getDepthValue(texture2D(Texture1, FragTexCoord0 ));' );\r\n for ( var i = 1; i < Math.ceil( nbSamples / 2 ); i++ ) {\r\n kernel.push( ' offset = ' + this.getUVOffset( i ) );\r\n\r\n kernel.push( ' tmpUV = FragTexCoord0 + offset;' );\r\n kernel.push( ' tmpDepth = getDepthValue(texture2D(Texture1, tmpUV ));' );\r\n kernel.push( ' if ( abs(depth-tmpDepth) < radius) {' );\r\n kernel.push( ' pixel += texture2D(Texture0, tmpUV);' );\r\n kernel.push( ' nbHits += 1.0;' );\r\n kernel.push( ' }' );\r\n\r\n kernel.push( ' tmpUV = FragTexCoord0 - offset;' );\r\n kernel.push( ' tmpDepth = getDepthValue(texture2D(Texture1, tmpUV ));' );\r\n kernel.push( ' if ( abs(depth-tmpDepth) < radius) {' );\r\n kernel.push( ' pixel += texture2D(Texture0, tmpUV);' );\r\n kernel.push( ' nbHits += 1.0;' );\r\n kernel.push( ' }' );\r\n }\r\n kernel.push( ' pixel /= nbHits;' );\r\n return kernel;\r\n },\r\n build: function () {\r\n //var nbSamples = this._nbSamples;\r\n var vtx = Composer.Filter.defaultVertexShader;\r\n var fgt = [\r\n Composer.Filter.defaultFragmentShaderHeader,\r\n 'uniform sampler2D Texture1;',\r\n 'uniform float width;',\r\n 'uniform mat4 projection;',\r\n 'uniform float radius;',\r\n 'uniform float pixelSize;',\r\n\r\n 'float znear,zfar,zrange;',\r\n '',\r\n Composer.Filter.shaderUtils,\r\n '',\r\n 'float getDepthValue(vec4 v) {',\r\n ' float depth = unpack4x8ToFloat(v);',\r\n ' depth = depth*zrange+znear;',\r\n ' return -depth;',\r\n '}',\r\n\r\n 'void main (void)',\r\n '{',\r\n ' vec4 pixel;',\r\n ' float depth, tmpDepth;',\r\n ' znear = projection[3][2] / (projection[2][2]-1.0);',\r\n ' zfar = projection[3][2] / (projection[2][2]+1.0);',\r\n ' zrange = zfar-znear;',\r\n ' float nbHits = 1.0;',\r\n\r\n this.getShaderBlurKernel().join( '\\n' ),\r\n ' gl_FragColor = vec4(pixel);',\r\n '}',\r\n ''\r\n ].join( '\\n' );\r\n\r\n var program = new Program(\r\n new Shader( 'VERTEX_SHADER', vtx ),\r\n new Shader( 'FRAGMENT_SHADER', fgt ) );\r\n\r\n if ( this._stateSet.getUniform( 'Texture0' ) === undefined ) {\r\n this._stateSet.addUniform( Uniform.createInt1( 0, 'Texture0' ) );\r\n }\r\n if ( this._stateSet.getUniform( 'Texture1' ) === undefined ) {\r\n this._stateSet.addUniform( Uniform.createInt1( 1, 'Texture1' ) );\r\n }\r\n this._stateSet.addUniform( this._radius );\r\n this._stateSet.addUniform( this._pixelSize );\r\n this._stateSet.setTextureAttributeAndModes( 1, this._depthTexture );\r\n this._stateSet.setAttributeAndModes( program );\r\n this._dirty = false;\r\n }\r\n } );\r\n\r\n Composer.Filter.BilateralVBlur = function ( options ) {\r\n Composer.Filter.BilateralHBlur.call( this, options );\r\n };\r\n\r\n Composer.Filter.BilateralVBlur.prototype = MACROUTILS.objectInherit( Composer.Filter.BilateralHBlur.prototype, {\r\n getUVOffset: function ( value ) {\r\n return 'vec2(float(' + value + ')*pixelSize/RenderSize[0],0.0);';\r\n }\r\n } );\r\n\r\n // InputTexture is a fake filter to setup the first texture\r\n // in the composer pipeline\r\n Composer.Filter.InputTexture = function ( texture ) {\r\n Composer.Filter.call( this );\r\n this._stateSet.setTextureAttributeAndModes( 0, texture );\r\n };\r\n Composer.Filter.InputTexture.prototype = MACROUTILS.objectInherit( Composer.Filter.prototype, {\r\n build: function () {\r\n this._dirty = false;\r\n }\r\n } );\r\n\r\n // Operate a Gaussian horizontal blur\r\n Composer.Filter.HBlur = function ( nbSamplesOpt, linear ) {\r\n Composer.Filter.call( this );\r\n this._noLinear = linear === false;\r\n if ( nbSamplesOpt === undefined ) {\r\n this.setBlurSize( 5 );\r\n } else {\r\n this.setBlurSize( nbSamplesOpt );\r\n }\r\n };\r\n\r\n Composer.Filter.HBlur.prototype = MACROUTILS.objectInherit( Composer.Filter.prototype, {\r\n setBlurSize: function ( nbSamples ) {\r\n if ( nbSamples % 2 !== 0 ) {\r\n nbSamples += 1;\r\n }\r\n this._nbSamples = nbSamples;\r\n this.dirty();\r\n },\r\n getUVOffset: function ( value ) {\r\n // TODO: could compute that in JS and remove 1 div per kernel step\r\n return 'vec2(float(' + value + ')/ RenderSize[0], 0.0) ;';\r\n },\r\n build: function () {\r\n var nbSamples = this._nbSamples;\r\n\r\n // TODO: get rendersize from that and precompute\r\n // offset when possible\r\n var tex = this._stateSet.getTextureAttribute( 0, 'Texture' );\r\n if ( tex && !this._noLinear ) {\r\n tex.setMinFilter( 'LINEAR' );\r\n tex.setMagFilter( 'LINEAR' );\r\n } else {\r\n this._noLinear = true;\r\n }\r\n\r\n var vtx = Composer.Filter.defaultVertexShader;\r\n\r\n\r\n // http://rastergrid.com/blog/2010/09/efficient-gaussian-blur-with-linear-sampling/\r\n // outermost are near 0, so unless float buffer...\r\n // at samples = 6 already it's 1/32 = 0.03\r\n // so we lessen texFetch (allow higher kernel size with less texfetch)\r\n var weightMin = 0.005 / nbSamples;\r\n var coeffIdx = nbSamples;\r\n var weights = Composer.Filter.Helper.getOrCreatePascalCoefficients( coeffIdx );\r\n var start = Math.floor( coeffIdx / 2.0 );\r\n\r\n var kernel = [];\r\n kernel.push( ' pixel = float(' + weights[ start ] + ')*texture2D(Texture0, FragTexCoord0 ).rgb;' );\r\n\r\n kernel.push( ' vec2 offset;' );\r\n var idx, i, weight, offset, offsetIdx;\r\n if ( this._noLinear ) {\r\n idx = 1;\r\n for ( i = start + 1; i < nbSamples; i++ ) {\r\n weight = weights[ i ];\r\n\r\n if ( weight < weightMin ) break;\r\n\r\n offsetIdx = idx++;\r\n offset = this.getUVOffset( offsetIdx );\r\n\r\n kernel.push( ' offset = ' + offset );\r\n kernel.push( ' pixel += ' + weight + '* texture2D(Texture0, (FragTexCoord0.xy + offset.xy)).rgb;' );\r\n kernel.push( ' pixel += ' + weight + '* texture2D(Texture0, (FragTexCoord0.xy - offset.xy)).rgb;' );\r\n }\r\n } else {\r\n\r\n // using bilinear HW to divide texfetch by 2\r\n // http://www.rastergrid.com/blog/wp-content/uploads/2010/09/equation.png\r\n idx = 1;\r\n for ( i = start + 1; i < nbSamples; i += 2 ) {\r\n var weightT1 = weights[ i ];\r\n var weightT2 = weights[ i + 1 ];\r\n\r\n weight = weightT1 + weightT2;\r\n\r\n if ( weight < weightMin ) break;\r\n\r\n var offsetT1 = idx;\r\n var offsetT2 = idx + 1;\r\n idx += 2;\r\n\r\n offsetIdx = ( offsetT1 * weightT1 + offsetT2 * weightT2 ) / weight;\r\n offset = this.getUVOffset( offsetIdx );\r\n\r\n kernel.push( ' offset = ' + offset );\r\n kernel.push( ' pixel += ' + weight + '* texture2D(Texture0, (FragTexCoord0.xy + offset.xy)).rgb;' );\r\n kernel.push( ' pixel += ' + weight + '* texture2D(Texture0, (FragTexCoord0.xy - offset.xy)).rgb;' );\r\n }\r\n }\r\n var fgt = [\r\n Composer.Filter.defaultFragmentShaderHeader,\r\n 'uniform float width;',\r\n\r\n 'void main (void)',\r\n '{',\r\n ' vec3 pixel;',\r\n kernel.join( '\\n' ),\r\n ' gl_FragColor = vec4(pixel,1.0);',\r\n '}',\r\n ''\r\n ].join( '\\n' );\r\n\r\n var program = new Program(\r\n new Shader( 'VERTEX_SHADER', vtx ),\r\n new Shader( 'FRAGMENT_SHADER', fgt ) );\r\n\r\n if ( this._stateSet.getUniform( 'Texture0' ) === undefined ) {\r\n this._stateSet.addUniform( Uniform.createInt1( 0, 'Texture0' ) );\r\n }\r\n this._stateSet.setAttributeAndModes( program );\r\n this._dirty = false;\r\n }\r\n } );\r\n\r\n // Operate a Gaussian vertical blur\r\n Composer.Filter.VBlur = function ( nbSamplesOpt, linear ) {\r\n Composer.Filter.HBlur.call( this, nbSamplesOpt, linear );\r\n };\r\n\r\n Composer.Filter.VBlur.prototype = MACROUTILS.objectInherit( Composer.Filter.HBlur.prototype, {\r\n getUVOffset: function ( value ) {\r\n return 'vec2(0.0, float(' + value + ')/RenderSize[1]) ;';\r\n }\r\n } );\r\n\r\n // Sobel filter\r\n // http://en.wikipedia.org/wiki/Sobel_operator\r\n Composer.Filter.SobelFilter = function () {\r\n Composer.Filter.call( this );\r\n this._color = Uniform.createFloat3( [ 1.0, 1.0, 1.0 ], 'color' );\r\n this._factor = Uniform.createFloat( 1.0, 'factor' );\r\n };\r\n\r\n Composer.Filter.SobelFilter.prototype = MACROUTILS.objectInherit( Composer.Filter.prototype, {\r\n setColor: function ( color ) {\r\n this._color.get()[ 0 ] = color[ 0 ];\r\n this._color.get()[ 1 ] = color[ 1 ];\r\n this._color.get()[ 2 ] = color[ 2 ];\r\n this._color.dirty();\r\n },\r\n setFactor: function ( f ) {\r\n this._factor.get()[ 0 ] = f;\r\n this._factor.dirty();\r\n },\r\n build: function () {\r\n var stateSet = this._stateSet;\r\n var vtx = Composer.Filter.defaultVertexShader;\r\n var fgt = [\r\n '',\r\n Composer.Filter.defaultFragmentShaderHeader,\r\n 'uniform vec3 color;',\r\n 'uniform float factor;',\r\n 'void main (void)',\r\n '{',\r\n ' float fac0 = 2.0;',\r\n ' float fac1 = 1.0;',\r\n ' float offsetx = 1.0/RenderSize[0];',\r\n ' float offsety = 1.0/RenderSize[1];',\r\n ' vec4 texel0 = texture2D(Texture0, FragTexCoord0 + vec2(offsetx, offsety));',\r\n ' vec4 texel1 = texture2D(Texture0, FragTexCoord0 + vec2(offsetx, 0.0));',\r\n ' vec4 texel2 = texture2D(Texture0, FragTexCoord0 + vec2(offsetx, -offsety));',\r\n ' vec4 texel3 = texture2D(Texture0, FragTexCoord0 + vec2(0.0, -offsety));',\r\n ' vec4 texel4 = texture2D(Texture0, FragTexCoord0 + vec2(-offsetx, -offsety));',\r\n ' vec4 texel5 = texture2D(Texture0, FragTexCoord0 + vec2(-offsetx, 0.0));',\r\n ' vec4 texel6 = texture2D(Texture0, FragTexCoord0 + vec2(-offsetx, offsety));',\r\n ' vec4 texel7 = texture2D(Texture0, FragTexCoord0 + vec2(0.0, offsety));',\r\n ' vec4 rowx = -fac0*texel5 + fac0*texel1 + -fac1*texel6 + fac1*texel0 + -fac1*texel4 + fac1*texel2;',\r\n ' vec4 rowy = -fac0*texel3 + fac0*texel7 + -fac1*texel4 + fac1*texel6 + -fac1*texel2 + fac1*texel0;',\r\n ' float mag = sqrt(dot(rowy,rowy)+dot(rowx,rowx));',\r\n ' if (mag < 1.0/255.0) discard;',\r\n ' mag *= factor;',\r\n ' mag = min(1.0, mag);',\r\n ' gl_FragColor = vec4(color*mag,mag);',\r\n '}',\r\n ''\r\n ].join( '\\n' );\r\n\r\n var program = new Program(\r\n new Shader( 'VERTEX_SHADER', vtx ),\r\n new Shader( 'FRAGMENT_SHADER', fgt ) );\r\n\r\n stateSet.setAttributeAndModes( program );\r\n stateSet.addUniform( this._color );\r\n stateSet.addUniform( this._factor );\r\n stateSet.addUniform( Uniform.createInt1( 0, 'Texture0' ) );\r\n this._dirty = false;\r\n }\r\n } );\r\n\r\n\r\n\r\n Composer.Filter.BlendMix = function () {\r\n Composer.Filter.call( this );\r\n var texture0, texture1, mixValue;\r\n var unit0 = 0;\r\n var unit1 = 1;\r\n var stateSet = this._stateSet;\r\n if ( arguments.length === 3 ) {\r\n texture0 = arguments[ 0 ];\r\n texture1 = arguments[ 1 ];\r\n mixValue = arguments[ 2 ];\r\n unit0 = 1;\r\n unit1 = 2;\r\n stateSet.setTextureAttributeAndModes( unit0, texture0 );\r\n } else if ( arguments.length === 2 ) {\r\n texture1 = arguments[ 0 ];\r\n mixValue = arguments[ 1 ];\r\n } else if ( arguments.length === 1 ) {\r\n texture1 = arguments[ 0 ];\r\n mixValue = 0.5;\r\n }\r\n stateSet.setTextureAttributeAndModes( unit1, texture1 );\r\n stateSet.addUniform( Uniform.createInt1( unit0, 'Texture0' ) );\r\n stateSet.addUniform( Uniform.createInt1( unit1, 'Texture1' ) );\r\n this._mixValueUniform = Uniform.createFloat1( mixValue, 'MixValue' );\r\n stateSet.addUniform( this._mixValueUniform );\r\n };\r\n\r\n Composer.Filter.BlendMix.prototype = MACROUTILS.objectInherit( Composer.Filter.prototype, {\r\n getBlendFactorUniform: function () {\r\n return this._mixValueUniform;\r\n },\r\n\r\n build: function () {\r\n var stateSet = this._stateSet;\r\n var vtx = Composer.Filter.defaultVertexShader;\r\n var fgt = [\r\n '',\r\n Composer.Filter.defaultFragmentShaderHeader,\r\n 'uniform sampler2D Texture1;',\r\n 'uniform float MixValue;',\r\n\r\n 'void main (void)',\r\n '{',\r\n ' gl_FragColor = mix(texture2D(Texture0,FragTexCoord0), texture2D(Texture1,FragTexCoord0),MixValue);',\r\n '}',\r\n ''\r\n ].join( '\\n' );\r\n\r\n var program = new Program(\r\n new Shader( 'VERTEX_SHADER', vtx ),\r\n new Shader( 'FRAGMENT_SHADER', fgt ) );\r\n\r\n stateSet.setAttributeAndModes( program );\r\n this._dirty = false;\r\n }\r\n } );\r\n\r\n\r\n Composer.Filter.BlendMultiply = function () {\r\n Composer.Filter.call( this );\r\n var stateSet = this._stateSet;\r\n var texture0, texture1;\r\n var unit0 = 0;\r\n var unit1 = 1;\r\n if ( arguments.length === 2 ) {\r\n texture0 = arguments[ 0 ];\r\n texture1 = arguments[ 1 ];\r\n unit0 = 1;\r\n unit0 = 2;\r\n stateSet.setTextureAttributeAndModes( unit0, texture0 );\r\n } else if ( arguments.length === 1 ) {\r\n texture1 = arguments[ 0 ];\r\n }\r\n stateSet.setTextureAttributeAndModes( unit1, texture1 );\r\n stateSet.addUniform( Uniform.createInt1( unit0, 'Texture0' ) );\r\n stateSet.addUniform( Uniform.createInt1( unit1, 'Texture1' ) );\r\n };\r\n\r\n Composer.Filter.BlendMultiply.prototype = MACROUTILS.objectInherit( Composer.Filter.prototype, {\r\n build: function () {\r\n var vtx = Composer.Filter.defaultVertexShader;\r\n var fgt = [\r\n '',\r\n Composer.Filter.defaultFragmentShaderHeader,\r\n 'uniform sampler2D Texture1;',\r\n 'uniform float MixValue;',\r\n\r\n 'void main (void)',\r\n '{',\r\n ' gl_FragColor = texture2D(Texture0,FragTexCoord0)*texture2D(Texture1,FragTexCoord0);',\r\n '}',\r\n ''\r\n ].join( '\\n' );\r\n\r\n var program = new Program(\r\n new Shader( 'VERTEX_SHADER', vtx ),\r\n new Shader( 'FRAGMENT_SHADER', fgt ) );\r\n\r\n this._stateSet.setAttributeAndModes( program );\r\n this._dirty = false;\r\n }\r\n } );\r\n\r\n Composer.Filter.SSAO = function ( options ) {\r\n Composer.Filter.call( this );\r\n\r\n var stateSet = this._stateSet;\r\n var nbSamples = 16;\r\n var radius = 0.05;\r\n if ( options !== undefined ) {\r\n if ( options.nbSamples !== undefined )\r\n nbSamples = options.nbSamples;\r\n\r\n if ( options.radius !== undefined )\r\n radius = options.radius;\r\n }\r\n\r\n var textureNormal = options.normal;\r\n var texturePosition = options.position;\r\n this._radius = radius;\r\n this._nbSamples = nbSamples;\r\n this._noiseTextureSize = 16;\r\n this._sceneRadius = 2.0;\r\n\r\n stateSet.addUniform( Uniform.createFloat1( 1.0, 'Power' ) );\r\n stateSet.addUniform( Uniform.createFloat1( radius, 'Radius' ) );\r\n stateSet.addUniform( Uniform.createInt1( 0, 'Texture0' ) );\r\n stateSet.addUniform( Uniform.createInt1( 1, 'Texture1' ) );\r\n stateSet.addUniform( Uniform.createInt1( 2, 'Texture2' ) );\r\n stateSet.addUniform( Uniform.createFloat1( 0.1, 'AngleLimit' ) );\r\n\r\n var w = textureNormal.getWidth();\r\n var h = textureNormal.getHeight();\r\n this._size = [ w, h ];\r\n\r\n stateSet.setTextureAttributeAndModes( 0, textureNormal );\r\n stateSet.setTextureAttributeAndModes( 1, texturePosition );\r\n\r\n this.initNoise();\r\n\r\n };\r\n\r\n Composer.Filter.SSAO.prototype = MACROUTILS.objectInherit( Composer.Filter.prototype, {\r\n\r\n initNoise: function () {\r\n var sizeNoise = this._noiseTextureSize;\r\n var noise = new Array( sizeNoise * sizeNoise * 3 );\r\n ( function ( array ) {\r\n var n = [ 0.0, 0.0 ];\r\n for ( var i = 0; i < sizeNoise * sizeNoise; i++ ) {\r\n n[ 0 ] = 2.0 * ( Math.random() - 0.5 );\r\n n[ 1 ] = 2.0 * ( Math.random() - 0.5 );\r\n\r\n Vec2.normalize( n, n );\r\n array[ i * 3 + 0 ] = 255 * ( n[ 0 ] * 0.5 + 0.5 );\r\n array[ i * 3 + 1 ] = 255 * ( n[ 1 ] * 0.5 + 0.5 );\r\n array[ i * 3 + 2 ] = 255 * 0.5;\r\n }\r\n } )( noise );\r\n\r\n var noiseTexture = new Texture();\r\n noiseTexture.setWrapS( 'REPEAT' );\r\n noiseTexture.setWrapT( 'REPEAT' );\r\n noiseTexture.setMinFilter( 'NEAREST' );\r\n noiseTexture.setMagFilter( 'NEAREST' );\r\n\r\n noiseTexture.setTextureSize( sizeNoise, sizeNoise );\r\n noiseTexture.setImage( new Uint8Array( noise ), 'RGB' );\r\n this._noiseTexture = noiseTexture;\r\n },\r\n setSceneRadius: function ( value ) {\r\n this._sceneRadius = value;\r\n this.dirty();\r\n },\r\n setAngleLimit: function ( value ) {\r\n var uniform = this._stateSet.getUniform( 'AngleLimit' );\r\n uniform.get()[ 0 ] = value;\r\n uniform.dirty();\r\n },\r\n setNbSamples: function ( value ) {\r\n if ( value === this._nbSamples ) {\r\n return;\r\n }\r\n this._nbSamples = Math.floor( value );\r\n this.dirty();\r\n },\r\n setRadius: function ( value ) {\r\n var uniform = this._stateSet.getUniform( 'Radius' );\r\n uniform.get()[ 0 ] = value;\r\n uniform.dirty();\r\n },\r\n setPower: function ( value ) {\r\n var uniform = this._stateSet.getUniform( 'Power' );\r\n uniform.get()[ 0 ] = value;\r\n uniform.dirty();\r\n },\r\n build: function () {\r\n var stateSet = this._stateSet;\r\n var nbSamples = this._nbSamples;\r\n var kernel = new Array( nbSamples * 4 );\r\n ( function ( array ) {\r\n var v = [ 0.0, 0.0, 0.0 ];\r\n for ( var i = 0; i < nbSamples; i++ ) {\r\n v[ 0 ] = 2.0 * ( Math.random() - 0.5 );\r\n v[ 1 ] = 2.0 * ( Math.random() - 0.5 );\r\n v[ 2 ] = Math.random();\r\n\r\n Vec3.normalize( v, v );\r\n var scale = Math.max( i / nbSamples, 0.1 );\r\n scale = 0.1 + ( 1.0 - 0.1 ) * ( scale * scale );\r\n array[ i * 3 + 0 ] = v[ 0 ];\r\n array[ i * 3 + 1 ] = v[ 1 ];\r\n array[ i * 3 + 2 ] = v[ 2 ];\r\n array[ i * 3 + 3 ] = scale;\r\n }\r\n } )( kernel );\r\n\r\n\r\n stateSet.setTextureAttributeAndModes( 2, this._noiseTexture );\r\n var uniform = stateSet.getUniform( 'noiseSampling' );\r\n if ( uniform === undefined ) {\r\n uniform = Uniform.createFloat2( [ this._size[ 0 ] / this._noiseTextureSize, this._size[ 1 ] / this._noiseTextureSize ], 'noiseSampling' );\r\n stateSet.addUniform( uniform );\r\n } else {\r\n uniform.set( [ this._size[ 0 ] / this._noiseTextureSize, this._size[ 1 ] / this._noiseTextureSize ] );\r\n uniform.dirty();\r\n }\r\n var vertexshader = [\r\n '',\r\n '#ifdef GL_ES',\r\n 'precision highp float;',\r\n '#endif',\r\n 'attribute vec3 Vertex;',\r\n 'attribute vec2 TexCoord0;',\r\n 'varying vec2 FragTexCoord0;',\r\n 'uniform mat4 ModelViewMatrix;',\r\n 'uniform mat4 ProjectionMatrix;',\r\n 'void main(void) {',\r\n ' gl_Position = ProjectionMatrix * ModelViewMatrix * vec4(Vertex,1.0);',\r\n ' FragTexCoord0 = TexCoord0;',\r\n '}',\r\n ''\r\n ].join( '\\n' );\r\n\r\n var kernelglsl = [];\r\n for ( var i = 0; i < nbSamples; i++ ) {\r\n kernelglsl.push( 'kernel[' + i + '] = vec4(' + kernel[ i * 3 ] + ',' + kernel[ i * 3 + 1 ] + ', ' + kernel[ i * 3 + 2 ] + ', ' + kernel[ i * 3 + 3 ] + ');' );\r\n }\r\n kernelglsl = kernelglsl.join( '\\n' );\r\n\r\n //var ssaoRadiusMin = this._sceneRadius * 0.002;\r\n //var ssaoRadiusMax = this._sceneRadius * 0.05;\r\n //var ssaoRadiusStep = ( ssaoRadiusMax - ssaoRadiusMin ) / 200.0;\r\n\r\n var fragmentshader = [\r\n '',\r\n Composer.Filter.defaultFragmentShaderHeader,\r\n 'uniform sampler2D Texture1;',\r\n 'uniform sampler2D Texture2;',\r\n 'uniform mat4 projection;',\r\n 'uniform vec2 noiseSampling;',\r\n 'uniform float Power;', //'+ '{ 'min': 0.1, 'max': 16.0, 'step': 0.1, 'value': 1.0 }',\r\n 'uniform float Radius;', //'+ '{ 'min': ' + ssaoRadiusMin +', 'max': ' + ssaoRadiusMax + ', 'step': '+ ssaoRadiusStep + ', 'value': 0.01 }',\r\n 'uniform float AngleLimit;',\r\n '#define NB_SAMPLES ' + this._nbSamples,\r\n 'float depth;',\r\n 'vec3 normal;',\r\n 'vec4 position;',\r\n 'vec4 kernel[' + nbSamples + '];',\r\n\r\n\r\n 'mat3 computeBasis()',\r\n '{',\r\n ' vec2 uvrand = FragTexCoord0*noiseSampling;',\r\n ' vec3 rvec = texture2D(Texture2, uvrand*2.0).xyz*2.0-vec3(1.0);',\r\n ' vec3 tangent = normalize(rvec - normal * dot(rvec, normal));',\r\n ' vec3 bitangent = cross(normal, tangent);',\r\n ' mat3 tbn = mat3(tangent, bitangent, normal);',\r\n ' return tbn;',\r\n '}',\r\n\r\n 'void main (void)',\r\n '{',\r\n kernelglsl,\r\n ' position = texture2D(Texture1, FragTexCoord0);',\r\n ' vec4 p = texture2D(Texture0, FragTexCoord0);',\r\n ' depth = p.w;',\r\n ' normal = vec3(p);',\r\n ' if ( position.w == 0.0) {',\r\n ' gl_FragColor = vec4(1.0,1.0,1.0,0.0);',\r\n ' return;',\r\n ' }',\r\n '',\r\n ' mat3 tbn = computeBasis();',\r\n ' float occlusion = 0.0;',\r\n ' for (int i = 0; i < NB_SAMPLES; i++) {',\r\n ' vec3 vecKernel = vec3(kernel[i]);',\r\n ' vecKernel[2] = max(AngleLimit,vecKernel[2]);',\r\n ' vec3 sample = tbn * vecKernel;',\r\n ' vec3 dir = sample;',\r\n ' float w = dot(dir, normal);',\r\n ' float dist = 1.0-kernel[i].w;',\r\n ' w *= dist*dist*Power;',\r\n ' sample = dir * float(Radius) + position.xyz;',\r\n\r\n ' vec4 offset = projection * vec4(sample,1.0);',\r\n ' offset.xy /= offset.w;',\r\n ' offset.xy = offset.xy * 0.5 + 0.5;',\r\n\r\n ' float sample_depth = texture2D(Texture1, offset.xy).z;',\r\n ' float range_check = abs(sample.z - sample_depth) < float(Radius) ? 1.0 : 0.0;',\r\n ' occlusion += (sample_depth > sample.z ? 1.0 : 0.0) * range_check*w;',\r\n\r\n ' }',\r\n ' occlusion = 1.0 - (occlusion / float(NB_SAMPLES));',\r\n ' gl_FragColor = vec4(vec3(occlusion),1.0);',\r\n '}',\r\n ''\r\n ].join( '\\n' );\r\n\r\n var program = new Program(\r\n new Shader( 'VERTEX_SHADER', vertexshader ),\r\n new Shader( 'FRAGMENT_SHADER', fragmentshader ) );\r\n\r\n stateSet.setAttributeAndModes( program );\r\n this._dirty = false;\r\n }\r\n } );\r\n\r\n\r\n\r\n Composer.Filter.SSAO8 = function ( options ) {\r\n Composer.Filter.SSAO.call( this, options );\r\n };\r\n\r\n Composer.Filter.SSAO8.prototype = MACROUTILS.objectInherit( Composer.Filter.SSAO.prototype, {\r\n buildGeometry: function ( quad ) {\r\n quad.getAttributes().TexCoord1 = this._texCoord1;\r\n return quad;\r\n },\r\n build: function () {\r\n var stateSet = this._stateSet;\r\n var nbSamples = this._nbSamples;\r\n var kernel = new Array( nbSamples * 4 );\r\n //var angleLimit = this._angleLimit;\r\n ( function ( array ) {\r\n var v = [ 0.0, 0.0, 0.0 ];\r\n for ( var i = 0; i < nbSamples; i++ ) {\r\n v[ 0 ] = 2.0 * ( Math.random() - 0.5 );\r\n v[ 1 ] = 2.0 * ( Math.random() - 0.5 );\r\n v[ 2 ] = Math.random();\r\n\r\n Vec3.normalize( v, v );\r\n var scale = Math.max( i / nbSamples, 0.1 );\r\n scale = 0.1 + ( 1.0 - 0.1 ) * ( scale * scale );\r\n array[ i * 3 + 0 ] = v[ 0 ];\r\n array[ i * 3 + 1 ] = v[ 1 ];\r\n array[ i * 3 + 2 ] = v[ 2 ];\r\n array[ i * 3 + 3 ] = scale;\r\n }\r\n } )( kernel );\r\n\r\n //var sizeNoise = this._noiseTextureSize;\r\n stateSet.setTextureAttributeAndModes( 2, this._noiseTexture );\r\n var uniform = stateSet.getUniform( 'noiseSampling' );\r\n if ( uniform === undefined ) {\r\n uniform = Uniform.createFloat2( [ this._size[ 0 ] / this._noiseTextureSize, this._size[ 1 ] / this._noiseTextureSize ], 'noiseSampling' );\r\n stateSet.addUniform( uniform );\r\n } else {\r\n uniform.set( [ this._size[ 0 ] / this._noiseTextureSize, this._size[ 1 ] / this._noiseTextureSize ] );\r\n uniform.dirty();\r\n }\r\n var vertexshader = [\r\n '',\r\n '#ifdef GL_ES',\r\n 'precision highp float;',\r\n '#endif',\r\n 'attribute vec3 Vertex;',\r\n 'attribute vec2 TexCoord0;',\r\n 'attribute vec3 TexCoord1;',\r\n 'varying vec2 FragTexCoord0;',\r\n 'varying vec3 FragTexCoord1;',\r\n 'uniform mat4 ModelViewMatrix;',\r\n 'uniform mat4 ProjectionMatrix;',\r\n 'void main(void) {',\r\n ' gl_Position = ProjectionMatrix * ModelViewMatrix * vec4(Vertex,1.0);',\r\n ' FragTexCoord0 = TexCoord0;',\r\n ' FragTexCoord1 = TexCoord1;',\r\n '}',\r\n ''\r\n ].join( '\\n' );\r\n\r\n var kernelglsl = [];\r\n for ( var i = 0; i < nbSamples; i++ ) {\r\n kernelglsl.push( 'kernel[' + i + '] = vec4(' + kernel[ i * 3 ] + ',' + kernel[ i * 3 + 1 ] + ', ' + kernel[ i * 3 + 2 ] + ', ' + kernel[ i * 3 + 3 ] + ');' );\r\n }\r\n kernelglsl = kernelglsl.join( '\\n' );\r\n\r\n //var ssaoRadiusMin = this._sceneRadius * 0.002;\r\n //var ssaoRadiusMax = this._sceneRadius * 0.05;\r\n //var ssaoRadiusStep = ( ssaoRadiusMax - ssaoRadiusMin ) / 200.0;\r\n\r\n var fragmentshader = [\r\n '',\r\n Composer.Filter.defaultFragmentShaderHeader,\r\n 'varying vec3 FragTexCoord1;',\r\n 'uniform sampler2D Texture1;',\r\n 'uniform sampler2D Texture2;',\r\n 'uniform mat4 projection;',\r\n 'uniform vec2 noiseSampling;',\r\n 'uniform float Power;', //'+ '{ 'min': 0.1, 'max': 16.0, 'step': 0.1, 'value': 1.0 }',\r\n 'uniform float Radius;', //'+ '{ 'min': ' + ssaoRadiusMin +', 'max': ' + ssaoRadiusMax + ', 'step': '+ ssaoRadiusStep + ', 'value': 0.01 }',\r\n 'uniform float AngleLimit;',\r\n '#define NB_SAMPLES ' + this._nbSamples,\r\n 'float depth;',\r\n 'float znear, zfar, zrange;',\r\n 'vec3 normal;',\r\n 'vec3 position;',\r\n 'vec4 kernel[' + nbSamples + '];',\r\n\r\n Composer.Filter.shaderUtils,\r\n\r\n 'mat3 computeBasis()',\r\n '{',\r\n ' vec2 uvrand = FragTexCoord0*noiseSampling;',\r\n ' //uvrand = rand(gl_FragCoord.xy);',\r\n ' vec3 rvec = texture2D(Texture2, uvrand*2.0).xyz*2.0-vec3(1.0);',\r\n ' //vec3 rvec = normalize(vec3(uvrand,0.0));',\r\n ' vec3 tangent = normalize(rvec - normal * dot(rvec, normal));',\r\n ' vec3 bitangent = cross(normal, tangent);',\r\n ' mat3 tbn = mat3(tangent, bitangent, normal);',\r\n ' return tbn;',\r\n '}',\r\n\r\n 'float getDepthValue(vec4 v) {',\r\n ' float depth = unpack4x8ToFloat(v);',\r\n ' depth = depth*zrange+znear;',\r\n ' //depth = depth*zrange;',\r\n ' return -depth;',\r\n '}',\r\n\r\n 'void main (void)',\r\n '{',\r\n kernelglsl,\r\n ' vec4 p = texture2D(Texture0, FragTexCoord0);',\r\n ' if (dot(p,p) < 0.001) { ',\r\n ' gl_FragColor = vec4(1.0,1.0,1.0,0.0);',\r\n ' return;',\r\n ' }',\r\n ' znear = projection[3][2] / (projection[2][2]-1.0);',\r\n ' zfar = projection[3][2] / (projection[2][2]+1.0);',\r\n ' zrange = zfar-znear;',\r\n ' depth = getDepthValue(texture2D(Texture1, FragTexCoord0));',\r\n //B = (A - znear)/(zfar-znear);',\r\n //B = A/(zfar-znear) - znear/(zfar-znear);',\r\n //B+ znear/(zfar-znear) = A/(zfar-znear) ;',\r\n //(zfar-znear)*(B+ znear/(zfar-znear)) = A ;',\r\n //(zfar-znear)*B+ znear = A ;',\r\n\r\n ' if ( -depth < znear) {',\r\n ' gl_FragColor = vec4(1.0,1.0,1.0,0.0);',\r\n ' return;',\r\n ' }',\r\n\r\n ' normal = decodeNormal(unpack4x8To2Float(p));',\r\n\r\n ' position = -FragTexCoord1*depth;',\r\n ' position.z = -position.z;',\r\n\r\n '',\r\n ' mat3 tbn = computeBasis();',\r\n ' float occlusion = 0.0;',\r\n ' for (int i = 0; i < NB_SAMPLES; i++) {',\r\n ' vec3 vecKernel = vec3(kernel[i]);',\r\n ' vecKernel[2] = max(AngleLimit,vecKernel[2]);',\r\n ' vec3 sample = tbn * vec3(vecKernel);',\r\n ' vec3 dir = sample;',\r\n ' float w = dot(dir, normal);',\r\n ' float dist = 1.0-kernel[i].w;',\r\n ' w *= dist*dist*Power;',\r\n ' sample = dir * float(Radius) + position.xyz;',\r\n\r\n ' vec4 offset = projection * vec4(sample,1.0);',\r\n ' offset.xy /= offset.w;',\r\n ' offset.xy = offset.xy * 0.5 + 0.5;',\r\n\r\n ' float sample_depth = getDepthValue(texture2D(Texture1, offset.xy));',\r\n ' float range_check = abs(sample.z - sample_depth) < float(Radius) ? 1.0 : 0.0;',\r\n ' occlusion += (sample_depth > sample.z ? 1.0 : 0.0) * range_check*w;',\r\n\r\n ' }',\r\n ' occlusion = 1.0 - (occlusion / float(NB_SAMPLES));',\r\n ' gl_FragColor = vec4(vec3(occlusion),1.0);',\r\n '}',\r\n ''\r\n ].join( '\\n' );\r\n\r\n var program = new Program(\r\n new Shader( 'VERTEX_SHADER', vertexshader ),\r\n new Shader( 'FRAGMENT_SHADER', fragmentshader ) );\r\n\r\n stateSet.setAttributeAndModes( program );\r\n this._dirty = false;\r\n }\r\n } );\r\n\r\n return Composer;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgUtil/Composer.js\n ** module id = 133\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/NodeVisitor',\r\n 'osg/Geometry',\r\n 'osg/BufferArray',\r\n 'osg/DrawArrays',\r\n 'osg/PrimitiveSet',\r\n 'osg/StateSet',\r\n 'osg/Uniform',\r\n 'osg/Depth',\r\n 'osg/Program',\r\n 'osg/Shader'\r\n], function ( MACROUTILS, NodeVisitor, Geometry, BufferArray, DrawArrays, PrimitiveSet, StateSet, Uniform, Depth, Program, Shader ) {\r\n\r\n 'use strict';\r\n\r\n var program;\r\n\r\n var DisplayNormalVisitor = function () {\r\n NodeVisitor.call( this );\r\n\r\n this._unifScale = Uniform.createFloat( 1.0, 'uScale' );\r\n\r\n var ns = this._normalStateSet = new StateSet();\r\n ns.setAttribute( DisplayNormalVisitor.getShader() );\r\n ns.addUniform( Uniform.createFloat3( [ 1.0, 0.0, 0.0 ], 'uColorDebug' ) );\r\n ns.addUniform( this._unifScale );\r\n ns.setAttribute( new Depth( Depth.NEVER ) );\r\n\r\n var ts = this._tangentStateSet = new StateSet();\r\n ts.setAttribute( DisplayNormalVisitor.getShader() );\r\n ts.addUniform( Uniform.createFloat3( [ 0.0, 1.0, 0.0 ], 'uColorDebug' ) );\r\n ts.addUniform( this._unifScale );\r\n ts.setAttribute( new Depth( Depth.NEVER ) );\r\n };\r\n\r\n DisplayNormalVisitor.getShader = function () {\r\n if ( program ) return program;\r\n var vertexshader = [\r\n '#ifdef GL_ES',\r\n 'precision highp float;',\r\n '#endif',\r\n 'attribute vec3 Vertex;',\r\n 'attribute vec3 Normal;',\r\n 'uniform float uScale;',\r\n 'uniform mat4 ModelViewMatrix;',\r\n 'uniform mat4 ProjectionMatrix;',\r\n 'void main(void) {',\r\n ' gl_Position = ProjectionMatrix * ModelViewMatrix * vec4(Vertex + Normal * uScale, 1.0);',\r\n '}'\r\n ].join( '\\n' );\r\n\r\n var fragmentshader = [\r\n '#ifdef GL_ES',\r\n 'precision highp float;',\r\n '#endif',\r\n 'uniform vec3 uColorDebug;',\r\n 'void main(void) {',\r\n ' gl_FragColor = vec4(uColorDebug, 1.0);',\r\n '}'\r\n ].join( '\\n' );\r\n program = new Program( new Shader( Shader.VERTEX_SHADER, vertexshader ), new Shader( Shader.FRAGMENT_SHADER, fragmentshader ) );\r\n return program;\r\n };\r\n\r\n DisplayNormalVisitor.prototype = MACROUTILS.objectInherit( NodeVisitor.prototype, {\r\n setScale: function ( scale ) {\r\n this._unifScale.set( scale );\r\n },\r\n setTangentVisibility: function ( bool ) {\r\n this._tangentStateSet.setAttribute( new Depth( bool ? Depth.LESS : Depth.NEVER ) );\r\n },\r\n setNormalVisibility: function ( bool ) {\r\n this._normalStateSet.setAttribute( new Depth( bool ? Depth.LESS : Depth.NEVER ) );\r\n },\r\n apply: function ( node ) {\r\n if ( node instanceof Geometry === false ) {\r\n this.traverse( node );\r\n return;\r\n }\r\n var vertices = node.getAttributes().Vertex;\r\n if ( !vertices || node._isVisitedNormalDebug )\r\n return;\r\n node._isVisitedNormalDebug = true;\r\n var norm = this.createDebugGeom( node.getAttributes().Normal, vertices );\r\n if ( norm ) {\r\n norm.setStateSet( this._normalStateSet );\r\n node.addChild( norm );\r\n }\r\n\r\n var tang = this.createDebugGeom( node.getAttributes().Tangent, vertices );\r\n if ( tang ) {\r\n tang.setStateSet( this._tangentStateSet );\r\n node.addChild( tang );\r\n }\r\n },\r\n createDebugGeom: function ( dispVec, vertices ) {\r\n if ( !dispVec )\r\n return;\r\n var vSize = vertices.getItemSize();\r\n var dSize = dispVec.getItemSize();\r\n dispVec = dispVec.getElements();\r\n vertices = vertices.getElements();\r\n\r\n var nbVertices = vertices.length / vSize;\r\n var lineVertices = new Float32Array( nbVertices * 2 * 3 );\r\n var lineNormals = new Float32Array( nbVertices * 2 * 3 );\r\n for ( var i = 0; i < nbVertices; ++i ) {\r\n var idl = i * 6;\r\n var idv = i * vSize;\r\n var idd = i * dSize;\r\n\r\n lineVertices[ idl ] = lineVertices[ idl + 3 ] = vertices[ idv ];\r\n lineVertices[ idl + 1 ] = lineVertices[ idl + 4 ] = vertices[ idv + 1 ];\r\n lineVertices[ idl + 2 ] = lineVertices[ idl + 5 ] = vertices[ idv + 2 ];\r\n lineNormals[ idl + 3 ] = dispVec[ idd ];\r\n lineNormals[ idl + 4 ] = dispVec[ idd + 1 ];\r\n lineNormals[ idl + 5 ] = dispVec[ idd + 2 ];\r\n }\r\n var g = new Geometry();\r\n g._isNormalDebug = true;\r\n g.getAttributes().Vertex = new BufferArray( BufferArray.ARRAY_BUFFER, lineVertices, 3 );\r\n g.getAttributes().Normal = new BufferArray( BufferArray.ARRAY_BUFFER, lineNormals, 3 );\r\n var primitive = new DrawArrays( PrimitiveSet.LINES, 0, nbVertices * 2 );\r\n g.getPrimitives().push( primitive );\r\n return g;\r\n }\r\n } );\r\n\r\n return DisplayNormalVisitor;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgUtil/DisplayNormalVisitor.js\n ** module id = 134\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/NodeVisitor',\r\n 'osg/Geometry',\r\n 'osg/Program',\r\n 'osg/Uniform',\r\n 'osg/Shader',\r\n 'osg/StateSet'\r\n], function ( MACROUTILS, NodeVisitor, Geometry, Program, Uniform, Shader, StateSet ) {\r\n\r\n 'use strict';\r\n\r\n var program;\r\n\r\n var GeometryColorDebugVisitor = function () {\r\n NodeVisitor.call( this );\r\n this._customShader = true;\r\n };\r\n GeometryColorDebugVisitor.getShader = function () {\r\n if ( program ) return program;\r\n var vertexshader = [\r\n '#ifdef GL_ES',\r\n 'precision highp float;',\r\n '#endif',\r\n 'attribute vec3 Vertex;',\r\n 'uniform mat4 ModelViewMatrix;',\r\n 'uniform mat4 ProjectionMatrix;',\r\n 'void main(void) {',\r\n ' gl_Position = ProjectionMatrix * ModelViewMatrix * vec4(Vertex, 1.0);',\r\n '}'\r\n ].join( '\\n' );\r\n\r\n var fragmentshader = [\r\n '#ifdef GL_ES',\r\n 'precision highp float;',\r\n '#endif',\r\n 'uniform vec3 uColorDebug;',\r\n 'void main(void) {',\r\n ' gl_FragColor = vec4(uColorDebug, 1.0);',\r\n '}'\r\n ].join( '\\n' );\r\n program = new Program( new Shader( Shader.VERTEX_SHADER, vertexshader ), new Shader( Shader.FRAGMENT_SHADER, fragmentshader ) );\r\n return program;\r\n };\r\n GeometryColorDebugVisitor.prototype = MACROUTILS.objectInherit( NodeVisitor.prototype, {\r\n setCustomShader: function ( node, bool ) {\r\n this._customShader = bool;\r\n this.apply( node );\r\n },\r\n apply: function ( node ) {\r\n if ( node._isNormalDebug )\r\n return;\r\n if ( node instanceof Geometry ) {\r\n if ( this._customShader ) {\r\n var st = new StateSet();\r\n node._originalStateSet = node.getStateSet();\r\n node.setStateSet( st );\r\n st.addUniform( Uniform.createFloat3( [ Math.random(), Math.random(), Math.random() ], 'uColorDebug' ) );\r\n st.setAttributeAndModes( GeometryColorDebugVisitor.getShader() );\r\n } else {\r\n node.setStateSet( node._originalStateSet );\r\n }\r\n }\r\n this.traverse( node );\r\n }\r\n } );\r\n\r\n return GeometryColorDebugVisitor;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgUtil/DisplayGeometryVisitor.js\n ** module id = 135\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/NodeVisitor'\r\n\r\n], function ( MACROUTILS, NodeVisitor ) {\r\n\r\n 'use strict';\r\n\r\n // Make the jquery dependency optional\r\n try {\r\n var $ = require( 'jquery' );\r\n } catch ( e ) {\r\n throw new Error( 'jQuery is required to use the DisplayNodeGraphVisitor' );\r\n }\r\n\r\n // Simple tooltips implementation\r\n var SimpleTooltips = function ( options ) {\r\n\r\n this.options = options;\r\n var css = document.createElement( 'style' );\r\n css.type = 'text/css';\r\n css.innerHTML = [\r\n '.osgDebugSimpleTooltip {',\r\n 'display: none;',\r\n 'position: absolute;',\r\n 'margin-left: 10px;',\r\n 'border-radius: 4px;',\r\n 'padding: 10px;',\r\n 'background: rgba(0,0,0,.9);',\r\n 'color: #ffffff;',\r\n '}',\r\n '.osgDebugSimpleTooltip:before {',\r\n 'content: ',\r\n ';',\r\n 'position: absolute;',\r\n 'left: -10px;',\r\n 'top: 8px;',\r\n 'border: 10px solid transparent;',\r\n 'border-width: 10px 10px 10px 0;',\r\n 'border-right-color: rgba(0,0,0,.9);',\r\n '}'\r\n ].join( '\\n' );\r\n document.getElementsByTagName( 'head' )[ 0 ].appendChild( css );\r\n\r\n this.el = document.createElement( 'div' );\r\n this.el.className = 'osgDebugSimpleTooltip';\r\n document.body.appendChild( this.el );\r\n var nodes = document.querySelectorAll( this.options.selector );\r\n for ( var i = 0; i < nodes.length; i++ ) {\r\n nodes[ i ].addEventListener( 'mouseover', this.showTooltip.bind( this ), false );\r\n nodes[ i ].addEventListener( 'mouseout', this.hideTooltip.bind( this ), false );\r\n }\r\n };\r\n SimpleTooltips.prototype = {\r\n showTooltip: function ( e ) {\r\n var target = e.currentTarget;\r\n this.el.innerHTML = target.getAttribute( 'title' );\r\n this.el.style.display = 'block';\r\n this.el.style.left = ( $( target ).position().left + $( target ).get( 0 ).getBoundingClientRect().width ) + 'px';\r\n this.el.style.top = $( target ).position().top + 'px';\r\n },\r\n hideTooltip: function ( /* e */) {\r\n this.el.style.display = 'none';\r\n }\r\n };\r\n\r\n\r\n var DisplayNodeGraphVisitor = function () {\r\n NodeVisitor.call( this, NodeVisitor.TRAVERSE_ALL_CHILDREN );\r\n\r\n this._fullNodeList = [];\r\n this._nodeList = [];\r\n this._linkList = [];\r\n this._focusedElement = 'graph';\r\n\r\n this._idToDomElement = new window.Map();\r\n this._uniqueEdges = new window.Set();\r\n\r\n this._cbSelect = undefined; // callback when selecting a node\r\n\r\n this._$svg = $( '' );\r\n $( 'body' ).append( this._$svg );\r\n\r\n this._css = '.node {text-align: center;cursor: pointer;}.node rect {stroke: #FFF;}.edgePath path {stroke: #FFF;fill: none;}table {text-align: right;}svg {position: absolute;left: 0px;top: 0px;}.osgDebugButton {position: absolute;left: 15px;top: 15px;z-index: 5;border: 0;background: #65a9d7;background: -webkit-gradient(linear, left top, left bottom, from(#3e779d), to(#65a9d7));background: -webkit-linear-gradient(top, #3e779d, #65a9d7);background: -moz-linear-gradient(top, #3e779d, #65a9d7);background: -ms-linear-gradient(top, #3e779d, #65a9d7);background: -o-linear-gradient(top, #3e779d, #65a9d7);padding: 5px 10px;-webkit-border-radius: 7px;-moz-border-radius: 7px;border-radius: 7px;-webkit-box-shadow: rgba(0,0,0,1) 0 1px 0;-moz-box-shadow: rgba(0,0,0,1) 0 1px 0;box-shadow: rgba(0,0,0,1) 0 1px 0;text-shadow: rgba(0,0,0,.4) 0 1px 0;color: white;font-size: 15px;font-family: Helvetica, Arial, Sans-Serif;text-decoration: none;vertical-align: middle;}.osgDebugButton:hover {border-top-color: #28597a;background: #28597a;color: #ccc;}.osgDebugButton:active {border-top-color: #1b435e;background: #1b435e;}.osgDebugSimpleTooltip .osgDebugName {font-weight: bold;color: #60b1fc;margin: 0;}.osgDebugSimpleTooltip .osgDebugDescription {margin: 0;}';\r\n };\r\n\r\n DisplayNodeGraphVisitor.prototype = MACROUTILS.objectInherit( NodeVisitor.prototype, {\r\n setCallbackSelect: function ( cb ) {\r\n this._cbSelect = cb;\r\n },\r\n apply: function ( node ) {\r\n if ( node._isNormalDebug )\r\n return;\r\n\r\n if ( this._fullNodeList[ node.getInstanceID() ] !== node ) {\r\n\r\n var nodeMatrix = '';\r\n if ( node.getMatrix ) {\r\n nodeMatrix = this.createMatrixGrid( node, nodeMatrix, node.getMatrix() );\r\n }\r\n\r\n var stateset = '';\r\n if ( node.getStateSet() ) {\r\n stateset = this.createStateset( node );\r\n this._fullNodeList[ stateset.name ] = node.getStateSet();\r\n }\r\n\r\n this._fullNodeList[ node.getInstanceID() ] = node;\r\n\r\n this._nodeList.push( {\r\n name: node.getName(),\r\n className: node.className(),\r\n instanceID: node.getInstanceID(),\r\n stateset: stateset,\r\n matrix: nodeMatrix\r\n } );\r\n\r\n }\r\n\r\n if ( this.nodePath.length >= 2 ) {\r\n var parentID = this.nodePath[ this.nodePath.length - 2 ].getInstanceID();\r\n var childID = node.getInstanceID();\r\n var key = parentID + '+' + childID;\r\n if ( !this._uniqueEdges.has( key ) ) {\r\n this._linkList.push( {\r\n parentNode: parentID,\r\n childrenNode: childID\r\n } );\r\n this._uniqueEdges.add( key );\r\n }\r\n }\r\n\r\n this.traverse( node );\r\n },\r\n\r\n reset: function () {\r\n this._$svg.empty();\r\n this._fullNodeList.length = 0;\r\n this._nodeList.length = 0;\r\n this._linkList.length = 0;\r\n this._uniqueEdges.clear();\r\n this._focusedElement = 'scene';\r\n $( '.osgDebugButton' ).hide();\r\n },\r\n\r\n focusOnScene: function () {\r\n $( '.osgDebugButton' ).text( 'Access to the graph' );\r\n this._$svg.css( 'zIndex', '-2' );\r\n this._focusedElement = 'scene';\r\n },\r\n\r\n focusOnGraph: function () {\r\n $( '.osgDebugButton' ).text( 'Access to the scene' );\r\n this._$svg.css( 'zIndex', '2' );\r\n $( '.osgDebugSimpleTooltip' ).css( 'zIndex', '3' );\r\n this._focusedElement = 'graph';\r\n },\r\n\r\n // Apply all the style\r\n injectStyleElement: function () {\r\n if ( this._cssInjected )\r\n return;\r\n this._cssInjected = true;\r\n\r\n $( 'body' ).append( '' );\r\n $( '.osgDebugButton' ).click( function () {\r\n if ( this._focusedElement === 'scene' )\r\n this.focusOnGraph();\r\n else\r\n this.focusOnScene();\r\n }.bind( this ) );\r\n\r\n var css = document.createElement( 'style' );\r\n css.type = 'text/css';\r\n css.innerHTML = this._css;\r\n document.getElementsByTagName( 'head' )[ 0 ].appendChild( css );\r\n },\r\n\r\n // Create and display a dagre d3 graph\r\n createGraph: function () {\r\n if ( window.d3 && window.dagreD3 ) {\r\n this.createGraphApply();\r\n return;\r\n }\r\n var d3url = '//cdnjs.cloudflare.com/ajax/libs/d3/3.4.13/d3.min.js';\r\n var dagreurl = '//cdn.jsdelivr.net/dagre-d3/0.2.9/dagre-d3.min.js';\r\n $.getScript( d3url ).done( function () {\r\n $.getScript( dagreurl ).done( this.createGraphApply.bind( this ) );\r\n }.bind( this ) );\r\n },\r\n\r\n createGraphApply: function () {\r\n var g = new window.dagreD3.Digraph();\r\n\r\n g = this.g = this.generateNodeAndLink( g );\r\n\r\n // Add the style of the graph\r\n this.injectStyleElement();\r\n $( '.osgDebugButton' ).show();\r\n\r\n // Create the renderer\r\n var renderer = this.renderer = new window.dagreD3.Renderer();\r\n\r\n // Set up an SVG group so that we can translate the final graph.\r\n var svg = window.d3.select( this._$svg.get( 0 ) );\r\n var svgGroup = svg.append( 'g' );\r\n\r\n // Set initial zoom to 75%\r\n var initialScale = 0.75;\r\n var oldZoom = renderer.zoom();\r\n renderer.zoom( function ( graph, svg ) {\r\n var zoom = oldZoom( graph, svg );\r\n\r\n zoom.scale( initialScale ).event( svg );\r\n return zoom;\r\n } );\r\n\r\n // Simple function to style the tooltip for the given node.\r\n var styleTooltip = function ( name, description ) {\r\n return '

' + name + '

' + description + '
';\r\n };\r\n\r\n var idToDom = this._idToDomElement;\r\n // Override drawNodes to set up the hover.\r\n var oldDrawNodes = renderer.drawNodes();\r\n renderer.drawNodes( function ( g, svg ) {\r\n var svgNodes = oldDrawNodes( g, svg );\r\n\r\n // Set the title on each of the nodes and use tipsy to display the tooltip on hover\r\n svgNodes.attr( 'title', function ( d ) {\r\n idToDom.set( d, this );\r\n return styleTooltip( d, g.node( d ).description );\r\n } );\r\n\r\n return svgNodes;\r\n } );\r\n\r\n // Run the renderer. This is what draws the final graph.\r\n renderer.run( g, svgGroup );\r\n\r\n this.tooltip = new SimpleTooltips( {\r\n selector: '.node'\r\n } );\r\n\r\n // Do a console log of the node (or stateset) and save it in window.*\r\n $( '.node' ).click( this.onNodeSelect.bind( this ) );\r\n this.focusOnGraph();\r\n },\r\n selectNode: function ( node ) {\r\n var id = node.getInstanceID();\r\n var dom = this._idToDomElement.get( id );\r\n if ( dom )\r\n $( dom ).click();\r\n },\r\n onNodeSelect: function ( e ) {\r\n var target = e.currentTarget;\r\n var identifier = $( target.getAttribute( 'title' ) )[ 0 ].innerHTML;\r\n var fnl = this._fullNodeList;\r\n\r\n if ( this.lastStateSet )\r\n this.lastStateSet.childNodes[ 0 ].style.fill = '#09f';\r\n if ( this.lastNode )\r\n this.lastNode.childNodes[ 0 ].style.fill = '#fff';\r\n this.lastStateSet = this.lastNode = null;\r\n target.childNodes[ 0 ].style.fill = '#f00';\r\n\r\n var elt = fnl[ identifier ];\r\n\r\n if ( elt.className() !== 'StateSet' ) {\r\n this.lastNode = target;\r\n window.activeNode = elt;\r\n console.log( 'window.activeNode is set.' );\r\n console.log( window.activeNode );\r\n } else {\r\n this.lastStateSet = target;\r\n window.activeStateset = elt;\r\n console.log( 'window.activeStateset is set.' );\r\n console.log( window.activeStateset );\r\n }\r\n if ( this._cbSelect )\r\n this._cbSelect( elt );\r\n },\r\n // Subfunction of createGraph, will iterate to create all the node and link in dagre\r\n generateNodeAndLink: function ( g ) {\r\n var nodeLength = this._nodeList.length;\r\n for ( var i = 0; i < nodeLength; i++ ) {\r\n var element = this._nodeList[ i ];\r\n\r\n g.addNode( element.instanceID, {\r\n label: element.className + ( element.name ? '\\n' + element.name : '' ),\r\n description: ( element.matrix !== '' ? '

' : '' ) + element.matrix\r\n } );\r\n\r\n if ( element.stateset ) {\r\n\r\n if ( !g.hasNode( element.stateset.name ) ) {\r\n g.addNode( element.stateset.name, {\r\n label: 'StateSet',\r\n description: 'numTexture : ' + element.stateset.numTexture,\r\n style: 'fill: #0099FF;stroke-width: 0px;'\r\n } );\r\n }\r\n\r\n g.addEdge( null, element.instanceID, element.stateset.name, {\r\n style: 'stroke: #0099FF;'\r\n } );\r\n }\r\n }\r\n\r\n var linkLength = this._linkList.length;\r\n for ( i = 0; i < linkLength; i++ ) {\r\n g.addEdge( null, this._linkList[ i ].parentNode, this._linkList[ i ].childrenNode );\r\n }\r\n\r\n return g;\r\n },\r\n\r\n // Create an array to display the matrix\r\n createMatrixGrid: function ( node, nodeMatrix, matrixArray ) {\r\n\r\n nodeMatrix += '';\r\n nodeMatrix += '';\r\n nodeMatrix += '';\r\n nodeMatrix += '';\r\n\r\n nodeMatrix += '';\r\n nodeMatrix += '';\r\n nodeMatrix += '';\r\n nodeMatrix += '';\r\n\r\n nodeMatrix += '';\r\n nodeMatrix += '';\r\n nodeMatrix += '';\r\n nodeMatrix += '';\r\n\r\n nodeMatrix += '';\r\n nodeMatrix += '';\r\n nodeMatrix += '';\r\n nodeMatrix += '
' + matrixArray[ 0 ] + '' + matrixArray[ 4 ] + '' + matrixArray[ 8 ] + '' + matrixArray[ 12 ] + '
' + matrixArray[ 1 ] + '' + matrixArray[ 5 ] + '' + matrixArray[ 9 ] + '' + matrixArray[ 13 ] + '
' + matrixArray[ 2 ] + '' + matrixArray[ 6 ] + '' + matrixArray[ 10 ] + '' + matrixArray[ 14 ] + '
' + matrixArray[ 3 ] + '' + matrixArray[ 7 ] + '' + matrixArray[ 11 ] + '' + matrixArray[ 15 ] + '
';\r\n\r\n return nodeMatrix;\r\n },\r\n\r\n // Get the stateset and create the stateset display structure\r\n createStateset: function ( node ) {\r\n return {\r\n name: node.getStateSet().getInstanceID(),\r\n parentID: node.getInstanceID(),\r\n stateset: node.getStateSet(),\r\n numTexture: node.getStateSet().getNumTextureAttributeLists()\r\n };\r\n },\r\n\r\n getFullNodeList: function () {\r\n return this._fullNodeList;\r\n },\r\n\r\n getNodeList: function () {\r\n return this._nodeList;\r\n },\r\n\r\n getLinkList: function () {\r\n return this._linkList;\r\n }\r\n\r\n } );\r\n\r\n return DisplayNodeGraphVisitor;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgUtil/DisplayNodeGraphVisitor.js\n ** module id = 136\n ** module chunks = 0 1\n **/","/**\r\n * @author Jordi Torres\r\n */\r\n\r\ndefine( [\r\n 'osg/Utils',\r\n 'osg/NodeVisitor',\r\n 'osg/Matrix',\r\n 'osg/TransformEnums'\r\n], function ( MACROUTILS, NodeVisitor, Matrix, TransformEnums ) {\r\n\r\n 'use strict';\r\n\r\n var IntersectionVisitor = function () {\r\n NodeVisitor.call( this );\r\n // We could need to use a stack of intersectors in case we want\r\n // to use several intersectors. Right now we use only one.\r\n this._intersector = undefined;\r\n this._projectionStack = [];\r\n this._modelStack = [];\r\n this._viewStack = [];\r\n this._windowStack = [];\r\n };\r\n\r\n IntersectionVisitor.prototype = MACROUTILS.objectInherit( NodeVisitor.prototype, {\r\n setIntersector: function ( intersector ) {\r\n this._intersector = intersector;\r\n },\r\n getIntersector: function () {\r\n return this._intersector;\r\n },\r\n // Model matrix\r\n pushModelMatrix: function ( matrix ) {\r\n this._modelStack.push( matrix );\r\n },\r\n getModelMatrix: function () {\r\n return ( this._modelStack.length ) ? this._modelStack[ this._modelStack.length - 1 ] : undefined;\r\n\r\n },\r\n popModelMatrix: function () {\r\n return this._modelStack.pop();\r\n },\r\n // View Matrix\r\n pushViewMatrix: function ( matrix ) {\r\n this._viewStack.push( matrix );\r\n\r\n },\r\n getViewMatrix: function () {\r\n return ( this._viewStack.length ) ? this._viewStack[ this._viewStack.length - 1 ] : undefined;\r\n\r\n },\r\n popViewMatrix: function () {\r\n return this._viewStack.pop();\r\n },\r\n // Projection Matrix\r\n pushProjectionMatrix: function ( matrix ) {\r\n this._projectionStack.push( matrix );\r\n },\r\n getProjectionMatrix: function () {\r\n return ( this._projectionStack.length ) ? this._projectionStack[ this._projectionStack.length - 1 ] : undefined;\r\n\r\n },\r\n popProjectionMatrix: function () {\r\n return this._projectionStack.pop();\r\n },\r\n // Window Matrix\r\n pushWindowMatrix: function ( matrix ) {\r\n this._windowStack.push( matrix );\r\n },\r\n pushWindowMatrixUsingViewport: function ( viewport ) {\r\n this._windowStack.push( viewport.computeWindowMatrix() );\r\n },\r\n getWindowMatrix: function () {\r\n return ( this._windowStack.length ) ? this._windowStack[ this._windowStack.length - 1 ] : undefined;\r\n },\r\n popWindowMatrix: function () {\r\n return this._windowStack.pop();\r\n },\r\n getTransformation: ( function () {\r\n // We should move this to the intersector when we need to use different coordinate frames\r\n // Now we only support WINDOW coordinate frame\r\n var mat = Matrix.create();\r\n var matid = Matrix.create();\r\n return function () {\r\n Matrix.copy( this.getWindowMatrix() || matid, mat );\r\n Matrix.preMult( mat, this.getProjectionMatrix() || matid );\r\n Matrix.preMult( mat, this.getViewMatrix() || matid );\r\n Matrix.preMult( mat, this.getModelMatrix() || matid );\r\n\r\n return mat;\r\n };\r\n } )(),\r\n\r\n enter: function ( node ) {\r\n // Call to each intersector\r\n return this._intersector.enter( node );\r\n },\r\n\r\n apply: function ( node ) {\r\n // Here we need to decide which apply method to use\r\n if ( node.getViewMatrix ) {\r\n // It's a Camera\r\n this.applyCamera( node );\r\n } else {\r\n if ( node.getMatrix ) {\r\n // It's a Transform Node\r\n this.applyTransform( node );\r\n } else {\r\n // It's a leaf or an intermediate node\r\n this.applyNode( node );\r\n }\r\n }\r\n },\r\n\r\n applyCamera: function ( camera ) {\r\n // We use an absolute reference frame for simplicity\r\n var vp = camera.getViewport();\r\n if ( vp !== undefined ) {\r\n this.pushWindowMatrixUsingViewport( vp );\r\n }\r\n\r\n var projection, view, model;\r\n if ( camera.getReferenceFrame() === TransformEnums.RELATIVE_RF && this.getViewMatrix() && this.getProjectionMatrix() ) {\r\n // relative\r\n projection = Matrix.mult( this.getProjectionMatrix(), camera.getProjectionMatrix(), Matrix.create() );\r\n view = this.getViewMatrix();\r\n model = Matrix.mult( this.getModelMatrix(), camera.getViewMatrix(), Matrix.create() );\r\n } else {\r\n // absolute\r\n projection = camera.getProjectionMatrix();\r\n view = camera.getViewMatrix();\r\n model = Matrix.create();\r\n }\r\n\r\n this.pushProjectionMatrix( projection );\r\n this.pushViewMatrix( view );\r\n this.pushModelMatrix( model );\r\n\r\n // TODO maybe we should do something like OSG for the transformation given\r\n // to the intersector (having a stack)\r\n this._intersector.setCurrentTransformation( this.getTransformation() );\r\n this.traverse( camera );\r\n\r\n this.popModelMatrix();\r\n this.popViewMatrix();\r\n this.popProjectionMatrix();\r\n if ( vp !== undefined ) {\r\n this.popWindowMatrix();\r\n }\r\n this._intersector.setCurrentTransformation( this.getTransformation() );\r\n },\r\n\r\n applyNode: function ( node ) {\r\n if ( !this.enter( node ) ) return;\r\n if ( node.primitives ) {\r\n this._intersector.intersect( this, node );\r\n // If it is a leaf (it has primitives) we can safely return\r\n return;\r\n }\r\n if ( node.traverse ) {\r\n this.traverse( node );\r\n }\r\n },\r\n\r\n applyTransform: function ( node ) {\r\n // Now only use PROJECTION coordinate frame\r\n if ( !this.enter( node ) ) return;\r\n // Accumulate Transform\r\n if ( node.getReferenceFrame() === TransformEnums.ABSOLUTE_RF ) {\r\n this.pushViewMatrix( Matrix.create() );\r\n this.pushModelMatrix( node.getMatrix() );\r\n } else if ( this._modelStack.length > 0 ) {\r\n var m = Matrix.copy( this.getModelMatrix(), Matrix.create() );\r\n Matrix.preMult( m, node.getMatrix() );\r\n this.pushModelMatrix( m );\r\n } else {\r\n this.pushModelMatrix( node.getMatrix() );\r\n }\r\n\r\n // TODO see above\r\n this._intersector.setCurrentTransformation( this.getTransformation() );\r\n this.traverse( node );\r\n\r\n this.popModelMatrix();\r\n if ( node.getReferenceFrame() === TransformEnums.ABSOLUTE_RF )\r\n this.popViewMatrix();\r\n this._intersector.setCurrentTransformation( this.getTransformation() );\r\n }\r\n } );\r\n\r\n return IntersectionVisitor;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgUtil/IntersectionVisitor.js\n ** module id = 137\n ** module chunks = 0 1\n **/","/**\r\n * @author Jordi Torres\r\n */\r\n\r\n\r\ndefine( [\r\n 'osg/Vec3',\r\n 'osg/Matrix',\r\n 'osgUtil/TriangleIntersector'\r\n], function ( Vec3, Matrix, TriangleIntersector ) {\r\n\r\n 'use strict';\r\n\r\n var LineSegmentIntersector = function () {\r\n this._start = Vec3.create();\r\n this._end = Vec3.create();\r\n this._iStart = Vec3.create();\r\n this._iEnd = Vec3.create();\r\n this._intersections = [];\r\n };\r\n\r\n LineSegmentIntersector.prototype = {\r\n set: function ( start, end ) {\r\n Vec3.copy( start, this._start );\r\n Vec3.copy( end, this._end );\r\n },\r\n setStart: function ( start ) {\r\n Vec3.copy( start, this._start );\r\n },\r\n setEnd: function ( end ) {\r\n Vec3.copy( end, this._end );\r\n },\r\n reset: function () {\r\n // Clear the intersections vector\r\n this._intersections.length = 0;\r\n },\r\n enter: function ( node ) {\r\n // Not working if culling disabled ??\r\n return !node.isCullingActive() || this.intersects( node.getBound() );\r\n },\r\n // Intersection Segment/Sphere \r\n intersects: ( function () {\r\n var sm = Vec3.create();\r\n var se = Vec3.create();\r\n return function ( bsphere ) {\r\n // test for _start inside the bounding sphere\r\n if ( !bsphere.valid() ) return false;\r\n Vec3.sub( this._iStart, bsphere.center(), sm );\r\n var c = Vec3.length2( sm ) - bsphere.radius2();\r\n if ( c < 0.0 ) {\r\n return true;\r\n }\r\n // solve quadratic equation\r\n Vec3.sub( this._iEnd, this._iStart, se );\r\n var a = Vec3.length2( se );\r\n var b = Vec3.dot( sm, se ) * 2.0;\r\n var d = b * b - 4.0 * a * c;\r\n // no intersections if d<0\r\n if ( d < 0.0 ) {\r\n return false;\r\n }\r\n // compute two solutions of quadratic equation\r\n d = Math.sqrt( d );\r\n var div = 0.5 / a;\r\n var r1 = ( -b - d ) * div;\r\n var r2 = ( -b + d ) * div;\r\n\r\n // return false if both intersections are before the ray start\r\n if ( r1 <= 0.0 && r2 <= 0.0 ) {\r\n return false;\r\n }\r\n\r\n if ( r1 >= 1.0 && r2 >= 1.0 ) {\r\n return false;\r\n }\r\n return true;\r\n };\r\n } )(),\r\n\r\n intersect: function ( iv, node ) {\r\n var kdtree = node.getShape();\r\n if ( kdtree ) {\r\n // Use KDTREES\r\n return kdtree.intersectRay( this._iStart, this._iEnd, this._intersections, iv.nodePath );\r\n } else {\r\n // Use the TriangleIntersector\r\n var ti = new TriangleIntersector();\r\n ti.setNodePath( iv.nodePath );\r\n ti.set( this._iStart, this._iEnd );\r\n ti.apply( node );\r\n var l = ti._intersections.length;\r\n if ( l > 0 ) {\r\n // Intersection/s exists\r\n for ( var i = 0; i < l; i++ ) {\r\n this._intersections.push( ti._intersections[ i ] );\r\n }\r\n return true;\r\n }\r\n // No intersection found\r\n return false;\r\n }\r\n return false;\r\n },\r\n getIntersections: function () {\r\n return this._intersections;\r\n },\r\n setCurrentTransformation: function ( matrix ) {\r\n Matrix.inverse( matrix, matrix );\r\n Matrix.transformVec3( matrix, this._start, this._iStart );\r\n Matrix.transformVec3( matrix, this._end, this._iEnd );\r\n }\r\n };\r\n\r\n return LineSegmentIntersector;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgUtil/LineSegmentIntersector.js\n ** module id = 138\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Node',\r\n 'osg/MatrixTransform',\r\n 'osg/Depth',\r\n 'osg/BlendFunc',\r\n 'osg/CullFace',\r\n 'osg/Uniform',\r\n 'osg/Vec2',\r\n 'osg/Vec3',\r\n 'osg/Matrix',\r\n 'osg/Quat',\r\n 'osgUtil/IntersectionVisitor',\r\n 'osgUtil/LineSegmentIntersector',\r\n 'osgUtil/GizmoGeometry',\r\n 'osg/TransformEnums',\r\n 'osg/Utils'\r\n], function ( Node, MatrixTransform, Depth, BlendFunc, CullFace, Uniform, Vec2, Vec3, Matrix, Quat, IntersectionVisitor, LineSegmentIntersector, GizmoGeometry, TransformEnums, MACROUTILS ) {\r\n\r\n 'use strict';\r\n\r\n var getCanvasCoord = function ( vec, e ) {\r\n vec[ 0 ] = e.offsetX === undefined ? e.layerX : e.offsetX;\r\n vec[ 1 ] = e.offsetY === undefined ? e.layerY : e.offsetY;\r\n };\r\n\r\n var HideCullCallback = function () {};\r\n HideCullCallback.prototype = {\r\n cull: function () {\r\n return false;\r\n }\r\n };\r\n\r\n var blendAttribute = new BlendFunc( BlendFunc.SRC_ALPHA, BlendFunc.ONE_MINUS_SRC_ALPHA );\r\n\r\n var LineCustomIntersector = function ( testPlane ) {\r\n this._testPlane = testPlane; // intersection plane or line\r\n this._inter = Vec3.create(); // translate distance\r\n LineSegmentIntersector.call( this );\r\n };\r\n LineCustomIntersector.prototype = MACROUTILS.objectInherit( LineSegmentIntersector.prototype, {\r\n enter: ( function () {\r\n var axis = Vec3.create();\r\n var dir = Vec3.create();\r\n\r\n return function ( node ) {\r\n if ( node._nbAxis === undefined )\r\n return true;\r\n\r\n Vec3.init( axis );\r\n axis[ node._nbAxis ] = 1.0;\r\n if ( !this._testPlane ) {\r\n // intersection line line\r\n Vec3.normalize( Vec3.sub( this._iEnd, this._iStart, dir ), dir );\r\n\r\n var a01 = -Vec3.dot( dir, axis );\r\n var b0 = Vec3.dot( this._iStart, dir );\r\n var det = Math.abs( 1.0 - a01 * a01 );\r\n\r\n var b1 = -Vec3.dot( this._iStart, axis );\r\n Vec3.init( this._inter );\r\n this._inter[ node._nbAxis ] = ( a01 * b0 - b1 ) / det;\r\n } else {\r\n // intersection line plane\r\n var dist1 = Vec3.dot( this._iStart, axis );\r\n var dist2 = Vec3.dot( this._iEnd, axis );\r\n // ray copplanar to triangle\r\n if ( dist1 === dist2 )\r\n return false;\r\n // intersection between ray and triangle\r\n var val = -dist1 / ( dist2 - dist1 );\r\n this._inter[ 0 ] = this._iStart[ 0 ] + ( this._iEnd[ 0 ] - this._iStart[ 0 ] ) * val;\r\n this._inter[ 1 ] = this._iStart[ 1 ] + ( this._iEnd[ 1 ] - this._iStart[ 1 ] ) * val;\r\n this._inter[ 2 ] = this._iStart[ 2 ] + ( this._iEnd[ 2 ] - this._iStart[ 2 ] ) * val;\r\n }\r\n return false;\r\n };\r\n } )(),\r\n intersect: function () {\r\n return false;\r\n }\r\n } );\r\n\r\n // The MT node can be detected as such because they\r\n // have a '_nbAxis' property on them (x=0, y=1, z=2)\r\n //\r\n // MatrixTransform _________________________________________\r\n // | | |\r\n // ____ Rotate Translate TranslatePlane\r\n // | / | \\ / | \\ / | \\\r\n // MT MT MT MT MT MT MT MT MT MT\r\n // | \\ | / \\ | / \\ | /\r\n // FullArc \\|/ \\|/ \\|/\r\n // ____|_____ ___|________ ___|________\r\n // | | | | | |\r\n // DrawArc HideNode DrawArrow HideNode DrawPlane HideNode\r\n // | | |\r\n // PickArc PickArrow PickPlane\r\n //\r\n var NodeGizmo = function ( viewer ) {\r\n MatrixTransform.call( this );\r\n\r\n this._tmask = 1; // traversal mask when picking the scene\r\n\r\n // We can set this boolean to true if we want to insert a MatrixTransform just\r\n // before the picked geometry.\r\n // Otherwise, we simply select the first MatrixTransform with an 'editMask' property\r\n this._autoInsertMT = false;\r\n\r\n this._viewer = viewer;\r\n this._canvas = viewer.getGraphicContext().canvas;\r\n this._manipulator = viewer.getManipulator();\r\n\r\n this._rotateNode = new MatrixTransform();\r\n this._translateNode = new MatrixTransform();\r\n this._planeNode = new MatrixTransform();\r\n\r\n this._rotateInLocal = true; // local vs static space\r\n this._showAngle = new MatrixTransform();\r\n\r\n //for realtime picking\r\n this._downCanvasCoord = Vec2.create();\r\n this._hoverNode = null; // the hovered x/y/z MT node\r\n this._keepHoverColor = null;\r\n\r\n // for editing\r\n this._isEditing = false;\r\n\r\n this._editLineOrigin = Vec3.create();\r\n this._editLineDirection = Vec3.create();\r\n this._editOffset = Vec3.create();\r\n\r\n this._editLocal = Matrix.create();\r\n this._editWorldTrans = Matrix.create();\r\n this._editWorldScaleRot = Matrix.create();\r\n this._editInvWorldScaleRot = Matrix.create();\r\n\r\n this._debugNode = new Node();\r\n\r\n this._attachedNode = null;\r\n this.attachToGeometry( null );\r\n\r\n this.init();\r\n };\r\n\r\n // picking masks\r\n NodeGizmo.NO_PICK = 1 << 0;\r\n NodeGizmo.PICK_ARC = 1 << 1;\r\n NodeGizmo.PICK_ARROW = 1 << 2;\r\n NodeGizmo.PICK_PLANE = 1 << 3;\r\n\r\n NodeGizmo.PICK_X = 1 << 4;\r\n NodeGizmo.PICK_Y = 1 << 5;\r\n NodeGizmo.PICK_Z = 1 << 6;\r\n\r\n NodeGizmo.PICK_XYZ = NodeGizmo.PICK_X | NodeGizmo.PICK_Y | NodeGizmo.PICK_Z;\r\n NodeGizmo.PICK_GIZMO = NodeGizmo.PICK_ARC | NodeGizmo.PICK_ARROW | NodeGizmo.PICK_PLANE;\r\n\r\n NodeGizmo.prototype = MACROUTILS.objectInherit( MatrixTransform.prototype, {\r\n setTraversalMask: function ( tmask ) {\r\n this._tmask = tmask;\r\n },\r\n init: function () {\r\n this.getOrCreateStateSet().setAttributeAndModes( new Depth( Depth.DISABLE ) );\r\n this.getOrCreateStateSet().setAttributeAndModes( new CullFace( CullFace.DISABLE ) );\r\n\r\n var UpdateCallback = function () {};\r\n UpdateCallback.prototype = {\r\n update: this.updateGizmo.bind( this )\r\n };\r\n this.addUpdateCallback( new UpdateCallback() );\r\n this.addChild( this.initNodeTranslate() );\r\n this.addChild( this.initNodeTranslatePlane() );\r\n this.addChild( this.initNodeRotate() );\r\n if ( this._debugNode ) {\r\n this._debugNode.addChild( GizmoGeometry.createDebugLineGeometry() );\r\n this.addChild( this._debugNode );\r\n this._debugNode.setNodeMask( 0x0 );\r\n }\r\n\r\n var canvas = this._canvas;\r\n canvas.addEventListener( 'mousemove', this.onMouseMove.bind( this ) );\r\n canvas.addEventListener( 'mousedown', this.onMouseDown.bind( this ) );\r\n canvas.addEventListener( 'mouseup', this.onMouseUp.bind( this ) );\r\n canvas.addEventListener( 'mouseout', this.onMouseUp.bind( this ) );\r\n },\r\n attachToNodePath: function ( nodepath ) {\r\n var node;\r\n if ( nodepath ) {\r\n for ( var i = nodepath.length - 1; i >= 0; --i ) {\r\n var editMask = nodepath[ i ].editMask || 0;\r\n if ( editMask & NodeGizmo.PICK_GIZMO ) {\r\n node = nodepath[ i ];\r\n break;\r\n }\r\n }\r\n }\r\n if ( !node ) {\r\n this._attachedNode = null;\r\n this.setNodeMask( 0x0 );\r\n return;\r\n }\r\n\r\n this._attachedNode = node;\r\n this.updateGizmoMask();\r\n },\r\n attachToMatrixTransform: function ( node ) {\r\n if ( !node ) {\r\n this._attachedNode = null;\r\n this.setNodeMask( 0x0 );\r\n return;\r\n }\r\n if ( node.editMask === undefined )\r\n node.editMask = NodeGizmo.PICK_GIZMO;\r\n\r\n this._attachedNode = node;\r\n this.updateGizmoMask();\r\n },\r\n attachToGeometry: function ( node ) {\r\n if ( !node ) {\r\n this._attachedNode = null;\r\n this.setNodeMask( 0x0 );\r\n return;\r\n }\r\n // insert MatrixTransform node before geometry node\r\n var pr = node.getParents();\r\n if ( pr[ 0 ].editMask === undefined ) {\r\n var imt = new MatrixTransform();\r\n while ( pr.length > 0 ) {\r\n pr[ 0 ].addChild( imt );\r\n pr[ 0 ].removeChild( node );\r\n }\r\n imt.addChild( node );\r\n imt.editMask = NodeGizmo.PICK_GIZMO;\r\n node = imt;\r\n } else {\r\n node = pr[ 0 ];\r\n }\r\n\r\n this._attachedNode = node;\r\n this.updateGizmoMask();\r\n },\r\n updateGizmoMask: function () {\r\n if ( !this._attachedNode ) {\r\n this.setNodeMask( 0x0 );\r\n return;\r\n }\r\n var mask = this._attachedNode.editMask;\r\n this.setNodeMask( mask & NodeGizmo.PICK_GIZMO ? NodeGizmo.NO_PICK : 0x0 );\r\n this._translateNode.setNodeMask( mask & NodeGizmo.PICK_ARROW ? NodeGizmo.PICK_ARROW : 0x0 );\r\n this._rotateNode.setNodeMask( mask & NodeGizmo.PICK_ARC ? NodeGizmo.PICK_ARC : 0x0 );\r\n this._planeNode.setNodeMask( mask & NodeGizmo.PICK_PLANE ? NodeGizmo.PICK_PLANE : 0x0 );\r\n },\r\n onNodeHovered: function ( hit ) {\r\n if ( this._hoverNode )\r\n this._hoverNode.getStateSet().getUniform( 'uColor' ).set( this._keepHoverColor );\r\n if ( !hit ) {\r\n this._hoverNode = null;\r\n return;\r\n }\r\n\r\n // stop at the first X/Y/Z matrix node\r\n var np = hit.nodepath;\r\n var i = np.length - 1;\r\n var node = np[ i ];\r\n while ( node._nbAxis === undefined ) {\r\n if ( i === 0 )\r\n return;\r\n node = np[ --i ];\r\n }\r\n\r\n var unif = node.getStateSet().getUniform( 'uColor' );\r\n this._hoverNode = node;\r\n this._keepHoverColor = unif.get();\r\n unif.set( [ 1.0, 1.0, 0.0, 1.0 ] );\r\n },\r\n initNodeRotate: function () {\r\n var drawArcXYZ = GizmoGeometry.createTorusGeometry( 1.0, 0.01, 6, 64, Math.PI * 2 );\r\n var drawArc = GizmoGeometry.createTorusGeometry( 1.0, 0.01, 6, 64, Math.PI );\r\n var pickArc = GizmoGeometry.createTorusGeometry( 1.0, 0.1, 6, 64, Math.PI );\r\n\r\n var mtXYZ = new MatrixTransform();\r\n var mtX = new MatrixTransform();\r\n var mtY = new MatrixTransform();\r\n var mtZ = new MatrixTransform();\r\n mtX._nbAxis = 0;\r\n mtY._nbAxis = 1;\r\n mtZ._nbAxis = 2;\r\n\r\n var hideNode = new Node();\r\n hideNode.setCullCallback( new HideCullCallback() );\r\n hideNode.addChild( pickArc );\r\n\r\n // set masks\r\n drawArcXYZ.setNodeMask( NodeGizmo.NO_PICK );\r\n drawArc.setNodeMask( NodeGizmo.NO_PICK );\r\n pickArc.setNodeMask( NodeGizmo.PICK_ARC );\r\n mtX.setNodeMask( NodeGizmo.PICK_X );\r\n mtY.setNodeMask( NodeGizmo.PICK_Y );\r\n mtZ.setNodeMask( NodeGizmo.PICK_Z );\r\n\r\n mtXYZ.addChild( drawArcXYZ );\r\n mtX.addChild( drawArc );\r\n mtY.addChild( drawArc );\r\n mtZ.addChild( drawArc );\r\n\r\n mtX.addChild( hideNode );\r\n mtY.addChild( hideNode );\r\n mtZ.addChild( hideNode );\r\n\r\n mtXYZ.getOrCreateStateSet().addUniform( Uniform.createFloat4( [ 0.2, 0.2, 0.2, 1.0 ], 'uColor' ) );\r\n mtX.getOrCreateStateSet().addUniform( Uniform.createFloat4( [ 1.0, 0.0, 0.0, 1.0 ], 'uColor' ) );\r\n mtY.getOrCreateStateSet().addUniform( Uniform.createFloat4( [ 0.0, 1.0, 0.0, 1.0 ], 'uColor' ) );\r\n mtZ.getOrCreateStateSet().addUniform( Uniform.createFloat4( [ 0.0, 0.0, 1.0, 1.0 ], 'uColor' ) );\r\n\r\n var showAngle = this._showAngle;\r\n showAngle.getOrCreateStateSet().setAttributeAndModes( blendAttribute );\r\n showAngle.setNodeMask( 0x0 );\r\n showAngle.getOrCreateStateSet().addUniform( Uniform.createFloat3( [ 1.0, 0.0, 0.0 ], 'uBase' ) );\r\n showAngle.getOrCreateStateSet().addUniform( Uniform.createFloat( 0.0, 'uAngle' ) );\r\n showAngle.addChild( GizmoGeometry.createQuadCircleGeometry() );\r\n\r\n var rotate = this._rotateNode;\r\n rotate.setNodeMask( NodeGizmo.PICK_ARC );\r\n rotate.addChild( mtXYZ );\r\n rotate.addChild( mtX );\r\n rotate.addChild( mtY );\r\n rotate.addChild( mtZ );\r\n rotate.addChild( showAngle );\r\n return rotate;\r\n },\r\n initNodeTranslate: function () {\r\n var aHeight = 1.5;\r\n var aConeHeight = 0.3;\r\n var pickStart = 0.5; // offset (because of the picking plane)\r\n var pickHeight = ( aHeight - pickStart + aConeHeight ) * 1.1;\r\n\r\n // cone arrow\r\n var mtCone = new MatrixTransform();\r\n Matrix.makeTranslate( 0.0, 0.0, aHeight + aConeHeight * 0.5, mtCone.getMatrix() );\r\n mtCone.addChild( GizmoGeometry.createCylinderGeometry( 0.0, 0.07, aConeHeight, 32, 1, true, true ) );\r\n // arrow base\r\n var mtArrow = new MatrixTransform();\r\n Matrix.makeTranslate( 0.0, 0.0, aHeight * 0.5, mtArrow.getMatrix() );\r\n mtArrow.addChild( GizmoGeometry.createCylinderGeometry( 0.01, 0.01, aHeight, 32, 1, true, true ) );\r\n // draw arrow\r\n var drawArrow = new Node();\r\n drawArrow.addChild( mtArrow );\r\n drawArrow.addChild( mtCone );\r\n\r\n var pickArrow = GizmoGeometry.createCylinderGeometry( 0.1, 0.1, pickHeight, 32, 1, true, true );\r\n\r\n var mtX = new MatrixTransform();\r\n var mtY = new MatrixTransform();\r\n var mtZ = new MatrixTransform();\r\n mtX._nbAxis = 0;\r\n mtY._nbAxis = 1;\r\n mtZ._nbAxis = 2;\r\n\r\n Matrix.makeRotate( Math.PI * 0.5, 0.0, 1.0, 0.0, mtX.getMatrix() );\r\n Matrix.makeRotate( -Math.PI * 0.5, 1.0, 0.0, 0.0, mtY.getMatrix() );\r\n\r\n var hideNode = new MatrixTransform();\r\n hideNode.setCullCallback( new HideCullCallback() );\r\n Matrix.makeTranslate( 0.0, 0.0, pickStart + pickHeight * 0.5, hideNode.getMatrix() );\r\n hideNode.addChild( pickArrow );\r\n\r\n // set masks\r\n drawArrow.setNodeMask( NodeGizmo.NO_PICK );\r\n pickArrow.setNodeMask( NodeGizmo.PICK_ARROW );\r\n mtX.setNodeMask( NodeGizmo.PICK_X );\r\n mtY.setNodeMask( NodeGizmo.PICK_Y );\r\n mtZ.setNodeMask( NodeGizmo.PICK_Z );\r\n\r\n mtX.addChild( drawArrow );\r\n mtY.addChild( drawArrow );\r\n mtZ.addChild( drawArrow );\r\n\r\n mtX.addChild( hideNode );\r\n mtY.addChild( hideNode );\r\n mtZ.addChild( hideNode );\r\n\r\n mtX.getOrCreateStateSet().addUniform( Uniform.createFloat4( [ 1.0, 0.0, 0.0, 1.0 ], 'uColor' ) );\r\n mtY.getOrCreateStateSet().addUniform( Uniform.createFloat4( [ 0.0, 1.0, 0.0, 1.0 ], 'uColor' ) );\r\n mtZ.getOrCreateStateSet().addUniform( Uniform.createFloat4( [ 0.0, 0.0, 1.0, 1.0 ], 'uColor' ) );\r\n\r\n var translate = this._translateNode;\r\n translate.setNodeMask( NodeGizmo.PICK_ARROW );\r\n translate.addChild( mtX );\r\n translate.addChild( mtY );\r\n translate.addChild( mtZ );\r\n return translate;\r\n },\r\n initNodeTranslatePlane: function () {\r\n var mtPlane = new MatrixTransform();\r\n Matrix.makeTranslate( 0.5, 0.5, 0.0, mtPlane.getMatrix() );\r\n Matrix.postMult( Matrix.makeScale( 0.5, 0.5, 1.0, Matrix.create() ), mtPlane.getMatrix() );\r\n mtPlane.addChild( GizmoGeometry.createPlaneGeometry() );\r\n\r\n var mtX = new MatrixTransform();\r\n var mtY = new MatrixTransform();\r\n var mtZ = new MatrixTransform();\r\n mtX._nbAxis = 0;\r\n mtY._nbAxis = 1;\r\n mtZ._nbAxis = 2;\r\n\r\n Matrix.makeRotate( -Math.PI * 0.5, 0.0, 1.0, 0.0, mtX.getMatrix() );\r\n Matrix.makeRotate( Math.PI * 0.5, 1.0, 0.0, 0.0, mtY.getMatrix() );\r\n\r\n // set masks\r\n mtPlane.setNodeMask( NodeGizmo.PICK_PLANE );\r\n mtX.setNodeMask( NodeGizmo.PICK_X );\r\n mtY.setNodeMask( NodeGizmo.PICK_Y );\r\n mtZ.setNodeMask( NodeGizmo.PICK_Z );\r\n\r\n mtX.addChild( mtPlane );\r\n mtY.addChild( mtPlane );\r\n mtZ.addChild( mtPlane );\r\n\r\n mtX.getOrCreateStateSet().addUniform( Uniform.createFloat4( [ 1.0, 0.0, 0.0, 0.3 ], 'uColor' ) );\r\n mtY.getOrCreateStateSet().addUniform( Uniform.createFloat4( [ 0.0, 1.0, 0.0, 0.3 ], 'uColor' ) );\r\n mtZ.getOrCreateStateSet().addUniform( Uniform.createFloat4( [ 0.0, 0.0, 1.0, 0.3 ], 'uColor' ) );\r\n\r\n var plane = this._planeNode;\r\n plane.setNodeMask( NodeGizmo.PICK_PLANE );\r\n plane.getOrCreateStateSet().setAttributeAndModes( blendAttribute );\r\n plane.addChild( mtX );\r\n plane.addChild( mtY );\r\n plane.addChild( mtZ );\r\n return plane;\r\n },\r\n updateArcRotation: ( function () {\r\n var quat = Quat.create();\r\n var quatx = Quat.makeRotate( -Math.PI * 0.5, 0.0, 1.0, 0.0, Quat.create() );\r\n var quaty = Quat.makeRotate( -Math.PI * 0.5, 1.0, 0.0, 0.0, Quat.create() );\r\n return function ( eye ) {\r\n var rotateNode = this._rotateNode;\r\n var arcs = rotateNode.getChildren();\r\n // eye arc\r\n quat[ 0 ] = -eye[ 1 ];\r\n quat[ 1 ] = eye[ 0 ];\r\n quat[ 2 ] = 0.0;\r\n quat[ 3 ] = 1.0 + eye[ 2 ];\r\n Quat.normalize( quat, quat );\r\n Matrix.makeRotateFromQuat( quat, arcs[ 0 ].getMatrix() );\r\n // x arc\r\n Quat.makeRotate( Math.atan2( eye[ 2 ], eye[ 1 ] ), 1.0, 0.0, 0.0, quat );\r\n Quat.mult( quat, quatx, quat );\r\n Matrix.makeRotateFromQuat( quat, arcs[ 1 ].getMatrix() );\r\n // y arc\r\n Quat.makeRotate( Math.atan2( -eye[ 0 ], -eye[ 2 ] ), 0.0, 1.0, 0.0, quat );\r\n Quat.mult( quat, quaty, quat );\r\n Matrix.makeRotateFromQuat( quat, arcs[ 2 ].getMatrix() );\r\n // z arc\r\n Quat.makeRotate( Math.atan2( -eye[ 0 ], eye[ 1 ] ), 0.0, 0.0, 1.0, quat );\r\n Matrix.makeRotateFromQuat( quat, arcs[ 3 ].getMatrix() );\r\n\r\n arcs[ 1 ].dirtyBound();\r\n arcs[ 2 ].dirtyBound();\r\n arcs[ 3 ].dirtyBound();\r\n };\r\n } )(),\r\n getTransformType: function ( node ) {\r\n var n = node;\r\n while ( n.parents.length > 0 ) {\r\n if ( n.referenceFrame !== undefined && n.referenceFrame === TransformEnums.ABSOLUTE_RF )\r\n return TransformEnums.ABSOLUTE_RF;\r\n n = n.parents[ 0 ];\r\n }\r\n return TransformEnums.RELATIVE_RF;\r\n },\r\n updateGizmo: ( function () {\r\n var eye = Vec3.create();\r\n var trVec = Vec3.create();\r\n var tmpVec = Vec3.create();\r\n\r\n var temp = Matrix.create();\r\n var trWorld = Matrix.create();\r\n var invScale = Matrix.create();\r\n var scGiz = Matrix.create();\r\n\r\n return function () {\r\n if ( !this._attachedNode )\r\n return;\r\n var ttype = this.getTransformType( this._attachedNode );\r\n this.setReferenceFrame( ttype );\r\n this.setCullingActive( ttype === TransformEnums.RELATIVE_RF );\r\n var worldMat = this._attachedNode.getWorldMatrices()[ 0 ];\r\n\r\n // world trans\r\n Matrix.getTrans( worldMat, trVec );\r\n Matrix.makeTranslate( trVec[ 0 ], trVec[ 1 ], trVec[ 2 ], trWorld );\r\n\r\n // normalize gizmo size\r\n var scaleFactor = 3.0;\r\n if ( ttype === TransformEnums.ABSOLUTE_RF ) {\r\n eye[ 0 ] = eye[ 1 ] = eye[ 2 ] = 0.0;\r\n tmpVec[ 0 ] = tmpVec[ 1 ] = tmpVec[ 2 ] = 1.0;\r\n } else {\r\n var scaleFov = Matrix.getScale( this._viewer.getCamera().getProjectionMatrix(), tmpVec )[ 0 ];\r\n this._manipulator.getEyePosition( eye );\r\n scaleFactor = Vec3.distance( eye, trVec ) / ( 10 * scaleFov );\r\n }\r\n Matrix.makeScale( scaleFactor, scaleFactor, scaleFactor, scGiz );\r\n\r\n // gizmo node\r\n Matrix.mult( trWorld, scGiz, this.getMatrix() );\r\n\r\n Vec3.sub( eye, trVec, eye );\r\n Vec3.normalize( eye, eye );\r\n\r\n // rotate node\r\n if ( this._rotateInLocal ) {\r\n // world scale\r\n Matrix.getScale( worldMat, tmpVec );\r\n Matrix.makeScale( tmpVec[ 0 ], tmpVec[ 1 ], tmpVec[ 2 ], invScale );\r\n Matrix.inverse( invScale, invScale );\r\n\r\n Matrix.mult( worldMat, invScale, temp );\r\n temp[ 12 ] = temp[ 13 ] = temp[ 14 ] = 0.0;\r\n Matrix.copy( temp, this._rotateNode.getMatrix() );\r\n Matrix.inverse( temp, temp );\r\n Matrix.transformVec3( temp, eye, eye );\r\n } else {\r\n Matrix.makeIdentity( this._rotateNode.getMatrix() );\r\n }\r\n\r\n this.updateArcRotation( eye );\r\n\r\n this._rotateNode.dirtyBound();\r\n this._translateNode.dirtyBound();\r\n this._planeNode.dirtyBound();\r\n\r\n if ( this._isEditing )\r\n Matrix.copy( this._hoverNode.getMatrix(), this._showAngle.getMatrix() );\r\n };\r\n } )(),\r\n computeNearestIntersection: ( function () {\r\n var sortByRatio = function ( a, b ) {\r\n return a.ratio - b.ratio;\r\n };\r\n var coord = Vec2.create();\r\n\r\n return function ( e, tmask ) {\r\n getCanvasCoord( coord, e );\r\n\r\n // canvas to webgl coord\r\n var canvas = this._canvas;\r\n var x = coord[ 0 ] * ( canvas.width / canvas.clientWidth );\r\n var y = ( canvas.clientHeight - coord[ 1 ] ) * ( canvas.height / canvas.clientHeight );\r\n\r\n var hits = this._viewer.computeIntersections( x, y, tmask );\r\n\r\n if ( hits.length === 0 )\r\n return undefined;\r\n\r\n hits.sort( sortByRatio );\r\n return hits[ 0 ];\r\n };\r\n } )(),\r\n setOnlyGizmoPicking: function () {\r\n // enable picking only for the gizmo\r\n this._viewer.getCamera().addChild( this );\r\n this._viewer.getSceneData().setNodeMask( 0x0 );\r\n this.setNodeMask( ~0x0 );\r\n },\r\n setOnlyScenePicking: function () {\r\n this._viewer.getCamera().removeChild( this );\r\n this._viewer.getSceneData().setNodeMask( ~0x0 );\r\n this.setNodeMask( NodeGizmo.NO_PICK );\r\n },\r\n pickGizmo: function ( e, tmask ) {\r\n this.setOnlyGizmoPicking();\r\n var hit = this.computeNearestIntersection( e, tmask );\r\n this.setOnlyScenePicking();\r\n return hit;\r\n },\r\n getCanvasPositionFromWorldPoint: function ( worldPoint, out ) {\r\n var cam = this._viewer.getCamera();\r\n var mat = Matrix.create();\r\n Matrix.preMult( mat, cam.getViewport() ? cam.getViewport().computeWindowMatrix() : Matrix.create() );\r\n Matrix.preMult( mat, cam.getProjectionMatrix() );\r\n if ( this.getReferenceFrame() === TransformEnums.RELATIVE_RF )\r\n Matrix.preMult( mat, cam.getViewMatrix() );\r\n\r\n var screenPoint = out || Vec3.create();\r\n Matrix.transformVec3( mat, worldPoint, screenPoint );\r\n\r\n // canvas to webgl coord\r\n var canvas = this._canvas;\r\n out[ 0 ] = out[ 0 ] / ( canvas.width / canvas.clientWidth );\r\n out[ 1 ] = canvas.clientHeight - out[ 1 ] / ( canvas.height / canvas.clientHeight );\r\n return out;\r\n },\r\n onMouseDown: function ( e ) {\r\n getCanvasCoord( this._downCanvasCoord, e );\r\n if ( !this._hoverNode || !this._attachedNode )\r\n return;\r\n this._viewer._eventProxy.StandardMouseKeyboard._enable = false;\r\n\r\n this.saveEditMatrices();\r\n var nm = this._hoverNode.getParents()[ 0 ].getNodeMask();\r\n this._isEditing = true;\r\n\r\n if ( nm & NodeGizmo.PICK_ARC ) {\r\n this._translateNode.setNodeMask( 0x0 );\r\n this._planeNode.setNodeMask( 0x0 );\r\n this.startRotateEdit( e );\r\n } else if ( nm & NodeGizmo.PICK_ARROW ) {\r\n this._rotateNode.setNodeMask( 0x0 );\r\n this._planeNode.setNodeMask( 0x0 );\r\n this.startTranslateEdit( e );\r\n } else if ( nm & NodeGizmo.PICK_PLANE ) {\r\n this._rotateNode.setNodeMask( 0x0 );\r\n this._translateNode.setNodeMask( 0x0 );\r\n this.startPlaneEdit( e );\r\n }\r\n },\r\n saveEditMatrices: function () {\r\n Matrix.copy( this._attachedNode.getMatrix(), this._editLocal );\r\n // save the world translation\r\n var wm = this._attachedNode.getWorldMatrices()[ 0 ];\r\n Matrix.makeTranslate( wm[ 12 ], wm[ 13 ], wm[ 14 ], this._editWorldTrans );\r\n // save the inv of world rotation + scale\r\n Matrix.copy( wm, this._editWorldScaleRot );\r\n // removes translation\r\n this._editWorldScaleRot[ 12 ] = this._editWorldScaleRot[ 13 ] = this._editWorldScaleRot[ 14 ] = 0.0;\r\n Matrix.inverse( this._editWorldScaleRot, this._editInvWorldScaleRot );\r\n },\r\n startRotateEdit: function ( e ) {\r\n var gizmoMat = this._rotateNode.getWorldMatrices()[ 0 ];\r\n\r\n // center of gizmo on screen\r\n var projCenter = Vec3.create();\r\n Matrix.transformVec3( gizmoMat, projCenter, projCenter );\r\n this.getCanvasPositionFromWorldPoint( projCenter, projCenter );\r\n\r\n // pick rotate gizmo\r\n var hit = this.pickGizmo( e, this._hoverNode.getNodeMask() | NodeGizmo.PICK_ARC );\r\n if ( !hit ) return;\r\n // compute tangent direction\r\n var sign = this._hoverNode._nbAxis === 0 ? -1.0 : 1.0;\r\n var tang = Vec3.create();\r\n tang[ 0 ] = sign * hit.point[ 1 ];\r\n tang[ 1 ] = -sign * hit.point[ 0 ];\r\n tang[ 2 ] = hit.point[ 2 ];\r\n\r\n // project tangent on screen\r\n var projArc = Vec3.create();\r\n Matrix.transformVec3( this._hoverNode.getMatrix(), tang, projArc );\r\n Matrix.transformVec3( gizmoMat, projArc, projArc );\r\n this.getCanvasPositionFromWorldPoint( projArc, projArc );\r\n\r\n var dir = this._editLineDirection;\r\n Vec2.sub( projArc, projCenter, dir );\r\n Vec2.normalize( dir, dir );\r\n\r\n // show angle\r\n this._showAngle.setNodeMask( NodeGizmo.NO_PICK );\r\n hit.point[ 2 ] = 0.0;\r\n var stateAngle = this._showAngle.getStateSet();\r\n stateAngle.getUniform( 'uAngle' ).set( 0.0 );\r\n stateAngle.getUniform( 'uBase' ).set( Vec3.normalize( hit.point, hit.point ) );\r\n\r\n getCanvasCoord( this._editLineOrigin, e );\r\n },\r\n startTranslateEdit: function ( e ) {\r\n var origin = this._editLineOrigin;\r\n var dir = this._editLineDirection;\r\n\r\n // 3d origin (center of gizmo)\r\n var gizmoMat = this._translateNode.getWorldMatrices()[ 0 ];\r\n Matrix.getTrans( gizmoMat, origin );\r\n\r\n // 3d direction\r\n Vec3.init( dir );\r\n dir[ this._hoverNode._nbAxis ] = 1.0;\r\n Vec3.add( origin, dir, dir );\r\n\r\n // project on canvas\r\n this.getCanvasPositionFromWorldPoint( origin, origin );\r\n this.getCanvasPositionFromWorldPoint( dir, dir );\r\n\r\n Vec2.sub( dir, origin, dir );\r\n Vec2.normalize( dir, dir );\r\n\r\n var offset = this._editOffset;\r\n getCanvasCoord( offset, e );\r\n Vec2.sub( offset, origin, offset );\r\n },\r\n startPlaneEdit: function ( e ) {\r\n var origin = this._editLineOrigin; // just used to determine the 2d offset\r\n\r\n // 3d origin (center of gizmo)\r\n var gizmoMat = this._planeNode.getWorldMatrices()[ 0 ];\r\n Matrix.getTrans( gizmoMat, origin );\r\n\r\n // project on canvas\r\n this.getCanvasPositionFromWorldPoint( origin, origin );\r\n\r\n var offset = this._editOffset;\r\n getCanvasCoord( offset, e );\r\n Vec2.sub( offset, origin, offset );\r\n },\r\n drawLineCanvasDebug: function ( x1, y1, x2, y2 ) {\r\n this._debugNode.setNodeMask( NodeGizmo.NO_PICK );\r\n var buffer = this._debugNode.getChildren()[ 0 ].getAttributes().Vertex;\r\n buffer.getElements()[ 0 ] = ( ( x1 / this._canvas.clientWidth ) * 2 ) - 1.0;\r\n buffer.getElements()[ 1 ] = ( ( ( this._canvas.clientHeight - y1 ) / this._canvas.clientHeight ) ) * 2 - 1.0;\r\n buffer.getElements()[ 2 ] = ( ( x2 / this._canvas.clientWidth ) * 2 ) - 1.0;\r\n buffer.getElements()[ 3 ] = ( ( ( this._canvas.clientHeight - y2 ) / this._canvas.clientHeight ) ) * 2 - 1.0;\r\n buffer.dirty();\r\n },\r\n pickAndSelect: function ( e ) {\r\n this.setNodeMask( 0x0 );\r\n var hit = this.computeNearestIntersection( e, this._tmask );\r\n if ( this._autoInsertMT )\r\n this.attachToGeometry( hit ? hit.nodepath[ hit.nodepath.length - 1 ] : hit );\r\n else\r\n this.attachToNodePath( hit ? hit.nodepath : hit );\r\n },\r\n onMouseUp: function ( e ) {\r\n var smk = this._viewer._eventProxy.StandardMouseKeyboard;\r\n if ( smk._enable === false ) {\r\n smk._enable = true;\r\n this._viewer._eventProxy.StandardMouseKeyboard.mouseup( e );\r\n }\r\n if ( this._debugNode )\r\n this._debugNode.setNodeMask( 0x0 );\r\n\r\n var v = Vec2.create();\r\n getCanvasCoord( v, e );\r\n if ( Vec2.distance( this._downCanvasCoord, v ) === 0.0 )\r\n this.pickAndSelect( e );\r\n\r\n this._showAngle.setNodeMask( 0x0 );\r\n this._isEditing = false;\r\n if ( !this._hoverNode )\r\n return;\r\n this.updateGizmoMask();\r\n },\r\n onMouseMove: function ( e ) {\r\n if ( !this._attachedNode )\r\n return;\r\n var hit;\r\n if ( this._isEditing === false ) {\r\n hit = this.pickGizmo( e, NodeGizmo.PICK_XYZ | NodeGizmo.PICK_GIZMO );\r\n this.onNodeHovered( hit );\r\n return;\r\n }\r\n if ( !this._hoverNode )\r\n return;\r\n var par = this._hoverNode.getParents()[ 0 ];\r\n if ( par === this._rotateNode )\r\n this.updateRotateEdit( e );\r\n else if ( par === this._translateNode )\r\n this.updateTranslateEdit( e );\r\n else if ( par === this._planeNode )\r\n this.updatePlaneEdit( e );\r\n },\r\n updateRotateEdit: ( function () {\r\n var mrot = Matrix.create();\r\n var vec = Vec2.create();\r\n\r\n return function ( e ) {\r\n\r\n var origin = this._editLineOrigin;\r\n var dir = this._editLineDirection;\r\n\r\n getCanvasCoord( vec, e );\r\n Vec2.sub( vec, origin, vec );\r\n var dist = Vec2.dot( vec, dir );\r\n\r\n if ( this._debugNode )\r\n this.drawLineCanvasDebug( origin[ 0 ], origin[ 1 ], origin[ 0 ] + dir[ 0 ] * dist, origin[ 1 ] + dir[ 1 ] * dist );\r\n\r\n var angle = 7 * dist / Math.min( this._canvas.clientWidth, this._canvas.clientHeight );\r\n angle %= ( Math.PI * 2 );\r\n var nbAxis = this._hoverNode._nbAxis;\r\n if ( nbAxis === 0 )\r\n Matrix.makeRotate( -angle, 1.0, 0.0, 0.0, mrot );\r\n else if ( nbAxis === 1 )\r\n Matrix.makeRotate( -angle, 0.0, 1.0, 0.0, mrot );\r\n else if ( nbAxis === 2 )\r\n Matrix.makeRotate( -angle, 0.0, 0.0, 1.0, mrot );\r\n\r\n this._showAngle.getOrCreateStateSet().getUniform( 'uAngle' ).set( nbAxis === 0 ? -angle : angle );\r\n\r\n if ( !this._rotateInLocal ) {\r\n Matrix.postMult( this._editInvWorldScaleRot, mrot );\r\n Matrix.preMult( mrot, this._editWorldScaleRot );\r\n }\r\n\r\n Matrix.mult( this._editLocal, mrot, this._attachedNode.getMatrix() );\r\n\r\n this._attachedNode.dirtyBound();\r\n };\r\n } )(),\r\n updateTranslateEdit: ( function () {\r\n var vec = Vec2.create();\r\n var tra = Vec2.create();\r\n\r\n return function ( e ) {\r\n\r\n var origin = this._editLineOrigin;\r\n var dir = this._editLineDirection;\r\n\r\n getCanvasCoord( vec, e );\r\n Vec2.sub( vec, origin, vec );\r\n Vec2.sub( vec, this._editOffset, vec );\r\n\r\n var dist = Vec2.dot( vec, dir );\r\n vec[ 0 ] = origin[ 0 ] + dir[ 0 ] * dist;\r\n vec[ 1 ] = origin[ 1 ] + dir[ 1 ] * dist;\r\n\r\n if ( this._debugNode )\r\n this.drawLineCanvasDebug( origin[ 0 ], origin[ 1 ], vec[ 0 ], vec[ 1 ] );\r\n\r\n // canvas to webgl coord\r\n var canvas = this._canvas;\r\n var coordx = vec[ 0 ] * ( canvas.width / canvas.clientWidth );\r\n var coordy = ( canvas.clientHeight - vec[ 1 ] ) * ( canvas.height / canvas.clientHeight );\r\n\r\n // project 2D point on the 3d line\r\n var lsi = new LineCustomIntersector();\r\n lsi.set( [ coordx, coordy, 0.0 ], [ coordx, coordy, 1.0 ] );\r\n var iv = new IntersectionVisitor();\r\n iv.setTraversalMask( this._hoverNode.getNodeMask() | NodeGizmo.PICK_ARROW );\r\n iv.setIntersector( lsi );\r\n\r\n Matrix.copy( this._editWorldTrans, this.getMatrix() );\r\n\r\n this.setOnlyGizmoPicking();\r\n this._viewer._camera.accept( iv );\r\n this.setOnlyScenePicking();\r\n\r\n Matrix.transformVec3( this._editInvWorldScaleRot, lsi._inter, tra );\r\n Matrix.multTranslate( this._editLocal, tra, this._attachedNode.getMatrix() );\r\n\r\n this._attachedNode.dirtyBound();\r\n };\r\n } )(),\r\n updatePlaneEdit: function ( e ) {\r\n var vec = Vec3.create();\r\n getCanvasCoord( vec, e );\r\n Vec2.sub( vec, this._editOffset, vec );\r\n\r\n // canvas to webgl coord\r\n var canvas = this._canvas;\r\n var coordx = vec[ 0 ] * ( canvas.width / canvas.clientWidth );\r\n var coordy = ( canvas.clientHeight - vec[ 1 ] ) * ( canvas.height / canvas.clientHeight );\r\n\r\n // project 2D point on the 3d plane\r\n var lsi = new LineCustomIntersector( true );\r\n lsi.set( [ coordx, coordy, 0.0 ], [ coordx, coordy, 1.0 ] );\r\n var iv = new IntersectionVisitor();\r\n iv.setTraversalMask( this._hoverNode.getNodeMask() | NodeGizmo.PICK_PLANE );\r\n iv.setIntersector( lsi );\r\n\r\n Matrix.copy( this._editWorldTrans, this.getMatrix() );\r\n\r\n this.setOnlyGizmoPicking();\r\n this._viewer._camera.accept( iv );\r\n this.setOnlyScenePicking();\r\n\r\n Matrix.transformVec3( this._editInvWorldScaleRot, lsi._inter, vec );\r\n Matrix.multTranslate( this._editLocal, vec, this._attachedNode.getMatrix() );\r\n\r\n this._attachedNode.dirtyBound();\r\n }\r\n } );\r\n\r\n return NodeGizmo;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgUtil/NodeGizmo.js\n ** module id = 139\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Camera',\r\n 'osg/FrameBufferObject',\r\n 'osg/Matrix',\r\n 'osg/Node',\r\n 'osg/Program',\r\n 'osg/Shader',\r\n 'osg/Shape',\r\n 'osg/Texture',\r\n 'osg/Transform',\r\n 'osg/Uniform',\r\n 'osg/Viewport'\r\n], function ( Camera, FrameBufferObject, Matrix, Node, Program, Shader, Shape, Texture, Transform, Uniform, Viewport ) {\r\n\r\n 'use strict';\r\n\r\n var UpdateRttCameraCallback = function ( rootView, offsetView, canvas, orthoCam, isLeft, isCardboard ) {\r\n this._rootView = rootView;\r\n this._offsetView = offsetView;\r\n this._canvas = canvas;\r\n this._width = canvas.width;\r\n this._height = canvas.height;\r\n this._isLeft = isLeft;\r\n this._orthoCam = orthoCam;\r\n this._isCardboard = isCardboard;\r\n };\r\n\r\n UpdateRttCameraCallback.prototype = {\r\n update: function ( node /*, nv */ ) {\r\n var canvas = this._canvas;\r\n if ( this._isCardboard && ( canvas.width !== this._width || canvas.height !== this._height ) ) {\r\n this._width = canvas.width;\r\n this._height = canvas.height;\r\n if ( this._isLeft )\r\n this._orthoCam.setViewport( new Viewport( 0.0, 0.0, this._width / 2.0, this._height ) );\r\n else\r\n this._orthoCam.setViewport( new Viewport( this._width / 2.0, 0.0, this._width / 2.0, this._height ) );\r\n }\r\n var nodeView = node.getViewMatrix();\r\n Matrix.mult( this._offsetView, this._rootView, nodeView );\r\n return true;\r\n }\r\n };\r\n\r\n var setupOculus = function ( worldFactor, HMD, oculusUniforms, oculusMatrices ) {\r\n var aspect = HMD.hResolution / ( 2.0 * HMD.vResolution );\r\n var r = -1.0 - ( 4.0 * ( HMD.hScreenSize * 0.25 - HMD.lensSeparationDistance * 0.5 ) / HMD.hScreenSize );\r\n var distScale = ( HMD.distortionK[ 0 ] + HMD.distortionK[ 1 ] * Math.pow( r, 2 ) + HMD.distortionK[ 2 ] * Math.pow( r, 4 ) + HMD.distortionK[ 3 ] * Math.pow( r, 6 ) );\r\n var fov = ( 180.0 / Math.PI ) * 2.0 * Math.atan2( HMD.vScreenSize * distScale, 2.0 * HMD.eyeToScreenDistance );\r\n\r\n var proj = Matrix.makePerspective( fov, aspect, 0.3, 10000.0, Matrix.create() );\r\n var hOffset = 4.0 * ( HMD.hScreenSize * 0.25 - HMD.interpupillaryDistance * 0.5 ) / HMD.hScreenSize;\r\n var lensShift = 4.0 * ( HMD.hScreenSize * 0.25 - HMD.lensSeparationDistance * 0.5 ) / HMD.hScreenSize;\r\n\r\n oculusMatrices.projectionLeft = Matrix.preMult( Matrix.makeTranslate( hOffset, 0.0, 0.0, Matrix.create() ), proj );\r\n oculusMatrices.projectionRight = Matrix.preMult( Matrix.makeTranslate( -hOffset, 0.0, 0.0, Matrix.create() ), proj );\r\n oculusMatrices.viewLeft = Matrix.makeTranslate( worldFactor * HMD.interpupillaryDistance * 0.5, 0.0, 0.0, Matrix.create() );\r\n oculusMatrices.viewRight = Matrix.makeTranslate( -worldFactor * HMD.interpupillaryDistance * 0.5, 0.0, 0.0, Matrix.create() );\r\n\r\n oculusUniforms.lensCenterLeft = [ lensShift, 0.0 ];\r\n oculusUniforms.lensCenterRight = [ -lensShift, 0.0 ];\r\n oculusUniforms.hmdWarpParam = HMD.distortionK;\r\n oculusUniforms.chromAbParam = HMD.chromaAbParameter;\r\n oculusUniforms.scaleIn = [ 1.0, 1.0 / aspect ];\r\n oculusUniforms.scale = [ 1.0 / distScale, 1.0 * aspect / distScale ];\r\n };\r\n\r\n var getOculusShader = function () {\r\n var vertexshader = [\r\n '',\r\n '#ifdef GL_ES',\r\n 'precision highp float;',\r\n '#endif',\r\n\r\n 'attribute vec3 Vertex;',\r\n 'attribute vec3 Normal;',\r\n 'attribute vec2 TexCoord0;',\r\n\r\n 'uniform mat4 ModelViewMatrix;',\r\n 'uniform mat4 ProjectionMatrix;',\r\n 'uniform mat4 NormalMatrix;',\r\n\r\n 'varying vec2 vTexCoord;',\r\n\r\n 'void main(void) {',\r\n ' vTexCoord = TexCoord0;',\r\n ' gl_Position = ProjectionMatrix * ModelViewMatrix * vec4(Vertex, 1.0);',\r\n '}'\r\n ].join( '\\n' );\r\n\r\n var fragmentshader = [\r\n '',\r\n '#ifdef GL_ES',\r\n 'precision highp float;',\r\n '#endif',\r\n\r\n 'uniform vec2 uScale;',\r\n 'uniform vec2 uScaleIn;',\r\n 'uniform vec2 uLensCenter;',\r\n 'uniform vec4 uHmdWarpParam;',\r\n 'uniform vec4 uChromAbParam;',\r\n 'uniform sampler2D Texture0;',\r\n\r\n 'varying vec2 vTexCoord;',\r\n\r\n // from http://paradise.untergrund.net/tmp/demoshit/examples/js/effects/OculusRiftEffect.js\r\n 'void main(void) {',\r\n ' vec2 uv = (vTexCoord * 2.0) - 1.0;', // range from [0,1] to [-1,1]\r\n ' vec2 theta = (uv - uLensCenter) * uScaleIn;',\r\n ' float rSq = theta.x * theta.x + theta.y * theta.y;',\r\n ' vec2 rvector = theta * (uHmdWarpParam.x + uHmdWarpParam.y * rSq + uHmdWarpParam.z * rSq * rSq + uHmdWarpParam.w * rSq * rSq * rSq);',\r\n ' vec2 rBlue = rvector * (uChromAbParam.z + uChromAbParam.w * rSq);',\r\n ' vec2 tcBlue = (uLensCenter + uScale * rBlue);',\r\n ' tcBlue = (tcBlue + 1.0) * 0.5;', // range from [-1,1] to [0,1]\r\n ' if (any(bvec2(clamp(tcBlue, vec2(0.0, 0.0), vec2(1.0, 1.0)) - tcBlue))) {',\r\n ' gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);',\r\n ' return;',\r\n ' }',\r\n ' vec2 tcGreen = uLensCenter + uScale * rvector;',\r\n ' tcGreen = (tcGreen + 1.0) * 0.5;', // range from [-1,1] to [0,1]\r\n ' vec2 rRed = rvector * (uChromAbParam.x + uChromAbParam.y * rSq);',\r\n ' vec2 tcRed = uLensCenter + uScale * rRed;',\r\n ' tcRed = (tcRed + 1.0) * 0.5;', // range from [-1,1] to [0,1]\r\n ' gl_FragColor = vec4(texture2D(Texture0, tcRed).r, texture2D(Texture0, tcGreen).g, texture2D(Texture0, tcBlue).b, 1);',\r\n '}',\r\n ''\r\n ].join( '\\n' );\r\n\r\n var program = new Program(\r\n new Shader( Shader.VERTEX_SHADER, vertexshader ),\r\n new Shader( Shader.FRAGMENT_SHADER, fragmentshader ) );\r\n\r\n return program;\r\n };\r\n\r\n var createTextureRtt = function ( rttSize ) {\r\n var rttTexture = new Texture();\r\n rttTexture.setTextureSize( rttSize[ 0 ], rttSize[ 1 ] );\r\n rttTexture.setMinFilter( 'LINEAR' );\r\n rttTexture.setMagFilter( 'LINEAR' );\r\n return rttTexture;\r\n };\r\n\r\n var createQuadRtt = function ( isLeftCam, texture, ocUnifs ) {\r\n var quad = Shape.createTexturedQuadGeometry( -0.5, -0.5, 0, 1, 0, 0, 0, 1, 0 );\r\n var orStateSet = quad.getOrCreateStateSet();\r\n orStateSet.setTextureAttributeAndModes( 0, texture );\r\n orStateSet.setAttributeAndModes( getOculusShader() );\r\n orStateSet.addUniform( new Uniform.createFloat2( ocUnifs.scale, 'uScale' ) );\r\n orStateSet.addUniform( new Uniform.createFloat2( ocUnifs.scaleIn, 'uScaleIn' ) );\r\n orStateSet.addUniform( new Uniform.createFloat2( isLeftCam ? ocUnifs.lensCenterLeft : ocUnifs.lensCenterRight, 'uLensCenter' ) );\r\n orStateSet.addUniform( new Uniform.createFloat4( ocUnifs.hmdWarpParam, 'uHmdWarpParam' ) );\r\n orStateSet.addUniform( new Uniform.createFloat4( ocUnifs.chromAbParam, 'uChromAbParam' ) );\r\n return quad;\r\n };\r\n\r\n var createOrthoRtt = function ( left, viewportSize, canvasSize, cardboard ) {\r\n var orthoCamera = new Camera();\r\n var vw = viewportSize[ 0 ];\r\n var vh = viewportSize[ 1 ];\r\n var cw = canvasSize[ 0 ];\r\n var ch = canvasSize[ 1 ];\r\n if ( cardboard === true ) {\r\n if ( left )\r\n orthoCamera.setViewport( new Viewport( 0.0, 0.0, cw / 2.0, ch ) );\r\n else\r\n orthoCamera.setViewport( new Viewport( cw / 2.0, 0.0, cw / 2.0, ch ) );\r\n } else {\r\n if ( left )\r\n orthoCamera.setViewport( new Viewport( 0.5 * cw - vw, 0.5 * ( ch - vh ), vw, vh ) );\r\n else\r\n orthoCamera.setViewport( new Viewport( 0.5 * cw, 0.5 * ( ch - vh ), vw, vh ) );\r\n }\r\n Matrix.makeOrtho( -0.5, 0.5, -0.5, 0.5, -5, 5, orthoCamera.getProjectionMatrix() );\r\n orthoCamera.setRenderOrder( Camera.NESTED_RENDER, 0 );\r\n orthoCamera.setReferenceFrame( Transform.ABSOLUTE_RF );\r\n return orthoCamera;\r\n };\r\n\r\n var createCameraRtt = function ( texture, projMatrix ) {\r\n var camera = new Camera();\r\n camera.setName( 'rtt camera' );\r\n camera.setViewport( new Viewport( 0, 0, texture.getWidth(), texture.getHeight() ) );\r\n camera.setProjectionMatrix( projMatrix );\r\n camera.setClearColor( [ 0.3, 0.3, 0.3, 0.0 ] );\r\n camera.setRenderOrder( Camera.POST_RENDER, 0 );\r\n camera.attachTexture( FrameBufferObject.COLOR_ATTACHMENT0, texture );\r\n camera.attachRenderBuffer( FrameBufferObject.DEPTH_ATTACHMENT, FrameBufferObject.DEPTH_COMPONENT16 );\r\n camera.setReferenceFrame( Transform.ABSOLUTE_RF );\r\n return camera;\r\n };\r\n\r\n var Oculus = {};\r\n\r\n Oculus.createScene = function ( viewer, rttScene, HMDconfig ) {\r\n var HMD = Oculus.getDefaultConfig( HMDconfig );\r\n var rttSize = [ HMD.hResolution, HMD.vResolution ];\r\n var viewportSize = [ HMD.hResolution * 0.5, HMD.vResolution ];\r\n var vp = viewer.getCamera().getViewport();\r\n var canvasSize = [ vp.width(), vp.height() ];\r\n\r\n var canvas = viewer.getGraphicContext().canvas;\r\n if ( HMD.isCardboard ) {\r\n canvasSize[ 0 ] = canvas.width;\r\n canvasSize[ 1 ] = canvas.height;\r\n }\r\n\r\n var worldFactor = 1.0; //world unit\r\n var oculusUniforms = {};\r\n var oculusMatrices = {};\r\n setupOculus( worldFactor, HMD, oculusUniforms, oculusMatrices );\r\n\r\n var rootViewMatrix = viewer.getCamera().getViewMatrix();\r\n\r\n var root = new Node();\r\n\r\n var rttTextureLeft = createTextureRtt( rttSize );\r\n var rttCamLeft = createCameraRtt( rttTextureLeft, oculusMatrices.projectionLeft );\r\n var quadTextLeft = createQuadRtt( true, rttTextureLeft, oculusUniforms );\r\n var orthoCameraLeft = createOrthoRtt( true, viewportSize, canvasSize, HMD.isCardboard );\r\n rttCamLeft.setUpdateCallback( new UpdateRttCameraCallback( rootViewMatrix, oculusMatrices.viewLeft, canvas, orthoCameraLeft, true, HMD.isCardboard ) );\r\n\r\n var rttTextureRight = createTextureRtt( rttSize );\r\n var rttCamRight = createCameraRtt( rttTextureRight, oculusMatrices.projectionRight );\r\n var quadTextRight = createQuadRtt( false, rttTextureRight, oculusUniforms );\r\n var orthoCameraRight = createOrthoRtt( false, viewportSize, canvasSize, HMD.isCardboard );\r\n rttCamRight.setUpdateCallback( new UpdateRttCameraCallback( rootViewMatrix, oculusMatrices.viewRight, canvas, orthoCameraRight, false, HMD.isCardboard ) );\r\n\r\n rttCamLeft.addChild( rttScene );\r\n rttCamRight.addChild( rttScene );\r\n\r\n orthoCameraLeft.addChild( quadTextLeft );\r\n orthoCameraRight.addChild( quadTextRight );\r\n\r\n root.addChild( rttCamLeft );\r\n root.addChild( rttCamRight );\r\n\r\n root.addChild( orthoCameraLeft );\r\n root.addChild( orthoCameraRight );\r\n\r\n return root;\r\n };\r\n\r\n Oculus.getDefaultConfig = function ( hmdConfig ) {\r\n // FOV: 103.506416\r\n // vScreenCenter: 0.03645\r\n\r\n // Oculus Rift DK2\r\n var hmd = {\r\n hResolution: 1920,\r\n vResolution: 1080,\r\n hScreenSize: 0.1296,\r\n vScreenSize: 0.0729,\r\n interpupillaryDistance: 0.064,\r\n lensSeparationDistance: 0.0635,\r\n eyeToScreenDistance: 0.04,\r\n distortionK: [ 1.0, 0.22, 0.13, 0.02 ],\r\n chromaAbParameter: [ 0.996, -0.004, 1.014, 0.0 ],\r\n isCardboard: false\r\n };\r\n if ( hmdConfig === 2 || hmdConfig === undefined )\r\n return hmd;\r\n if ( hmdConfig === 1 ) {\r\n // Oculus Rift DK1\r\n hmd.hResolution = 1280;\r\n hmd.vResolution = 800;\r\n hmd.hScreenSize = 0.14976;\r\n hmd.vScreenSize = 0.0936;\r\n hmd.lensSeparationDistance = 0.064;\r\n hmd.eyeToScreenDistance = 0.041;\r\n hmd.distortionK = [ 1.0, 0.22, 0.24, 0.0 ];\r\n return hmd;\r\n }\r\n // custom param\r\n if ( hmdConfig.hResolution !== undefined ) hmd.hResolution = hmdConfig.hResolution;\r\n if ( hmdConfig.vResolution !== undefined ) hmd.vResolution = hmdConfig.vResolution;\r\n if ( hmdConfig.hScreenSize !== undefined ) hmd.hScreenSize = hmdConfig.hScreenSize;\r\n if ( hmdConfig.vScreenSize !== undefined ) hmd.vScreenSize = hmdConfig.vScreenSize;\r\n if ( hmdConfig.interpupillaryDistance !== undefined ) hmd.interpupillaryDistance = hmdConfig.interpupillaryDistance;\r\n if ( hmdConfig.lensSeparationDistance !== undefined ) hmd.lensSeparationDistance = hmdConfig.lensSeparationDistance;\r\n if ( hmdConfig.eyeToScreenDistance !== undefined ) hmd.eyeToScreenDistance = hmdConfig.eyeToScreenDistance;\r\n if ( hmdConfig.distortionK !== undefined ) hmd.distortionK = hmdConfig.distortionK;\r\n if ( hmdConfig.chromaAbParameter !== undefined ) hmd.chromaAbParameter = hmdConfig.chromaAbParameter;\r\n if ( hmdConfig.isCardboard !== undefined ) hmd.isCardboard = hmdConfig.isCardboard;\r\n\r\n return hmd;\r\n };\r\n\r\n return Oculus;\r\n\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgUtil/Oculus.js\n ** module id = 140\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/Notify',\r\n 'osg/Uniform',\r\n 'osg/NodeVisitor'\r\n], function ( MACROUTILS, Notify, Uniform, NodeVisitor ) {\r\n\r\n var ArraySlider = function ( params ) {\r\n if ( params !== undefined ) {\r\n if ( params.object !== undefined && params.field !== undefined ) {\r\n this.createInternalSlider( params );\r\n }\r\n this._uniform = this.createInternalSliderUniform( params );\r\n }\r\n };\r\n\r\n ArraySlider.prototype = {\r\n setTargetHTML: function ( target ) {\r\n this.parent = target;\r\n },\r\n addToDom: function ( content ) {\r\n var mydiv = document.createElement( 'div' );\r\n mydiv.innerHTML = content;\r\n this.parent.appendChild( mydiv );\r\n },\r\n\r\n getValue: function ( name ) {\r\n if ( window.localStorage ) {\r\n var value = window.localStorage.getItem( name );\r\n return value;\r\n }\r\n return null;\r\n },\r\n setValue: function ( name, value ) {\r\n if ( window.localStorage ) {\r\n window.localStorage.setItem( name, value );\r\n }\r\n },\r\n createHTMLSlider: function ( param, value, nameIndex, cbnameIndex ) {\r\n var input = '
NAME [ MIN - MAX ]
';\r\n var min = param.min;\r\n var max = param.max;\r\n var step = param.step;\r\n var name = nameIndex;\r\n var cbname = cbnameIndex;\r\n var onchange = cbname + '(this.value)';\r\n input = input.replace( /MIN/g, min );\r\n input = input.replace( /MAX/g, ( max + step ) );\r\n input = input.replace( 'STEP', step );\r\n input = input.replace( 'VALUE', value );\r\n input = input.replace( /NAME/g, name );\r\n input = input.replace( /UPDATE/g, cbname );\r\n input = input.replace( 'ONCHANGE', onchange );\r\n return input;\r\n },\r\n\r\n createUniformFunction: function ( param, name, index, uniform, cbnameIndex ) {\r\n var self = this;\r\n return ( function () {\r\n var cname = name;\r\n var cindex = index;\r\n var cuniform = uniform;\r\n var id = cbnameIndex;\r\n var func = function ( value ) {\r\n cuniform.get()[ cindex ] = value;\r\n cuniform.dirty();\r\n Notify.debug( cname + ' value ' + value );\r\n document.getElementById( cbnameIndex ).innerHTML = Number( value ).toFixed( 4 );\r\n self.setValue( id, value );\r\n if ( param.onchange !== undefined ) {\r\n param.onchange( cuniform.get() );\r\n }\r\n // store the value to localstorage\r\n };\r\n return func;\r\n } )();\r\n },\r\n\r\n createFunction: function ( param, name, index, object, field, cbnameIndex ) {\r\n var self = this;\r\n return ( function () {\r\n var cname = name;\r\n //var cindex = index;\r\n var cfield = field;\r\n var id = cbnameIndex;\r\n var obj = object;\r\n var func = function ( value ) {\r\n if ( typeof ( value ) === 'string' ) {\r\n value = parseFloat( value );\r\n }\r\n\r\n if ( typeof ( object[ cfield ] ) === 'number' ) {\r\n obj[ cfield ] = value;\r\n } else {\r\n obj[ cfield ][ index ] = value;\r\n }\r\n Notify.debug( cname + ' value ' + value );\r\n document.getElementById( cbnameIndex ).innerHTML = Number( value ).toFixed( 4 );\r\n self.setValue( id, value );\r\n if ( param.onchange !== undefined ) {\r\n param.onchange( obj[ cfield ] );\r\n }\r\n\r\n // store the value to localstorage\r\n };\r\n return func;\r\n } )();\r\n },\r\n\r\n getCallbackName: function ( name, prgId ) {\r\n return 'change_' + prgId + '_' + name;\r\n },\r\n\r\n copyDefaultValue: function ( param ) {\r\n var uvalue = param.value;\r\n if ( Array.isArray( param.value ) ) {\r\n uvalue = param.value.slice();\r\n } else {\r\n uvalue = [ uvalue ];\r\n }\r\n return uvalue;\r\n },\r\n\r\n createInternalSliderUniform: function ( param ) {\r\n var uvalue = param.value;\r\n var uniform = param.uniform;\r\n if ( uniform === undefined ) {\r\n var type = param.type;\r\n type = type.charAt( 0 ).toUpperCase() + type.slice( 1 );\r\n uniform = Uniform[ 'create' + type ]( uvalue, param.name );\r\n }\r\n\r\n var cbname = this.getCallbackName( param.name, param.id );\r\n var dim = uvalue.length;\r\n for ( var i = 0; i < dim; i++ ) {\r\n\r\n var istring = i.toString();\r\n var nameIndex = param.name + istring;\r\n var cbnameIndex = cbname + istring;\r\n\r\n // default value\r\n var value = uvalue[ i ];\r\n\r\n // read local storage value if it exist\r\n var readValue = this.getValue( cbnameIndex );\r\n if ( readValue !== null ) {\r\n value = readValue;\r\n } else if ( param.uniform && param.uniform.get()[ i ] !== undefined ) {\r\n // read value from original uniform\r\n value = param.uniform.get()[ i ];\r\n }\r\n\r\n var dom = this.createHTMLSlider( param, value, nameIndex, cbnameIndex );\r\n this.addToDom( dom );\r\n window[ cbnameIndex ] = this.createUniformFunction( param, nameIndex, i, uniform, cbnameIndex );\r\n Notify.log( nameIndex + ' ' + value );\r\n window[ cbnameIndex ]( value );\r\n }\r\n this.uniform = uniform;\r\n return uniform;\r\n },\r\n\r\n createInternalSlider: function ( param ) {\r\n var uvalue = param.value;\r\n var name = param.name;\r\n var id = param.id;\r\n var dim = uvalue.length;\r\n var cbname = this.getCallbackName( name, id );\r\n var object = param.object;\r\n var field = param.field;\r\n for ( var i = 0; i < dim; i++ ) {\r\n\r\n var istring = i.toString();\r\n var nameIndex = name + istring;\r\n var cbnameIndex = cbname + istring;\r\n\r\n // default value\r\n var value = uvalue[ i ];\r\n\r\n // read local storage value if it exist\r\n var readValue = this.getValue( cbnameIndex );\r\n if ( readValue !== null ) {\r\n value = readValue;\r\n } else {\r\n if ( typeof object[ field ] === 'number' ) {\r\n value = object[ field ];\r\n } else {\r\n value = object[ field ][ i ];\r\n }\r\n }\r\n\r\n var dom = this.createHTMLSlider( param, value, nameIndex, cbnameIndex );\r\n this.addToDom( dom );\r\n window[ cbnameIndex ] = this.createFunction( param, nameIndex, i, object, field, cbnameIndex );\r\n Notify.log( nameIndex + ' ' + value );\r\n window[ cbnameIndex ]( value );\r\n }\r\n },\r\n\r\n createSlider: function ( param ) {\r\n if ( param.html !== undefined ) {\r\n this.setTargetHTML( param.html );\r\n }\r\n if ( param.id === undefined ) {\r\n param.id = param.name;\r\n }\r\n param.value = this.copyDefaultValue( param );\r\n if ( param.type !== undefined ) {\r\n return this.createInternalSliderUniform( param );\r\n } else {\r\n if ( param.object === undefined ) {\r\n param.object = {\r\n 'data': param.value\r\n };\r\n param.field = 'data';\r\n }\r\n return this.createInternalSlider( param );\r\n }\r\n }\r\n };\r\n\r\n\r\n var ParameterVisitor = function () {\r\n NodeVisitor.call( this );\r\n\r\n this.arraySlider = new ArraySlider();\r\n this.setTargetHTML( document.body );\r\n };\r\n\r\n ParameterVisitor.createSlider = function ( param ) {\r\n ( new ArraySlider() ).createSlider( param );\r\n };\r\n\r\n ParameterVisitor.prototype = MACROUTILS.objectInherit( NodeVisitor.prototype, {\r\n\r\n setTargetHTML: function ( html ) {\r\n this.targetHTML = html;\r\n this.arraySlider.setTargetHTML( this.targetHTML );\r\n },\r\n\r\n getUniformList: function ( str, map ) {\r\n\r\n //var txt='uniform float Power; // { min: 0.1, max: 2.0, step: 0.1, value: [0,0,0] }';\r\n\r\n var re1 = '(uniform)'; // Word 1\r\n var re2 = '.*?'; // Non-greedy match on filler\r\n var re3 = '((?:[a-z][a-z]+))'; // Word 2\r\n var re4 = '.*?'; // Non-greedy match on filler\r\n var re5 = '((?:[a-z][a-z]+))'; // Word 3\r\n var re6 = '.*?'; // Non-greedy match on filler\r\n var re7 = '.'; // Uninteresting: c\r\n var re8 = '.*?'; // Non-greedy match on filler\r\n var re9 = '.'; // Uninteresting: c\r\n var re10 = '.*?'; // Non-greedy match on filler\r\n var re11 = '(.)'; // Any Single Character 1\r\n var re12 = '(.)'; // Any Single Character 2\r\n var re13 = '.*?'; // Non-greedy match on filler\r\n var re14 = '(\\\\{.*?\\\\})'; // Curly Braces 1\r\n\r\n var p = new RegExp( re1 + re2 + re3 + re4 + re5 + re6 + re7 + re8 + re9 + re10 + re11 + re12 + re13 + re14, [ 'g' ] );\r\n var r = str.match( p );\r\n var list = map;\r\n\r\n var createGetter = function ( value ) {\r\n return function () {\r\n return value;\r\n };\r\n };\r\n\r\n if ( r !== null ) {\r\n var re = new RegExp( re1 + re2 + re3 + re4 + re5 + re6 + re7 + re8 + re9 + re10 + re11 + re12 + re13 + re14, [ 'i' ] );\r\n for ( var i = 0, l = r.length; i < l; i++ ) {\r\n var result = r[ i ].match( re );\r\n //var result = p.exec(str);\r\n if ( result !== null ) {\r\n //var word1 = result[ 1 ];\r\n var type = result[ 2 ];\r\n var name = result[ 3 ];\r\n //var c1 = result[ 4 ];\r\n //var c2 = result[ 5 ];\r\n var json = result[ 6 ];\r\n\r\n var param = JSON.parse( json );\r\n param.type = type;\r\n param.name = name;\r\n var value = param.value;\r\n param.value = createGetter( value );\r\n list[ name ] = param;\r\n }\r\n }\r\n }\r\n return list;\r\n },\r\n\r\n getUniformFromStateSet: function ( stateSet, uniformMap ) {\r\n var maps = stateSet.getUniformList();\r\n if ( !maps ) {\r\n return;\r\n }\r\n var keys = window.Object.keys( uniformMap );\r\n for ( var i = 0, l = keys.length; i < l; i++ ) {\r\n var k = keys[ i ];\r\n // get the first one found in the tree\r\n if ( maps[ k ] !== undefined && uniformMap[ k ].uniform === undefined ) {\r\n uniformMap[ k ].uniform = maps[ k ].object;\r\n }\r\n }\r\n },\r\n\r\n findExistingUniform: function ( node, uniformMap ) {\r\n var BackVisitor = function () {\r\n NodeVisitor.call( this, NodeVisitor.TRAVERSE_PARENTS );\r\n };\r\n BackVisitor.prototype = MACROUTILS.objectInherit( NodeVisitor.prototype, {\r\n setUniformMap: function ( map ) {\r\n this.uniformMap = map;\r\n },\r\n apply: function ( node ) {\r\n var stateSet = node.getStateSet();\r\n if ( stateSet ) {\r\n ParameterVisitor.prototype.getUniformFromStateSet( stateSet, this.uniformMap );\r\n }\r\n this.traverse( node );\r\n }\r\n } );\r\n var visitor = new BackVisitor();\r\n visitor.setUniformMap( uniformMap );\r\n node.accept( visitor );\r\n },\r\n\r\n applyProgram: function ( node, stateset ) {\r\n var program = stateset.getAttribute( 'Program' );\r\n var programName = program.getName();\r\n //var string = program.getVertexShader().getText();\r\n var uniformMap = {};\r\n this.getUniformList( program.getVertexShader().getText(), uniformMap );\r\n this.getUniformList( program.getFragmentShader().getText(), uniformMap );\r\n\r\n\r\n var keys = window.Object.keys( uniformMap );\r\n\r\n if ( programName === undefined ) {\r\n var hashCode = function ( str ) {\r\n var hash = 0;\r\n var chara = 0;\r\n if ( str.length === 0 ) {\r\n return hash;\r\n }\r\n for ( i = 0; i < str.length; i++ ) {\r\n chara = str.charCodeAt( i );\r\n /*jshint bitwise: false */\r\n hash = ( ( hash << 5 ) - hash ) + chara;\r\n hash = hash & hash; // Convert to 32bit integer\r\n /*jshint bitwise: true */\r\n }\r\n if ( hash < 0 ) {\r\n hash = -hash;\r\n }\r\n return hash;\r\n };\r\n var str = keys.join( '' );\r\n programName = hashCode( str ).toString();\r\n }\r\n\r\n this.findExistingUniform( node, uniformMap );\r\n\r\n var addedSlider = false;\r\n for ( var i = 0; i < keys.length; i++ ) {\r\n var k = keys[ i ];\r\n var entry = uniformMap[ k ];\r\n var type = entry.type;\r\n var name = entry.name;\r\n entry.id = programName;\r\n var uniform = this.arraySlider.createSlider( entry );\r\n if ( false ) {\r\n uniform = this.arraySlider.createSlider( {\r\n name: name,\r\n type: type,\r\n id: programName,\r\n uniform: entry.uniform\r\n } );\r\n }\r\n if ( entry.uniform === undefined && uniform ) {\r\n stateset.addUniform( uniform );\r\n }\r\n addedSlider = true;\r\n }\r\n\r\n // add a separator\r\n if ( addedSlider ) {\r\n var mydiv = document.createElement( 'div' );\r\n mydiv.innerHTML = '

';\r\n this.targetHTML.appendChild( mydiv );\r\n }\r\n\r\n Notify.log( uniformMap );\r\n },\r\n\r\n\r\n applyStateSet: function ( node, stateset ) {\r\n if ( stateset.getAttribute( 'Program' ) !== undefined ) {\r\n this.applyProgram( node, stateset );\r\n }\r\n },\r\n\r\n apply: function ( node ) {\r\n var element = this.targetHTML;\r\n if ( element === undefined || element === null ) {\r\n return;\r\n }\r\n\r\n var st = node.getStateSet();\r\n if ( st !== undefined ) {\r\n this.applyStateSet( node, st );\r\n }\r\n\r\n this.traverse( node );\r\n }\r\n } );\r\n\r\n return ParameterVisitor;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgUtil/ParameterVisitor.js\n ** module id = 141\n ** module chunks = 0 1\n **/","define( [\r\n 'osgUtil/PolytopePrimitiveIntersector',\r\n 'osg/Matrix',\r\n 'osg/Vec4',\r\n 'osg/Vec3'\r\n], function ( PolytopePrimitiveIntersector, Matrix, Vec4, Vec3 ) {\r\n\r\n 'use strict';\r\n /** Concrete class for implementing polytope intersections with the scene graph.\r\n * To be used in conjunction with IntersectionVisitor. */\r\n var PolytopeIntersector = function () {\r\n this._intersections = [];\r\n this._index = 0;\r\n this._polytope = [];\r\n this._iPolytope = [];\r\n this._referencePlane = Vec4.create();\r\n this._iReferencePlane = Vec4.create();\r\n this._intersectionLimit = PolytopeIntersector.NO_LIMIT;\r\n this._dimensionMask = PolytopeIntersector.AllDims;\r\n };\r\n\r\n\r\n PolytopeIntersector.NO_LIMIT = 0;\r\n PolytopeIntersector.LIMIT_ONE_PER_DRAWABLE = 1;\r\n PolytopeIntersector.LIMIT_ONE = 2;\r\n\r\n\r\n PolytopeIntersector.DimZero = ( 1 << 0 );\r\n PolytopeIntersector.DimOne = ( 1 << 1 );\r\n PolytopeIntersector.DimTwo = ( 1 << 2 );\r\n PolytopeIntersector.AllDims = ( PolytopeIntersector.DimZero | PolytopeIntersector.DimOne | PolytopeIntersector.DimTwo );\r\n\r\n\r\n PolytopeIntersector.prototype = {\r\n\r\n setPolytope: function ( polytope ) {\r\n this._polytope = polytope;\r\n this._referencePlane[ 0 ] = polytope[ polytope.length - 1 ][ 0 ];\r\n this._referencePlane[ 1 ] = polytope[ polytope.length - 1 ][ 1 ];\r\n this._referencePlane[ 2 ] = polytope[ polytope.length - 1 ][ 2 ];\r\n this._referencePlane[ 3 ] = polytope[ polytope.length - 1 ][ 3 ];\r\n },\r\n\r\n setPolytopeFromWindowCoordinates: function ( xMin, yMin, xMax, yMax ) {\r\n // Note: last polytope value depends on the Coordinate frame\r\n // Now we are only supporting WINDOW coordinate frame, so must change this if we decide to support\r\n // other types of Coordinate Frame\r\n this.setPolytope( [\r\n [ 1.0, 0.0, 0.0, -xMin ],\r\n [ -1.0, 0.0, 0.0, xMax ],\r\n [ 0.0, 1.0, 0.0, -yMin ],\r\n [ 0.0, -1.0, 0.0, yMax ],\r\n [ 0.0, 0.0, 1.0, 0.0 ]\r\n ] );\r\n },\r\n\r\n /** Set the dimension mask.\r\n * As polytope-triangle and polytope-quad intersections are expensive to compute\r\n * it is possible to turn them off by calling setDimensionMask( DimZero | DimOne )\r\n */\r\n setDimensionMask: function ( mask ) {\r\n this._dimensionMask = mask;\r\n },\r\n\r\n reset: function () {\r\n // Clear the intersections vector\r\n this._intersections.length = 0;\r\n },\r\n\r\n enter: function ( node ) {\r\n if ( this.reachedLimit() ) return false;\r\n return ( this.intersects( node.getBound() ) );\r\n },\r\n\r\n reachedLimit: function () {\r\n return this._intersectionLimit === PolytopeIntersector.LIMIT_ONE && this._intersections.length > 0;\r\n },\r\n\r\n // Intersection Polytope/Sphere\r\n intersects: ( function () {\r\n var position = Vec3.create();\r\n return function ( bsphere ) {\r\n if ( !bsphere.valid() ) return false;\r\n var pos = bsphere.center();\r\n var d;\r\n Vec3.copy( pos, position );\r\n var radius = -bsphere.radius();\r\n for ( var i = 0, j = this._iPolytope.length; i < j; i++ ) {\r\n d = this._iPolytope[ i ][ 0 ] * position[ 0 ] + this._iPolytope[ i ][ 1 ] * position[ 1 ] + this._iPolytope[ i ][ 2 ] * position[ 2 ] + this._iPolytope[ i ][ 3 ];\r\n if ( d <= radius ) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n };\r\n } )(),\r\n\r\n // Intersection Polytope/Geometry\r\n intersect: function ( iv, node ) {\r\n if ( this.reachedLimit() ) return false;\r\n var ppi = new PolytopePrimitiveIntersector();\r\n ppi.setNodePath( iv.nodePath );\r\n ppi.set( this._iPolytope, this._iReferencePlane );\r\n ppi.setLimitOneIntersection( this._intersectionLimit === PolytopeIntersector.LIMIT_ONE_PER_DRAWABLE || this._intersectionLimit === PolytopeIntersector.LIMIT_ONE );\r\n ppi.setDimensionMask( this._dimensionMask );\r\n ppi.apply( node );\r\n var l = ppi._intersections.length;\r\n if ( l > 0 ) {\r\n // Intersection/s exists\r\n for ( var i = 0; i < l; i++ ) {\r\n this._intersections.push( ppi._intersections[ i ] );\r\n }\r\n return true;\r\n }\r\n // No intersection found\r\n return false;\r\n },\r\n\r\n getIntersections: function () {\r\n return this._intersections;\r\n },\r\n\r\n setIntersectionLimit: function ( limit ) {\r\n this._intersectionLimit = limit;\r\n },\r\n\r\n setCurrentTransformation: function ( matrix ) {\r\n // Transform the polytope and the referencePlane to the current Model local coordinate frame\r\n var inv;\r\n var iplane = Vec4.create();\r\n for ( var i = 0, j = this._polytope.length; i < j; i++ ) {\r\n var plane = this._polytope[ i ];\r\n // PostMult\r\n Matrix.transformVec4PostMult( matrix, plane, iplane );\r\n // multiply the coefficients of the plane equation with a constant factor so that the equation a^2+b^2+c^2 = 1 holds.\r\n inv = 1.0 / Math.sqrt( iplane[ 0 ] * iplane[ 0 ] + iplane[ 1 ] * iplane[ 1 ] + iplane[ 2 ] * iplane[ 2 ] );\r\n iplane[ 0 ] *= inv;\r\n iplane[ 1 ] *= inv;\r\n iplane[ 2 ] *= inv;\r\n iplane[ 3 ] *= inv;\r\n this._iPolytope[ i ] = Vec4.copy( iplane, Vec4.create() );\r\n }\r\n //Post Mult\r\n Matrix.transformVec4PostMult( matrix, this._referencePlane, this._iReferencePlane );\r\n // multiply the coefficients of the plane equation with a constant factor so that the equation a^2+b^2+c^2 = 1 holds.\r\n inv = 1.0 / Math.sqrt( this._iReferencePlane[ 0 ] * this._iReferencePlane[ 0 ] + this._iReferencePlane[ 1 ] * this._iReferencePlane[ 1 ] + this._iReferencePlane[ 2 ] * this._iReferencePlane[ 2 ] );\r\n this._iReferencePlane[ 0 ] *= inv;\r\n this._iReferencePlane[ 1 ] *= inv;\r\n this._iReferencePlane[ 2 ] *= inv;\r\n this._iReferencePlane[ 3 ] *= inv;\r\n }\r\n };\r\n\r\n return PolytopeIntersector;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgUtil/PolytopeIntersector.js\n ** module id = 142\n ** module chunks = 0 1\n **/","/**\r\n * @author Jordi Torres\r\n */\r\n\r\ndefine( [\r\n 'osg/Utils',\r\n 'osg/Vec3',\r\n 'osg/PrimitiveFunctor'\r\n], function ( MACROUTILS, Vec3, PrimitiveFunctor ) {\r\n\r\n var PolytopeIntersection = function ( index, candidates, candidatesMasks, referencePlane, nodePath ) {\r\n this._index = index - 1; ///< primitive index\r\n this._distance = 0; ///< distance from reference plane\r\n this._maxDistance = -1; ///< maximum distance of intersection points from reference plane\r\n this._numPoints = 0;\r\n this._points = [];\r\n this._maxNumIntersections = 6;\r\n this._center = Vec3.create();\r\n for ( var i = 0, j = candidates.length; i < j; i++ ) {\r\n if ( candidatesMasks[ i ] === 0 ) continue;\r\n this._points[ this._numPoints++ ] = Vec3.copy( candidates[ i ], Vec3.create() );\r\n Vec3.add( this._center, candidates[ i ], this._center );\r\n var distance = referencePlane[ 0 ] * candidates[ i ][ 0 ] + referencePlane[ 1 ] * candidates[ i ][ 1 ] + referencePlane[ 2 ] * candidates[ i ][ 2 ] + referencePlane[ 3 ];\r\n if ( distance > this._maxDistance ) this._maxDistance = distance;\r\n if ( this._numPoints === this._maxNumIntesections ) break;\r\n }\r\n Vec3.mult( this._center, 1 / this._numPoints, this._center );\r\n this._distance = referencePlane[ 0 ] * this._center[ 0 ] + referencePlane[ 1 ] * this._center[ 1 ] + referencePlane[ 2 ] * this._center[ 2 ] + referencePlane[ 3 ];\r\n this.nodePath = nodePath;\r\n };\r\n\r\n var PlanesLine = function ( planeMask, pos, dir ) {\r\n this._planeMask = planeMask;\r\n this._pos = pos;\r\n this._dir = dir;\r\n };\r\n var PolytopePrimitiveIntersector = function () {\r\n this._intersections = [];\r\n this._nodePath = [];\r\n this._index = 0;\r\n this._referencePlane = [];\r\n this._planes = []; ///< active planes extracted from polytope\r\n this._lines = []; ///< all intersection lines of two polytope planes\r\n this._candidates = [];\r\n this._candidatesMasks = [];\r\n this._lines = [];\r\n this._planesMask = 0;\r\n this._limitOneIntersection = false;\r\n this._dimensionMask = undefined;\r\n };\r\n\r\n PolytopePrimitiveIntersector.prototype = {\r\n\r\n setNodePath: function ( np ) {\r\n this._nodePath = np;\r\n },\r\n\r\n set: function ( polytope, referencePlane ) {\r\n this._planes = polytope;\r\n this._referencePlane = referencePlane;\r\n this._planesMask = 0;\r\n this._lines.length = 0;\r\n for ( var i = 0; i < this._planes.length; i++ ) {\r\n this._planesMask = ( this._planesMask << 1 ) | 1;\r\n }\r\n },\r\n\r\n setDimensionMask: function ( mask ) {\r\n this._dimensionMask = mask;\r\n },\r\n\r\n apply: function ( node ) {\r\n if ( !node.getAttributes().Vertex ) {\r\n return;\r\n }\r\n var vertices = node.getAttributes().Vertex.getElements();\r\n var self = this;\r\n // The callback must be defined as a closure\r\n /* jshint asi: true */\r\n var cb = function () {\r\n return {\r\n operatorPoint: function ( v ) {\r\n self.intersectPoint( v );\r\n },\r\n operatorLine: function ( v1, v2 ) {\r\n self.intersectLine( v1, v2 );\r\n },\r\n operatorTriangle: function ( v1, v2, v3 ) {\r\n self.intersectTriangle( v1, v2, v3 );\r\n }\r\n }\r\n };\r\n var pf = new PrimitiveFunctor( node, cb, vertices );\r\n pf.apply();\r\n },\r\n\r\n\r\n checkCandidatePoints: function ( insideMask ) {\r\n var selectorMask = 0x1;\r\n var numCands = this._candidates.length;\r\n for ( var i = 0, j = this._planes.length; i < j && numCands > 0; ++i, selectorMask <<= 1 ) {\r\n if ( insideMask & selectorMask ) continue;\r\n for ( var c = 0; c < this._candidates.length; ++c ) {\r\n if ( this._candidatesMasks[ c ] === 0 ) continue;\r\n if ( selectorMask & this._candidatesMasks[ c ] ) continue;\r\n if ( this.distance( this._planes[ i ], this._candidates[ c ] ) < 0.0 ) {\r\n this._candidatesMasks[ c ] = 0;\r\n --numCands;\r\n if ( numCands === 0 ) return 0;\r\n }\r\n }\r\n }\r\n return numCands;\r\n },\r\n\r\n intersectPoint: ( function () {\r\n var hit = Vec3.create();\r\n return function ( v ) {\r\n this._index++;\r\n if ( ( this._dimensionMask & ( 1 << 0 ) ) === 0 ) return;\r\n if ( this._limitOneIntersection && this._intersections.length > 0 ) return;\r\n var d;\r\n\r\n for ( var i = 0, j = this._planes.length; i < j; ++i ) {\r\n d = this.distance( this._planes[ i ], v );\r\n if ( d < 0.0 ) {\r\n // point is outside the polytope\r\n return;\r\n }\r\n }\r\n this._candidates = [];\r\n this._candidatesMasks = [];\r\n // Intersection found: Copy the value and push it\r\n Vec3.copy( v, hit );\r\n this._candidates.push( hit );\r\n this._candidatesMasks.push( this._planesMask );\r\n this._intersections.push( new PolytopeIntersection( this._index, this._candidates, this._candidatesMasks, this._referencePlane, this._nodePath.slice( 0 ) ) );\r\n };\r\n } )(),\r\n\r\n\r\n intersectLine: ( function () {\r\n\r\n var hit = Vec3.create();\r\n return function ( v1, v2 ) {\r\n this._index++;\r\n if ( ( this._dimensionMask & ( 1 << 1 ) ) === 0 ) return;\r\n if ( this._limitOneIntersection && this._intersections.length > 0 ) return;\r\n var v1Inside = true;\r\n var v2Inside = true;\r\n var selectorMask = 0x1;\r\n var insideMask = 0x0;\r\n this._candidates = [];\r\n this._candidatesMasks = [];\r\n var d1, d2, d1IsNegative, d2IsNegative;\r\n for ( var i = 0, j = this._planes.length; i < j; ++i, selectorMask <<= 1 ) {\r\n d1 = this.distance( this._planes[ i ], v1 );\r\n d2 = this.distance( this._planes[ i ], v2 );\r\n d1IsNegative = ( d1 < 0.0 );\r\n d2IsNegative = ( d2 < 0.0 );\r\n if ( d1IsNegative && d2IsNegative ) return; // line outside\r\n if ( !d1IsNegative && !d2IsNegative ) {\r\n // completly inside this plane\r\n insideMask |= selectorMask;\r\n continue;\r\n }\r\n if ( d1IsNegative ) v1Inside = false;\r\n if ( d2IsNegative ) v2Inside = false;\r\n if ( d1 === 0.0 ) {\r\n Vec3.copy( v1, hit );\r\n this._candidates.push( hit );\r\n this._candidatesMasks.push( selectorMask );\r\n } else if ( d2 === 0.0 ) {\r\n Vec3.copy( v2, hit );\r\n this._candidates.push( hit );\r\n this._candidatesMasks.push( selectorMask );\r\n } else if ( d1IsNegative && !d2IsNegative ) {\r\n //v1-(v2-v1)*(d1/(-d1+d2))) )\r\n Vec3.sub( v2, v1, hit );\r\n Vec3.mult( hit, d1 / ( -d1 + d2 ), hit );\r\n Vec3.sub( v1, hit, hit );\r\n this._candidates.push( hit );\r\n this._candidatesMasks.push( selectorMask );\r\n } else if ( !d1IsNegative && d2IsNegative ) {\r\n //(v1+(v2-v1)*(d1/(d1-d2)))\r\n Vec3.sub( v2, v1, hit );\r\n Vec3.mult( hit, d1 / ( d1 - d2 ), hit );\r\n Vec3.add( v1, hit, hit );\r\n this._candidates.push( hit );\r\n this._candidatesMasks.push( selectorMask );\r\n }\r\n }\r\n\r\n if ( insideMask === this._planesMask ) {\r\n this._candidates.push( Vec3.copy( v1, Vec3.create() ) );\r\n this._candidatesMasks.push( this._planesMask );\r\n this._candidates.push( Vec3.copy( v2, Vec3.create() ) );\r\n this._candidatesMasks.push( this._planesMask );\r\n this._intersections.push( new PolytopeIntersection( this._index, this._candidates, this._candidatesMasks, this._referencePlane, this._nodePath.slice( 0 ) ) );\r\n return;\r\n }\r\n\r\n var numCands = this.checkCandidatePoints( insideMask );\r\n if ( numCands > 0 ) {\r\n if ( v1Inside ) {\r\n this._candidatesMasks.push( this._planesMask );\r\n this._candidates.push( Vec3.copy( v1, Vec3.create() ) );\r\n }\r\n if ( v2Inside ) {\r\n this._candidatesMasks.push( this._planesMask );\r\n this._candidates.push( Vec3.copy( v2, Vec3.create() ) );\r\n }\r\n this._intersections.push( new PolytopeIntersection( this._index, this._candidates, this._candidatesMasks, this._referencePlane, this._nodePath.slice( 0 ) ) );\r\n }\r\n };\r\n } )(),\r\n\r\n intersectTriangle: ( function () {\r\n\r\n var tmpHit = Vec3.create();\r\n // Only needed for special case, should we move it to a new function?\r\n var e1 = Vec3.create();\r\n var e2 = Vec3.create();\r\n var point = Vec3.create();\r\n var p = Vec3.create();\r\n var s = Vec3.create();\r\n var q = Vec3.create();\r\n return function ( v1, v2, v3 ) {\r\n this._index++;\r\n if ( ( this._dimensionMask & ( 1 << 2 ) ) === 0 ) return;\r\n if ( this._limitOneIntersection && this._intersections.length > 0 ) return;\r\n var selectorMask = 0x1;\r\n var insideMask = 0x0;\r\n this._candidates = [];\r\n this._candidatesMasks = [];\r\n var d1, d2, d3, d1IsNegative, d2IsNegative, d3IsNegative;\r\n for ( var i = 0, j = this._planes.length; i < j; ++i, selectorMask <<= 1 ) {\r\n d1 = this.distance( this._planes[ i ], v1 );\r\n d2 = this.distance( this._planes[ i ], v2 );\r\n d3 = this.distance( this._planes[ i ], v3 );\r\n d1IsNegative = ( d1 < 0.0 );\r\n d2IsNegative = ( d2 < 0.0 );\r\n d3IsNegative = ( d3 < 0.0 );\r\n\r\n if ( d1IsNegative && d2IsNegative && d3IsNegative ) return; // Triangle outside\r\n if ( !d1IsNegative && !d2IsNegative && !d3IsNegative ) {\r\n // completly inside this plane\r\n insideMask |= selectorMask;\r\n continue;\r\n }\r\n // edge v1-v2 intersects\r\n if ( d1 === 0.0 ) {\r\n Vec3.copy( v1, tmpHit );\r\n this._candidates.push( Vec3.copy( tmpHit, Vec3.create() ) );\r\n this._candidatesMasks.push( selectorMask );\r\n } else if ( d2 === 0.0 ) {\r\n Vec3.copy( v2, tmpHit );\r\n this._candidates.push( Vec3.copy( tmpHit, Vec3.create() ) );\r\n this._candidatesMasks.push( selectorMask );\r\n } else if ( d1IsNegative && !d2IsNegative ) {\r\n //v1-(v2-v1)*(d1/(-d1+d2))) )\r\n Vec3.sub( v2, v1, tmpHit );\r\n Vec3.mult( tmpHit, d1 / ( -d1 + d2 ), tmpHit );\r\n Vec3.sub( v1, tmpHit, tmpHit );\r\n this._candidates.push( Vec3.copy( tmpHit, Vec3.create() ) );\r\n this._candidatesMasks.push( selectorMask );\r\n } else if ( !d1IsNegative && d2IsNegative ) {\r\n //(v1+(v2-v1)*(d1/(d1-d2)))\r\n Vec3.sub( v2, v1, tmpHit );\r\n Vec3.mult( tmpHit, d1 / ( d1 - d2 ), tmpHit );\r\n Vec3.add( v1, tmpHit, tmpHit );\r\n this._candidates.push( Vec3.copy( tmpHit, Vec3.create() ) );\r\n this._candidatesMasks.push( selectorMask );\r\n }\r\n // edge v1-v3 intersects\r\n if ( d3 === 0.0 ) {\r\n Vec3.copy( v3, tmpHit );\r\n this._candidates.push( Vec3.copy( tmpHit, Vec3.create() ) );\r\n this._candidatesMasks.push( selectorMask );\r\n } else if ( d1IsNegative && !d3IsNegative ) {\r\n // v1-(v3-v1)*(d1/(-d1+d3))\r\n Vec3.sub( v3, v1, tmpHit );\r\n Vec3.mult( tmpHit, d1 / ( -d1 + d3 ), tmpHit );\r\n Vec3.sub( v1, tmpHit, tmpHit );\r\n this._candidates.push( Vec3.copy( tmpHit, Vec3.create() ) );\r\n this._candidatesMasks.push( selectorMask );\r\n } else if ( !d1IsNegative && d3IsNegative ) {\r\n // v1+(v3-v1)*(d1/(d1-d3))\r\n Vec3.sub( v3, v1, tmpHit );\r\n Vec3.mult( tmpHit, d1 / ( d1 - d3 ), tmpHit );\r\n Vec3.add( v1, tmpHit, tmpHit );\r\n this._candidates.push( Vec3.copy( tmpHit, Vec3.create() ) );\r\n this._candidatesMasks.push( selectorMask );\r\n }\r\n // edge v2-v3 intersects\r\n if ( d2IsNegative && !d3IsNegative ) {\r\n // v2-(v3-v2)*(d2/(-d2+d3))\r\n Vec3.sub( v3, v2, tmpHit );\r\n Vec3.mult( tmpHit, d2 / ( -d2 + d3 ), tmpHit );\r\n Vec3.sub( v2, tmpHit, tmpHit );\r\n this._candidates.push( Vec3.copy( tmpHit, Vec3.create() ) );\r\n this._candidatesMasks.push( selectorMask );\r\n } else if ( !d2IsNegative && d3IsNegative ) {\r\n //v2+(v3-v2)*(d2/(d2-d3))\r\n Vec3.sub( v3, v2, tmpHit );\r\n Vec3.mult( tmpHit, d2 / ( d2 - d3 ), tmpHit );\r\n Vec3.add( v2, tmpHit, tmpHit );\r\n this._candidates.push( Vec3.copy( tmpHit, Vec3.create() ) );\r\n this._candidatesMasks.push( selectorMask );\r\n }\r\n }\r\n if ( insideMask === this._planesMask ) {\r\n // triangle lies inside of all planes\r\n this._candidates.push( Vec3.copy( v1, Vec3.create() ) );\r\n this._candidatesMasks.push( this._planesMask );\r\n this._candidates.push( Vec3.copy( v2, Vec3.create() ) );\r\n this._candidatesMasks.push( this._planesMask );\r\n this._candidates.push( Vec3.copy( v3, Vec3.create() ) );\r\n this._candidatesMasks.push( this._planesMask );\r\n this._intersections.push( new PolytopeIntersection( this._index, this._candidates, this._candidatesMasks, this._referencePlane, this._nodePath.slice( 0 ) ) );\r\n return;\r\n }\r\n var numCands = this.checkCandidatePoints( insideMask );\r\n if ( numCands > 0 ) {\r\n this._intersections.push( new PolytopeIntersection( this._index, this._candidates, this._candidatesMasks, this._referencePlane, this._nodePath.slice( 0 ) ) );\r\n return;\r\n }\r\n // handle case where the polytope goes through the triangle\r\n // without containing any point of it\r\n // Probably it can be moved to other function and do the relevant closures.\r\n\r\n var lines = this.getPolytopeLines();\r\n this._candidates = [];\r\n // check all polytope lines against the triangle\r\n // use algorithm from \"Real-time rendering\" (second edition) pp.580\r\n //var e1= Vec3.create();\r\n //var e2= Vec3.create();\r\n\r\n Vec3.sub( v2, v1, e1 );\r\n Vec3.sub( v3, v1, e2 );\r\n for ( i = 0; i < lines.length; ++i ) {\r\n //var point = Vec3.create();\r\n //var p = Vec3.create(); \r\n Vec3.cross( lines[ i ]._dir, e2, p );\r\n var a = Vec3.dot( e1, p );\r\n if ( Math.abs( a ) < 1E-6 ) continue;\r\n var f = 1.0 / a;\r\n //var s = Vec3.create();\r\n Vec3.sub( lines[ i ]._pos, v1, s );\r\n var u = f * ( Vec3.dot( s, p ) );\r\n if ( u < 0.0 || u > 1.0 ) continue;\r\n //var q = Vec3.create();\r\n Vec3.cross( s, e1, q );\r\n var v = f * ( Vec3.dot( lines[ i ]._dir, q ) );\r\n if ( v < 0.0 || u + v > 1.0 ) continue;\r\n var t = f * ( Vec3.dot( e2, q ) );\r\n Vec3.mult( lines[ i ]._dir, t, point );\r\n Vec3.add( lines[ i ]._pos, point, point );\r\n this._candidates.push( Vec3.copy( point, Vec3.create() ) );\r\n this._candidatesMasks.push( lines[ i ]._planeMask );\r\n }\r\n numCands = this.checkCandidatePoints( insideMask );\r\n if ( numCands > 0 ) {\r\n this._intersections.push( new PolytopeIntersection( this._index, this._candidates, this._candidatesMasks, this._referencePlane, this._nodePath.slice( 0 ) ) );\r\n return;\r\n }\r\n };\r\n } )(),\r\n\r\n getPolytopeLines: ( function () {\r\n var lineDirection = Vec3.create();\r\n var searchDirection = Vec3.create();\r\n var normal1 = Vec3.create();\r\n var point1 = Vec3.create();\r\n var normal2 = Vec3.create();\r\n var linePoint = Vec3.create();\r\n var epsilon = 1E-6;\r\n return function () {\r\n if ( this._lines.length > 0 ) return this._lines; // Polytope lines already calculated\r\n var selectorMask = 0x1;\r\n for ( var i = 0, j = this._planes.length; i < j; i++, selectorMask <<= 1 ) {\r\n Vec3.copy( this.getNormal( this._planes[ i ] ), normal1 );\r\n Vec3.mult( normal1, -this._planes[ i ][ 3 ], point1 ); // canonical point on plane[ i ]\r\n var subSelectorMask = ( selectorMask << 1 );\r\n for ( var jt = i + 1, k = this._planes.length; jt < k; ++jt, subSelectorMask <<= 1 ) {\r\n Vec3.copy( this.getNormal( this._planes[ jt ] ), normal2 );\r\n if ( Math.abs( Vec3.dot( normal1, normal2 ) ) > ( 1.0 - epsilon ) ) continue;\r\n Vec3.cross( normal1, normal2, lineDirection );\r\n Vec3.cross( lineDirection, normal1, searchDirection );\r\n //-plane2.distance(point1)/(searchDirection*normal2);\r\n var searchDist = -this.distance( this._planes[ jt ], point1 ) / Vec3.dot( searchDirection, normal2 );\r\n if ( isNaN( searchDist ) ) continue;\r\n Vec3.mult( searchDirection, searchDist, linePoint );\r\n Vec3.add( point1, lineDirection, lineDirection );\r\n this._lines.push( new PlanesLine( selectorMask | subSelectorMask, Vec3.copy( linePoint, Vec3.create() ), Vec3.copy( lineDirection, Vec3.create() ) ) );\r\n }\r\n }\r\n return this._lines;\r\n };\r\n } )(),\r\n\r\n setLimitOneIntersection: function ( limit ) {\r\n this._limitOneIntersection = limit;\r\n },\r\n\r\n distance: function ( plane, v ) {\r\n var d = plane[ 0 ] * v[ 0 ] + plane[ 1 ] * v[ 1 ] + plane[ 2 ] * v[ 2 ] + plane[ 3 ];\r\n return d;\r\n },\r\n\r\n getNormal: ( function () {\r\n var normal = Vec3.create();\r\n return function ( plane ) {\r\n normal[ 0 ] = plane[ 0 ];\r\n normal[ 1 ] = plane[ 1 ];\r\n normal[ 2 ] = plane[ 2 ];\r\n return normal;\r\n };\r\n } )()\r\n };\r\n\r\n return PolytopePrimitiveIntersector;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgUtil/PolytopePrimitiveIntersector.js\n ** module id = 143\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Vec3',\r\n 'osg/Matrix',\r\n 'osgUtil/TriangleSphereIntersector'\r\n], function ( Vec3, Matrix, TriangleSphereIntersector ) {\r\n\r\n 'use strict';\r\n\r\n var SphereIntersector = function () {\r\n this._center = Vec3.create();\r\n this._iCenter = Vec3.create();\r\n this._radius = 1.0;\r\n this._intersections = [];\r\n };\r\n\r\n SphereIntersector.prototype = {\r\n set: function ( center, radius ) {\r\n Vec3.copy( center, this._center );\r\n this._radius = radius;\r\n },\r\n setCenter: function ( center ) {\r\n Vec3.copy( center, this._center );\r\n },\r\n setRadius: function ( radius ) {\r\n this._radius = radius;\r\n },\r\n reset: function () {\r\n // Clear the intersections vector\r\n this._intersections.length = 0;\r\n },\r\n enter: function ( node ) {\r\n // Not working if culling disabled ??\r\n return !node.isCullingActive() || this.intersects( node.getBound() );\r\n },\r\n // Intersection Sphere/Sphere \r\n intersects: function ( bsphere ) {\r\n if ( !bsphere.valid() ) return false;\r\n var r = this._radius + bsphere.radius();\r\n return Vec3.distance2( this._iCenter, bsphere.center() ) <= r * r;\r\n },\r\n\r\n intersect: function ( iv, node ) {\r\n var kdtree = node.getShape();\r\n if ( kdtree ) {\r\n // Use KDTREES\r\n return kdtree.intersectSphere( this._iCenter, this._radius, this._intersections, iv.nodePath );\r\n } else {\r\n var ti = new TriangleSphereIntersector();\r\n ti.setNodePath( iv.nodePath );\r\n ti.set( this._iCenter, this._radius );\r\n ti.apply( node );\r\n var l = ti._intersections.length;\r\n if ( l > 0 ) {\r\n // Intersection/s exists\r\n for ( var i = 0; i < l; i++ ) {\r\n this._intersections.push( ti._intersections[ i ] );\r\n }\r\n return true;\r\n }\r\n // No intersection found\r\n return false;\r\n }\r\n return false;\r\n },\r\n getIntersections: function () {\r\n return this._intersections;\r\n },\r\n setCurrentTransformation: function ( matrix ) {\r\n Matrix.inverse( matrix, matrix );\r\n Matrix.transformVec3( matrix, this._center, this._iCenter );\r\n }\r\n };\r\n\r\n return SphereIntersector;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgUtil/SphereIntersector.js\n ** module id = 144\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/BufferArray',\r\n 'osg/Geometry',\r\n 'osg/NodeVisitor',\r\n 'osg/PrimitiveSet',\r\n 'osg/Vec3',\r\n\r\n], function ( MACROUTILS, BufferArray, Geometry, NodeVisitor, PrimitiveSet, Vec3 ) {\r\n\r\n 'use strict';\r\n\r\n var osg = MACROUTILS;\r\n\r\n var TangentSpaceGenerator = function () {\r\n NodeVisitor.call( this );\r\n this._T = undefined;\r\n this._B = undefined;\r\n this._N = undefined;\r\n this._texCoordUnit = 0;\r\n };\r\n\r\n TangentSpaceGenerator.prototype = MACROUTILS.objectInherit( NodeVisitor.prototype, {\r\n\r\n apply: function ( node ) {\r\n\r\n if ( node.getTypeID() === Geometry.getTypeID() )\r\n this.generate( node, this._texCoordUnit );\r\n else\r\n this.traverse( node );\r\n\r\n },\r\n\r\n setTexCoordUnit: function ( texCoordUnit ) {\r\n this._texCoordUnit = texCoordUnit;\r\n },\r\n\r\n computePrimitiveSet: function ( geometry, primitiveSet ) {\r\n\r\n // no indices -> exit\r\n if ( !primitiveSet.getIndices )\r\n return;\r\n\r\n var numIndices = primitiveSet.getNumIndices();\r\n\r\n var vx = geometry.getAttributes().Vertex;\r\n var nx = geometry.getAttributes().Normal;\r\n var tx = geometry.getAttributes()[ 'TexCoord' + this._texCoordUnit ];\r\n\r\n var i;\r\n\r\n if ( primitiveSet.getMode() === PrimitiveSet.TRIANGLES ) {\r\n\r\n for ( i = 0; i < numIndices; i += 3 ) {\r\n this.compute( primitiveSet, vx, nx, tx, i, i + 1, i + 2 );\r\n }\r\n\r\n } else if ( primitiveSet.getMode() === PrimitiveSet.TRIANGLE_STRIP ) {\r\n\r\n for ( i = 0; i < numIndices - 2; ++i ) {\r\n if ( ( i % 2 ) === 0 ) {\r\n this.compute( primitiveSet, vx, nx, tx, i, i + 1, i + 2 );\r\n } else {\r\n this.compute( primitiveSet, vx, nx, tx, i + 1, i, i + 2 );\r\n }\r\n }\r\n }\r\n\r\n },\r\n\r\n generate: function ( geometry, texCoordUnit ) {\r\n\r\n this._texCoordUnit = texCoordUnit;\r\n\r\n if ( this._texCoordUnit === undefined )\r\n this._texCoordUnit = 0;\r\n\r\n var size = geometry.getAttributes().Vertex.getElements().length;\r\n this._T = new osg.Float32Array( size );\r\n this._B = new osg.Float32Array( size );\r\n this._N = new osg.Float32Array( size );\r\n\r\n geometry.getPrimitiveSetList().forEach( function ( primitiveSet ) {\r\n\r\n this.computePrimitiveSet( geometry, primitiveSet );\r\n\r\n }, this );\r\n\r\n var nbElements = size / 3;\r\n var tangents = new osg.Float32Array( nbElements * 4 );\r\n\r\n var tmp0 = Vec3.create();\r\n var tmp1 = Vec3.create();\r\n var t3 = Vec3.create();\r\n\r\n for ( var i = 0; i < nbElements; i++ ) {\r\n var t = this._T.subarray( i * 3, i * 3 + 3 );\r\n var n = this._N.subarray( i * 3, i * 3 + 3 );\r\n var b = this._B.subarray( i * 3, i * 3 + 3 );\r\n\r\n Vec3.normalize( n, n );\r\n\r\n // Gram-Schmidt orthogonalize\r\n // Vec3 t3 = (t - n * (n * t));\r\n // t3.normalize();\r\n // finalTangent = Vec4(t3, 0.0);\r\n // Calculate handedness\r\n // finalTangent[3] = (((n ^ t) * b) < 0.0) ? -1.0 : 1.0;\r\n // The bitangent vector B is then given by B = (N × T) · Tw\r\n\r\n var nt = Vec3.dot( n, t );\r\n Vec3.mult( n, nt, tmp1 );\r\n Vec3.sub( t, tmp1, tmp0 );\r\n Vec3.normalize( tmp0, t3 );\r\n\r\n Vec3.cross( n, t, tmp0 );\r\n var sign = Vec3.dot( tmp0, b );\r\n sign = sign < 0.0 ? -1.0 : 0.0;\r\n\r\n tangents[ i * 4 ] = t3[ 0 ];\r\n tangents[ i * 4 + 1 ] = t3[ 1 ];\r\n tangents[ i * 4 + 2 ] = t3[ 2 ];\r\n tangents[ i * 4 + 3 ] = sign;\r\n }\r\n\r\n geometry.getAttributes().Normal.setElements( this._N );\r\n geometry.getAttributes().Tangent = new BufferArray( 'ARRAY_BUFFER', tangents, 4 );\r\n\r\n },\r\n\r\n compute: function ( primitiveSet, vx, nx, tx, ia, ib, ic ) {\r\n\r\n var i0 = primitiveSet.index( ia );\r\n var i1 = primitiveSet.index( ib );\r\n var i2 = primitiveSet.index( ic );\r\n\r\n var P1 = vx.getElements().subarray( i0 * 3, i0 * 3 + 3 );\r\n var P2 = vx.getElements().subarray( i1 * 3, i1 * 3 + 3 );\r\n var P3 = vx.getElements().subarray( i2 * 3, i2 * 3 + 3 );\r\n\r\n var N1 = nx.getElements().subarray( i0 * 3, i0 * 3 + 3 );\r\n var N2 = nx.getElements().subarray( i1 * 3, i1 * 3 + 3 );\r\n var N3 = nx.getElements().subarray( i2 * 3, i2 * 3 + 3 );\r\n\r\n var uv1 = tx.getElements().subarray( i0 * 2, i0 * 2 + 2 );\r\n var uv2 = tx.getElements().subarray( i1 * 2, i1 * 2 + 2 );\r\n var uv3 = tx.getElements().subarray( i2 * 2, i2 * 2 + 2 );\r\n\r\n var vz, vy;\r\n var V = Vec3.create();\r\n\r\n var B1 = Vec3.create();\r\n var B2 = Vec3.create();\r\n var B3 = Vec3.create();\r\n\r\n var T1 = Vec3.create();\r\n var T2 = Vec3.create();\r\n var T3 = Vec3.create();\r\n\r\n var v1 = Vec3.create();\r\n var v2 = Vec3.create();\r\n\r\n\r\n Vec3.set( P2[ 0 ] - P1[ 0 ], uv2[ 0 ] - uv1[ 0 ], uv2[ 1 ] - uv1[ 1 ], v1 );\r\n Vec3.set( P3[ 0 ] - P1[ 0 ], uv3[ 0 ] - uv1[ 0 ], uv3[ 1 ] - uv1[ 1 ], v2 );\r\n\r\n Vec3.cross( v1, v2, V );\r\n\r\n if ( V[ 0 ] !== 0.0 ) {\r\n Vec3.normalize( V, V );\r\n vy = -V[ 1 ] / V[ 0 ];\r\n vz = -V[ 2 ] / V[ 0 ];\r\n T1[ 0 ] += vy;\r\n B1[ 0 ] += vz;\r\n T2[ 0 ] += vy;\r\n B2[ 0 ] += vz;\r\n T3[ 0 ] += vy;\r\n B3[ 0 ] += vz;\r\n }\r\n\r\n\r\n Vec3.set( P2[ 1 ] - P1[ 1 ], uv2[ 0 ] - uv1[ 0 ], uv2[ 1 ] - uv1[ 1 ], v1 );\r\n Vec3.set( P3[ 1 ] - P1[ 1 ], uv3[ 0 ] - uv1[ 0 ], uv3[ 1 ] - uv1[ 1 ], v2 );\r\n\r\n Vec3.cross( v1, v2, V );\r\n\r\n if ( V[ 0 ] !== 0.0 ) {\r\n Vec3.normalize( V, V );\r\n vy = -V[ 1 ] / V[ 0 ];\r\n vz = -V[ 2 ] / V[ 0 ];\r\n T1[ 1 ] += vy;\r\n B1[ 1 ] += vz;\r\n T2[ 1 ] += vy;\r\n B2[ 1 ] += vz;\r\n T3[ 1 ] += vy;\r\n B3[ 1 ] += vz;\r\n }\r\n\r\n\r\n Vec3.set( P2[ 2 ] - P1[ 2 ], uv2[ 0 ] - uv1[ 0 ], uv2[ 1 ] - uv1[ 1 ], v1 );\r\n Vec3.set( P3[ 2 ] - P1[ 2 ], uv3[ 0 ] - uv1[ 0 ], uv3[ 1 ] - uv1[ 1 ], v2 );\r\n\r\n Vec3.cross( v1, v2, V );\r\n\r\n if ( V[ 0 ] !== 0.0 ) {\r\n Vec3.normalize( V, V );\r\n vy = -V[ 1 ] / V[ 0 ];\r\n vz = -V[ 2 ] / V[ 0 ];\r\n T1[ 2 ] += vy;\r\n B1[ 2 ] += vz;\r\n T2[ 2 ] += vy;\r\n B2[ 2 ] += vz;\r\n T3[ 2 ] += vy;\r\n B3[ 2 ] += vz;\r\n }\r\n\r\n var tempVec = Vec3.create();\r\n var tempVec2 = Vec3.create();\r\n\r\n var Tdst, Bdst, Ndst;\r\n\r\n Vec3.cross( N1, T1, tempVec );\r\n Vec3.cross( tempVec, N1, tempVec2 );\r\n Tdst = this._T.subarray( i0 * 3, i0 * 3 + 3 );\r\n Vec3.add( tempVec2, Tdst, Tdst );\r\n\r\n Vec3.cross( B1, N1, tempVec );\r\n Vec3.cross( N1, tempVec, tempVec2 );\r\n Bdst = this._B.subarray( i0 * 3, i0 * 3 + 3 );\r\n Vec3.add( tempVec2, Bdst, Bdst );\r\n\r\n\r\n Vec3.cross( N2, T2, tempVec );\r\n Vec3.cross( tempVec, N2, tempVec2 );\r\n Tdst = this._T.subarray( i1 * 3, i1 * 3 + 3 );\r\n Vec3.add( tempVec2, Tdst, Tdst );\r\n\r\n Vec3.cross( B2, N2, tempVec );\r\n Vec3.cross( N2, tempVec, tempVec2 );\r\n Bdst = this._B.subarray( i1 * 3, i1 * 3 + 3 );\r\n Vec3.add( tempVec2, Bdst, Bdst );\r\n\r\n\r\n Vec3.cross( N3, T3, tempVec );\r\n Vec3.cross( tempVec, N3, tempVec2 );\r\n Tdst = this._T.subarray( i2 * 3, i2 * 3 + 3 );\r\n Vec3.add( tempVec2, Tdst, Tdst );\r\n\r\n Vec3.cross( B3, N3, tempVec );\r\n Vec3.cross( N3, tempVec, tempVec2 );\r\n Bdst = this._B.subarray( i2 * 3, i2 * 3 + 3 );\r\n Vec3.add( tempVec2, Bdst, Bdst );\r\n\r\n\r\n Ndst = this._N.subarray( i0 * 3, i0 * 3 + 3 );\r\n Vec3.add( N1, Ndst, Ndst );\r\n\r\n Ndst = this._N.subarray( i1 * 3, i1 * 3 + 3 );\r\n Vec3.add( N2, Ndst, Ndst );\r\n\r\n Ndst = this._N.subarray( i2 * 3, i2 * 3 + 3 );\r\n Vec3.add( N3, Ndst, Ndst );\r\n }\r\n\r\n } );\r\n\r\n return TangentSpaceGenerator;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgUtil/TangentSpaceGenerator.js\n ** module id = 145\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Vec3',\r\n 'osg/TriangleIndexFunctor'\r\n], function ( Vec3, TriangleIndexFunctor ) {\r\n\r\n 'use strict';\r\n\r\n var TriangleIntersection = function ( index, normal, r1, v1, r2, v2, r3, v3 ) {\r\n this.index = index;\r\n this.normal = normal;\r\n this.r1 = r1;\r\n this.v1 = v1;\r\n this.r2 = r2;\r\n this.v2 = v2;\r\n this.r3 = r3;\r\n this.v3 = v3;\r\n };\r\n\r\n var TriangleIntersector = function () {\r\n this._intersections = [];\r\n this._nodePath = [];\r\n this._index = 0;\r\n };\r\n\r\n TriangleIntersector.prototype = {\r\n setNodePath: function ( np ) {\r\n this._nodePath = np;\r\n },\r\n set: function ( start, end ) {\r\n this._start = start;\r\n this._end = end;\r\n this._dir = Vec3.sub( end, start, [ 0.0, 0.0, 0.0 ] );\r\n this._length = Vec3.length( this._dir );\r\n this._invLength = 1.0 / this._length;\r\n Vec3.mult( this._dir, this._invLength, this._dir );\r\n },\r\n\r\n apply: function ( node ) {\r\n if ( !node.getAttributes().Vertex ) {\r\n return;\r\n }\r\n var vertices = node.getAttributes().Vertex.getElements();\r\n var self = this;\r\n var v1 = Vec3.create();\r\n var v2 = Vec3.create();\r\n var v3 = Vec3.create();\r\n var cb = function ( i1, i2, i3 ) {\r\n if ( i1 === i2 || i1 === i3 || i2 === i3 )\r\n return;\r\n var j = i1 * 3;\r\n v1[ 0 ] = vertices[ j ];\r\n v1[ 1 ] = vertices[ j + 1 ];\r\n v1[ 2 ] = vertices[ j + 2 ];\r\n j = i2 * 3;\r\n v2[ 0 ] = vertices[ j ];\r\n v2[ 1 ] = vertices[ j + 1 ];\r\n v2[ 2 ] = vertices[ j + 2 ];\r\n j = i3 * 3;\r\n v3[ 0 ] = vertices[ j ];\r\n v3[ 1 ] = vertices[ j + 1 ];\r\n v3[ 2 ] = vertices[ j + 2 ];\r\n self.intersect( v1, v2, v3 );\r\n };\r\n var tif = new TriangleIndexFunctor( node, cb );\r\n tif.apply();\r\n },\r\n\r\n intersect: ( function () {\r\n var normal = Vec3.create();\r\n var e2 = Vec3.create();\r\n var e1 = Vec3.create();\r\n var tvec = Vec3.create();\r\n var pvec = Vec3.create();\r\n var qvec = Vec3.create();\r\n var epsilon = 1E-20;\r\n return function ( v0, v1, v2 ) {\r\n this._index++;\r\n var d = this._dir;\r\n\r\n Vec3.sub( v2, v0, e2 );\r\n Vec3.sub( v1, v0, e1 );\r\n Vec3.cross( d, e2, pvec );\r\n\r\n var det = Vec3.dot( pvec, e1 );\r\n if ( det > -epsilon && det < epsilon )\r\n return;\r\n var invDet = 1.0 / det;\r\n\r\n Vec3.sub( this._start, v0, tvec );\r\n\r\n var u = Vec3.dot( pvec, tvec ) * invDet;\r\n if ( u < 0.0 || u > 1.0 )\r\n return;\r\n\r\n Vec3.cross( tvec, e1, qvec );\r\n\r\n var v = Vec3.dot( qvec, d ) * invDet;\r\n if ( v < 0.0 || ( u + v ) > 1.0 )\r\n return;\r\n\r\n var t = Vec3.dot( qvec, e2 ) * invDet;\r\n\r\n if ( t < epsilon || t > this._length ) //no intersection\r\n return;\r\n\r\n var r0 = 1.0 - u - v;\r\n var r1 = u;\r\n var r2 = v;\r\n var r = t * this._invLength;\r\n\r\n var interX = v0[ 0 ] * r0 + v1[ 0 ] * r1 + v2[ 0 ] * r2;\r\n var interY = v0[ 1 ] * r0 + v1[ 1 ] * r1 + v2[ 1 ] * r2;\r\n var interZ = v0[ 2 ] * r0 + v1[ 2 ] * r1 + v2[ 2 ] * r2;\r\n\r\n Vec3.cross( e1, e2, normal );\r\n Vec3.normalize( normal, normal );\r\n\r\n this._intersections.push( {\r\n ratio: r,\r\n nodepath: this._nodePath.slice( 0 ), // Note: If you are computing intersections from a viewer the first node is the camera of the viewer\r\n TriangleIntersection: new TriangleIntersection( this._index - 1, normal.slice( 0 ), r0, v0.slice( 0 ), r1, v1.slice( 0 ), r2, v2.slice( 0 ) ),\r\n point: [ interX, interY, interZ ]\r\n } );\r\n this.hit = true;\r\n };\r\n } )()\r\n };\r\n\r\n return TriangleIntersector;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgUtil/TriangleIntersector.js\n ** module id = 146\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Camera',\r\n 'osg/FrameBufferObject',\r\n 'osg/Matrix',\r\n 'osg/Node',\r\n 'osg/Program',\r\n 'osg/Projection',\r\n 'osg/Shader',\r\n 'osg/Shape',\r\n 'osg/Texture',\r\n 'osg/Transform',\r\n 'osg/Uniform',\r\n 'osg/Viewport',\r\n 'osgUtil/Composer'\r\n], function ( Camera, FrameBufferObject, Matrix, Node, Program, Projection, Shader, Shape, Texture, Transform, Uniform, Viewport, Composer ) {\r\n\r\n 'use strict';\r\n\r\n var UpdateRttCameraCallback = function ( rootView, offsetView ) {\r\n this._rootView = rootView;\r\n this._offsetView = offsetView;\r\n };\r\n\r\n UpdateRttCameraCallback.prototype = {\r\n update: function ( node /*, nv */ ) {\r\n var nodeView = node.getViewMatrix();\r\n Matrix.mult( this._offsetView, this._rootView, nodeView );\r\n return true;\r\n }\r\n };\r\n\r\n function perspectiveMatrixFromVRFieldOfView( fov, zNear, zFar ) {\r\n\r\n var matrix = new Matrix.create();\r\n\r\n var upTan = Math.tan( fov.upDegrees * Math.PI / 180.0 );\r\n var downTan = Math.tan( fov.downDegrees * Math.PI / 180.0 );\r\n var leftTan = Math.tan( fov.leftDegrees * Math.PI / 180.0 );\r\n var rightTan = Math.tan( fov.rightDegrees * Math.PI / 180.0 );\r\n\r\n var xScale = 2.0 / ( leftTan + rightTan );\r\n var yScale = 2.0 / ( upTan + downTan );\r\n\r\n // return Matrix.makeFrustum( xmin, xmax, ymin, ymax, znear, zfar, result );\r\n\r\n matrix[ 0 ] = xScale;\r\n matrix[ 4 ] = 0.0;\r\n matrix[ 8 ] = -( ( leftTan - rightTan ) * xScale * 0.5 );\r\n matrix[ 12 ] = 0.0;\r\n\r\n matrix[ 1 ] = 0.0;\r\n matrix[ 5 ] = yScale;\r\n matrix[ 9 ] = ( ( upTan - downTan ) * yScale * 0.5 );\r\n matrix[ 13 ] = 0.0;\r\n\r\n matrix[ 2 ] = 0.0;\r\n matrix[ 6 ] = 0.0;\r\n matrix[ 10 ] = zFar / ( zNear - zFar );\r\n matrix[ 14 ] = ( zFar * zNear ) / ( zNear - zFar );\r\n\r\n matrix[ 3 ] = 0.0;\r\n matrix[ 7 ] = 0.0;\r\n matrix[ 11 ] = -1.0;\r\n matrix[ 15 ] = 0.0;\r\n\r\n return matrix;\r\n }\r\n\r\n\r\n var createTexture = function ( size ) {\r\n var texture = new Texture();\r\n texture.setTextureSize( size.width, size.height );\r\n texture.setMinFilter( 'LINEAR' );\r\n texture.setMagFilter( 'LINEAR' );\r\n return texture;\r\n };\r\n\r\n function getAssembleShader() {\r\n\r\n var fragmentShader = [\r\n '#ifdef GL_ES',\r\n ' precision highp float;',\r\n '#endif',\r\n 'varying vec2 FragTexCoord0;',\r\n 'uniform sampler2D leftEyeTexture;',\r\n 'uniform sampler2D rightEyeTexture;',\r\n\r\n 'void main() {',\r\n ' if (FragTexCoord0.x < 0.5)',\r\n ' gl_FragColor = texture2D(leftEyeTexture, vec2(FragTexCoord0.x * 2.0, FragTexCoord0.y));',\r\n ' else',\r\n ' gl_FragColor = texture2D(rightEyeTexture, vec2(FragTexCoord0.x * 2.0 - 1.0, FragTexCoord0.y));',\r\n '}',\r\n ].join( '\\n' );\r\n\r\n return new Program(\r\n new Shader( Shader.VERTEX_SHADER, Composer.Filter.defaultVertexShader ),\r\n new Shader( Shader.FRAGMENT_SHADER, fragmentShader )\r\n );\r\n }\r\n\r\n // This camera will render both textures on the canvas in a single pass\r\n var createCameraCanvas = function ( leftEyeTexture, rightEyeTexture, viewport ) {\r\n\r\n var orthoCamera = new Camera();\r\n orthoCamera.setViewport( viewport );\r\n orthoCamera.setRenderOrder( Camera.POST_RENDER, 0 );\r\n orthoCamera.setReferenceFrame( Transform.ABSOLUTE_RF );\r\n Matrix.makeOrtho( -0.5, 0.5, -0.5, 0.5, -5.0, 5.0, orthoCamera.getProjectionMatrix() );\r\n\r\n var quad = Shape.createTexturedQuadGeometry( -0.5, -0.5, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0 );\r\n var stateSet = quad.getOrCreateStateSet();\r\n var samplerLeft = Uniform.createInt1( 0, 'leftEyeTexture' );\r\n var samplerRight = Uniform.createInt1( 1, 'rightEyeTexture' );\r\n\r\n stateSet.setTextureAttributeAndModes( 0, leftEyeTexture );\r\n stateSet.setTextureAttributeAndModes( 1, rightEyeTexture );\r\n stateSet.setAttributeAndModes( getAssembleShader() );\r\n stateSet.addUniform( samplerLeft );\r\n stateSet.addUniform( samplerRight );\r\n\r\n orthoCamera.addChild( quad );\r\n\r\n return orthoCamera;\r\n };\r\n\r\n // This camera will render the scene on a texture for an eye\r\n var createCameraRtt = function ( texture, projection ) {\r\n var camera = new Camera();\r\n camera.setName( 'rtt camera' );\r\n camera.setViewport( new Viewport( 0.0, 0.0, texture.getWidth(), texture.getHeight() ) );\r\n camera.setProjectionMatrix( projection );\r\n camera.setClearColor( [ 0.3, 0.3, 0.3, 0.0 ] );\r\n camera.setRenderOrder( Camera.PRE_RENDER, 0 );\r\n camera.attachTexture( FrameBufferObject.COLOR_ATTACHMENT0, texture, 0 );\r\n camera.attachRenderBuffer( FrameBufferObject.DEPTH_ATTACHMENT, FrameBufferObject.DEPTH_COMPONENT16 );\r\n camera.setReferenceFrame( Transform.ABSOLUTE_RF );\r\n return camera;\r\n };\r\n\r\n var WebVR = {};\r\n\r\n WebVR.createScene = function ( viewer, rttScene, HMDdevice ) {\r\n\r\n var root = new Node();\r\n var worldFactor = 1.0;\r\n\r\n var hmd = getHMDOptions( HMDdevice );\r\n\r\n // Compute projections and view matrices for both eyes\r\n var projectionLeft = perspectiveMatrixFromVRFieldOfView( hmd.fovLeft, 0.1, 1000 );\r\n var projectionRight = perspectiveMatrixFromVRFieldOfView( hmd.fovRight, 0.1, 1000 );\r\n var viewLeft = Matrix.makeTranslate( worldFactor * hmd.eyeOffsetLeft.x, hmd.eyeOffsetLeft.y, hmd.eyeOffsetLeft.z, Matrix.create() );\r\n var viewRight = Matrix.makeTranslate( worldFactor * hmd.eyeOffsetRight.x, hmd.eyeOffsetRight.y, hmd.eyeOffsetRight.z, Matrix.create() );\r\n\r\n // Each eye is rendered on a texture whose width is half of the final combined texture\r\n var eyeTextureSize = {\r\n width: hmd.rttResolution.width / 2.0,\r\n height: hmd.rttResolution.height\r\n };\r\n\r\n var leftEyeTexture = createTexture( eyeTextureSize );\r\n var rightEyeTexture = createTexture( eyeTextureSize );\r\n\r\n // Setup the render cameras for both eyes\r\n var camRttLeft = createCameraRtt( leftEyeTexture, projectionLeft );\r\n var camRttRight = createCameraRtt( rightEyeTexture, projectionRight );\r\n\r\n // The viewMatrix of each eye is updated with the current viewer's camera viewMatrix\r\n var rootViewMatrix = viewer.getCamera().getViewMatrix();\r\n camRttLeft.setUpdateCallback( new UpdateRttCameraCallback( rootViewMatrix, viewLeft ) );\r\n camRttRight.setUpdateCallback( new UpdateRttCameraCallback( rootViewMatrix, viewRight ) );\r\n\r\n // Render both textures on the canvas, using the viewer's camera viewport to render on the fullscreen canvas\r\n var camCanvas = createCameraCanvas( leftEyeTexture, rightEyeTexture, viewer.getCamera().getViewport() );\r\n\r\n camRttLeft.addChild( rttScene );\r\n camRttRight.addChild( rttScene );\r\n\r\n root.addChild( camRttLeft );\r\n root.addChild( camRttRight );\r\n root.addChild( camCanvas );\r\n\r\n return root;\r\n };\r\n\r\n function getHMDOptions( hmdDevice ) {\r\n\r\n /* WebVR API state as of 22/07/2014\r\n Firefox {\r\n getCurrentEyeFieldOfView()\r\n getMaximumEyeFieldOfView()\r\n getRecommendedEyeFieldOfView()\r\n getEyeTranslation()\r\n },\r\n Chrome {\r\n getCurrentEyeFieldOfView()\r\n getMaximumEyeFieldOfView()\r\n getRecommendedEyeFieldOfView()\r\n getEyeTranslation()\r\n getRecommendedRenderTargetSize()\r\n }*/\r\n\r\n var hmd = {\r\n\r\n fovLeft: hmdDevice.getRecommendedEyeFieldOfView( 'left' ),\r\n fovRight: hmdDevice.getRecommendedEyeFieldOfView( 'right' ),\r\n eyeOffsetLeft: hmdDevice.getEyeTranslation( 'left' ),\r\n eyeOffsetRight: hmdDevice.getEyeTranslation( 'right' ),\r\n rttResolution: {\r\n width: 1920,\r\n height: 1080\r\n },\r\n };\r\n if ( hmdDevice.getRecommendedRenderTargetSize )\r\n hmd.rttResolution = hmdDevice.getRecommendedRenderTargetSize();\r\n\r\n // On Mac (FF+Chromium), the Left and Right angles of both eyes are inverted\r\n // Left Eye must see more to the Left than to the Right (Left angle > Right angle)\r\n // Right Eye must see more to the Right than to the Left (Right angle > Left angle)\r\n // This is because of the nose blocking the view\r\n var swapLeftAndRight = function ( fov ) {\r\n var temp = fov.leftDegrees;\r\n fov.leftDegrees = fov.rightDegrees;\r\n fov.rightDegrees = temp;\r\n };\r\n\r\n if ( hmd.fovLeft.leftDegrees < hmd.fovLeft.rightDegrees ) {\r\n swapLeftAndRight( hmd.fovLeft );\r\n }\r\n if ( hmd.fovRight.rightDegrees < hmd.fovRight.leftDegrees ) {\r\n swapLeftAndRight( hmd.fovRight );\r\n }\r\n\r\n return hmd;\r\n }\r\n\r\n return WebVR;\r\n\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgUtil/WebVR.js\n ** module id = 147\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/CullSettings',\r\n 'osg/CullVisitor',\r\n 'osg/Matrix',\r\n 'osg/Object',\r\n 'osg/RenderStage',\r\n 'osg/State',\r\n 'osg/StateGraph',\r\n\r\n 'osgShader/osgShader',\r\n\r\n], function ( MACROUTILS, CullSettings, CullVisitor, Matrix, Object, RenderStage, State, StateGraph, osgShader ) {\r\n\r\n 'use strict';\r\n\r\n var Renderer = function ( camera ) {\r\n Object.call( this );\r\n\r\n this._state = undefined;\r\n this._camera = camera;\r\n this._renderStage = undefined;\r\n this._stateGraph = undefined;\r\n\r\n this._frameStamp = undefined;\r\n\r\n this.setDefaults();\r\n };\r\n\r\n Renderer.prototype = MACROUTILS.objectLibraryClass( MACROUTILS.objectInherit( Object.prototype, {\r\n\r\n setDefaults: function () {\r\n\r\n this._state = new State( new osgShader.ShaderGeneratorProxy() );\r\n\r\n this._cullVisitor = new CullVisitor();\r\n this._cullVisitor.setRenderer( this );\r\n this._renderStage = new RenderStage();\r\n this._stateGraph = new StateGraph();\r\n\r\n this.getCamera().setClearColor( [ 0.0, 0.0, 0.0, 0.0 ] );\r\n\r\n\r\n var osg = require( 'osg/osg' );\r\n var stateSet = this.getCamera().getOrCreateStateSet(); //new osg.StateSet();\r\n stateSet.setAttributeAndModes( new osg.Material() );\r\n stateSet.setAttributeAndModes( new osg.Depth() );\r\n stateSet.setAttributeAndModes( new osg.BlendFunc() );\r\n stateSet.setAttributeAndModes( new osg.CullFace() );\r\n\r\n },\r\n\r\n getCullVisitor: function () {\r\n return this._cullVisitor;\r\n },\r\n\r\n setCullVisitor: function ( cv ) {\r\n if ( cv && !cv.getRenderer() ) cv.setRenderer( this );\r\n this._cullVisitor = cv;\r\n },\r\n\r\n getCamera: function () {\r\n return this._camera;\r\n },\r\n\r\n setFrameStamp: function ( fs ) {\r\n this._frameStamp = fs;\r\n },\r\n\r\n getFrameStamp: function () {\r\n return this._frameStamp;\r\n },\r\n\r\n getState: function () {\r\n return this._state;\r\n },\r\n\r\n setState: function ( state ) {\r\n this._state = state;\r\n },\r\n\r\n setGraphicContext: function ( gc ) {\r\n this._state.setGraphicContext( gc );\r\n },\r\n\r\n getGraphicContext: function () {\r\n return this._state.getGraphicContext();\r\n },\r\n\r\n cullAndDraw: function () {\r\n this.cull();\r\n this.draw();\r\n },\r\n\r\n cull: ( function () {\r\n\r\n var projectionMatrixTmp = Matrix.create();\r\n var viewMatrixTmp = Matrix.create();\r\n\r\n return function () {\r\n\r\n var camera = this.getCamera();\r\n var view = camera.getView();\r\n\r\n this._cullVisitor.setFrameStamp( this._frameStamp );\r\n\r\n // It should be done in RenderStage\r\n this._cullVisitor.setCamera( this.getCamera() );\r\n\r\n\r\n // this part of code should be called for each view\r\n // right now, we dont support multi view\r\n this._stateGraph.clean();\r\n this._renderStage.reset();\r\n\r\n this._cullVisitor.reset();\r\n this._cullVisitor.setStateGraph( this._stateGraph );\r\n this._cullVisitor.setRenderStage( this._renderStage );\r\n\r\n this._cullVisitor.pushStateSet( camera.getStateSet() );\r\n\r\n // save cullSettings\r\n var previousCullsettings = new CullSettings();\r\n previousCullsettings.setCullSettings( this._cullVisitor );\r\n this._cullVisitor.setCullSettings( camera );\r\n if ( previousCullsettings.getSettingSourceOverrider() === this._cullVisitor && previousCullsettings.getEnableFrustumCulling() ) {\r\n this._cullVisitor.setEnableFrustumCulling( true );\r\n }\r\n\r\n this._cullVisitor.pushModelViewMatrix( Matrix.copy( camera.getViewMatrix(), viewMatrixTmp ) );\r\n\r\n this._cullVisitor.pushProjectionMatrix( Matrix.copy( camera.getProjectionMatrix(), projectionMatrixTmp ) );\r\n\r\n // update bound\r\n camera.getBound();\r\n\r\n var light = view.getLight();\r\n var View = require( 'osgViewer/View' );\r\n\r\n if ( light ) {\r\n\r\n switch ( view.getLightingMode() ) {\r\n\r\n case View.LightingMode.HEADLIGHT:\r\n this._cullVisitor.addPositionedAttribute( null, light );\r\n break;\r\n\r\n case View.LightingMode.SKY_LIGHT:\r\n this._cullVisitor.addPositionedAttribute( camera.getViewMatrix(), light );\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n this._cullVisitor.pushViewport( camera.getViewport() );\r\n\r\n\r\n\r\n this._renderStage.setClearDepth( camera.getClearDepth() );\r\n this._renderStage.setClearColor( camera.getClearColor() );\r\n this._renderStage.setClearMask( camera.getClearMask() );\r\n this._renderStage.setViewport( camera.getViewport() );\r\n\r\n // pass de dbpager to the cullvisitor, so plod's can do the requests\r\n this._cullVisitor.setDatabaseRequestHandler( this._camera.getView().getDatabasePager() );\r\n // dont add camera on the stack just traverse it\r\n this._cullVisitor.handleCullCallbacksAndTraverse( camera );\r\n\r\n // fix projection matrix if camera has near/far auto compute\r\n this._cullVisitor.popModelViewMatrix();\r\n this._cullVisitor.popProjectionMatrix();\r\n\r\n\r\n // store complete frustum\r\n camera.setNearFar( this._cullVisitor._computedNear, this._cullVisitor._computedFar );\r\n\r\n // restore previous state of the camera\r\n this._cullVisitor.setCullSettings( previousCullsettings );\r\n\r\n this._cullVisitor.popViewport();\r\n this._cullVisitor.popStateSet();\r\n\r\n this._renderStage.sort();\r\n\r\n };\r\n } )(),\r\n\r\n draw: function () {\r\n\r\n var state = this.getState();\r\n\r\n state.resetCacheFrame(); // important because cache are used in cullvisitor\r\n\r\n this._renderStage.draw( state );\r\n\r\n // noticed that we accumulate lot of stack, maybe because of the stateGraph\r\n // CP: ^^ really ? check it / report an issue\r\n state.popAllStateSets();\r\n state.apply();\r\n\r\n }\r\n\r\n\r\n } ), 'osgViewer', 'Renderer' );\r\n\r\n return Renderer;\r\n\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgViewer/Renderer.js\n ** module id = 148\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/BlendFunc',\r\n 'osg/BufferArray',\r\n 'osg/Camera',\r\n 'osg/CullFace',\r\n 'osg/Depth',\r\n 'osg/FrameStamp',\r\n 'osg/FrameBufferObject',\r\n 'osg/Light',\r\n 'osg/Material',\r\n 'osg/Matrix',\r\n 'osg/Node',\r\n 'osg/Options',\r\n 'osg/Texture',\r\n 'osg/Program',\r\n 'osg/Shader',\r\n 'osg/Viewport',\r\n 'osg/WebGLCaps',\r\n\r\n 'osgUtil/IntersectionVisitor',\r\n 'osgUtil/LineSegmentIntersector',\r\n\r\n 'osgViewer/Renderer',\r\n 'osgViewer/Scene'\r\n\r\n], function (\r\n BlendFunc,\r\n BufferArray,\r\n Camera,\r\n CullFace,\r\n Depth,\r\n FrameStamp,\r\n FrameBufferObject,\r\n Light,\r\n Material,\r\n Matrix,\r\n Node,\r\n Options,\r\n Texture,\r\n Program,\r\n Shader,\r\n Viewport,\r\n WebGLCaps,\r\n\r\n IntersectionVisitor,\r\n LineSegmentIntersector,\r\n\r\n Renderer,\r\n Scene ) {\r\n\r\n 'use strict';\r\n\r\n\r\n // View is normally inherited from osg/View. In osgjs we dont need it yet\r\n // this split, so everything is in osgViewer/View\r\n\r\n var View = function () {\r\n\r\n this._camera = new Camera();\r\n this._scene = new Scene();\r\n this._frameStamp = new FrameStamp();\r\n this._lightingMode = undefined;\r\n this._manipulator = undefined;\r\n this._webGLCaps = undefined;\r\n this._canvasWidth = 0;\r\n this._canvasHeight = 0;\r\n\r\n this._requestContinousUpdate = true;\r\n this._requestRedraw = true;\r\n\r\n this.setLightingMode( View.LightingMode.HEADLIGHT );\r\n // assign a renderer to the camera\r\n var renderer = this.createRenderer( this.getCamera() );\r\n renderer.setFrameStamp( this._frameStamp );\r\n this.getCamera().setRenderer( renderer );\r\n this.getCamera().setView( this );\r\n\r\n };\r\n\r\n View.LightingMode = {\r\n NO_LIGHT: 0,\r\n HEADLIGHT: 1,\r\n SKY_LIGHT: 2\r\n };\r\n\r\n View.prototype = {\r\n requestRedraw: function () {\r\n this._requestRedraw = true;\r\n },\r\n requestContinuousUpdate: function ( bool ) {\r\n this._requestContinousUpdate = bool;\r\n },\r\n createRenderer: function ( camera ) {\r\n var render = new Renderer( camera );\r\n //camera->setStats(new osg::Stats(\"Camera\"));\r\n return render;\r\n },\r\n\r\n setGraphicContext: function ( gc ) {\r\n this.getCamera().getRenderer().getState().setGraphicContext( gc );\r\n },\r\n\r\n getGraphicContext: function () {\r\n return this.getCamera().getRenderer().getState().getGraphicContext();\r\n },\r\n\r\n getWebGLCaps: function () {\r\n return this._webGLCaps;\r\n },\r\n\r\n initWebGLCaps: function ( gl ) {\r\n this._webGLCaps = new WebGLCaps( gl );\r\n this._webGLCaps.init();\r\n },\r\n\r\n computeCanvasSize: ( function () {\r\n return function ( canvas ) {\r\n\r\n var clientWidth, clientHeight;\r\n clientWidth = canvas.clientWidth;\r\n clientHeight = canvas.clientHeight;\r\n\r\n if ( clientWidth < 1 ) clientWidth = 1;\r\n if ( clientHeight < 1 ) clientHeight = 1;\r\n\r\n var devicePixelRatio = this._devicePixelRatio;\r\n\r\n var widthPixel = Math.floor( clientWidth * devicePixelRatio );\r\n var heightPixel = Math.floor( clientHeight * devicePixelRatio );\r\n\r\n var hasChanged = false;\r\n if ( this._canvasWidth !== widthPixel ) {\r\n canvas.width = widthPixel;\r\n this._canvasWidth = widthPixel;\r\n hasChanged = true;\r\n }\r\n\r\n if ( this._canvasHeight !== heightPixel ) {\r\n canvas.height = heightPixel;\r\n this._canvasHeight = heightPixel;\r\n hasChanged = true;\r\n }\r\n return hasChanged;\r\n };\r\n } )(),\r\n\r\n setUpView: function ( canvas, options ) {\r\n\r\n\r\n var devicePixelRatio = window.devicePixelRatio || 1;\r\n var overrideDevicePixelRatio = options.getNumber( 'overrideDevicePixelRatio' );\r\n var maxDevicePixelRatio = options.getNumber( 'maxDevicePixelRatio' ) || -1;\r\n\r\n // override the pixel ratio, used to save pixel on mobile\r\n if ( typeof overrideDevicePixelRatio === 'number' ) {\r\n devicePixelRatio = overrideDevicePixelRatio;\r\n } else if ( maxDevicePixelRatio !== -1 ) {\r\n devicePixelRatio = maxDevicePixelRatio;\r\n }\r\n this._devicePixelRatio = devicePixelRatio;\r\n\r\n this.computeCanvasSize( canvas );\r\n\r\n var ratio = canvas.clientWidth / canvas.clientHeight;\r\n\r\n var width = canvas.width;\r\n var height = canvas.height;\r\n\r\n this._camera.setViewport( new Viewport( 0, 0, width, height ) );\r\n\r\n this._camera.setGraphicContext( this.getGraphicContext() );\r\n Matrix.makeLookAt( [ 0, 0, -10 ], [ 0, 0, 0 ], [ 0, 1, 0 ], this._camera.getViewMatrix() );\r\n Matrix.makePerspective( 55, ratio, 1.0, 1000.0, this._camera.getProjectionMatrix() );\r\n\r\n\r\n if ( options && options.enableFrustumCulling )\r\n this.getCamera().getRenderer().getCullVisitor().setEnableFrustumCulling( true );\r\n\r\n },\r\n\r\n /**\r\n * X = 0 at the left\r\n * Y = 0 at the BOTTOM\r\n */\r\n computeIntersections: function ( x, y, traversalMask ) {\r\n /*jshint bitwise: false */\r\n if ( traversalMask === undefined ) {\r\n traversalMask = ~0;\r\n }\r\n /*jshint bitwise: true */\r\n var lsi = new LineSegmentIntersector();\r\n lsi.set( [ x, y, 0.0 ], [ x, y, 1.0 ] );\r\n var iv = new IntersectionVisitor();\r\n iv.setTraversalMask( traversalMask );\r\n iv.setIntersector( lsi );\r\n this._camera.accept( iv );\r\n return lsi.getIntersections();\r\n },\r\n\r\n setFrameStamp: function ( frameStamp ) {\r\n this._frameStamp = frameStamp;\r\n },\r\n\r\n getFrameStamp: function () {\r\n return this._frameStamp;\r\n },\r\n\r\n setCamera: function ( camera ) {\r\n this._camera = camera;\r\n },\r\n\r\n getCamera: function () {\r\n return this._camera;\r\n },\r\n\r\n setSceneData: function ( node ) {\r\n\r\n if ( node === this._scene.getSceneData() )\r\n return;\r\n\r\n this._scene.setSceneData( node );\r\n\r\n this._camera.removeChildren();\r\n this._camera.addChild( node );\r\n\r\n },\r\n\r\n getSceneData: function () {\r\n return this._scene.getSceneData();\r\n },\r\n\r\n setDatabasePager: function ( dbpager ) {\r\n this._scene.setDatabasePager( dbpager );\r\n },\r\n\r\n getDatabasePager: function () {\r\n return this._scene.getDatabasePager();\r\n },\r\n\r\n getScene: function () {\r\n return this._scene;\r\n },\r\n\r\n getManipulator: function () {\r\n return this._manipulator;\r\n },\r\n\r\n setManipulator: function ( manipulator ) {\r\n this._manipulator = manipulator;\r\n },\r\n\r\n getLight: function () {\r\n return this._light;\r\n },\r\n\r\n setLight: function ( light ) {\r\n this._light = light;\r\n if ( this._lightingMode !== View.LightingMode.NO_LIGHT ) {\r\n this._scene.getOrCreateStateSet().setAttributeAndModes( this._light );\r\n }\r\n },\r\n\r\n getLightingMode: function () {\r\n return this._lightingMode;\r\n },\r\n\r\n setLightingMode: function ( lightingMode ) {\r\n\r\n if ( this._lightingMode !== lightingMode ) {\r\n this._lightingMode = lightingMode;\r\n\r\n if ( this._lightingMode !== View.LightingMode.NO_LIGHT ) {\r\n\r\n if ( !this._light ) this._light = new Light();\r\n\r\n } else {\r\n this._light = undefined;\r\n }\r\n }\r\n },\r\n\r\n // In OSG this call is done in SceneView\r\n flushDeletedGLObjects: function ( /*currentTime,*/ availableTime ) {\r\n // Flush all deleted OpenGL objects within the specified availableTime\r\n var gl = this.getGraphicContext();\r\n availableTime = BufferArray.flushDeletedGLBufferArrays( gl, availableTime );\r\n availableTime = Texture.getTextureManager( gl ).flushDeletedTextureObjects( gl, availableTime );\r\n availableTime = Program.flushDeletedGLPrograms( gl, availableTime );\r\n availableTime = Shader.flushDeletedGLShaders( gl, availableTime );\r\n availableTime = FrameBufferObject.flushDeletedGLFrameBuffers( gl, availableTime );\r\n }\r\n\r\n };\r\n\r\n return View;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgViewer/View.js\n ** module id = 149\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Notify',\r\n 'osg/Matrix',\r\n 'osg/Options',\r\n 'osg/Stats',\r\n 'osg/Timer',\r\n 'osg/UpdateVisitor',\r\n 'osg/Utils',\r\n 'osg/Texture',\r\n 'osgGA/OrbitManipulator',\r\n\r\n 'osgViewer/CanvasStats',\r\n 'osgViewer/eventProxy/EventProxy',\r\n 'osgViewer/View',\r\n 'osgViewer/webgl-utils',\r\n 'osgViewer/webgl-debug'\r\n\r\n], function ( Notify, Matrix, Options, Stats, Timer, UpdateVisitor, MACROUTILS, Texture, OrbitManipulator, CanvasStats, EventProxy, View, WebGLUtils, WebGLDebugUtils ) {\r\n\r\n 'use strict';\r\n\r\n var OptionsURL = ( function () {\r\n var options = {};\r\n ( function ( options ) {\r\n var vars = [],\r\n hash;\r\n var indexOptions = window.location.href.indexOf( '?' );\r\n if ( indexOptions < 0 ) return;\r\n\r\n var hashes = window.location.href.slice( indexOptions + 1 ).split( '&' );\r\n for ( var i = 0; i < hashes.length; i++ ) {\r\n hash = hashes[ i ].split( '=' );\r\n var element = hash[ 0 ];\r\n vars.push( element );\r\n var result = hash[ 1 ];\r\n if ( result === undefined ) {\r\n result = '1';\r\n }\r\n options[ element ] = result;\r\n }\r\n } )( options );\r\n\r\n if ( options.log !== undefined ) {\r\n var level = options.log.toLowerCase();\r\n\r\n switch ( level ) {\r\n case 'debug':\r\n Notify.setNotifyLevel( Notify.DEBUG );\r\n break;\r\n case 'info':\r\n Notify.setNotifyLevel( Notify.INFO );\r\n break;\r\n case 'notice':\r\n Notify.setNotifyLevel( Notify.NOTICE );\r\n break;\r\n case 'warn':\r\n Notify.setNotifyLevel( Notify.WARN );\r\n break;\r\n case 'error':\r\n Notify.setNotifyLevel( Notify.ERROR );\r\n break;\r\n case 'html':\r\n ( function () {\r\n var logContent = [];\r\n var divLogger = document.createElement( 'div' );\r\n var codeElement = document.createElement( 'pre' );\r\n document.addEventListener( 'DOMContentLoaded', function () {\r\n document.body.appendChild( divLogger );\r\n divLogger.appendChild( codeElement );\r\n } );\r\n var logFunc = function ( str ) {\r\n logContent.unshift( str );\r\n codeElement.innerHTML = logContent.join( '\\n' );\r\n };\r\n divLogger.style.overflow = 'hidden';\r\n divLogger.style.position = 'absolute';\r\n divLogger.style.zIndex = '10000';\r\n divLogger.style.height = '100%';\r\n divLogger.style.maxWidth = '600px';\r\n codeElement.style.overflow = 'scroll';\r\n codeElement.style.width = '105%';\r\n codeElement.style.height = '100%';\r\n codeElement.style.fontSize = '10px';\r\n\r\n [ 'log', 'error', 'warn', 'info', 'debug' ].forEach( function ( value ) {\r\n window.console[ value ] = logFunc;\r\n } );\r\n } )();\r\n break;\r\n }\r\n }\r\n\r\n return options;\r\n } )();\r\n\r\n\r\n var Viewer = function ( canvas, userOptions, error ) {\r\n View.call( this );\r\n\r\n this._startFrameTick = undefined;\r\n this._startTick = Timer.instance().tick();\r\n this._stats = new Stats( 'Viewer' );\r\n this._canvasStats = undefined;\r\n this._done = false;\r\n\r\n var options = this.initOptions( userOptions );\r\n var gl = this.initWebGLContext( canvas, options, error );\r\n\r\n if ( !gl )\r\n throw 'No WebGL implementation found';\r\n\r\n // this MACROUTILS.init(); should be removed and replace by something\r\n // more natural\r\n MACROUTILS.init();\r\n\r\n this.initDeviceEvents( options, canvas );\r\n this.initStats( options, canvas );\r\n\r\n this._updateVisitor = new UpdateVisitor();\r\n\r\n this.setUpView( gl.canvas, options );\r\n };\r\n\r\n\r\n Viewer.prototype = MACROUTILS.objectInherit( View.prototype, {\r\n\r\n initDeviceEvents: function ( options, canvas ) {\r\n\r\n // default argument for mouse binding\r\n var defaultMouseEventNode = options.mouseEventNode || canvas;\r\n\r\n var eventsBackend = options.EventBackend || {};\r\n if ( !options.EventBackend ) options.EventBackend = eventsBackend;\r\n eventsBackend.StandardMouseKeyboard = options.EventBackend.StandardMouseKeyboard || {};\r\n var mouseEventNode = eventsBackend.StandardMouseKeyboard.mouseEventNode || defaultMouseEventNode;\r\n eventsBackend.StandardMouseKeyboard.mouseEventNode = mouseEventNode;\r\n eventsBackend.StandardMouseKeyboard.keyboardEventNode = eventsBackend.StandardMouseKeyboard.keyboardEventNode || document;\r\n\r\n // hammer, Only activate it if we have a touch device in order to fix problems with IE11\r\n if ( 'ontouchstart' in window ) {\r\n eventsBackend.Hammer = eventsBackend.Hammer || {};\r\n eventsBackend.Hammer.eventNode = eventsBackend.Hammer.eventNode || defaultMouseEventNode;\r\n }\r\n // gamepad\r\n eventsBackend.GamePad = eventsBackend.GamePad || {};\r\n\r\n this._eventProxy = this.initEventProxy( options );\r\n },\r\n\r\n initOptions: function ( userOptions ) {\r\n // use default options\r\n var options = new Options();\r\n\r\n if ( userOptions ) {\r\n // user options override by user options\r\n options.extend( userOptions );\r\n }\r\n\r\n // if url options override url options\r\n options.extend( OptionsURL );\r\n\r\n\r\n // Check if Frustum culling is enabled to calculate the clip planes\r\n if ( options.getBoolean( 'enableFrustumCulling' ) === true )\r\n this.getCamera().getRenderer().getCullVisitor().setEnableFrustumCulling( true );\r\n\r\n\r\n return options;\r\n },\r\n\r\n initWebGLContext: function ( canvas, options, error ) {\r\n\r\n // #FIXME see tojiro's blog for webgl lost context stuffs\r\n if ( options.get( 'SimulateWebGLLostContext' ) ) {\r\n canvas = WebGLDebugUtils.makeLostContextSimulatingCanvas( canvas );\r\n canvas.loseContextInNCalls( options.get( 'SimulateWebGLLostContext' ) );\r\n }\r\n\r\n var gl = WebGLUtils.setupWebGL( canvas, options, error );\r\n\r\n canvas.addEventListener( 'webglcontextlost', function ( event ) {\r\n this.contextLost();\r\n event.preventDefault();\r\n }.bind( this ), false );\r\n\r\n canvas.addEventListener( 'webglcontextrestored', function () {\r\n this.contextRestored();\r\n }.bind( this ), false );\r\n\r\n if ( Notify.reportWebGLError || options.get( 'reportWebGLError' ) ) {\r\n gl = WebGLDebugUtils.makeDebugContext( gl );\r\n }\r\n\r\n this.initWebGLCaps( gl );\r\n this.setGraphicContext( gl );\r\n\r\n return gl;\r\n },\r\n\r\n contextLost: function () {\r\n Notify.log( 'webgl context lost' );\r\n window.cancelRequestAnimFrame( this._requestID );\r\n },\r\n contextRestored: function () {\r\n Notify.log( 'webgl context restored, but not supported - reload the page' );\r\n },\r\n\r\n init: function () {\r\n //this._done = false;\r\n },\r\n\r\n getState: function () {\r\n return this.getCamera().getRenderer().getState();\r\n },\r\n\r\n initStats: function ( options, canvas ) {\r\n\r\n if ( !options.getBoolean( 'stats' ) )\r\n return;\r\n\r\n var maxMS = 20;\r\n var stepMS = 2;\r\n //var fontsize = 14;\r\n\r\n if ( options.statsMaxMS !== undefined ) {\r\n maxMS = parseInt( options.statsMaxMS, 10 );\r\n }\r\n if ( options.statsStepMS !== undefined ) {\r\n stepMS = parseInt( options.statsStepMS, 10 );\r\n }\r\n\r\n var createDomElements = function ( elementToAppend ) {\r\n var id = Math.floor( Math.random() * 1000 );\r\n\r\n var gridID = 'StatsCanvasGrid' + id.toString();\r\n var statsCanvasID = 'StatsCanvas' + id.toString();\r\n var statsCanvasTextID = 'StatsCanvasText' + id.toString();\r\n\r\n var dom = [\r\n '
',\r\n '
',\r\n options.getBoolean( 'statsNoGraph' ) ? '' : '',\r\n options.getBoolean( 'statsNoGraph' ) ? '' : '',\r\n '',\r\n '
',\r\n\r\n '
'\r\n ].join( '\\n' );\r\n\r\n\r\n var parent;\r\n\r\n if ( elementToAppend === undefined ) {\r\n parent = document.body;\r\n } else {\r\n parent = elementToAppend;\r\n }\r\n\r\n var mydiv = document.createElement( 'div' );\r\n mydiv.innerHTML = dom;\r\n parent.appendChild( mydiv );\r\n\r\n if ( options.getBoolean( 'statsNoGraph' ) ) {\r\n return {\r\n text: document.getElementById( statsCanvasTextID )\r\n };\r\n }\r\n\r\n var grid = document.getElementById( gridID );\r\n var ctx = grid.getContext( '2d' );\r\n ctx.clearRect( 0, 0, grid.width, grid.height );\r\n\r\n var step = Math.floor( maxMS / stepMS ).toFixed( 0 );\r\n var r = grid.height / step;\r\n ctx.strokeStyle = 'rgb(70,70,70)';\r\n for ( var i = 0, l = step; i < l; i++ ) {\r\n ctx.beginPath();\r\n ctx.moveTo( 0, i * r );\r\n ctx.lineTo( grid.width, i * r );\r\n ctx.stroke();\r\n }\r\n\r\n return {\r\n graph: document.getElementById( statsCanvasID ),\r\n text: document.getElementById( statsCanvasTextID )\r\n };\r\n };\r\n\r\n var elementToAttach = canvas.parentNode;\r\n var domStats = createDomElements( elementToAttach );\r\n var canvasStats = new CanvasStats( domStats.graph, domStats.text );\r\n\r\n canvasStats.addLayer( '#ff0fff', 65,\r\n function ( /*t*/) {\r\n var fn = this.getFrameStamp().getFrameNumber() - 1;\r\n var value = this.getViewerStats().getAveragedAttribute( fn - 25, fn, 'Frame rate' );\r\n return value;\r\n }.bind( this ),\r\n function ( a ) {\r\n return 'FrameRate: ' + ( a ).toFixed( 0 ) + ' fps';\r\n } );\r\n\r\n canvasStats.addLayer( '#ffff00', maxMS,\r\n function ( /*t*/) {\r\n var fn = this.getFrameStamp().getFrameNumber() - 1;\r\n var value = this.getViewerStats().getAttribute( fn, 'Frame duration' );\r\n return value * 1000.0;\r\n }.bind( this ),\r\n function ( a ) {\r\n return 'FrameTime: ' + a.toFixed( 2 ) + ' ms';\r\n } );\r\n\r\n canvasStats.addLayer( '#d07b1f', maxMS,\r\n function ( /*t*/) {\r\n var fn = this.getFrameStamp().getFrameNumber() - 1;\r\n var value = this.getViewerStats().getAttribute( fn, 'Update duration' );\r\n return value * 1000.0;\r\n }.bind( this ),\r\n function ( a ) {\r\n return 'UpdateTime: ' + a.toFixed( 2 ) + ' ms';\r\n } );\r\n\r\n canvasStats.addLayer( '#73e0ff', maxMS,\r\n function ( /*t*/) {\r\n var fn = this.getFrameStamp().getFrameNumber() - 1;\r\n var value = this.getViewerStats().getAttribute( fn, 'Cull duration' );\r\n return value * 1000.0;\r\n }.bind( this ),\r\n function ( a ) {\r\n return 'CullTime: ' + a.toFixed( 2 ) + ' ms';\r\n } );\r\n\r\n canvasStats.addLayer( '#ff0000', maxMS,\r\n function ( /*t*/) {\r\n var fn = this.getFrameStamp().getFrameNumber() - 1;\r\n var value = this.getViewerStats().getAttribute( fn, 'Draw duration' );\r\n return value * 1000.0;\r\n }.bind( this ),\r\n function ( a ) {\r\n return 'DrawTime: ' + a.toFixed( 2 ) + ' ms';\r\n } );\r\n\r\n canvasStats.addLayer( '#f0f000', 256,\r\n function ( /*t*/) {\r\n var fn = this.getFrameStamp().getFrameNumber() - 1;\r\n var stats = Texture.getTextureManager( this.getGraphicContext() ).getStats();\r\n var value = stats.getAttribute( fn, 'Texture used' );\r\n return value / ( 1024 * 1024 );\r\n }.bind( this ),\r\n function ( a ) {\r\n return 'Texture used: ' + a.toFixed( 2 ) + ' MB';\r\n } );\r\n\r\n canvasStats.addLayer( '#f00f00', 256,\r\n function ( /*t*/) {\r\n var fn = this.getFrameStamp().getFrameNumber() - 1;\r\n var stats = Texture.getTextureManager( this.getGraphicContext() ).getStats();\r\n var value = stats.getAttribute( fn, 'Texture total' );\r\n return value / ( 1024 * 1024 );\r\n }.bind( this ),\r\n function ( a ) {\r\n return 'Texture total: ' + a.toFixed( 2 ) + ' MB';\r\n } );\r\n\r\n if ( window.performance && window.performance.memory && window.performance.memory.totalJSHeapSize ) {\r\n canvasStats.addLayer( '#00ff00',\r\n window.performance.memory.totalJSHeapSize,\r\n function ( /*t*/) {\r\n var fn = this.getFrameStamp().getFrameNumber() - 1;\r\n var value = this.getViewerStats().getAttribute( fn, 'Heap size' );\r\n return value;\r\n }.bind( this ),\r\n function ( a ) {\r\n var v = a / ( 1024 * 1024 );\r\n return 'Memory : ' + v.toFixed( 2 ) + ' Mb';\r\n } );\r\n }\r\n this._canvasStats = canvasStats;\r\n\r\n },\r\n\r\n getViewerStats: function () {\r\n return this._stats;\r\n },\r\n\r\n renderingTraversal: function () {\r\n\r\n var frameNumber = this.getFrameStamp().getFrameNumber();\r\n\r\n if ( this.getScene().getSceneData() )\r\n this.getScene().getSceneData().getBound();\r\n\r\n if ( this.getCamera() ) {\r\n\r\n var tick0 = Timer.instance().tick();\r\n this.getCamera().getRenderer().cull();\r\n\r\n var tick1 = Timer.instance().tick();\r\n this.getViewerStats().setAttribute( frameNumber, 'Cull duration', Timer.instance().deltaS( tick0, tick1 ) );\r\n\r\n this.getCamera().getRenderer().draw();\r\n\r\n var tick2 = Timer.instance().tick();\r\n this.getViewerStats().setAttribute( frameNumber, 'Draw duration', Timer.instance().deltaS( tick1, tick2 ) );\r\n }\r\n },\r\n\r\n\r\n updateTraversal: function () {\r\n\r\n var startTraversal = Timer.instance().tick();\r\n // update the scene\r\n this.getScene().updateSceneGraph( this._updateVisitor );\r\n // Remove ExpiredSubgraphs from DatabasePager\r\n this.getDatabasePager().releaseGLExpiredSubgraphs( 0.005 );\r\n // In OSG this.is deferred until the draw traversal, to handle multiple contexts\r\n this.flushDeletedGLObjects( 0.005 );\r\n var deltaS = Timer.instance().deltaS( startTraversal, Timer.instance().tick() );\r\n\r\n this.getViewerStats().setAttribute( this.getFrameStamp().getFrameNumber(), 'Update duration', deltaS );\r\n },\r\n\r\n advance: function ( simulationTime ) {\r\n\r\n var sTime = simulationTime;\r\n\r\n if ( sTime === undefined )\r\n sTime = Number.MAX_VALUE;\r\n\r\n var frameStamp = this._frameStamp;\r\n var previousReferenceTime = frameStamp.getReferenceTime();\r\n var previousFrameNumber = frameStamp.getFrameNumber();\r\n\r\n frameStamp.setFrameNumber( previousFrameNumber + 1 );\r\n\r\n var deltaS = Timer.instance().deltaS( this._startTick, Timer.instance().tick() );\r\n frameStamp.setReferenceTime( deltaS );\r\n\r\n // reference time\r\n if ( sTime === Number.MAX_VALUE )\r\n frameStamp.setSimulationTime( frameStamp.getReferenceTime() );\r\n else\r\n frameStamp.setSimulationTime( sTime );\r\n\r\n var deltaFrameTime = frameStamp.getReferenceTime() - previousReferenceTime;\r\n this.getViewerStats().setAttribute( previousFrameNumber, 'Frame rate', 1.0 / deltaFrameTime );\r\n },\r\n\r\n beginFrame: function () {\r\n this._startFrameTick = Timer.instance().tick();\r\n },\r\n\r\n endFrame: function () {\r\n\r\n var frameNumber = this.getFrameStamp().getFrameNumber();\r\n\r\n if ( window.performance &&\r\n window.performance.memory &&\r\n window.performance.memory.usedJSHeapSize ) {\r\n var mem = window.performance.memory.usedJSHeapSize;\r\n this.getViewerStats().setAttribute( frameNumber, 'Heap size', mem );\r\n }\r\n\r\n this.getViewerStats().setAttribute( frameNumber, 'Frame duration', Timer.instance().deltaS( this._startFrameTick, Timer.instance().tick() ) );\r\n\r\n if ( this._canvasStats ) { // update ui stats\r\n Texture.getTextureManager( this.getGraphicContext() ).updateStats( frameNumber );\r\n this._canvasStats.update();\r\n }\r\n },\r\n\r\n checkNeedToDoFrame: function () {\r\n return this._requestContinousUpdate || this._requestRedraw;\r\n },\r\n\r\n frame: function () {\r\n\r\n this.beginFrame();\r\n\r\n this.advance();\r\n\r\n // update viewport if a resize occured\r\n var canvasSizeChanged = this.updateViewport();\r\n\r\n // update inputs devices\r\n this.updateEventProxy( this._eventProxy, this.getFrameStamp() );\r\n\r\n // setup framestamp\r\n this._updateVisitor.setFrameStamp( this.getFrameStamp() );\r\n // Update Manipulator/Event\r\n if ( this.getManipulator() ) {\r\n this.getManipulator().update( this._updateVisitor );\r\n Matrix.copy( this.getManipulator().getInverseMatrix(), this.getCamera().getViewMatrix() );\r\n }\r\n\r\n if ( this.checkNeedToDoFrame() || canvasSizeChanged ) {\r\n this._requestRedraw = false;\r\n this.updateTraversal();\r\n this.renderingTraversal();\r\n }\r\n\r\n this.endFrame();\r\n },\r\n\r\n setDone: function ( bool ) {\r\n this._done = bool;\r\n },\r\n done: function () {\r\n return this._done;\r\n },\r\n\r\n run: function () {\r\n var self = this;\r\n var render = function () {\r\n if ( !self.done() ) {\r\n self._requestID = window.requestAnimationFrame( render, self.getGraphicContext().canvas );\r\n self.frame();\r\n }\r\n };\r\n render();\r\n },\r\n\r\n setupManipulator: function ( manipulator /*, dontBindDefaultEvent */ ) {\r\n if ( manipulator === undefined ) {\r\n manipulator = new OrbitManipulator();\r\n }\r\n\r\n if ( manipulator.setNode !== undefined ) {\r\n manipulator.setNode( this.getSceneData() );\r\n } else {\r\n // for backward compatibility\r\n manipulator.view = this;\r\n }\r\n\r\n manipulator.setCamera( this.getCamera() );\r\n this.setManipulator( manipulator );\r\n },\r\n\r\n\r\n // updateViewport\r\n updateViewport: function () {\r\n\r\n var gl = this.getGraphicContext();\r\n var canvas = gl.canvas;\r\n\r\n var hasChanged = this.computeCanvasSize( canvas );\r\n if ( !hasChanged )\r\n return false;\r\n\r\n var camera = this.getCamera();\r\n var vp = camera.getViewport();\r\n\r\n var prevWidth = vp.width();\r\n var prevHeight = vp.height();\r\n\r\n var widthChangeRatio = canvas.width / prevWidth;\r\n var heightChangeRatio = canvas.height / prevHeight;\r\n var aspectRatioChange = widthChangeRatio / heightChangeRatio;\r\n vp.setViewport( vp.x() * widthChangeRatio, vp.y() * heightChangeRatio, vp.width() * widthChangeRatio, vp.height() * heightChangeRatio );\r\n\r\n if ( aspectRatioChange !== 1.0 ) {\r\n Matrix.preMult( camera.getProjectionMatrix(), Matrix.makeScale( 1.0 / aspectRatioChange, 1.0, 1.0, Matrix.create() ) );\r\n }\r\n\r\n return true;\r\n },\r\n\r\n // intialize all input devices\r\n initEventProxy: function ( argsObject ) {\r\n var args = argsObject || {};\r\n var deviceEnabled = {};\r\n\r\n var lists = EventProxy;\r\n var argumentEventBackend = args.EventBackend;\r\n\r\n\r\n // loop on each devices and try to initialize it\r\n var keys = window.Object.keys( lists );\r\n for ( var i = 0, l = keys.length; i < l; i++ ) {\r\n var device = keys[ i ];\r\n\r\n // check if the config has a require\r\n var initialize = true;\r\n var argDevice = {};\r\n if ( argumentEventBackend && ( argumentEventBackend[ device ] !== undefined ) ) {\r\n initialize = argumentEventBackend[ device ].enable || true;\r\n argDevice = argumentEventBackend[ device ];\r\n }\r\n\r\n // extend argDevice with regular options eg:\r\n // var options = {\r\n // EventBackend: {\r\n // Hammer: {\r\n // drag_max_touches: 4,\r\n // transform_min_scale: 0.08,\r\n // transform_min_rotation: 180,\r\n // transform_always_block: true\r\n // }\r\n // },\r\n // zoomscroll: false\r\n // };\r\n\r\n // to options merged:\r\n // var options = {\r\n // drag_max_touches: 4,\r\n // transform_min_scale: 0.08,\r\n // transform_min_rotation: 180,\r\n // transform_always_block: true,\r\n // zoomscroll: false\r\n // };\r\n //\r\n var options = new Options();\r\n options.extend( argDevice ).extend( argsObject );\r\n delete options.EventBackend;\r\n\r\n if ( initialize ) {\r\n var inputDevice = new lists[ device ]( this );\r\n inputDevice.init( options );\r\n deviceEnabled[ device ] = inputDevice;\r\n }\r\n }\r\n return deviceEnabled;\r\n },\r\n updateEventProxy: function ( list, frameStamp ) {\r\n var keys = window.Object.keys( list );\r\n keys.forEach( function ( key ) {\r\n var device = list[ key ];\r\n if ( device.update )\r\n device.update( frameStamp );\r\n } );\r\n }\r\n\r\n } );\r\n\r\n return Viewer;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgViewer/Viewer.js\n ** module id = 150\n ** module chunks = 0 1\n **/","define( [\r\n 'osgViewer/eventProxy/GamePad',\r\n 'osgViewer/eventProxy/Hammer',\r\n 'osgViewer/eventProxy/LeapMotion',\r\n 'osgViewer/eventProxy/StandardMouseKeyboard',\r\n 'osgViewer/eventProxy/Oculus',\r\n 'osgViewer/eventProxy/DeviceOrientation'\r\n], function ( GamePad, HammerOsg, LeapMotion, StandardMouseKeyboard, Oculus, DeviceOrientation ) {\r\n\r\n return {\r\n GamePad: GamePad,\r\n Hammer: HammerOsg,\r\n LeapMotion: LeapMotion,\r\n StandardMouseKeyboard: StandardMouseKeyboard,\r\n Oculus: Oculus,\r\n DeviceOrientation: DeviceOrientation\r\n };\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgViewer/eventProxy/EventProxy.js\n ** module id = 151\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Notify',\r\n 'osg/Utils',\r\n 'osg/Uniform',\r\n 'osgShader/nodeFactory'\r\n\r\n], function ( Notify, MACROUTILS, Uniform, factory ) {\r\n 'use strict';\r\n\r\n var Compiler = function ( attributes, textureAttributes, shaderProcessor ) {\r\n this._attributes = attributes;\r\n this._textureAttributes = textureAttributes;\r\n\r\n this._variables = {};\r\n this._vertexShader = [];\r\n this._fragmentShader = [];\r\n\r\n // global stuffs\r\n this._shaderProcessor = shaderProcessor;\r\n this._texturesByName = {};\r\n\r\n // TODO: Have to handle better textures\r\n // 4 separate loop over texture list: one here, one for declareTexture, 2 for vertexShader (varying decl + varying store)\r\n // (not counting loops done above in shader generator)\r\n\r\n this._shadowsTextures = [];\r\n this._lights = [];\r\n this._shadows = [];\r\n this._textures = [];\r\n this._material = null;\r\n\r\n this.initAttributes();\r\n this.initTextureAttributes();\r\n };\r\n\r\n Compiler.prototype = {\r\n\r\n initAttributes: function () {\r\n var attributes = this._attributes;\r\n // separate Material / Light / Texture\r\n // because this shader generator is specific for this\r\n var lights = this._lights;\r\n var shadows = this._shadows;\r\n for ( var i = 0, l = attributes.length; i < l; i++ ) {\r\n\r\n var type = attributes[ i ].className();\r\n\r\n // Test one light at a time\r\n if ( type === 'Light' ) { // && lights.length === 0) {\r\n\r\n lights.push( attributes[ i ] );\r\n\r\n } else if ( type === 'Material' ) {\r\n\r\n this._material = attributes[ i ];\r\n\r\n } else if ( type === 'ShadowAttribute' ) {\r\n shadows.push( attributes[ i ] );\r\n }\r\n }\r\n },\r\n\r\n initTextureAttributes: function () {\r\n var textureAttributes = this._textureAttributes;\r\n var texturesNum = textureAttributes.length;\r\n var textures = this._textures;\r\n var shadowTextures = this._shadowsTextures;\r\n textures.length = shadowTextures.length = texturesNum;\r\n\r\n for ( var j = 0; j < texturesNum; j++ ) {\r\n\r\n var tu = textureAttributes[ j ];\r\n if ( tu === undefined )\r\n continue;\r\n\r\n for ( var t = 0, tl = tu.length; t < tl; t++ ) {\r\n\r\n var tuTarget = tu[ t ];\r\n\r\n var tType = tuTarget.className();\r\n\r\n var texUnit;\r\n var tName;\r\n if ( tType === 'Texture' ) {\r\n\r\n texUnit = j;\r\n tName = tuTarget.getName();\r\n if ( tuTarget.getName() === undefined ) {\r\n tName = tType + texUnit;\r\n tuTarget.setName( tName );\r\n }\r\n textures[ texUnit ] = tuTarget;\r\n\r\n\r\n this._texturesByName[ tName ] = {\r\n variable: undefined,\r\n textureUnit: texUnit\r\n };\r\n\r\n } else if ( tType === 'ShadowTexture' ) {\r\n\r\n texUnit = j;\r\n tName = tuTarget.getName();\r\n if ( tuTarget.getName() === undefined ) {\r\n tName = tType + texUnit;\r\n tuTarget.setName( tName );\r\n }\r\n shadowTextures[ texUnit ] = tuTarget;\r\n\r\n this._texturesByName[ tName ] = {\r\n 'variable': undefined,\r\n 'textureUnit': texUnit,\r\n 'shadow': true\r\n };\r\n }\r\n // TODO: cubemap\r\n\r\n }\r\n }\r\n },\r\n\r\n getVariable: function ( name ) {\r\n return this._variables[ name ];\r\n },\r\n\r\n getAttributeType: function ( type ) {\r\n\r\n for ( var i = 0; i < this._attributes.length; i++ ) {\r\n if ( this._attributes[ i ].getType() === type )\r\n return this._attributes[ i ];\r\n }\r\n return undefined;\r\n\r\n },\r\n\r\n\r\n // if doesn't exist create a new on\r\n // if name given and var already exist, create a varname +\r\n createVariable: function ( type, varname, deepness ) {\r\n\r\n var name = varname;\r\n\r\n if ( name === undefined ) {\r\n\r\n var len = Object.keys( this._variables ).length;\r\n name = 'tmp_' + len;\r\n\r\n } else if ( this._variables[ name ] ) {\r\n // create a new variable\r\n // if we want to reuse a variable we should NOT\r\n // call this function in the first place and do the\r\n // test before...\r\n // however for uniform, varying and sampler, we return\r\n // the variable if it already exists, because they are\r\n // meant to be read only\r\n name = name + deepness;\r\n if ( deepness === undefined ) {\r\n return this.createVariable( type, varname, 1 );\r\n } else if ( this._variables[ name ] ) {\r\n deepness++;\r\n return this.createVariable( type, varname, deepness );\r\n }\r\n\r\n }\r\n\r\n var v = factory.getNode( 'Variable', type, name );\r\n this._variables[ name ] = v;\r\n return v;\r\n },\r\n\r\n // Map of uniform from a StateAttribute or TextureStateAttribute\r\n getOrCreateUniformFromUniformMap: function ( uniforms, prefix ) {\r\n var keys = Object.keys( uniforms );\r\n var object = {};\r\n\r\n var prefixUniform = prefix ? prefix : '';\r\n\r\n for ( var i = 0; i < keys.length; i++ ) {\r\n var k = prefixUniform + keys[ i ];\r\n object[ k ] = this.getOrCreateUniform( uniforms[ keys[ i ] ] );\r\n }\r\n\r\n return object;\r\n },\r\n\r\n // specialized for texture, enforcing last parameter usage.\r\n getOrCreateTextureStateAttributeUniforms: function ( stateAttribute, prefix, unit ) {\r\n\r\n var uniforms = stateAttribute.getOrCreateUniforms( unit );\r\n return this.getOrCreateUniformFromUniformMap( uniforms, prefix );\r\n },\r\n\r\n getOrCreateStateAttributeUniforms: function ( stateAttribute, prefix ) {\r\n\r\n var uniforms = stateAttribute.getOrCreateUniforms();\r\n return this.getOrCreateUniformFromUniformMap( uniforms, prefix );\r\n },\r\n\r\n getOrCreateUniform: function ( type, varname ) {\r\n\r\n var name = varname;\r\n\r\n // accept uniform as parameter to simplify code\r\n if ( type instanceof Uniform ) {\r\n\r\n var uniform = type;\r\n type = uniform.getType();\r\n name = uniform.getName();\r\n\r\n } else if ( name === undefined ) {\r\n\r\n var len = Object.keys( this._variables ).length;\r\n name = 'tmp_' + len;\r\n\r\n }\r\n\r\n var exist = this._variables[ name ];\r\n if ( exist ) {\r\n // see comment in Variable function\r\n return exist;\r\n }\r\n\r\n var v = factory.getNode( 'Uniform', type, name );\r\n this._variables[ name ] = v;\r\n return v;\r\n },\r\n\r\n\r\n getOrCreateVarying: function ( type, varname ) {\r\n\r\n var name = varname;\r\n if ( name === undefined ) {\r\n\r\n var len = Object.keys( this._variables ).length;\r\n name = 'tmp_' + len;\r\n\r\n } else {\r\n\r\n var exist = this._variables[ name ];\r\n if ( exist ) {\r\n // see comment in Variable function\r\n return exist;\r\n }\r\n\r\n }\r\n var v = factory.getNode( 'Varying', type, name );\r\n this._variables[ name ] = v;\r\n return v;\r\n },\r\n\r\n\r\n getOrCreateSampler: function ( type, varname ) {\r\n\r\n var name = varname;\r\n if ( name === undefined ) {\r\n\r\n var len = Object.keys( this._variables ).length;\r\n name = 'sampler_' + len;\r\n\r\n } else {\r\n\r\n var exist = this._variables[ name ];\r\n if ( exist ) {\r\n // see comment in Variable function\r\n return exist;\r\n }\r\n\r\n }\r\n var v = factory.getNode( 'Sampler', type, name );\r\n this._variables[ name ] = v;\r\n return v;\r\n },\r\n\r\n declareAttributeUniforms: function ( attribute ) {\r\n\r\n var uniformMap = attribute.getOrCreateUniforms();\r\n var uniformMapKeys = uniformMap.getKeys();\r\n\r\n for ( var m = 0, ml = uniformMapKeys.length; m < ml; m++ ) {\r\n\r\n var kk = uniformMapKeys[ m ];\r\n var kkey = uniformMap[ kk ];\r\n this.getOrCreateUniform( kkey.type, kkey.name );\r\n\r\n }\r\n\r\n },\r\n\r\n declareUniforms: function () {\r\n\r\n if ( this._material ) {\r\n this.declareAttributeUniforms( this._material );\r\n }\r\n var t;\r\n for ( t = 0; t < this._lights.length; t++ ) {\r\n this.declareAttributeUniforms( this._lights[ t ] );\r\n }\r\n for ( t = 0; t < this._shadows.length; t++ ) {\r\n this.declareAttributeUniforms( this._shadows[ t ] );\r\n }\r\n /*\r\n for ( t = 0; t < this._shadowsTextures.length; t++ ) {\r\n if ( this._shadowsTextures[ t ] !== undefined ) {\r\n this.declareAttributeUniforms( this._shadowsTextures[ t ] );\r\n }\r\n }\r\n*/\r\n\r\n },\r\n\r\n\r\n getOrCreateInputNormal: function () {\r\n return this.getOrCreateVarying( 'vec3', 'FragNormal' );\r\n },\r\n\r\n\r\n getOrCreateFrontNormal: function () {\r\n var inputNormal = this.getOrCreateInputNormal();\r\n var frontNormal = this.createVariable( 'vec3', 'frontNormal' );\r\n\r\n factory.getNode( 'FrontNormal' ).inputs( {\r\n normal: inputNormal\r\n } ).outputs( {\r\n normal: frontNormal\r\n } );\r\n\r\n return frontNormal;\r\n },\r\n\r\n\r\n getOrCreateInputPosition: function () {\r\n return this.getOrCreateVarying( 'vec3', 'FragEyeVector' );\r\n },\r\n\r\n\r\n getOrCreateNormalizedNormal: function () {\r\n var normal = this._variables[ 'normal' ];\r\n if ( normal )\r\n return normal;\r\n this.normalizeNormalAndEyeVector();\r\n return this._variables[ 'normal' ];\r\n },\r\n\r\n\r\n getOrCreateNormalizedPosition: function () {\r\n var eye = this._variables[ 'eyeVector' ];\r\n if ( eye )\r\n return eye;\r\n this.normalizeNormalAndEyeVector();\r\n return this._variables[ 'eyeVector' ];\r\n },\r\n\r\n\r\n // It should be called by getOrCreateNormalizedNormal or getOrCreateNormalizedPosition ONLY\r\n normalizeNormalAndEyeVector: function () {\r\n\r\n var frontNormal = this.getOrCreateFrontNormal();\r\n var inputPosition = this.getOrCreateInputPosition();\r\n\r\n // get or create normalized normal\r\n var outputNormal = this.createVariable( 'vec3', 'normal' );\r\n\r\n // get or create normalized position\r\n var outputPosition = this.createVariable( 'vec3', 'eyeVector' );\r\n\r\n //\r\n factory.getNode( 'NormalizeNormalAndEyeVector' ).inputs( {\r\n normal: frontNormal,\r\n position: inputPosition\r\n } ).outputs( {\r\n normal: outputNormal,\r\n eyeVector: outputPosition\r\n } );\r\n\r\n },\r\n\r\n\r\n getPremultAlpha: function ( finalColor, alpha ) {\r\n\r\n if ( alpha === undefined )\r\n return finalColor;\r\n\r\n var premultAlpha = this.createVariable( 'vec4' );\r\n\r\n factory.getNode( 'PreMultAlpha' ).inputs( {\r\n color: finalColor,\r\n alpha: alpha\r\n } ).outputs( {\r\n color: premultAlpha\r\n } );\r\n\r\n return premultAlpha;\r\n },\r\n\r\n\r\n getColorsRGB: function ( finalColor ) {\r\n var finalSrgbColor = this.createVariable( 'vec3' );\r\n factory.getNode( 'LinearTosRGB' ).inputs( {\r\n color: finalColor\r\n } ).outputs( {\r\n color: finalSrgbColor\r\n } );\r\n\r\n return finalSrgbColor;\r\n },\r\n\r\n\r\n // Declare variable / varying to handle vertex color\r\n // return a variable that contains the following operation\r\n // newDiffuseColor = diffuseColor * vertexColor\r\n // TODO: this code should move in the shader instead\r\n getVertexColor: function ( diffuseColor ) {\r\n\r\n if ( diffuseColor === undefined )\r\n return undefined;\r\n\r\n var vertexColor = this.getOrCreateVarying( 'vec4', 'VertexColor' );\r\n var vertexColorUniform = this.getOrCreateUniform( 'float', 'ArrayColorEnabled' );\r\n var tmp = this.createVariable( 'vec4' );\r\n\r\n var str = [ '',\r\n '%color.rgb = %diffuse.rgb;',\r\n 'if ( %hasVertexColor == 1.0)',\r\n ' %color *= %vertexColor.rgba;'\r\n ].join( '\\n' );\r\n\r\n factory.getNode( 'InlineCode' ).code( str ).inputs( {\r\n diffuse: diffuseColor,\r\n hasVertexColor: vertexColorUniform,\r\n vertexColor: vertexColor\r\n } ).outputs( {\r\n color: tmp\r\n } ).comment( 'diffuse color = diffuse color * vertex color' );\r\n\r\n return tmp;\r\n },\r\n\r\n\r\n getDiffuseColorFromTextures: function () {\r\n\r\n var texturesInput = [];\r\n var textures = this._texturesByName;\r\n\r\n var keys = Object.keys( textures );\r\n for ( var i = 0; i < keys.length; i++ ) {\r\n var texture = textures[ keys[ i ] ];\r\n\r\n if ( !texture )\r\n continue;\r\n\r\n if ( texture.shadow )\r\n continue;\r\n\r\n texturesInput.push( texture.variable );\r\n }\r\n\r\n // if multi texture multiply them all with diffuse\r\n // but if only one, return the first\r\n if ( texturesInput.length > 1 ) {\r\n\r\n var texAccum = this.createVariable( 'vec3', 'texDiffuseAccum' );\r\n\r\n factory.getNode( 'Mult' ).inputs( texturesInput ).outputs( texAccum );\r\n return texAccum;\r\n\r\n } else if ( texturesInput.length === 1 ) {\r\n\r\n return texturesInput[ 0 ];\r\n }\r\n\r\n return undefined;\r\n },\r\n\r\n\r\n // return the first texture valid in texture unit\r\n getFirstValidTexture: function () {\r\n\r\n var keys = Object.keys( this._texturesByName );\r\n if ( !keys.length )\r\n return undefined;\r\n\r\n return this._texturesByName[ keys[ 0 ] ].variable;\r\n\r\n },\r\n\r\n\r\n\r\n // declare sampler2D or samplerCube\r\n // declare varying FragTexCoordX corresponding to the texture unit\r\n // create a textureNode that could be referenced later by the compiler\r\n declareTexture: function ( unit, texture ) {\r\n\r\n var samplerName = 'Texture' + unit.toString();\r\n var textureSampler = this.getVariable( samplerName );\r\n\r\n if ( textureSampler === undefined ) {\r\n\r\n if ( texture.className() === 'Texture' ) {\r\n textureSampler = this.getOrCreateSampler( 'sampler2D', samplerName );\r\n } else if ( texture.className() === 'TextureCubeMap' ) {\r\n textureSampler = this.getOrCreateSampler( 'samplerCube', samplerName );\r\n } else if ( texture.className() === 'ShadowTexture' ) {\r\n textureSampler = this.getOrCreateSampler( 'sampler2D', samplerName );\r\n // return now to prevent creation of useless FragTexCoord\r\n //( shadow creates its own texcoord)\r\n return;\r\n }\r\n\r\n\r\n }\r\n\r\n // texture coordinates are automatically mapped to unit texture number\r\n // it means that for Texture0 we will search for FragTexCoord0,\r\n // Texture1 -> FragTexCoord1 ...\r\n var texCoordUnit = unit;\r\n var texCoord = this.getVariable( 'FragTexCoord' + texCoordUnit );\r\n if ( texCoord === undefined ) {\r\n texCoord = this.getOrCreateVarying( 'vec2', 'FragTexCoord' + texCoordUnit );\r\n }\r\n\r\n // instanciate and reference a texture node\r\n var output = this.createTextureRGBA( texture, textureSampler, texCoord );\r\n\r\n // this part would need to be checked/updated\r\n // not sure texturesByName makes sense\r\n var name = texture.getName();\r\n if ( name === undefined ) {\r\n name = 'Texture' + texCoordUnit;\r\n }\r\n\r\n // create/update texture entry (texture, textureUnit)\r\n var textureMaterial = this._texturesByName[ name ];\r\n if ( textureMaterial === undefined ) {\r\n\r\n this._texturesByName[ name ] = {\r\n variable: output,\r\n textureUnit: unit\r\n };\r\n\r\n } else {\r\n\r\n textureMaterial.variable = output;\r\n textureMaterial.textureUnit = unit;\r\n\r\n }\r\n\r\n },\r\n\r\n // check for all textures found in the State\r\n // and reference sampler associated to texture and uv channels\r\n declareTextures: function () {\r\n\r\n var textures = this._textures;\r\n var nbTextures = textures.length;\r\n\r\n for ( var t = 0, tl = nbTextures; t < tl; t++ ) {\r\n\r\n var texture = textures[ t ];\r\n if ( !texture )\r\n continue;\r\n\r\n if ( texture.getType() === 'Texture' )\r\n this.declareTexture( t, texture );\r\n\r\n }\r\n },\r\n createShadowingLight: function ( light, inputs, lightedOutput ) {\r\n\r\n var k;\r\n var shadow;\r\n var shadowTexture;\r\n var hasShadows = false;\r\n var shadowTextures = new Array( this._shadowsTextures.length );\r\n var lightIndex = -1;\r\n\r\n // seach current light its corresponding shadow and shadowTextures.\r\n // if none, no shadow, hop we go.\r\n // TODO: harder Link shadowTexture and shadowAttribute ?\r\n // TODO: multi shadow textures for 1 light\r\n for ( k = 0; k < this._shadows.length; k++ ) {\r\n shadow = this._shadows[ k ];\r\n if ( shadow.getLight() === light ) {\r\n lightIndex = k;\r\n for ( var p = 0; p < this._shadowsTextures.length; p++ ) {\r\n shadowTexture = this._shadowsTextures[ p ];\r\n if ( shadowTexture && shadowTexture.getLightUnit() === light.getLightNumber() ) {\r\n shadowTextures[ p ] = shadowTexture;\r\n hasShadows = true;\r\n }\r\n }\r\n }\r\n\r\n }\r\n if ( !hasShadows ) return undefined;\r\n\r\n // asserted we have a shadow we do the shadow node allocation\r\n // and mult with lighted output\r\n\r\n\r\n var shadowedOutput = this.createVariable( 'float' );\r\n\r\n // shadow Attribute uniforms\r\n var shadowUniforms = this.getOrCreateStateAttributeUniforms( this._shadows[ lightIndex ], 'shadow' );\r\n inputs = MACROUTILS.objectMix( inputs, shadowUniforms );\r\n\r\n // shadowTexture Attribute uniforms AND varying\r\n var tex, shadowVertexProjected;\r\n // TODO: better handle multi texture shadow (CSM/PSM/etc.)\r\n for ( k = 0; k < shadowTextures.length; k++ ) {\r\n\r\n shadowTexture = shadowTextures[ k ];\r\n if ( shadowTexture ) {\r\n tex = this.getOrCreateSampler( 'sampler2D', shadowTexture.getName() );\r\n inputs.shadowTexture = tex;\r\n // per texture uniforms\r\n\r\n var shadowTextureUniforms = this.getOrCreateTextureStateAttributeUniforms( shadowTexture, 'shadowTexture', k );\r\n inputs = MACROUTILS.objectMix( inputs, shadowTextureUniforms );\r\n\r\n\r\n // Varyings\r\n shadowVertexProjected = this.getOrCreateVarying( 'vec4', shadowTexture.getVaryingName( 'VertexProjected' ) );\r\n var shadowVarying = {\r\n shadowVertexProjected: shadowVertexProjected,\r\n lightEyeDir: inputs.lightEyeDir,\r\n lightNDL: inputs.lightNDL\r\n };\r\n inputs = MACROUTILS.objectMix( inputs, shadowVarying );\r\n }\r\n\r\n }\r\n // TODO: shadow Attributes in node, is this the legit way\r\n factory.getNode( 'Shadow' ).inputs( inputs ).outputs( {\r\n float: shadowedOutput\r\n } ).setShadowAttribute( shadow );\r\n\r\n var lightAndShadowTempOutput = this.createVariable( 'vec3', 'lightAndShadowTempOutput' );\r\n factory.getNode( 'Mult' ).inputs( lightedOutput, shadowedOutput ).outputs( lightAndShadowTempOutput );\r\n return lightAndShadowTempOutput;\r\n\r\n },\r\n\r\n // Shared var between lights and shadows\r\n createCommonLightingVars: function ( materials, enumLights, numLights ) {\r\n\r\n if ( numLights === 0 )\r\n return {};\r\n\r\n var lighted = this.createVariable( 'bool', 'lighted' );\r\n var lightPos = this.createVariable( 'vec3', 'lightEyePos' );\r\n var lightDir = this.createVariable( 'vec3', 'lightEyeDir' );\r\n var lightNDL = this.createVariable( 'float', 'lightNDL' );\r\n\r\n return {\r\n lighted: lighted,\r\n lightEyePos: lightPos,\r\n lightEyeDir: lightDir,\r\n lightNDL: lightNDL\r\n };\r\n\r\n },\r\n\r\n createLighting: function ( materials, overrideNodeName ) {\r\n\r\n var output = this.createVariable( 'vec3' );\r\n var lightOutputVarList = [];\r\n\r\n var enumToNodeName = overrideNodeName || {\r\n DIRECTION: 'SunLight',\r\n SPOT: 'SpotLight',\r\n POINT: 'PointLight',\r\n HEMI: 'HemiLight'\r\n };\r\n\r\n var lightOutShadowIn = this.createCommonLightingVars( materials, enumToNodeName, this._lights.length );\r\n\r\n var materialUniforms = this.getOrCreateStateAttributeUniforms( this._material, 'material' );\r\n for ( var i = 0; i < this._lights.length; i++ ) {\r\n\r\n var light = this._lights[ i ];\r\n\r\n var lightedOutput = this.createVariable( 'vec3' );\r\n var nodeName = enumToNodeName[ light.getLightType() ];\r\n\r\n // create uniforms from stateAttribute and mix them with materials\r\n // to pass the result as input for light node\r\n var lightUniforms = this.getOrCreateStateAttributeUniforms( this._lights[ i ], 'light' );\r\n\r\n var inputs = MACROUTILS.objectMix( {}, lightUniforms );\r\n inputs = MACROUTILS.objectMix( inputs, materialUniforms );\r\n inputs = MACROUTILS.objectMix( inputs, materials );\r\n inputs = MACROUTILS.objectMix( inputs, lightOutShadowIn );\r\n\r\n if ( !inputs.normal )\r\n inputs.normal = this.getOrCreateNormalizedNormal();\r\n if ( !inputs.eyeVector )\r\n inputs.eyeVector = this.getOrCreateNormalizedPosition();\r\n\r\n factory.getNode( nodeName ).inputs( inputs ).outputs( {\r\n color: lightedOutput\r\n } );\r\n\r\n var shadowedOutput = this.createShadowingLight( light, inputs, lightedOutput );\r\n if ( shadowedOutput ) {\r\n lightOutputVarList.push( shadowedOutput );\r\n } else {\r\n lightOutputVarList.push( lightedOutput );\r\n }\r\n\r\n var lightMatAmbientOutput = this.createVariable( 'vec3', 'lightMatAmbientOutput' );\r\n\r\n factory.getNode( 'Mult' ).inputs( inputs.materialambient, lightUniforms.lightambient ).outputs( lightMatAmbientOutput );\r\n\r\n\r\n lightOutputVarList.push( lightMatAmbientOutput );\r\n }\r\n\r\n // do not delete on the assumption that light list is always filled\r\n // in case CreateLighting is called with a empty lightList\r\n // when Compiler is overriden.\r\n if ( lightOutputVarList.length === 0 )\r\n lightOutputVarList.push( this.createVariable( 'vec3' ).setValue( 'vec3(0.0)' ) );\r\n\r\n factory.getNode( 'Add' ).inputs( lightOutputVarList ).outputs( output );\r\n\r\n return output;\r\n },\r\n\r\n\r\n // but we could later implement srgb inside and read differents flag\r\n // as read only in the texture\r\n createTextureRGBA: function ( texture, textureSampler, texCoord ) {\r\n\r\n var texel = this.createVariable( 'vec4' );\r\n factory.getNode( 'TextureRGBA' ).inputs( {\r\n sampler: textureSampler,\r\n uv: texCoord\r\n } ).outputs( {\r\n color: texel\r\n } );\r\n\r\n return texel;\r\n },\r\n\r\n\r\n // TODO: add a visitor to debug the graph\r\n traverse: function ( functor, node ) {\r\n\r\n var inputs = node.getInputs();\r\n if ( !Array.isArray( inputs ) ) {\r\n var keys = Object.keys( inputs );\r\n var objectToArray = [];\r\n for ( var j = 0; j < keys.length; j++ )\r\n objectToArray.push( inputs[ keys[ j ] ] );\r\n inputs = objectToArray;\r\n }\r\n\r\n for ( var i = 0, l = inputs.length; i < l; i++ ) {\r\n node.checkInputsOutputs();\r\n\r\n var child = inputs[ i ];\r\n\r\n if ( child !== undefined &&\r\n child !== node ) {\r\n this.traverse( functor, child );\r\n }\r\n }\r\n functor.call( functor, node );\r\n },\r\n\r\n // Gather a particular output field\r\n // for now one of\r\n // ['define', 'extensions']\r\n //\r\n // from a nodeGraph\r\n //\r\n // In case a node of same Type\r\n // have different outputs (shadow with different defines)\r\n // it use ID rather than Type as map index\r\n // UNIQUE PER TYPE\r\n // TODO: adds includes so that we can remove it from\r\n // the eval Global Functions ?\r\n evaluateAndGatherField: function ( node, field ) {\r\n\r\n var func = function ( node ) {\r\n\r\n var idx = node.getType();\r\n if ( idx === undefined || idx === '' ) {\r\n Notify.error( 'Your node ' + node + ' has not type' );\r\n }\r\n if ( node[ field ] && this._map[ idx ] === undefined ) {\r\n\r\n this._map[ idx ] = true;\r\n var c = node[ field ]();\r\n // push all elements of the array on text array\r\n // node[field]() must return an array\r\n Array.prototype.push.apply( this._text, c );\r\n\r\n }\r\n\r\n };\r\n\r\n func._map = {};\r\n func._text = [];\r\n this.traverse( func, node );\r\n\r\n return func._text;\r\n },\r\n\r\n // Gather a functions declartions of nodes\r\n // from a nodeGraph\r\n // (for now pragma include done here too. could be done with define/etc...)\r\n // Node of same Type has to share\r\n // exact same \"node.globalFunctionDeclaration\" output\r\n // as it use Type rather than ID as map index\r\n evaluateGlobalFunctionDeclaration: function ( node ) {\r\n\r\n var func = function ( node ) {\r\n\r\n // UNIQUE PER TYPE\r\n var idx = node.getType();\r\n\r\n if ( idx === undefined || idx === '' ) {\r\n Notify.error( 'Your node ' + node + ' has not type' );\r\n }\r\n if ( node.globalFunctionDeclaration &&\r\n this._map[ idx ] === undefined ) {\r\n\r\n this._map[ idx ] = true;\r\n var c = node.globalFunctionDeclaration();\r\n if ( c !== undefined ) {\r\n this._text.push( c );\r\n }\r\n\r\n }\r\n\r\n };\r\n\r\n func._map = {};\r\n func._text = [];\r\n this.traverse( func, node );\r\n\r\n return func._text.join( '\\n' );\r\n },\r\n\r\n // Gather a Variables declarations of nodes\r\n // from a nodeGraph to be outputted\r\n // outside the VOID MAIN code\r\n // ( Uniforms, Varying )\r\n // Node of same Type has different output\r\n // as it use Type rather than ID as map index\r\n evaluateGlobalVariableDeclaration: function ( node ) {\r\n\r\n var func = function ( node ) {\r\n\r\n // UNIQUE PER NODE\r\n var idx = node.getID();\r\n\r\n if ( node.globalDeclaration &&\r\n this._map[ idx ] === undefined ) {\r\n\r\n this._map[ idx ] = true;\r\n var c = node.globalDeclaration();\r\n if ( c !== undefined ) {\r\n this._text.push( c );\r\n }\r\n }\r\n };\r\n\r\n func._map = {};\r\n func._text = [];\r\n this.traverse( func, node );\r\n return func._text.join( '\\n' );\r\n },\r\n\r\n\r\n evaluate: function ( node ) {\r\n\r\n var func = function ( node ) {\r\n\r\n var id = node.getID();\r\n if ( this._mapTraverse[ id ] !== undefined ) {\r\n return;\r\n }\r\n\r\n var c = node.computeFragment();\r\n if ( c !== undefined ) {\r\n\r\n if ( node.getComment !== undefined ) {\r\n\r\n var comment = node.getComment();\r\n if ( comment !== undefined ) {\r\n this._text.push( comment );\r\n }\r\n\r\n }\r\n\r\n this._text.push( c );\r\n }\r\n this._mapTraverse[ id ] = true;\r\n };\r\n\r\n func._text = [];\r\n func._mapTraverse = [];\r\n this.traverse( func, node );\r\n this._fragmentShader.push( func._text.join( '\\n' ) );\r\n },\r\n\r\n getTexCoordUnit: function ( id ) {\r\n var texture = this._textures[ id ];\r\n if ( texture === undefined )\r\n return undefined;\r\n\r\n var textureMaterial = this._texturesByName[ texture.getName() ];\r\n if ( !textureMaterial )\r\n return undefined;\r\n\r\n var texCoordUnit = textureMaterial.textureUnit;\r\n if ( texCoordUnit === undefined )\r\n textureMaterial.textureUnit = texCoordUnit = id;\r\n return texCoordUnit;\r\n },\r\n\r\n //\r\n // TODO: change into node based graph shader system.\r\n declareVertexVariables: function () {\r\n var texCoordMap = {};\r\n\r\n this._vertexShader.push( [ '',\r\n 'attribute vec3 Vertex;',\r\n 'attribute vec4 Color;',\r\n 'attribute vec3 Normal;',\r\n '',\r\n 'uniform float ArrayColorEnabled;',\r\n 'uniform mat4 ModelViewMatrix;',\r\n 'uniform mat4 ProjectionMatrix;',\r\n 'uniform mat4 NormalMatrix;',\r\n '',\r\n 'varying vec4 VertexColor;',\r\n 'varying vec3 FragNormal;',\r\n 'varying vec3 FragEyeVector;',\r\n '',\r\n ''\r\n ].join( '\\n' ) );\r\n\r\n var i, ll;\r\n var hasShadows = false;\r\n for ( i = 0, ll = this._shadowsTextures.length; i < ll; i++ ) {\r\n\r\n var shadowTexture = this._shadowsTextures[ i ];\r\n if ( shadowTexture === undefined )\r\n continue;\r\n if ( !hasShadows ) {\r\n hasShadows = true;\r\n this._vertexShader.push( 'uniform mat4 ModelWorldMatrix;' );\r\n }\r\n\r\n var shadowTextureUniforms = shadowTexture.getOrCreateUniforms( i );\r\n var viewMat = shadowTextureUniforms.ViewMatrix;\r\n var projMat = shadowTextureUniforms.ProjectionMatrix;\r\n var depthRange = shadowTextureUniforms.DepthRange;\r\n var mapSize = shadowTextureUniforms.MapSize;\r\n // uniforms\r\n this._vertexShader.push( 'uniform mat4 ' + projMat.getName() + ';' );\r\n this._vertexShader.push( 'uniform mat4 ' + viewMat.getName() + ';' );\r\n this._vertexShader.push( 'uniform vec4 ' + depthRange.getName() + ';' );\r\n this._vertexShader.push( 'uniform vec4 ' + mapSize.getName() + ';' );\r\n // varyings\r\n this._vertexShader.push( 'varying vec4 ' + shadowTexture.getVaryingName( 'VertexProjected' ) + ';' );\r\n hasShadows = true;\r\n }\r\n\r\n for ( var t = 0, tl = this._textures.length; t < tl; t++ ) {\r\n var texCoordUnit = this.getTexCoordUnit( t );\r\n if ( texCoordUnit === undefined || texCoordMap[ texCoordUnit ] !== undefined )\r\n continue;\r\n this._vertexShader.push( 'attribute vec2 TexCoord' + texCoordUnit + ';' );\r\n this._vertexShader.push( 'varying vec2 FragTexCoord' + texCoordUnit + ';' );\r\n texCoordMap[ texCoordUnit ] = true;\r\n }\r\n },\r\n\r\n declareVertexMain: function () {\r\n this._vertexShader.push( [ '',\r\n ' FragNormal = vec3(NormalMatrix * vec4(Normal, 0.0));',\r\n ' vec4 viewPos = ModelViewMatrix * vec4(Vertex,1.0);',\r\n ' FragEyeVector = viewPos.xyz;',\r\n ' gl_Position = ProjectionMatrix * viewPos;',\r\n ' if (ArrayColorEnabled == 1.0)',\r\n ' VertexColor = Color;',\r\n ' else',\r\n ' VertexColor = vec4(1.0,1.0,1.0,1.0);',\r\n ' gl_PointSize = 1.0;',\r\n '',\r\n ''\r\n ].join( '\\n' ) );\r\n\r\n var texCoordMap = {};\r\n\r\n for ( var tt = 0; tt < this._textures.length; tt++ ) {\r\n var texCoordUnit = this.getTexCoordUnit( tt );\r\n if ( texCoordUnit === undefined || texCoordMap[ texCoordUnit ] !== undefined )\r\n continue;\r\n this._vertexShader.push( 'FragTexCoord' + texCoordUnit + ' = TexCoord' + texCoordUnit + ';' );\r\n texCoordMap[ texCoordUnit ] = true;\r\n }\r\n\r\n var hasShadows = false;\r\n for ( var i = 0, ll = this._shadowsTextures.length; i < ll; i++ ) {\r\n var shadowTexture = this._shadowsTextures[ i ];\r\n if ( !shadowTexture )\r\n continue;\r\n if ( !hasShadows ) {\r\n hasShadows = true;\r\n this._vertexShader.push( 'vec4 worldPosition = ModelWorldMatrix * vec4(Vertex,1.0);' );\r\n }\r\n\r\n // uniforms\r\n var shadowTextureUniforms = shadowTexture.getOrCreateUniforms( i );\r\n var shadowView = shadowTextureUniforms.ViewMatrix.getName();\r\n var shadowProj = shadowTextureUniforms.ProjectionMatrix.getName();\r\n\r\n // varyings\r\n var shadowVertProj = shadowTexture.getVaryingName( 'VertexProjected' );\r\n\r\n this._vertexShader.push( 'vec4 shadowPos' + i + ' = ' + shadowView + ' * worldPosition;' );\r\n this._vertexShader.push( ' ' + shadowVertProj + ' = ' + shadowProj + ' * shadowPos' + i + ';' );\r\n // varying packing using 1 vec4 fo both Projection vector & viewworld z pos\r\n // and pre-linearize Z\r\n this._vertexShader.push( ' ' + shadowVertProj + '.z = shadowPos' + i + '.z ;' );\r\n }\r\n },\r\n // Meanwhile, here it is.\r\n createVertexShaderGraph: function () {\r\n this.declareVertexVariables();\r\n this._vertexShader.push( 'void main() {' );\r\n this.declareVertexMain();\r\n this._vertexShader.push( '}' );\r\n },\r\n\r\n createVertexShader: function () {\r\n // Call to specialised inhenrited shader Compiler\r\n this.createVertexShaderGraph();\r\n var shader = this._vertexShader.join( '\\n' );\r\n\r\n shader = this._shaderProcessor.processShader( shader );\r\n return shader;\r\n },\r\n evaluateDefines: function ( root ) {\r\n return this.evaluateAndGatherField( root, 'getDefines' );\r\n },\r\n evaluateExtensions: function ( root ) {\r\n return this.evaluateAndGatherField( root, 'getExtensions' );\r\n },\r\n createFragmentShader: function () {\r\n\r\n this.declareUniforms();\r\n this.declareTextures();\r\n\r\n // Call to specialised inhenrited shader Compiler\r\n var root = this.createFragmentShaderGraph();\r\n\r\n this._fragmentShader.push( [ '',\r\n 'uniform mat4 NormalMatrix;',\r\n ''\r\n ].join( '\\n' ) );\r\n\r\n\r\n var vars = Object.keys( this._variables );\r\n\r\n // defines and extensions are added by process shader\r\n var extensions = this.evaluateExtensions( root );\r\n var defines = this.evaluateDefines( root );\r\n\r\n\r\n this._fragmentShader.push( '\\n' );\r\n this._fragmentShader.push( this.evaluateGlobalVariableDeclaration( root ) );\r\n this._fragmentShader.push( '\\n' );\r\n this._fragmentShader.push( this.evaluateGlobalFunctionDeclaration( root ) );\r\n\r\n\r\n this._fragmentShader.push( 'void main() {' );\r\n\r\n var variables = [];\r\n variables.push( '// vars\\n' );\r\n\r\n for ( var j = 0, jl = vars.length; j < jl; j++ ) {\r\n\r\n var d = this._variables[ vars[ j ] ].declare();\r\n if ( d !== undefined ) {\r\n variables.push( this._variables[ vars[ j ] ].declare() );\r\n }\r\n\r\n }\r\n variables.push( '\\n// end vars\\n' );\r\n // declare variable in main\r\n this._fragmentShader.push( variables.join( ' ' ) );\r\n\r\n this.evaluate( root );\r\n\r\n this._fragmentShader.push( '}' );\r\n var shader = this._fragmentShader.join( '\\n' );\r\n //osg.log('Fragment Shader');\r\n\r\n shader = this._shaderProcessor.processShader( shader, defines, extensions );\r\n\r\n Notify.debug( shader );\r\n return shader;\r\n },\r\n\r\n\r\n // This function is used when no material\r\n // is present. If you inherit from this Compiler\r\n // you could change the default behavior\r\n createDefaultFragmentShaderGraph: function () {\r\n return factory.getNode( 'FragColor' ).inputs( this.createVariable( 'vec4' ).setValue( 'vec4(1.0, 0.0, 1.0, 0.7)' ) );\r\n },\r\n\r\n\r\n // this is the main function that will generate the\r\n // fragment shader. If you need to improve / add your own\r\n // you could inherit and override this function\r\n createFragmentShaderGraph: function () {\r\n\r\n // no material then return a default shader\r\n if ( !this._material )\r\n return this.createDefaultFragmentShaderGraph();\r\n\r\n\r\n var materialUniforms = this.getOrCreateStateAttributeUniforms( this._material );\r\n\r\n // diffuse color\r\n var diffuseColor = this.getDiffuseColorFromTextures();\r\n\r\n if ( diffuseColor === undefined ) {\r\n\r\n diffuseColor = materialUniforms.diffuse;\r\n\r\n } else {\r\n\r\n factory.getNode( 'InlineCode' ).code( '%color.rgb *= %diffuse.rgb;' ).inputs( {\r\n diffuse: materialUniforms.diffuse\r\n } ).outputs( {\r\n color: diffuseColor\r\n } );\r\n }\r\n\r\n // vertex color needs to be computed to diffuse\r\n diffuseColor = this.getVertexColor( diffuseColor );\r\n\r\n\r\n // compute alpha\r\n var alpha = this.createVariable( 'float' );\r\n\r\n var textureTexel = this.getFirstValidTexture();\r\n\r\n var alphaCompute;\r\n if ( textureTexel ) // use alpha of the first valid texture if has texture\r\n alphaCompute = '%alpha = %color.a * %texelAlpha.a;';\r\n else\r\n alphaCompute = '%alpha = %color.a;';\r\n\r\n factory.getNode( 'InlineCode' ).code( alphaCompute ).inputs( {\r\n color: materialUniforms.diffuse,\r\n texelAlpha: textureTexel\r\n } ).outputs( {\r\n alpha: alpha\r\n } );\r\n\r\n // 2 codes path\r\n // if we have light we compute a subgraph that will generate\r\n // color from lights contribution...\r\n // if we dont have light we will use the diffuse color found as default\r\n // fallback\r\n var finalColor;\r\n\r\n if ( this._lights.length > 0 ) {\r\n\r\n // creates lights nodes\r\n var lightedOutput = this.createLighting( {\r\n materialdiffuse: diffuseColor\r\n } );\r\n finalColor = lightedOutput;\r\n\r\n } else {\r\n // no light, no emssion use diffuse color\r\n finalColor = diffuseColor;\r\n }\r\n\r\n if ( materialUniforms.emission ) {\r\n // add emission if any\r\n var outputDiffEm = this.createVariable( 'vec3' ).setValue( 'vec3(0.0)' );\r\n factory.getNode( 'Add' ).inputs( finalColor, materialUniforms.emission ).outputs( outputDiffEm );\r\n finalColor = outputDiffEm;\r\n }\r\n\r\n // premult alpha\r\n finalColor = this.getPremultAlpha( finalColor, alpha );\r\n\r\n var fragColor = factory.getNode( 'FragColor' );\r\n\r\n // todo add gamma corrected color, but it would also\r\n // mean to handle correctly srgb texture. So it should be done\r\n // at the same time. see osg.Tetxure to implement srgb\r\n factory.getNode( 'SetAlpha' ).inputs( {\r\n color: finalColor,\r\n alpha: alpha\r\n } ).outputs( {\r\n color: fragColor\r\n } );\r\n\r\n return fragColor;\r\n }\r\n };\r\n\r\n return Compiler;\r\n\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShader/Compiler.js\n ** module id = 152\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Notify',\r\n 'osg/Light',\r\n 'osg/Program',\r\n 'osg/Shader',\r\n 'osg/Map',\r\n 'osgShader/Compiler',\r\n 'osgShader/ShaderProcessor'\r\n], function ( Notify, Light, Program, Shader, Map, Compiler, ShaderProcessor ) {\r\n 'use strict';\r\n\r\n // this is the list of attributes type we support by default to generate shader\r\n // if you need to adjust for your need provide or modify this list\r\n // if you still need more fine tuning to the filter, override the filterAttributeTypes\r\n var DefaultsAcceptAttributeTypes = [\r\n 'ShadowAttribute',\r\n 'ShadowTexture',\r\n 'Texture',\r\n 'Light',\r\n 'Material'\r\n ];\r\n\r\n var ShaderGenerator = function () {\r\n this._cache = new window.Map();\r\n\r\n // ShaderProcessor singleton used by ShaderGenerator\r\n // but user can replace it if needed\r\n this._shaderProcessor = new ShaderProcessor();\r\n this._acceptAttributeTypes = new window.Set( DefaultsAcceptAttributeTypes );\r\n\r\n // ShaderCompiler Object to instanciate\r\n this._ShaderCompiler = Compiler;\r\n };\r\n\r\n ShaderGenerator.prototype = {\r\n\r\n // setShaderCompiler that will be used to createShader\r\n setShaderCompiler: function ( compiler ) {\r\n this._ShaderCompiler = compiler;\r\n },\r\n\r\n getShaderCompiler: function () {\r\n return this._ShaderCompiler;\r\n },\r\n\r\n\r\n // return a Set of accepted attribtues to generate shader\r\n getAcceptAttributeTypes: function () {\r\n return this._acceptAttributeTypes;\r\n },\r\n\r\n\r\n getShaderProcessor: function () {\r\n return this._shaderProcessor;\r\n },\r\n\r\n setShaderProcessor: function ( shaderProcessor ) {\r\n this._shaderProcessor = shaderProcessor;\r\n },\r\n\r\n // filter input types and write the result in the outputs array\r\n filterAttributeTypes: function ( attribute ) {\r\n\r\n if ( attribute.libraryName() !== 'osg' && attribute.libraryName() !== 'osgShadow' )\r\n return true;\r\n\r\n var attributeType = attribute.getType();\r\n\r\n // accept only attribute listed in the container\r\n if ( !this._acceptAttributeTypes.has( attributeType ) )\r\n return true;\r\n\r\n // works for attribute that contains isEnabled\r\n // Light, Shadow. It let us to filter them to build a shader if not enabled\r\n if ( attribute.isEnabled && !attribute.isEnabled() )\r\n return true;\r\n // // if it's a light and it's not enable we filter it\r\n // if ( attribute.typeID === Light.typeID && !attribute.isEnabled() ) {\r\n // return true;\r\n // }\r\n\r\n return false;\r\n },\r\n\r\n // get actives attribute that comes from state\r\n getActiveAttributeList: function ( state, list ) {\r\n\r\n var hash = '';\r\n var attributeMap = state.attributeMap;\r\n var attributeMapKeys = attributeMap.getKeys();\r\n\r\n for ( var j = 0, k = attributeMapKeys.length; j < k; j++ ) {\r\n\r\n var keya = attributeMapKeys[ j ];\r\n var attributeStack = attributeMap[ keya ];\r\n var attr = attributeStack.lastApplied;\r\n\r\n if ( this.filterAttributeTypes( attr ) )\r\n continue;\r\n\r\n if ( attr.getHash ) {\r\n hash += attr.getHash();\r\n } else {\r\n hash += attr.getType();\r\n }\r\n list.push( attr );\r\n }\r\n return hash;\r\n },\r\n\r\n // get actives texture attribute that comes from state\r\n getActiveTextureAttributeList: function ( state, list ) {\r\n var hash = '';\r\n var attributeMapList = state.textureAttributeMapList;\r\n var i, l;\r\n\r\n for ( i = 0, l = attributeMapList.length; i < l; i++ ) {\r\n var attributeMapForUnit = attributeMapList[ i ];\r\n if ( !attributeMapForUnit ) {\r\n continue;\r\n }\r\n list[ i ] = [];\r\n\r\n var attributeMapForUnitKeys = attributeMapForUnit.getKeys();\r\n\r\n for ( var j = 0, m = attributeMapForUnitKeys.length; j < m; j++ ) {\r\n\r\n var key = attributeMapForUnitKeys[ j ];\r\n var attributeStack = attributeMapForUnit[ key ];\r\n if ( attributeStack.values().length === 0 ) {\r\n continue;\r\n }\r\n\r\n var attr = attributeStack.lastApplied;\r\n if ( this.filterAttributeTypes( attr ) )\r\n continue;\r\n\r\n if ( attr.getHash ) {\r\n hash += attr.getHash();\r\n } else {\r\n hash += attr.getType();\r\n }\r\n list[ i ].push( attr );\r\n }\r\n }\r\n return hash;\r\n },\r\n\r\n getActiveUniforms: function ( state, attributeList, textureAttributeList ) {\r\n\r\n var uniforms = {};\r\n\r\n for ( var i = 0, l = attributeList.length; i < l; i++ ) {\r\n\r\n var at = attributeList[ i ];\r\n if ( at.getOrCreateUniforms ) {\r\n var attributeUniformMap = at.getOrCreateUniforms();\r\n var attributeUniformMapKeys = attributeUniformMap.getKeys();\r\n\r\n for ( var j = 0, m = attributeUniformMapKeys.length; j < m; j++ ) {\r\n var name = attributeUniformMapKeys[ j ];\r\n var uniform = attributeUniformMap[ name ];\r\n uniforms[ uniform.name ] = uniform;\r\n }\r\n }\r\n }\r\n\r\n for ( var a = 0, n = textureAttributeList.length; a < n; a++ ) {\r\n var tat = textureAttributeList[ a ];\r\n if ( tat ) {\r\n for ( var b = 0, o = tat.length; b < o; b++ ) {\r\n var attr = tat[ b ];\r\n\r\n var texUniformMap = attr.getOrCreateUniforms( a );\r\n var texUniformMapKeys = texUniformMap.getKeys();\r\n\r\n for ( var t = 0, tl = texUniformMapKeys.length; t < tl; t++ ) {\r\n var tname = texUniformMapKeys[ t ];\r\n var tuniform = texUniformMap[ tname ];\r\n uniforms[ tuniform.name ] = tuniform;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return new Map( uniforms );\r\n },\r\n\r\n getOrCreateProgram: ( function () {\r\n // TODO: double check GC impact of this stack\r\n var textureAttributes = [];\r\n var attributes = [];\r\n\r\n return function ( state ) {\r\n // extract valid attributes\r\n var hash = '';\r\n attributes.length = 0;\r\n textureAttributes.length = 0;\r\n hash += this.getActiveAttributeList( state, attributes );\r\n hash += this.getActiveTextureAttributeList( state, textureAttributes );\r\n\r\n var cache = this._cache.get( hash );\r\n if ( cache !== undefined ) {\r\n return cache;\r\n }\r\n\r\n // use ShaderCompiler, it can be overrided by a custom one\r\n var ShaderCompiler = this._ShaderCompiler;\r\n var shaderGen = new ShaderCompiler( attributes, textureAttributes, this._shaderProcessor );\r\n var vertexshader = shaderGen.createVertexShader();\r\n var fragmentshader = shaderGen.createFragmentShader();\r\n\r\n var program = new Program(\r\n new Shader( Shader.VERTEX_SHADER, vertexshader ),\r\n new Shader( Shader.FRAGMENT_SHADER, fragmentshader ) );\r\n\r\n program.hash = hash;\r\n program.activeUniforms = this.getActiveUniforms( state, attributes, textureAttributes );\r\n program.generated = true;\r\n\r\n this._cache.set( hash, program );\r\n return program;\r\n };\r\n } )()\r\n };\r\n\r\n return ShaderGenerator;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShader/ShaderGenerator.js\n ** module id = 153\n ** module chunks = 0 1\n **/","define( [\r\n 'osgShader/ShaderGenerator'\r\n\r\n], function ( ShaderGenerator ) {\r\n 'use strict';\r\n\r\n var ShaderGeneratorProxy = function () {\r\n\r\n // object of shader generators\r\n this._generators = new Map();\r\n this.addShaderGenerator( 'default', new ShaderGenerator() );\r\n\r\n return this;\r\n };\r\n\r\n ShaderGeneratorProxy.prototype = {\r\n\r\n getShaderGenerator: function ( name ) {\r\n\r\n if ( !name )\r\n return this._generators.get( 'default' );\r\n\r\n return this._generators.get( name );\r\n },\r\n\r\n // user-space facility to provide its own\r\n addShaderGenerator: function ( name, sg ) {\r\n\r\n this._generators.set( name, sg );\r\n\r\n }\r\n\r\n };\r\n\r\n return ShaderGeneratorProxy;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShader/ShaderGeneratorProxy.js\n ** module id = 154\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Notify',\r\n 'osgShader/shaderLib',\r\n 'osgShadow/shaderLib'\r\n\r\n], function ( Notify, shaderLib, shadowShaderLib ) {\r\n\r\n 'use strict';\r\n\r\n // Shader as vert/frag/glsl files Using requirejs text plugin\r\n // Preprocess features like: //\r\n // - Handle (recursive) include, avoiding code repeat and help code factorization\r\n // - Handle per shader and global define/precision\r\n\r\n\r\n var ShaderProcessor = function ( createInstance ) {\r\n\r\n if ( !createInstance ) {\r\n if ( ShaderProcessor.instance ) {\r\n return ShaderProcessor.instance;\r\n }\r\n ShaderProcessor.instance = this;\r\n }\r\n\r\n this.addShaders( shaderLib );\r\n this.addShaders( shadowShaderLib );\r\n return this;\r\n };\r\n\r\n ShaderProcessor.prototype = {\r\n _shadersText: {},\r\n _shadersList: {},\r\n _globalDefaultprecision: '#ifdef GL_FRAGMENT_PRECISION_HIGH\\n precision highp float;\\n #else\\n precision mediump float;\\n#endif',\r\n _debugLines: false,\r\n _includeR: /#pragma include \"([^\"]+)\"/g,\r\n _includeCondR: /#pragma include ([\"^+\"]?[\"\\ \"[a-zA-Z_0-9](.*)\"]*?)/g,\r\n _defineR: /\\#define\\s+([a-zA-Z_0-9]+)/,\r\n _precisionR: /precision\\s+(high|low|medium)p\\s+float/,\r\n\r\n\r\n // {\r\n // 'functions.glsl': textShaderFunctions,\r\n // 'lights.glsl': textShaderFunctions,\r\n // 'textures.glsl': textShaderFunctions\r\n // };\r\n addShaders: function ( shaders ) {\r\n\r\n var keys = Object.keys( shaders );\r\n\r\n keys.forEach( function ( key ) {\r\n\r\n this._shadersList[ key ] = key;\r\n this._shadersText[ key ] = shaders[ key ];\r\n\r\n }, this );\r\n\r\n },\r\n\r\n\r\n instrumentShaderlines: function ( content, sourceID ) {\r\n // TODO instrumentShaderlines\r\n // http://immersedcode.org/2012/1/12/random-notes-on-webgl/\r\n // one ID per \"file\"\r\n // Each file has its line number starting at 0\r\n // handle include, the do that numbering also in preprocess...\r\n // Then on shader error using sourceID and line you can point the correct line...\r\n // has to attach that info to osg.shader object.\r\n /*\r\n var allLines = content.split('\\n');\r\n var i = 0;\r\n for (var k = 0; k _< allLines.length; k++) {\r\n if (!this._includeR.test(allLines[k])) {\r\n allLines[k] = \"#line \" + (i++) + \" \" + sourceID + '\\n' + allLines[k] ;\r\n }\r\n }\r\n content = allLines.join('\\n');\r\n */\r\n\r\n // seems just prefixing first line seems ok to help renumbering error mesg\r\n return '\\n#line ' + 0 + ' ' + sourceID + '\\n' + content;\r\n },\r\n\r\n getShaderTextPure: function ( shaderName ) {\r\n\r\n var preShader = this._shadersText[ shaderName ];\r\n\r\n if ( !preShader ) {\r\n Notify.error( 'shader file/text: ' + shaderName + ' not registered' );\r\n preShader = '';\r\n }\r\n\r\n return preShader;\r\n },\r\n\r\n getShader: function ( shaderName, defines, extensions ) {\r\n var shader = this.getShaderTextPure( shaderName );\r\n return this.processShader( shader, defines, extensions );\r\n },\r\n\r\n // recursively handle #include external glsl\r\n // files (for now in the same folder.)\r\n preprocess: function ( content, sourceID, includeList, inputsDefines ) {\r\n var _self = this;\r\n return content.replace( this._includeCondR, function ( _, name ) {\r\n var includeOpt = name.split( ' ' );\r\n var includeName = includeOpt[ 0 ].replace( /\"/g, '' );\r\n\r\n // pure include is\r\n // \\#pragma include \"name\";\r\n\r\n // conditionnal include is name included if _PCF defined\r\n // \\#pragma include \"name\" \"_PCF\";\r\n if ( includeOpt.length > 1 && inputsDefines ) {\r\n\r\n // some conditions here.\r\n // if not defined we do not include\r\n var found = false;\r\n var defines = inputsDefines.map( function ( defineString ) {\r\n return _self._defineR.test( defineString ) && defineString.split( ' ' )[ 1 ];\r\n } );\r\n\r\n for ( var i = 1; i < includeOpt.length && !found; i++ ) {\r\n var key = includeOpt[ i ].replace( /\"/g, '' );\r\n for ( var k = 0; k < defines.length && !found; k++ ) {\r\n\r\n if ( defines[ k ] !== false && defines[ k ] === key ) {\r\n found = true;\r\n break;\r\n }\r\n\r\n }\r\n }\r\n if ( !found )\r\n return '';\r\n }\r\n\r\n // already included\r\n if ( includeList.indexOf( includeName ) !== -1 ) return '';\r\n // avoid endless loop, not calling the impure\r\n var txt = this.getShaderTextPure( includeName );\r\n // make sure it's not included twice\r\n includeList.push( includeName );\r\n if ( this._debugLines ) {\r\n txt = this.instrumentShaderlines( txt, sourceID );\r\n }\r\n sourceID++;\r\n // to the infinite and beyond !\r\n txt = this.preprocess( txt, sourceID, includeList, inputsDefines );\r\n return txt;\r\n }.bind( this ) );\r\n\r\n },\r\n\r\n // process a shader and define\r\n // get a full expanded single shader source code\r\n // resolving include dependencies\r\n // adding defines\r\n // adding line instrumenting.\r\n processShader: function ( shader, defines, extensions ) {\r\n\r\n var includeList = [];\r\n var preShader = shader;\r\n var sourceID = 0;\r\n if ( this._debugLines ) {\r\n preShader = this.instrumentShaderlines( preShader, sourceID );\r\n sourceID++;\r\n }\r\n\r\n // removes duplicates\r\n if ( defines !== undefined ) {\r\n defines = defines.sort().filter( function ( item, pos ) {\r\n return !pos || item !== defines[ pos - 1 ];\r\n } );\r\n }\r\n if ( extensions !== undefined ) {\r\n extensions = extensions.sort().filter( function ( item, pos ) {\r\n return !pos || item !== extensions[ pos - 1 ];\r\n } );\r\n }\r\n\r\n var postShader = this.preprocess( preShader, sourceID, includeList, defines );\r\n\r\n var prePrend = '';\r\n prePrend += '#version 100\\n'; // webgl1 (webgl2 #version 130 ?)\r\n\r\n // then\r\n // it's extensions first\r\n // See https://khronos.org/registry/gles/specs/2.0/GLSL_ES_Specification_1.0.17.pdf\r\n // p14-15: before any non-processor token\r\n // add them\r\n if ( extensions !== undefined ) {\r\n // could add an extension check support warning there...\r\n prePrend += extensions.join( '\\n' ) + '\\n';\r\n }\r\n\r\n if ( this._globalDefaultprecision ) {\r\n if ( !this._precisionR.test( postShader ) ) {\r\n // use the shaderhighprecision flag at shaderloader start\r\n //var highp = gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT);\r\n //var highpSupported = highp.precision != 0;\r\n prePrend += this._globalDefaultprecision + '\\n';\r\n }\r\n }\r\n\r\n // if defines\r\n // add them\r\n if ( defines !== undefined ) {\r\n prePrend += defines.join( '\\n' ) + '\\n';\r\n }\r\n postShader = prePrend + postShader;\r\n\r\n return postShader;\r\n }\r\n };\r\n return ShaderProcessor;\r\n\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShader/ShaderProcessor.js\n ** module id = 155\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Notify',\r\n 'osgShader/node/data',\r\n 'osgShader/node/functions',\r\n 'osgShader/node/lights',\r\n 'osgShader/node/shadows',\r\n 'osgShader/node/operations',\r\n 'osgShader/node/textures',\r\n\r\n], function ( Notify, data, functions, lights, shadows, operations, textures ) {\r\n 'use strict';\r\n\r\n var Factory = function () {\r\n\r\n this._nodes = new Map();\r\n\r\n this.registerNodes( data );\r\n this.registerNodes( textures );\r\n this.registerNodes( functions );\r\n this.registerNodes( lights );\r\n this.registerNodes( shadows );\r\n this.registerNodes( operations );\r\n };\r\n\r\n Factory.prototype = {\r\n\r\n registerNodes: function ( obj ) {\r\n var self = this;\r\n Object.keys( obj ).forEach( function ( key ) {\r\n self.registerNode( key, obj[ key ] );\r\n } );\r\n },\r\n\r\n registerNode: function ( name, constructor ) {\r\n\r\n if ( this._nodes.has( name ) ) {\r\n Notify.warn( 'Node ' + name + ' already registered' );\r\n }\r\n this._nodes.set( name, constructor );\r\n\r\n },\r\n\r\n // extra argument are passed to the constructor of the node\r\n getNode: function ( name ) {\r\n\r\n var Constructor = this._nodes.get( name );\r\n if ( !Constructor ) {\r\n Notify.warn( 'Node ' + name + ' does not exist' );\r\n return undefined;\r\n }\r\n\r\n\r\n // call a constructor with array arguments\r\n // http://www.ecma-international.org/ecma-262/5.1/#sec-13.2.2\r\n var instance = Object.create( Constructor.prototype );\r\n Constructor.apply( instance, Array.prototype.slice.call( arguments, 1 ) );\r\n\r\n return instance;\r\n }\r\n\r\n };\r\n\r\n var instance = new Factory();\r\n\r\n return instance;\r\n\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShader/nodeFactory.js\n ** module id = 156\n ** module chunks = 0 1\n **/","define( [\r\n\r\n 'osgShader/node/data',\r\n 'osgShader/node/textures',\r\n 'osgShader/node/functions',\r\n 'osgShader/node/lights',\r\n 'osgShader/node/operations'\r\n\r\n], function ( /*data, textures, functions, lights, operations */) {\r\n 'use strict';\r\n\r\n var lib = {};\r\n\r\n // use sublib except _ of course\r\n var subnamespace = Array.prototype.slice.call( arguments, 0 );\r\n\r\n // add all sub component to root level of the lib\r\n subnamespace.forEach( function ( component /*, index */ ) {\r\n\r\n Object.keys( component ).forEach( function ( key ) {\r\n\r\n var element = component[ key ];\r\n\r\n if ( this[ key ] !== undefined ) { // if exist throw exception\r\n throw 'duplicate entry in node library';\r\n }\r\n\r\n this[ key ] = element;\r\n\r\n }, this );\r\n\r\n }, lib );\r\n\r\n return lib;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShader/node.js\n ** module id = 157\n ** module chunks = 0 1\n **/","define( [], function () {\r\n\r\n 'use strict';\r\n\r\n var sprintf = function ( string, args ) {\r\n if ( !string || !args ) {\r\n return '';\r\n }\r\n\r\n var arg;\r\n\r\n for ( var index in args ) {\r\n arg = args[ index ];\r\n\r\n if ( arg === undefined )\r\n continue;\r\n\r\n if ( arg.getVariable ) {\r\n arg = arg.getVariable();\r\n }\r\n string = string.replace( '%s', arg );\r\n }\r\n return string;\r\n };\r\n\r\n\r\n var checkVariableType = function ( vars, optionalPrefix ) {\r\n\r\n var inputs = vars;\r\n var varsList = [];\r\n var prefix = optionalPrefix;\r\n if ( optionalPrefix === undefined ) {\r\n prefix = '';\r\n }\r\n\r\n for ( var i = 0, l = inputs.length; i < l; i++ ) {\r\n\r\n var variable = inputs[ i ];\r\n var output;\r\n\r\n if ( variable === undefined ) {\r\n output = 'undefined';\r\n } else if ( typeof variable === 'string' ) {\r\n output = variable;\r\n } else if ( variable.getType ) {\r\n output = variable.getType() + ' ' + variable.getVariable();\r\n } else {\r\n output = variable.getVariable();\r\n }\r\n\r\n varsList.push( prefix + output );\r\n }\r\n\r\n return varsList;\r\n\r\n };\r\n\r\n\r\n // call glsl function\r\n // generate a string with output = funcName ( inputs )\r\n // useful when debuging to print inputs / outputs\r\n // TODO check type of arguments with regexp in glsl\r\n // shader function regex\r\n // [\\r\\n]\\s[(vec4)|(vec3)|(vec2)|(float)|(bool)|(int)].*\\(.*[.|\\r\\n]*\\).*[\\r\\n]*{\r\n // doesn't handle multiline\r\n // then split(',')\r\n // then substring (out,in)\r\n // then type matching\r\n // (works by hand here.)\r\n // for instance, gather types from input and compare themt to glsl decl\r\n // var inputTypes = [\r\n // 'vec4',\r\n // 'vec4',\r\n // 'sampler2D',\r\n // 'vec4',\r\n // 'vec4',\r\n // 'vec3',\r\n // 'float',\r\n // 'vec3',\r\n // 'float',\r\n // 'float',\r\n // 'float',\r\n // 'float',\r\n // 'float'\r\n // ];\r\n // console.assert( inputs.length === inputTypes.length );\r\n // var i = inputs.length;\r\n // while ( i-- ) {\r\n // console.assert( inputs[ i ]._type === inputTypes[ i ], inputs[ i ]._prefix );\r\n // }\r\n var callFunction = function ( funcName, output, inputs ) {\r\n\r\n var osgShader = require( 'osgShader/osgShader' );\r\n\r\n var debug = [];\r\n var callString = '';\r\n\r\n // debug\r\n if ( osgShader.debugShaderNode ) {\r\n debug.push( '\\n// output' );\r\n Array.prototype.push.apply( debug, checkVariableType( [ output ], '// ' ) );\r\n }\r\n\r\n if ( output ) {\r\n if ( output.getVariable )\r\n output = output.getVariable();\r\n callString = output + ' = ';\r\n }\r\n\r\n callString = callString + funcName + '( ';\r\n\r\n if ( inputs && inputs.length > 0 ) {\r\n\r\n // debug\r\n if ( osgShader.debugShaderNode ) {\r\n debug.push( '// inputs' );\r\n Array.prototype.push.apply( debug, checkVariableType( inputs, '// ' ) );\r\n }\r\n\r\n for ( var i = 0, l = inputs.length; i < l; i++ ) {\r\n\r\n // check if it's a variable and not a constant\r\n if ( inputs[ i ].getVariable )\r\n callString += inputs[ i ].getVariable();\r\n else\r\n callString += inputs[ i ];\r\n\r\n if ( i !== l - 1 )\r\n callString += ', ';\r\n }\r\n }\r\n\r\n callString += ' );\\n';\r\n\r\n if ( osgShader.debugShaderNode )\r\n return debug.join( '\\n' ) + '\\n' + callString;\r\n\r\n return callString;\r\n };\r\n\r\n\r\n return {\r\n callFunction: callFunction,\r\n checkVariableType: checkVariableType,\r\n sprintf: sprintf\r\n };\r\n\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShader/utils.js\n ** module id = 158\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/StateAttribute',\r\n 'osg/Texture',\r\n 'osg/Uniform',\r\n 'osg/Matrix',\r\n 'osg/Vec3',\r\n 'osg/Vec4',\r\n 'osg/Map',\r\n 'osg/Notify'\r\n], function ( MACROUTILS, StateAttribute, Texture, Uniform, Matrix, Vec3, Vec4, Map, Notify ) {\r\n 'use strict';\r\n\r\n\r\n /**\r\n * ShadowAttribute encapsulate Shadow Main State object\r\n * @class ShadowAttribute\r\n * @inherits StateAttribute\r\n */\r\n var ShadowAttribute = function ( lightNumber, disable ) {\r\n StateAttribute.call( this );\r\n\r\n\r\n //this._lightNumber // (might be broken by light reordering change) // yeah agree\r\n\r\n // just in case\r\n // the object in case of change in ordering ?\r\n // need to be able to link in compiler the light uniforms as we use light uniforms in shadow shader code\r\n // well it's not supposed to be a problem, but yeah the ordering is an issue, so maybe it's better to link to\r\n // the light attribute, in this case we dont need anymore the _lightNumber\r\n // but re ordering light seems to not be a good practice in osg, it's still a risk\r\n this._light = undefined;\r\n // that could be more generic to have the unit instead of the object\r\n\r\n // see shadowSettings.js header for shadow algo param explanations\r\n\r\n this._lightNumber = lightNumber !== undefined ? lightNumber : 0;\r\n\r\n // hash change var\r\n this._algoType = 'NONE';\r\n\r\n // shadow depth bias as projected in shadow camera space texture\r\n // and viewer camera space projection introduce its bias\r\n this._bias = 0.001;\r\n // algo dependant\r\n // Exponential shadow maps use exponentials\r\n // to allows fuzzy depth\r\n this._exponent0 = 0.001;\r\n this._exponent1 = 0.001;\r\n // Variance Shadow mapping use One more epsilon\r\n this._epsilonVSM = 0.001;\r\n // shader compilation differnet upon texture precision\r\n this._precision = 'UNSIGNED_BYTE';\r\n // kernel size & type for pcf\r\n this._kernelSizePCF = undefined;\r\n\r\n this._enable = !disable;\r\n\r\n };\r\n\r\n ShadowAttribute.uniforms = {};\r\n ShadowAttribute.prototype = MACROUTILS.objectLibraryClass( MACROUTILS.objectInherit( StateAttribute.prototype, {\r\n\r\n attributeType: 'ShadowAttribute',\r\n\r\n cloneType: function () {\r\n return new ShadowAttribute( this._lightNumber, true );\r\n },\r\n\r\n getTypeMember: function () {\r\n return this.attributeType + this.getLightNumber();\r\n },\r\n getLightNumber: function () {\r\n return this._lightNumber;\r\n },\r\n\r\n getUniformName: function ( name ) {\r\n var prefix = this.getType() + this.getLightNumber().toString();\r\n return prefix + '_uniform_' + name;\r\n },\r\n\r\n setAlgorithm: function ( algo ) {\r\n this._algoType = algo;\r\n },\r\n getAlgorithm: function () {\r\n return this._algoType;\r\n },\r\n\r\n setBias: function ( bias ) {\r\n this._bias = bias;\r\n },\r\n getBias: function () {\r\n return this._bias;\r\n },\r\n setExponent0: function ( exp ) {\r\n this._exponent0 = exp;\r\n },\r\n getExponent0: function () {\r\n return this._exponent0;\r\n },\r\n setExponent1: function ( exp ) {\r\n this._exponent1 = exp;\r\n },\r\n getExponent1: function () {\r\n return this._exponent1;\r\n },\r\n setEpsilonVSM: function ( epsilon ) {\r\n this._epsilonVSM = epsilon;\r\n },\r\n getEpsilonVSM: function () {\r\n return this._epsilonVSM;\r\n },\r\n getKernelSizePCF: function () {\r\n return this._kernelSizePCF;\r\n },\r\n setKernelSizePCF: function ( v ) {\r\n this._kernelSizePCF = v;\r\n },\r\n setPrecision: function ( precision ) {\r\n this._precision = precision;\r\n this.dirty();\r\n },\r\n getPrecision: function () {\r\n return this._precision;\r\n },\r\n getLight: function () {\r\n return this._light;\r\n },\r\n setLight: function ( light ) {\r\n this._light = light;\r\n this._lightNumber = light.getLightNumber();\r\n this.dirty();\r\n },\r\n\r\n getOrCreateUniforms: function () {\r\n // uniform are once per CLASS attribute, not per instance\r\n var obj = ShadowAttribute;\r\n\r\n var typeMember = this.getTypeMember();\r\n\r\n if ( obj.uniforms[ typeMember ] ) return obj.uniforms[ typeMember ];\r\n\r\n // Variance Shadow mapping use One more epsilon\r\n var uniformList = {\r\n 'bias': 'createFloat',\r\n 'exponent0': 'createFloat',\r\n 'exponent1': 'createFloat',\r\n 'epsilonVSM': 'createFloat'\r\n };\r\n\r\n var uniforms = {};\r\n\r\n Object.keys( uniformList ).forEach( function ( key ) {\r\n\r\n var type = uniformList[ key ];\r\n var func = Uniform[ type ];\r\n uniforms[ key ] = func( this.getUniformName( key ) );\r\n\r\n }.bind( this ) );\r\n\r\n obj.uniforms[ typeMember ] = new Map( uniforms );\r\n\r\n return obj.uniforms[ typeMember ];\r\n },\r\n\r\n getExtensions: function () {\r\n var algo = this.getAlgorithm();\r\n if ( algo === 'PCF' ) {\r\n return [ '#ifdef GL_OES_standard_derivatives\\n#extension GL_OES_standard_derivatives : enable\\n#endif' ];\r\n } else {\r\n return [];\r\n }\r\n },\r\n\r\n // Here to be common between caster and receiver\r\n // (used by shadowMap and shadow node shader)\r\n getDefines: function () {\r\n\r\n var textureType = this.getPrecision();\r\n var algo = this.getAlgorithm();\r\n var defines = [];\r\n\r\n var isFloat = false;\r\n var isLinearFloat = false;\r\n\r\n if ( textureType !== 'UNSIGNED_BYTE' )\r\n isFloat = true;\r\n\r\n if ( isFloat && ( textureType === 'HALF_FLOAT_LINEAR' || textureType === 'FLOAT_LINEAR' ) )\r\n isLinearFloat = true;\r\n\r\n\r\n if ( algo === 'ESM' ) {\r\n defines.push( '#define _ESM' );\r\n } else if ( algo === 'NONE' ) {\r\n defines.push( '#define _NONE' );\r\n } else if ( algo === 'PCF' ) {\r\n defines.push( '#define _PCF' );\r\n var pcf = this.getKernelSizePCF();\r\n switch ( pcf ) {\r\n case '4Poisson(16texFetch)':\r\n defines.push( '#define _POISSON_PCF' );\r\n defines.push( '#define _PCFx4' );\r\n break;\r\n case '8Poisson(32texFetch)':\r\n defines.push( '#define _POISSON_PCF' );\r\n defines.push( '#define _PCFx9' );\r\n break;\r\n case '16Poisson(64texFetch)':\r\n defines.push( '#define _POISSON_PCF' );\r\n defines.push( '#define _PCFx16' );\r\n break;\r\n case '25Poisson(100texFetch)':\r\n defines.push( '#define _POISSON_PCF' );\r\n defines.push( '#define _PCFx25' );\r\n break;\r\n case '32Poisson(128texFetch)':\r\n defines.push( '#define _POISSON_PCF' );\r\n defines.push( '#define _PCFx32' );\r\n break;\r\n case '4Band(4texFetch)':\r\n defines.push( '#define _BAND_PCF' );\r\n defines.push( '#define _PCFx4' );\r\n break;\r\n case '9Band(9texFetch)':\r\n defines.push( '#define _BAND_PCF' );\r\n defines.push( '#define _PCFx9' );\r\n break;\r\n case '16Band(16texFetch)':\r\n defines.push( '#define _BAND_PCF' );\r\n defines.push( '#define _PCFx16' );\r\n break;\r\n case '9Tap(36texFetch)':\r\n defines.push( '#define _TAP_PCF' );\r\n defines.push( '#define _PCFx9' );\r\n break;\r\n case '16Tap(64texFetch)':\r\n defines.push( '#define _TAP_PCF' );\r\n defines.push( '#define _PCFx25' );\r\n break;\r\n default:\r\n case '4Tap(16texFetch)':\r\n defines.push( '#define _TAP_PCF' );\r\n defines.push( '#define _PCFx4' );\r\n break;\r\n }\r\n } else if ( algo === 'VSM' ) {\r\n defines.push( '#define _VSM' );\r\n } else if ( algo === 'EVSM' ) {\r\n defines.push( '#define _EVSM' );\r\n }\r\n\r\n if ( isFloat ) {\r\n defines.push( '#define _FLOATTEX' );\r\n }\r\n if ( isLinearFloat ) {\r\n defines.push( '#define _FLOATLINEAR' );\r\n }\r\n\r\n return defines;\r\n },\r\n\r\n apply: function ( /*state*/) {\r\n\r\n var uniformMap = this.getOrCreateUniforms();\r\n\r\n uniformMap.bias.set( this._bias );\r\n uniformMap.exponent0.set( this._exponent0 );\r\n uniformMap.exponent1.set( this._exponent1 );\r\n uniformMap.epsilonVSM.set( this._epsilonVSM );\r\n\r\n this.setDirty( false );\r\n },\r\n\r\n // need a isEnabled to let the ShaderGenerator to filter\r\n // StateAttribute from the shader compilation\r\n isEnabled: function () {\r\n return this._enable;\r\n },\r\n // Deprecated methods, should be removed in the future\r\n isEnable: function () {\r\n Notify.log( 'ShadowAttribute.isEnable() is deprecated, use isEnabled() instead' );\r\n return this.isEnabled();\r\n },\r\n getHash: function () {\r\n\r\n return this.getTypeMember() + this.getAlgorithm() + this.getKernelSizePCF();\r\n\r\n }\r\n\r\n } ), 'osgShadow', 'ShadowAttribute' );\r\n\r\n MACROUTILS.setTypeID( ShadowAttribute );\r\n\r\n return ShadowAttribute;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShadow/ShadowAttribute.js\n ** module id = 159\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/BoundingBox',\r\n 'osg/BoundingSphere',\r\n 'osg/Camera',\r\n 'osg/ComputeMatrixFromNodePath',\r\n 'osg/CullVisitor',\r\n 'osg/Geometry',\r\n 'osg/Light',\r\n 'osg/Matrix',\r\n 'osg/MatrixTransform',\r\n 'osg/Node',\r\n 'osg/NodeVisitor',\r\n 'osg/Notify',\r\n 'osg/Object',\r\n 'osg/Plane',\r\n 'osg/Utils',\r\n 'osg/Vec3'\r\n], function (\r\n BoundingBox, BoundingSphere, Camera, ComputeMatrixFromNodePath, CullVisitor, Geometry, Light, Matrix, MatrixTransform, Node, NodeVisitor, Notify, Object, Plane, MACROUTILS ) {\r\n 'use strict';\r\n /**\r\n * [ComputeFrustumBoundsVisitor get a scene bounds limited by a light and camera frustum]\r\n */\r\n var ComputeMultiFrustumBoundsVisitor = function () {\r\n NodeVisitor.call( this, NodeVisitor.TRAVERSE_ALL_CHILDREN );\r\n this._matrixStack = [ Matrix.create() ];\r\n this._bb = new BoundingBox();\r\n this._bs = new BoundingSphere();\r\n // keep a matrix in memory to avoid to create matrix\r\n this._reserveMatrixStack = [\r\n Matrix.create()\r\n ];\r\n this._reserveMatrixStack.current = 0;\r\n\r\n };\r\n\r\n /*\r\n * TODO: apply world matrix on the traverse instead of per node\r\n */\r\n ComputeMultiFrustumBoundsVisitor.prototype = MACROUTILS.objectInherit( NodeVisitor.prototype, {\r\n reset: function ( traversalMask, worldLightPos, cameraFrustum, cameraNearFar, lightFrustum ) {\r\n\r\n this.setTraversalMask( traversalMask );\r\n\r\n this._cameraFrustum = cameraFrustum;\r\n this._lightFrustum = lightFrustum;\r\n\r\n // what plane to exclude from shadowedscene\r\n this.getCameraPlaneMaskForLightNear( worldLightPos, cameraFrustum, cameraNearFar ? 6 : 4 );\r\n\r\n this._reserveMatrixStack.current = 0;\r\n this._matrixStack.length = 1;\r\n this._bb.init();\r\n },\r\n\r\n getBoundingBox: function () {\r\n return this._bb;\r\n },\r\n\r\n\r\n getCameraPlaneMaskForLightNear: function ( point, cameraFrustum, len ) {\r\n var selectorMask = 0x1;\r\n var resultMask = 15;\r\n var i;\r\n\r\n for ( i = 0; i < len; ++i ) {\r\n resultMask = ( resultMask << 1 ) | 1;\r\n }\r\n\r\n var planeList = cameraFrustum.getPlanes();\r\n for ( i = 0; i < len; ++i ) {\r\n if ( Plane.distanceToPlane( planeList[ i ], point ) < 0.0 ) {\r\n // Ligth frustum source poitn is outside this plane.\r\n // subsequent checks against this plane not required.\r\n // as light position is behind those,\r\n // and culling that would cull light near\r\n resultMask ^= selectorMask;\r\n }\r\n selectorMask <<= 1;\r\n }\r\n this._cameraPlaneMaskedByLightNear = resultMask;\r\n\r\n cameraFrustum.setResultMask( resultMask );\r\n cameraFrustum.pushCurrentMask( resultMask );\r\n return resultMask;\r\n },\r\n _getReservedMatrix: function () {\r\n var m = this._reserveMatrixStack[ this._reserveMatrixStack.current++ ];\r\n if ( this._reserveMatrixStack.current === this._reserveMatrixStack.length ) {\r\n this._reserveMatrixStack.push( Matrix.create() );\r\n }\r\n return m;\r\n },\r\n\r\n applyTransform: function ( transform ) {\r\n\r\n var matrix = this._getReservedMatrix();\r\n var stackLength = this._matrixStack.length;\r\n Matrix.copy( this._matrixStack[ stackLength - 1 ], matrix );\r\n transform.computeLocalToWorldMatrix( matrix, this );\r\n\r\n var bs = this._bs;\r\n Matrix.transformBoundingSphere( matrix, transform.getBound(), this._bs );\r\n\r\n // camera cull\r\n if ( this._cameraFrustum.getCurrentMask() !== 0 ) {\r\n // father bounding sphere is not totally inside\r\n // now test this one\r\n if ( !this._cameraFrustum.containsBoundingSphere( bs ) )\r\n return; // culled\r\n }\r\n\r\n // light cull\r\n if ( this._lightFrustum.getCurrentMask() !== 0 ) {\r\n // father bounding sphere is not totally inside\r\n // now test this one\r\n if ( !this._lightFrustum.containsBoundingSphere( bs ) )\r\n return; // culled\r\n }\r\n\r\n this._cameraFrustum.pushCurrentMask();\r\n this._lightFrustum.pushCurrentMask();\r\n\r\n this.pushMatrix( matrix );\r\n\r\n this.traverse( transform );\r\n\r\n this._cameraFrustum.popCurrentMask();\r\n this._lightFrustum.popCurrentMask();\r\n\r\n this.popMatrix();\r\n },\r\n applyBoundingBox: ( function () {\r\n var bbOut = new BoundingBox();\r\n return function ( bbox ) {\r\n var stackLength = this._matrixStack.length;\r\n var matrix = this._matrixStack[ stackLength - 1 ];\r\n if ( Matrix.isIdentity( matrix ) ) {\r\n this._bb.expandByBoundingBox( bbox );\r\n } else if ( bbox.valid() ) {\r\n Matrix.transformBoundingBox( matrix, bbox, bbOut );\r\n this._bb.expandByBoundingBox( bbOut );\r\n }\r\n };\r\n } )(),\r\n\r\n apply: function ( node ) {\r\n\r\n var typeID = node.getTypeID();\r\n\r\n if ( typeID === MatrixTransform.getTypeID() ) {\r\n this.applyTransform( node );\r\n return;\r\n\r\n } else if ( typeID === Geometry.getTypeID() ) {\r\n var bs = this._bs;\r\n var matrix = this._matrixStack[ this._matrixStack.length - 1 ];\r\n Matrix.transformBoundingSphere( matrix, node.getBound(), bs );\r\n\r\n // camera cull\r\n if ( this._cameraFrustum.getCurrentMask() !== 0 ) {\r\n // father bounding sphere is not totally inside\r\n // now test this one\r\n if ( !this._cameraFrustum.containsBoundingSphere( bs ) )\r\n return; // culled\r\n }\r\n\r\n // light cull\r\n if ( this._lightFrustum.getCurrentMask() !== 0 ) {\r\n // father bounding sphere is not totally inside\r\n // now test this one\r\n if ( !this._lightFrustum.containsBoundingSphere( bs ) )\r\n return; // culled\r\n }\r\n\r\n // Visible: we enlarge the bbox\r\n this.applyBoundingBox( node.getBoundingBox() );\r\n\r\n return;\r\n } else if ( typeID === Camera.getTypeID() ) {\r\n\r\n } else if ( typeID === Light.getTypeID() ) {\r\n\r\n }\r\n\r\n\r\n this.traverse( node );\r\n\r\n },\r\n\r\n pushMatrix: function ( matrix ) {\r\n this._matrixStack.push( matrix );\r\n },\r\n\r\n popMatrix: function () {\r\n this._matrixStack.pop();\r\n },\r\n\r\n } );\r\n\r\n return ComputeMultiFrustumBoundsVisitor;\r\n\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShadow/ShadowFrustumIntersection.js\n ** module id = 160\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/BoundingBox',\r\n 'osg/BlendFunc',\r\n 'osg/Camera',\r\n 'osg/ComputeBoundsVisitor',\r\n 'osg/FrameBufferObject',\r\n 'osg/Matrix',\r\n 'osg/Notify',\r\n 'osg/NodeVisitor',\r\n 'osg/Program',\r\n 'osg/Shader',\r\n 'osg/StateAttribute',\r\n 'osg/StateSet',\r\n 'osg/Texture',\r\n 'osg/Transform',\r\n 'osg/Uniform',\r\n 'osg/Utils',\r\n 'osg/Vec3',\r\n 'osg/Vec4',\r\n 'osg/Viewport',\r\n 'osgShader/ShaderProcessor',\r\n 'osgShadow/ShadowAttribute',\r\n 'osgShadow/ShadowFrustumIntersection',\r\n 'osgShadow/ShadowTechnique',\r\n 'osgShadow/ShadowTexture'\r\n], function ( BoundingBox, BlendFunc, Camera, ComputeBoundsVisitor, FrameBufferObject, Matrix, Notify, NodeVisitor, Program, Shader, StateAttribute, StateSet, Texture, Transform, Uniform, MACROUTILS, Vec3, Vec4, Viewport, ShaderProcessor, ShadowAttribute, ShadowFrustumIntersection, ShadowTechnique, ShadowTexture ) {\r\n\r\n 'use strict';\r\n\r\n\r\n var TransparentRemoveVisitor = function ( mask ) {\r\n NodeVisitor.call( this );\r\n // mask setting to avoid casting shadows\r\n this._noCastMask = mask;\r\n this._nodeList = [];\r\n };\r\n TransparentRemoveVisitor.prototype = MACROUTILS.objectInherit( NodeVisitor.prototype, {\r\n reset: function () {\r\n this._nodeList = [];\r\n },\r\n apply: function ( node ) {\r\n var st = node.getStateSet();\r\n // check that and other things ?\r\n if ( st ) {\r\n var blend = st.getAttribute( 'BlendFunc' );\r\n if ( blend !== undefined && blend.getSource() !== BlendFunc.DISABLE ) {\r\n /*jshint bitwise: false */\r\n var nm = node.getNodeMask();\r\n // ~0x0 as not to be processed\r\n if ( nm === ~0x0 ) {\r\n // set to avoid casting shadow\r\n nm = this._noCastMask;\r\n node.setNodeMask( nm );\r\n this._nodeList.push( node );\r\n } else if ( ( nm & ~( this._noCastMask ) ) !== 0 ) {\r\n // set to avoid casting shadow\r\n node.setNodeMask( nm | this._noCastMask );\r\n this._nodeList.push( node );\r\n }\r\n /*jshint bitwise: true */\r\n return;\r\n }\r\n }\r\n this.traverse( node );\r\n },\r\n setNoCastMask: function ( mask ) {\r\n this._noCastMask = mask;\r\n },\r\n // restore to any previous mask avoiding any breaks\r\n // in other application mask usage.\r\n restore: function () {\r\n var node, i = this._nodeList.length;\r\n while ( i-- ) {\r\n node = this._nodeList[ i ];\r\n var nm = node.getNodeMask();\r\n if ( nm === this._noCastMask ) node.setNodeMask( ~0x0 );\r\n else node.setNodeMask( nm & ~this._noCastMask );\r\n }\r\n }\r\n\r\n } );\r\n\r\n\r\n // Custom camera cull callback\r\n // we customize it just to avoid to add extra 'virtual' function\r\n // on the shadowTecnique class\r\n var CameraCullCallback = function ( shadowTechnique ) {\r\n this._shadowTechnique = shadowTechnique;\r\n };\r\n\r\n CameraCullCallback.prototype = {\r\n cull: function ( node, nv ) {\r\n\r\n // see ShadowTechnique CameraCullCallback\r\n this._shadowTechnique.getShadowedScene().nodeTraverse( nv );\r\n\r\n\r\n\r\n var cs = nv.getCurrentCullingSet();\r\n if ( nv.getComputeNearFar() === true && nv.getComputedFar() >= nv.getComputedNear() ) {\r\n var m = nv.getCurrentProjectionMatrix();\r\n\r\n //Matrix.clampProjectionMatrix( m, nv.getComputedNear(), nv.getComputedFar(), nv.getNearFarRatio() );\r\n this._shadowTechnique.getDepthRange()[ 0 ] = nv.getComputedNear();\r\n this._shadowTechnique.getDepthRange()[ 1 ] = nv.getComputedFar();\r\n\r\n Matrix.getFrustumPlanes( m, nv.getCurrentModelViewMatrix(), cs.getFrustum().getPlanes(), false );\r\n // TODO: no far no near.\r\n // should check if we have them\r\n // should add at least a near 0 clip if not\r\n cs.getFrustum().setupMask( 6 );\r\n }\r\n\r\n this._shadowTechnique.setLightFrustum( cs.getFrustum() );\r\n return false;\r\n }\r\n };\r\n\r\n /**\r\n * ShadowMap provides an implementation of shadow textures.\r\n * @class ShadowMap\r\n */\r\n var ShadowMap = function ( settings ) {\r\n ShadowTechnique.call( this );\r\n\r\n this._projectionMatrix = Matrix.create();\r\n this._viewMatrix = Matrix.create();\r\n\r\n this._lightUp = [ 0.0, 0.0, 1.0 ];\r\n\r\n // data\r\n this._cameraShadow = new Camera();\r\n this._cameraShadow.setCullCallback( new CameraCullCallback( this ) );\r\n this._cameraShadow.setRenderOrder( Camera.PRE_RENDER, 0 );\r\n this._cameraShadow.setReferenceFrame( Transform.ABSOLUTE_RF );\r\n this._cameraShadow.setClearColor( [ 1.0, 1.0, 1.0, 1.0 ] );\r\n\r\n this._texture = new ShadowTexture();\r\n this._textureUnitBase = 4;\r\n this._textureUnit = this._textureUnitBase;\r\n\r\n // see shadowSettings.js header for param explanations\r\n this._textureMagFilter = undefined;\r\n this._textureMinFilter = undefined;\r\n this._textureSize = 256;\r\n\r\n\r\n this._receivingStateset = undefined;\r\n\r\n this._casterStateSet = new StateSet();\r\n this._casterStateSet.addUniform( Uniform.createFloat1( 0, 'exponent0' ) );\r\n this._casterStateSet.addUniform( Uniform.createFloat1( 0, 'exponent1' ) );\r\n this._casterStateSet.addUniform( Uniform.createFloat1( 0.005, 'bias' ) );\r\n this._casterStateSet.addUniform( Uniform.createFloat1( 1.0 / this._textureSize, 'texelSize' ) );\r\n\r\n var near = 0.001;\r\n var far = 1000;\r\n this._depthRange = Vec4.create();\r\n this._depthRange[ 0 ] = near;\r\n this._depthRange[ 1 ] = far;\r\n this._depthRange[ 2 ] = far - near;\r\n this._depthRange[ 3 ] = 1.0 / ( far - near );\r\n this._casterStateSet.addUniform( Uniform.createFloat4( this._depthRange, 'Shadow_DepthRange' ) );\r\n\r\n this._castsShaderProgram = undefined;\r\n\r\n this._lightSource = undefined;\r\n\r\n this._shadowAttribute = new ShadowAttribute();\r\n\r\n this._worldLightPos = Vec4.create();\r\n this._worldLightPos[ 3 ] = 0;\r\n this._worldLightDir = Vec4.create();\r\n this._worldLightDir[ 3 ] = 1;\r\n\r\n this._castsShadowDrawTraversalMask = 0xffffffff;\r\n this._castsShadowBoundsTraversalMask = 0xffffffff;\r\n\r\n // program cache\r\n this._cache = {};\r\n\r\n this._shaderProcessor = undefined;\r\n\r\n // tmp variables\r\n this._tmpVec = Vec3.create();\r\n this._tmpVecBis = Vec3.create();\r\n this._tmpVecTercio = Vec3.create();\r\n this._tmpMatrix = Matrix.create();\r\n if ( settings )\r\n this.setShadowSettings( settings );\r\n\r\n this._computeFrustumBounds = new ShadowFrustumIntersection();\r\n this._computeBoundsVisitor = new ComputeBoundsVisitor();\r\n this._transparentVisitor = new TransparentRemoveVisitor( this._castsShadowTraversalMask );\r\n\r\n\r\n this._infiniteFrustum = true;\r\n };\r\n\r\n\r\n /** @lends ShadowMap.prototype */\r\n ShadowMap.prototype = MACROUTILS.objectLibraryClass( MACROUTILS.objectInherit( ShadowTechnique.prototype, {\r\n\r\n getDepthRange: function () {\r\n return this._depthRange;\r\n },\r\n setLightFrustum: function ( lf ) {\r\n this._lightFrustum = lf;\r\n },\r\n getCamera: function () {\r\n return this._cameraShadow;\r\n },\r\n\r\n getTexture: function () {\r\n return this._texture;\r\n },\r\n\r\n isDirty: function () {\r\n return this._dirty;\r\n },\r\n\r\n\r\n setShadowCasterShaderProgram: function ( prg ) {\r\n this._casterStateSet.setAttributeAndModes( prg, StateAttribute.ON | StateAttribute.OVERRIDE );\r\n this._castsShaderProgram = prg;\r\n },\r\n\r\n getShaderProgram: function ( vs, ps, defines ) {\r\n var hash = vs + ps + defines.join( '_' );\r\n\r\n var cache = this._cache;\r\n if ( cache[ hash ] !== undefined )\r\n return cache[ hash ];\r\n\r\n // we dont want singleton right now\r\n // actually it should disappear and use instead the one from State\r\n if ( !this._shaderProcessor )\r\n this._shaderProcessor = new ShaderProcessor( true ); //\r\n\r\n var vertexshader = this._shaderProcessor.getShader( vs, defines );\r\n var fragmentshader = this._shaderProcessor.getShader( ps, defines );\r\n\r\n var program = new Program(\r\n new Shader( 'VERTEX_SHADER', vertexshader ), new Shader( 'FRAGMENT_SHADER', fragmentshader ) );\r\n\r\n cache[ hash ] = program;\r\n return program;\r\n },\r\n\r\n // computes a shader upon user choice\r\n // of shadow algorithms\r\n // shader file, define but texture type/format\r\n // associated too\r\n computeShadowCasterShaderProgram: function () {\r\n\r\n var defines = this._shadowAttribute.getDefines();\r\n\r\n var shadowmapCasterVertex = 'shadowsCastVert.glsl';\r\n var shadowmapCasterFragment = 'shadowsCastFrag.glsl';\r\n var prg = this.getShaderProgram( shadowmapCasterVertex, shadowmapCasterFragment, defines );\r\n\r\n return prg;\r\n },\r\n setTextureUnitBase: function ( unitBase ) {\r\n this._textureUnitBase = unitBase;\r\n this._textureUnit = unitBase;\r\n },\r\n\r\n getShadowCasterShaderProgram: function () {\r\n if ( this._dirty || this._castsShaderProgram === undefined ) {\r\n this._castsShaderProgram = this.computeShadowCasterShaderProgram();\r\n }\r\n return this._castsShaderProgram;\r\n },\r\n\r\n /* Sets shadowSettings\r\n */\r\n setShadowSettings: function ( shadowSettings ) {\r\n\r\n if ( !shadowSettings )\r\n return;\r\n\r\n var lightSource = shadowSettings.lightSource;\r\n\r\n this.setCastsShadowDrawTraversalMask( shadowSettings.castsShadowDrawTraversalMask );\r\n this.setCastsShadowBoundsTraversalMask( shadowSettings.castsShadowBoundsTraversalMask );\r\n\r\n this.setLightSource( lightSource );\r\n this.setTextureSize( shadowSettings.textureSize );\r\n this.setTexturePrecision( shadowSettings.textureType );\r\n\r\n this.setKernelSizePCF( shadowSettings.kernelSizePCF );\r\n this.setAlgorithm( shadowSettings.algorithm );\r\n this.setBias( shadowSettings.bias );\r\n this.setExponent0( shadowSettings.exponent );\r\n this.setExponent1( shadowSettings.exponent1 );\r\n this.setEpsilonVSM( shadowSettings.epsilonVSM );\r\n\r\n },\r\n\r\n setCastsShadowDrawTraversalMask: function ( mask ) {\r\n this._castsShadowDrawTraversalMask = mask;\r\n },\r\n getCastsShadowDrawTraversalMask: function () {\r\n return this._castsDrawShadowTraversalMask;\r\n },\r\n\r\n setCastsShadowBoundsTraversalMask: function ( mask ) {\r\n this._castsShadowBoundsTraversalMask = mask;\r\n },\r\n getCastsShadowBoundsTraversalMask: function () {\r\n return this._castsShadowBoundsTraversalMask;\r\n },\r\n\r\n\r\n getBias: function () {\r\n return this._shadowAttribute.getBias();\r\n },\r\n setBias: function ( value ) {\r\n this._shadowAttribute.setBias( value );\r\n\r\n this._casterStateSet.getUniformList()[ 'bias' ].getUniform().set( value );\r\n\r\n },\r\n\r\n getExponent0: function () {\r\n return this._shadowAttribute.getExponent0();\r\n },\r\n setExponent0: function ( value ) {\r\n this._shadowAttribute.setExponent0( value );\r\n this._casterStateSet.getUniformList()[ 'exponent0' ].getUniform().set( value );\r\n },\r\n\r\n getExponent1: function () {\r\n return this._shadowAttribute.getExponent1();\r\n },\r\n setExponent1: function ( value ) {\r\n this._shadowAttribute.setExponent1( value );\r\n this._casterStateSet.getUniformList()[ 'exponent1' ].getUniform().set( value );\r\n },\r\n\r\n getEpsilonVSM: function () {\r\n return this._shadowAttribute.getEpsilonVSM();\r\n },\r\n setEpsilonVSM: function ( value ) {\r\n this._shadowAttribute.setEpsilonVSM( value );\r\n },\r\n\r\n getKernelSizePCF: function () {\r\n return this._shadowAttribute.getKernelSizePCF();\r\n },\r\n setKernelSizePCF: function ( value ) {\r\n this._shadowAttribute.setKernelSizePCF( value );\r\n },\r\n\r\n setShadowedScene: function ( shadowedScene ) {\r\n ShadowTechnique.prototype.setShadowedScene.call( this, shadowedScene );\r\n this._receivingStateset = this._shadowedScene.getOrCreateStateSet();\r\n this.dirty();\r\n },\r\n\r\n /** initialize the ShadowedScene and local cached data structures.*/\r\n init: function () {\r\n\r\n if ( !this._shadowedScene ) return;\r\n\r\n this._filledOnce = false;\r\n\r\n\r\n var light = this._lightSource.getLight();\r\n var lightNumber = light.getLightNumber();\r\n\r\n\r\n // if light number changed we need to remove cleanly\r\n // attributes from receiveStateSet\r\n // it's because it use a typemember like light attribute\r\n // so the number if very important to keep State clean\r\n if ( this._shadowAttribute.getLightNumber() !== lightNumber ) {\r\n if ( this._receivingStateset.getAttribute( this._shadowAttribute.getTypeMember() ) === this._shadowAttribute )\r\n this._receivingStateset.removeAttribute( this._shadowAttribute.getTypeMember() );\r\n }\r\n\r\n if ( this._texture && this._texture.getLightUnit() !== lightNumber ) {\r\n // remove this._texture, but not if it's not this._texture\r\n if ( this._receivingStateset.getTextureAttribute( this._textureUnit, this._texture.getTypeMember() ) === this._texture )\r\n this._receivingStateset.removeTextureAttribute( this._textureUnit, this._texture.getTypeMember() );\r\n }\r\n\r\n if ( !this._cameraShadow ) {\r\n this._cameraShadow = new Camera();\r\n this._cameraShadow.setCullCallback( new CameraCullCallback( this ) );\r\n this._cameraShadow.setRenderOrder( Camera.PRE_RENDER, 0 );\r\n this._cameraShadow.setReferenceFrame( Transform.ABSOLUTE_RF );\r\n this._cameraShadow.setClearColor( [ 1.0, 1.0, 1.0, 1.0 ] );\r\n }\r\n\r\n this.initTexture();\r\n this._textureUnit = this._textureUnitBase + lightNumber;\r\n this._cameraShadow.setName( 'light_shadow_camera' + light.getName() );\r\n\r\n this._texture.setLightUnit( lightNumber );\r\n this._texture.setName( 'ShadowTexture' + this._textureUnit );\r\n\r\n this._shadowAttribute.setLight( light );\r\n\r\n this._receivingStateset.setAttributeAndModes( this._shadowAttribute, StateAttribute.ON | StateAttribute.OVERRIDE );\r\n\r\n\r\n\r\n // prevent unnecessary texture bindings\r\n\r\n if ( !ShadowMap.BlankTexture ) {\r\n ShadowMap.BlankTexture = new Texture();\r\n ShadowMap.BlankTexture.setName( 'emptyTex' );\r\n }\r\n var blankTexture = ShadowMap.BlankTexture;\r\n\r\n // Mandatory: prevent binding shadow textures themselves (shadowedScene stateSet is applied\r\n // just above in stateset hierarchy\r\n // that would mean undefined values as it would be read/write access...\r\n this._casterStateSet.setTextureAttributeAndModes( this._textureUnit, blankTexture, StateAttribute.OFF | StateAttribute.OVERRIDE | StateAttribute.PROTECTED );\r\n\r\n // TODO: optimize: have a \"don't touch current Texture stateAttribute\"\r\n // on ALL texture unit but alpha max texture for Depth/Normal/etc renders\r\n\r\n // TODO: actually get the real max texture unit from webglCaps\r\n //var shouldGetMaxTextureUnits = 32;\r\n //\r\n // TODO:: Should handle the alpha_mask that uses a texture\r\n // case somehow...\r\n // deduce from shader compil ?\r\n //for ( var k = 0; k < shouldGetMaxTextureUnits; k++ ) {\r\n // this._casterStateSet.setTextureAttributeAndModes( k, blankTexture, StateAttribute.OFF | StateAttribute.OVERRIDE | StateAttribute.PROTECTED );\r\n //}\r\n\r\n\r\n var casterProgram = this.getShadowCasterShaderProgram();\r\n this.setShadowCasterShaderProgram( casterProgram );\r\n\r\n // add shadow texture to the receivers\r\n // should make sure somehow that\r\n // alpha blender transparent receiver doens't use it\r\n // compiler wise at least\r\n this._receivingStateset.setTextureAttributeAndModes( this._textureUnit, this._texture, StateAttribute.ON | StateAttribute.OVERRIDE );\r\n\r\n this._dirty = false;\r\n },\r\n\r\n valid: function () {\r\n // checks\r\n return true;\r\n },\r\n\r\n updateShadowTechnique: function ( /*nv*/) {\r\n\r\n var camera = this._cameraShadow;\r\n var texture = this._texture;\r\n\r\n if ( camera && texture ) {\r\n\r\n var vp = camera.getViewport();\r\n if ( !vp ) {\r\n vp = new Viewport();\r\n camera.setViewport( vp );\r\n }\r\n\r\n // if texture size changed update the camera rtt params\r\n if ( vp.width() !== texture.getWidth() ||\r\n vp.height() !== texture.getHeight() ) {\r\n\r\n camera.detachAll();\r\n\r\n camera.attachTexture( FrameBufferObject.COLOR_ATTACHMENT0, texture );\r\n camera.attachRenderBuffer( FrameBufferObject.DEPTH_ATTACHMENT, FrameBufferObject.DEPTH_COMPONENT16 );\r\n\r\n camera.getViewport().setViewport( 0, 0, texture.getWidth(), texture.getHeight() );\r\n }\r\n }\r\n },\r\n\r\n updateShadowTechnic: function ( /*nv*/) {\r\n Notify.log( 'ShadowMap.updateShadowTechnic() is deprecated, use updateShadowTechnique instead' );\r\n this.updateShadowTechnique();\r\n },\r\n\r\n // internal texture allocation\r\n // handle any change like resize, filter param, etc.\r\n initTexture: function () {\r\n\r\n if ( !this._dirty ) return;\r\n\r\n if ( !this._texture ) {\r\n this._texture = new ShadowTexture();\r\n this._textureUnit = this._textureUnitBase;\r\n }\r\n\r\n var texType = this.getTexturePrecision();\r\n var textureType, textureFormat, texFilterMin, texFilterMag;\r\n\r\n // see shadowSettings.js header\r\n switch ( this.getAlgorithm() ) {\r\n case 'ESM':\r\n case 'VSM':\r\n case 'EVSM':\r\n texFilterMin = Texture.LINEAR;\r\n texFilterMag = Texture.LINEAR;\r\n break;\r\n\r\n default:\r\n case 'PCF':\r\n case 'NONE':\r\n texFilterMin = Texture.NEAREST;\r\n texFilterMag = Texture.NEAREST;\r\n break;\r\n }\r\n\r\n switch ( texType ) {\r\n case 'HALF_FLOAT':\r\n textureType = Texture.HALF_FLOAT;\r\n texFilterMin = Texture.NEAREST;\r\n texFilterMag = Texture.NEAREST;\r\n break;\r\n case 'HALF_FLOAT_LINEAR':\r\n textureType = Texture.HALF_FLOAT;\r\n texFilterMin = Texture.LINEAR;\r\n texFilterMag = Texture.LINEAR;\r\n break;\r\n case 'FLOAT':\r\n textureType = Texture.FLOAT;\r\n texFilterMin = Texture.NEAREST;\r\n texFilterMag = Texture.NEAREST;\r\n break;\r\n case 'FLOAT_LINEAR':\r\n textureType = Texture.FLOAT;\r\n texFilterMin = Texture.LINEAR;\r\n texFilterMag = Texture.LINEAR;\r\n break;\r\n default:\r\n case 'UNSIGNED_BYTE':\r\n textureType = Texture.UNSIGNED_BYTE;\r\n break;\r\n }\r\n\r\n textureFormat = Texture.RGBA;\r\n this._texture.setTextureSize( this._textureSize, this._textureSize );\r\n\r\n this._texture.setInternalFormatType( textureType );\r\n\r\n this._texture.setMinFilter( texFilterMin );\r\n this._texture.setMagFilter( texFilterMag );\r\n this._texture.setInternalFormat( textureFormat );\r\n\r\n this._textureMagFilter = texFilterMag;\r\n this._textureMinFilter = texFilterMin;\r\n\r\n this._texture.setWrapS( Texture.CLAMP_TO_EDGE );\r\n this._texture.setWrapT( Texture.CLAMP_TO_EDGE );\r\n\r\n this._texture.dirty();\r\n\r\n },\r\n setTexturePrecision: function ( format ) {\r\n if ( format === this._shadowAttribute.getPrecision() ) return;\r\n\r\n this._shadowAttribute.setPrecision( format );\r\n this.dirty();\r\n },\r\n\r\n getTexturePrecision: function () {\r\n return this._shadowAttribute.getPrecision();\r\n },\r\n\r\n setTextureSize: function ( mapSize ) {\r\n\r\n if ( mapSize === this._textureSize ) return;\r\n\r\n this._textureSize = mapSize;\r\n this.dirty();\r\n },\r\n\r\n setAlgorithm: function ( algo ) {\r\n\r\n if ( algo === this.getAlgorithm() ) return;\r\n this._shadowAttribute.setAlgorithm( algo );\r\n this.dirty();\r\n },\r\n\r\n getAlgorithm: function () {\r\n return this._shadowAttribute.getAlgorithm();\r\n },\r\n\r\n setLightSource: function ( lightSource ) {\r\n\r\n if ( !lightSource || lightSource === this._lightSource )\r\n return;\r\n\r\n this._lightSource = lightSource;\r\n var light = lightSource.getLight();\r\n\r\n if ( !light ) {\r\n Notify.log( 'ShadowMap.setLightSource no light attached to the lightsource' );\r\n }\r\n\r\n this.dirty();\r\n },\r\n\r\n getUp: function ( dir ) {\r\n //avoid dir/up wrong angle breaking computation\r\n\r\n // compute a up vector ensuring avoiding parallel vectors\r\n // also might reverting to it once got the change here done once\r\n // [ 0.0, 0.0, 1.0 ];\r\n\r\n if ( Math.abs( Vec3.dot( this._lightUp, dir ) ) >= 1.0 ) {\r\n // another camera up\r\n // [ 1.0, 0.0, 0.0 ];\r\n if ( this._lightUp[ 0 ] === 1.0 ) {\r\n this._lightUp[ 0 ] = 0.0;\r\n this._lightUp[ 1 ] = 1.0;\r\n this._lightUp[ 2 ] = 0.0;\r\n } else {\r\n this._lightUp[ 0 ] = 1.0;\r\n this._lightUp[ 1 ] = 0.0;\r\n this._lightUp[ 2 ] = 0.0;\r\n }\r\n }\r\n return this._lightUp;\r\n },\r\n\r\n // makes sure we don't have incorrect near/far\r\n // or we actually have to render something.\r\n // Empty or Bad Frustums\r\n // No objects, handle it gracefully\r\n nearFarBounding: function () {\r\n\r\n var zNear = this._depthRange[ 0 ];\r\n var zFar = this._depthRange[ 1 ];\r\n\r\n var epsilon = ShadowMap.EPSILON;\r\n if ( zFar < zNear - epsilon ) {\r\n // early out\r\n this._emptyCasterScene = true;\r\n zFar = 1;\r\n zNear = epsilon;\r\n } else if ( zNear < epsilon ) {\r\n zNear = epsilon;\r\n }\r\n\r\n var nearFarRatio = 0.005;\r\n if ( zNear < zFar * nearFarRatio ) {\r\n zNear = zFar * nearFarRatio;\r\n }\r\n\r\n this._depthRange[ 0 ] = zNear;\r\n this._depthRange[ 1 ] = zFar;\r\n },\r\n\r\n makePerspectiveFromBoundingBox: function ( bbox, fov, eyePos, eyeDir, view, projection ) {\r\n var center = bbox.center( this._tmpVec );\r\n var radius = bbox.radius();\r\n var epsilon = ShadowMap.EPSILON;\r\n var zNear = epsilon;\r\n var zFar = 1.0;\r\n\r\n Vec3.copy( eyeDir, this._tmpVecBis );\r\n Vec3.neg( this._tmpVecBis, this._tmpVecBis );\r\n Vec3.normalize( this._tmpVecBis, this._tmpVecBis );\r\n\r\n // light Near Plane Equation\r\n // E = eyeDir + d\r\n var d = Vec3.dot( eyePos, this._tmpVecBis );\r\n // then distance to center point of sphere\r\n // perpendicular to lightdir\r\n var distance = Vec3.dot( center, this._tmpVecBis ) + d;\r\n\r\n // inside or not have unfluence\r\n // on using radius for fov\r\n if ( distance < -radius ) {\r\n // won't render anything the object is behind..\r\n this._emptyCasterScene = true;\r\n } else if ( distance <= 0.0 ) {\r\n // shhh.. we're inside !\r\n // sphere center is behind\r\n zNear = epsilon;\r\n zFar = distance + radius;\r\n } else if ( distance < radius ) {\r\n // shhh.. we're inside !\r\n // sphere center is in front\r\n zNear = epsilon;\r\n zFar = distance + radius;\r\n } else {\r\n // Sphere totally in front\r\n // long distance runner\r\n // we must make a nicer zNear here!\r\n zNear = distance - radius;\r\n zFar = distance + radius;\r\n }\r\n\r\n this._depthRange[ 0 ] = zNear;\r\n this._depthRange[ 1 ] = zFar;\r\n this.nearFarBounding();\r\n\r\n // positional light: spot, point, area\r\n // fov < 180.0\r\n // statically defined by spot, only needs zNear zFar estimates\r\n var fovRadius = this._depthRange[ 0 ] * Math.tan( fov * Math.PI / 180.0 );\r\n // if scene radius is smaller than fov on scene\r\n // Tighten and enhance precision\r\n fovRadius = fovRadius > radius ? radius : fovRadius;\r\n\r\n var ymax = fovRadius;\r\n var ymin = -ymax;\r\n\r\n var xmax = fovRadius;\r\n var xmin = -xmax;\r\n\r\n var up = this.getUp( eyeDir );\r\n\r\n if ( this._infiniteFrustum ) {\r\n Matrix.makeFrustumInfinite( xmin, xmax, ymin, ymax, this._depthRange[ 0 ], this._depthRange[ 1 ], projection );\r\n } else {\r\n Matrix.makeFrustum( xmin, xmax, ymin, ymax, this._depthRange[ 0 ], this._depthRange[ 1 ], projection );\r\n }\r\n\r\n Matrix.makeLookFromDirection( eyePos, eyeDir, up, view );\r\n },\r\n\r\n makeOrthoFromBoundingBox: function ( bbox, eyeDir, view, projection ) {\r\n\r\n var center = bbox.center( this._tmpVecTercio );\r\n\r\n var radius = bbox.radius();\r\n var diameter = radius + radius;\r\n\r\n var zNear = 0.0001;\r\n var zFar = diameter + 0.0001;\r\n\r\n // compute eye Pos from a inverted lightDir Ray shot from center of bbox\r\n // firs make a RAY\r\n var ray = this._tmpVecBis;\r\n Vec3.mult( eyeDir, -diameter, ray );\r\n // then move the eye to the that far pos following the ray\r\n var eyePos = this._tmpVec;\r\n Vec3.add( center, ray, eyePos );\r\n\r\n zNear = radius;\r\n zFar += radius;\r\n\r\n var zNearRatio = 0.001;\r\n if ( zNear < zFar * zNearRatio ) {\r\n zNear = zFar * zNearRatio;\r\n }\r\n\r\n var up = this.getUp( eyeDir );\r\n Matrix.makeLookFromDirection( eyePos, eyeDir, up, view );\r\n\r\n var right, top;\r\n top = radius;\r\n right = top;\r\n Matrix.makeOrtho( -right, right, -top, top, zNear, zFar, projection );\r\n\r\n this._depthRange[ 0 ] = zNear;\r\n this._depthRange[ 1 ] = zFar;\r\n\r\n },\r\n /*\r\n * Sync camera and light vision so that\r\n * shadow map render using a camera whom\r\n * settings come from the light\r\n * and the scene being shadowed\r\n */\r\n aimShadowCastingCamera: function ( cullVisitor, frustumBound ) {\r\n\r\n var lightSource = this._lightSource;\r\n\r\n if ( !lightSource ) {\r\n this._emptyCasterScene = true;\r\n return;\r\n }\r\n\r\n var light = lightSource.getLight();\r\n var camera = this._cameraShadow;\r\n\r\n var worldLightPos = this._worldLightPos;\r\n var worldLightDir = this._worldLightDir;\r\n\r\n // make sure it's not modified outside our computations\r\n // camera matrix can be modified by cullvisitor afterwards...\r\n\r\n Matrix.copy( camera.getProjectionMatrix(), this._projectionMatrix );\r\n Matrix.copy( camera.getViewMatrix(), this._viewMatrix );\r\n var projection = this._projectionMatrix;\r\n var view = this._viewMatrix;\r\n\r\n // inject camera world matrix.\r\n // from light current world/pos and camera eye pos.\r\n // inject camera world matrix.\r\n // from light current world/pos\r\n // NEED same camera eye pos\r\n var positionedAttribute = cullVisitor.getCurrentRenderBin().getPositionedAttribute();\r\n\r\n var lightMatrix;\r\n positionedAttribute = positionedAttribute.find( function ( element ) {\r\n if ( element.length > 0 && element[ 1 ] === light ) {\r\n lightMatrix = element[ 0 ];\r\n return true;\r\n }\r\n return false;\r\n } );\r\n if ( lightMatrix === undefined ) {\r\n Notify.warn( 'light isnt inside children of shadowedScene Node' );\r\n this._emptyCasterScene = true;\r\n return;\r\n }\r\n\r\n var eyeToWorld = this._tmpMatrix;\r\n Matrix.inverse( cullVisitor.getCurrentModelViewMatrix(), eyeToWorld );\r\n\r\n // light pos & lightTarget in World Space\r\n if ( light.getPosition()[ 3 ] !== 0.0 && light.getSpotCutoff() < 180 ) {\r\n //TODO: when spot light is camera attached?\r\n\r\n // light matrix is in eye space. even if it's below an Absolute REF Node. (wtf)\r\n Matrix.inverse( cullVisitor.getCurrentModelViewMatrix(), eyeToWorld );\r\n Matrix.mult( eyeToWorld, lightMatrix, this._tmpMatrix );\r\n var worldMatrix = this._tmpMatrix;\r\n // same code as light spot shader\r\n Matrix.transformVec3( worldMatrix, light.getPosition(), worldLightPos );\r\n worldMatrix[ 12 ] = 0;\r\n worldMatrix[ 13 ] = 0;\r\n worldMatrix[ 14 ] = 0;\r\n Matrix.inverse( worldMatrix, worldMatrix );\r\n Matrix.transpose( worldMatrix, worldMatrix );\r\n\r\n // not a directionnal light, compute the world light dir\r\n Vec3.copy( light.getDirection(), worldLightDir );\r\n Matrix.transformVec4( worldMatrix, worldLightDir, worldLightDir );\r\n Vec3.normalize( worldLightDir, worldLightDir );\r\n\r\n // and compute a perspective frustum\r\n this.makePerspectiveFromBoundingBox( frustumBound, light.getSpotCutoff(), worldLightPos, worldLightDir, view, projection );\r\n } else {\r\n Matrix.transformVec4( lightMatrix, light.getPosition(), worldLightPos );\r\n Matrix.transformVec4( eyeToWorld, worldLightPos, worldLightPos );\r\n // same code as light sun shader\r\n // lightpos is a light dir\r\n // so we now have to normalize\r\n // since the transform to world above\r\n Vec3.mult( worldLightPos, -1.0, worldLightPos );\r\n Vec3.normalize( worldLightPos, worldLightPos );\r\n this.makeOrthoFromBoundingBox( frustumBound, worldLightPos, view, projection );\r\n }\r\n\r\n\r\n Matrix.copy( this._projectionMatrix, camera.getProjectionMatrix() );\r\n Matrix.copy( this._viewMatrix, camera.getViewMatrix() );\r\n\r\n // set values now\r\n this.setShadowUniformsDepthValue();\r\n\r\n },\r\n\r\n // culling is done,\r\n // now try for a the tightest frustum\r\n // possible for shadowcasting\r\n frameShadowCastingFrustum: function ( cullVisitor ) {\r\n\r\n if ( !this._infiniteFrustum ) {\r\n this.nearFarBounding();\r\n Matrix.clampProjectionMatrix( this._projectionMatrix, this._depthRange[ 0 ], this._depthRange[ 1 ], cullVisitor.getNearFarRatio(), this._depthRange );\r\n this.setShadowUniformsDepthValue();\r\n }\r\n\r\n // overwrite any cullvisitor wrongness\r\n var camera = this._cameraShadow;\r\n Matrix.copy( this._projectionMatrix, camera.getProjectionMatrix() );\r\n Matrix.copy( this._viewMatrix, camera.getViewMatrix() );\r\n\r\n },\r\n\r\n setShadowUniformsDepthValue: function () {\r\n\r\n this.nearFarBounding();\r\n\r\n // set values now\r\n this._depthRange[ 2 ] = this._depthRange[ 1 ] - this._depthRange[ 0 ];\r\n this._depthRange[ 3 ] = 1.0 / ( this._depthRange[ 2 ] );\r\n\r\n var castUniforms = this._casterStateSet.getUniformList();\r\n castUniforms[ 'Shadow_DepthRange' ].getUniform().set( this._depthRange );\r\n\r\n this._texture.setViewMatrix( this._viewMatrix );\r\n this._texture.setProjectionMatrix( this._projectionMatrix );\r\n this._texture.setDepthRange( this._depthRange );\r\n\r\n },\r\n\r\n noDraw: function () {\r\n\r\n this._depthRange[ 0 ] = 0.0;\r\n this._depthRange[ 1 ] = 0.0;\r\n this._depthRange[ 2 ] = 0.0;\r\n this._depthRange[ 3 ] = 0.0;\r\n\r\n var castUniforms = this._casterStateSet.getUniformList();\r\n castUniforms[ 'Shadow_DepthRange' ].getUniform().set( this._depthRange );\r\n this._texture.setDepthRange( this._depthRange );\r\n\r\n var camera = this._cameraShadow;\r\n\r\n // make sure it's not modified outside our computations\r\n // camera matrix can be modified by cullvisitor afterwards...\r\n Matrix.copy( camera.getProjectionMatrix(), this._projectionMatrix );\r\n Matrix.copy( camera.getViewMatrix(), this._viewMatrix );\r\n\r\n this._texture.setViewMatrix( this._viewMatrix );\r\n this._texture.setProjectionMatrix( this._projectionMatrix );\r\n\r\n this._filledOnce = true;\r\n },\r\n // Defines the frustum from light param.\r\n //\r\n cullShadowCasting: function ( cullVisitor ) {\r\n\r\n\r\n var bbox;\r\n\r\n\r\n this._transparentVisitor.setNoCastMask( ~( this._castsShadowBoundsTraversalMask | this._castsShadowDrawTraversalMask ) );\r\n this._transparentVisitor.reset();\r\n this.getShadowedScene().accept( this._transparentVisitor );\r\n\r\n\r\n this._computeBoundsVisitor.setTraversalMask( this._castsShadowBoundsTraversalMask );\r\n this._computeBoundsVisitor.reset();\r\n this.getShadowedScene().accept( this._computeBoundsVisitor );\r\n bbox = this._computeBoundsVisitor.getBoundingBox();\r\n\r\n if ( !bbox.valid() ) {\r\n // nothing to draw Early out.\r\n this.noDraw();\r\n return;\r\n }\r\n\r\n // HERE we get the shadowedScene Current World Matrix\r\n // to get any world transform ABOVE the shadowedScene\r\n var worldMatrix = cullVisitor.getCurrentModelWorldMatrix();\r\n // it does fuck up the results.\r\n Matrix.transformBoundingBox( worldMatrix, bbox, bbox );\r\n\r\n this._emptyCasterScene = false;\r\n this.aimShadowCastingCamera( cullVisitor, bbox );\r\n\r\n if ( this._emptyCasterScene ) {\r\n // nothing to draw Early out.\r\n console.log( 'shadow early OUT' );\r\n this.noDraw();\r\n return;\r\n }\r\n\r\n\r\n // get renderer to make the cull program\r\n // record the traversal mask on entry so we can reapply it later.\r\n var traversalMask = cullVisitor.getTraversalMask();\r\n\r\n cullVisitor.setTraversalMask( this._castsShadowDrawTraversalMask );\r\n\r\n // cast geometries into depth shadow map\r\n cullVisitor.pushStateSet( this._casterStateSet );\r\n\r\n this._cameraShadow.setEnableFrustumCulling( true );\r\n // enabling this makes for strange projection fuck up\r\n // (as in clamped too tight projection)\r\n var needNearFar = this._castsShadowDrawTraversalMask === this._castsShadowBoundsTraversalMask;\r\n this._cameraShadow.setComputeNearFar( needNearFar );\r\n\r\n\r\n\r\n // do RTT from the camera traversal mimicking light pos/orient\r\n this._cameraShadow.accept( cullVisitor );\r\n\r\n // Here culling is done, we do have near/far.\r\n // and cull/non-culled info\r\n // if we wanted a tighter frustum.\r\n if ( needNearFar ) {\r\n this.frameShadowCastingFrustum( cullVisitor );\r\n }\r\n\r\n\r\n // enabling this makes for strange projection fuck up\r\n // (as in clamped too tight projection)\r\n this._cameraShadow.setComputeNearFar( false );\r\n\r\n // remove our flags changes on any bitmask\r\n // not to break things\r\n this._transparentVisitor.restore();\r\n\r\n cullVisitor.popStateSet();\r\n\r\n // reapply the original traversal mask\r\n cullVisitor.setTraversalMask( traversalMask );\r\n this._filledOnce = true;\r\n },\r\n\r\n cleanReceivingStateSet: function () {\r\n if ( this._receivingStateset ) {\r\n\r\n if ( this._texture ) {\r\n // remove this._texture, but not if it's not this._texture\r\n if ( this._receivingStateset.getTextureAttribute( this._textureUnit, this._texture.getTypeMember() ) === this._texture )\r\n this._receivingStateset.removeTextureAttribute( this._textureUnit, this._texture.getTypeMember() );\r\n }\r\n\r\n if ( this._receivingStateset.getAttribute( this._shadowAttribute.getTypeMember() ) === this._shadowAttribute )\r\n this._receivingStateset.removeAttribute( this._shadowAttribute.getTypeMember() );\r\n }\r\n\r\n },\r\n cleanSceneGraph: function () {\r\n // well release a lot more things when it works\r\n this._cameraShadow = undefined;\r\n this._filledOnce = false;\r\n\r\n\r\n this.cleanReceivingStateSet();\r\n\r\n // TODO: need state\r\n //this._texture.releaseGLObjects();\r\n //this._shadowAttribute = undefined;\r\n this._texture = undefined;\r\n this._shadowedScene = undefined;\r\n }\r\n\r\n } ), 'osgShadow', 'ShadowMap' );\r\n\r\n ShadowMap.EPSILON = 5e-3;\r\n\r\n MACROUTILS.setTypeID( ShadowMap );\r\n\r\n return ShadowMap;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShadow/ShadowMap.js\n ** module id = 161\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/Object',\r\n 'osg/Texture'\r\n], function ( MACROUTILS, Object, Texture ) {\r\n 'use strict';\r\n\r\n var kernelSizeList = [ '4Band(4texFetch)', '9Band(9texFetch)', '16Band(16texFetch)', '4Tap(16texFetch)', '9Tap(36texFetch)', '16Tap(64texFetch)', '4Poisson(16texFetch)', '8Poisson(32texFetch)', '16Poisson(64texFetch)', '25Poisson(100texFetch)', '32Poisson(128texFetch)' ];\r\n\r\n /**\r\n * ShadowSettings provides the parameters that the ShadowTechnique should use as a guide for setting up shadowing\r\n * @class ShadowSettings\r\n */\r\n var ShadowSettings = function ( options ) {\r\n\r\n this.castsShadowDrawTraversalMask = 0xffffffff;\r\n this.castsShadowBoundsTraversalMask = 0xffffffff;\r\n\r\n this.textureSize = 1024;\r\n\r\n // important note:\r\n // comparison shadow is: DepthShadow > DephFragment => shadowed\r\n // which is d 0 ) {\r\n if ( this._shadowTechniques.indexOf( technique ) !== -1 ) return;\r\n }\r\n\r\n this._shadowTechniques.push( technique );\r\n\r\n if ( technique.valid() ) {\r\n technique.setShadowedScene( this );\r\n technique.dirty();\r\n }\r\n },\r\n removeShadowTechnique: function ( technique ) {\r\n\r\n if ( this._shadowTechniques.length > 0 ) {\r\n var idx = this._shadowTechniques.indexOf( technique );\r\n if ( idx !== -1 ) {\r\n\r\n if ( this._shadowTechniques[ idx ].valid() ) {\r\n this._shadowTechniques[ idx ].cleanSceneGraph();\r\n }\r\n this._shadowTechniques.splice( idx, 1 );\r\n }\r\n }\r\n },\r\n /** Clean scene graph from any shadow technique specific nodes, state and drawables.*/\r\n cleanSceneGraph: function () {\r\n for ( var i = 0, lt = this._shadowTechniques.length; i < lt; i++ ) {\r\n if ( this._shadowTechniques[ i ] && this._shadowTechniques[ i ].valid() ) {\r\n this._shadowTechniques[ i ].cleanSceneGraph();\r\n }\r\n }\r\n },\r\n\r\n /** Dirty any cache data structures held in the attached ShadowTechnique.*/\r\n dirty: function () {\r\n for ( var i = 0; i < this._shadowTechniques.length; i++ )\r\n this._shadowTechniques[ i ].dirty();\r\n },\r\n\r\n nodeTraverse: function ( /*nv*/) {\r\n Node.prototype.traverse.apply( this, arguments );\r\n },\r\n traverse: function ( nv ) {\r\n\r\n\r\n if ( nv.getVisitorType() === NodeVisitor.UPDATE_VISITOR ) {\r\n\r\n // update the scene\r\n this.nodeTraverse( nv );\r\n\r\n } else if ( nv.getVisitorType() === NodeVisitor.CULL_VISITOR ) {\r\n\r\n // cull Shadowed Scene\r\n this.cullShadowReceivingScene( nv );\r\n\r\n var i, st, lt = this._shadowTechniques.length;\r\n // cull Casters\r\n for ( i = 0; i < lt; i++ ) {\r\n st = this._shadowTechniques[ i ];\r\n // dirty check for user playing with shadows inside update traverse\r\n if ( st && st.valid() ) {\r\n\r\n // those two checks\r\n // here\r\n // in case people update it from\r\n // any update/cull/callback\r\n if ( st.isDirty() )\r\n st.init();\r\n\r\n if ( st.isEnabled() || !st.isFilledOnce() ) {\r\n st.updateShadowTechnique( nv );\r\n st.cullShadowCasting( nv );\r\n }\r\n }\r\n }\r\n\r\n } else {\r\n this.nodeTraverse( nv );\r\n }\r\n },\r\n\r\n /*receiving shadows, cull normally, but with receiving shader/state set/texture*/\r\n cullShadowReceivingScene: function ( cullVisitor ) {\r\n\r\n\r\n // not used any where ???\r\n\r\n // WARNING: only works if there is a camera as ancestor\r\n // TODO: Better (Multi)Camera detection handling\r\n this._cameraShadowed = cullVisitor.getCurrentCamera();\r\n\r\n // What to do here... we want to draw all scene object, not only receivers ?\r\n // so no mask for now\r\n //var traversalMask = cullVisitor.getTraversalMask();\r\n //cullVisitor.setTraversalMask( this.getReceivesShadowTraversalMask() );\r\n\r\n if ( this.stateset ) cullVisitor.pushStateSet( this.stateset );\r\n this.nodeTraverse( cullVisitor );\r\n if ( this.stateset ) cullVisitor.popStateSet();\r\n\r\n }\r\n\r\n\r\n } ), 'osgShadow', 'ShadowedScene' );\r\n MACROUTILS.setTypeID( ShadowedScene );\r\n\r\n // same code like Node\r\n CullVisitor.prototype[ ShadowedScene.typeID ] = CullVisitor.prototype[ Node.typeID ];\r\n\r\n return ShadowedScene;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShadow/ShadowedScene.js\n ** module id = 165\n ** module chunks = 0 1\n **/","define( [\r\n 'q'\r\n], function ( Q ) {\r\n\r\n 'use strict';\r\n\r\n var osgWrapper = {};\r\n\r\n osgWrapper.Object = function ( input, obj ) {\r\n var jsonObj = input.getJSON();\r\n var check = function ( /*o*/) {\r\n return true;\r\n };\r\n if ( !check( jsonObj ) ) {\r\n return undefined;\r\n }\r\n\r\n if ( jsonObj.Name ) {\r\n obj.setName( jsonObj.Name );\r\n }\r\n\r\n if ( jsonObj.UserDataContainer ) {\r\n var userdata = input.setJSON( jsonObj.UserDataContainer ).readUserDataContainer();\r\n if ( userdata !== undefined ) {\r\n obj.setUserData( userdata );\r\n }\r\n }\r\n\r\n return obj;\r\n };\r\n /* jshint newcap: false */\r\n osgWrapper.Node = function ( input, node ) {\r\n var jsonObj = input.getJSON();\r\n\r\n var check = function ( /*o*/) {\r\n return true;\r\n };\r\n if ( !check( jsonObj ) ) {\r\n return undefined;\r\n }\r\n\r\n osgWrapper.Object( input, node );\r\n\r\n var promiseArray = [];\r\n\r\n var createCallback = function ( jsonCallback ) {\r\n var promise = input.setJSON( jsonCallback ).readObject();\r\n var df = Q.defer();\r\n promiseArray.push( df.promise );\r\n Q.when( promise ).then( function ( cb ) {\r\n if ( cb ) {\r\n node.addUpdateCallback( cb );\r\n }\r\n df.resolve();\r\n } );\r\n };\r\n\r\n if ( jsonObj.UpdateCallbacks ) {\r\n for ( var j = 0, l = jsonObj.UpdateCallbacks.length; j < l; j++ ) {\r\n createCallback( jsonObj.UpdateCallbacks[ j ] );\r\n }\r\n }\r\n\r\n if ( jsonObj.StateSet ) {\r\n var pp = input.setJSON( jsonObj.StateSet ).readObject();\r\n var df = Q.defer();\r\n promiseArray.push( df.promise );\r\n Q.when( pp ).then( function ( stateset ) {\r\n node.setStateSet( stateset );\r\n df.resolve();\r\n } );\r\n }\r\n\r\n var createChildren = function ( jsonChildren ) {\r\n var promise = input.setJSON( jsonChildren ).readObject();\r\n var df = Q.defer();\r\n Q.when( promise ).then( function ( obj ) {\r\n df.resolve( obj );\r\n } );\r\n return df.promise;\r\n };\r\n\r\n var queue = [];\r\n // For each url, create a function call and add it to the queue\r\n if ( jsonObj.Children ) {\r\n for ( var i = 0, k = jsonObj.Children.length; i < k; i++ ) {\r\n queue.push( createChildren( jsonObj.Children[ i ] ) );\r\n }\r\n }\r\n // Resolve first updateCallbacks and stateset.\r\n var deferred = Q.defer();\r\n Q.all( promiseArray ).then( function () {\r\n deferred.resolve();\r\n } );\r\n\r\n var defer = Q.defer();\r\n // Need to wait until the stateset and the all the callbacks are resolved\r\n Q( deferred.promise ).then( function () {\r\n Q.all( queue ).then( function () {\r\n // All the results from Q.all are on the argument as an array\r\n // Now insert children in the right order\r\n for ( var i = 0; i < queue.length; i++ )\r\n node.addChild( queue[ i ] );\r\n defer.resolve( node );\r\n } );\r\n } );\r\n return defer.promise;\r\n };\r\n\r\n osgWrapper.StateSet = function ( input, stateSet ) {\r\n var jsonObj = input.getJSON();\r\n var check = function ( /*o*/) {\r\n return true;\r\n };\r\n\r\n if ( !check( jsonObj ) ) {\r\n return;\r\n }\r\n\r\n osgWrapper.Object( input, stateSet );\r\n\r\n if ( jsonObj.RenderingHint !== undefined ) {\r\n stateSet.setRenderingHint( jsonObj.RenderingHint );\r\n }\r\n\r\n var createAttribute = function ( jsonAttribute ) {\r\n var promise = input.setJSON( jsonAttribute ).readObject();\r\n var df = Q.defer();\r\n promiseArray.push( df.promise );\r\n Q.when( promise ).then( function ( attribute ) {\r\n if ( attribute !== undefined ) {\r\n stateSet.setAttributeAndModes( attribute );\r\n }\r\n df.resolve();\r\n } );\r\n };\r\n\r\n var promiseArray = [];\r\n\r\n if ( jsonObj.AttributeList !== undefined ) {\r\n for ( var i = 0, l = jsonObj.AttributeList.length; i < l; i++ ) {\r\n createAttribute( jsonObj.AttributeList[ i ] );\r\n }\r\n }\r\n\r\n var createTextureAttribute = function ( unit, textureAttribute ) {\r\n var promise = input.setJSON( textureAttribute ).readObject();\r\n var df = Q.defer();\r\n promiseArray.push( df.promise );\r\n Q.when( promise ).then( function ( attribute ) {\r\n if ( attribute )\r\n stateSet.setTextureAttributeAndModes( unit, attribute );\r\n df.resolve();\r\n } );\r\n };\r\n\r\n if ( jsonObj.TextureAttributeList ) {\r\n var textures = jsonObj.TextureAttributeList;\r\n for ( var t = 0, lt = textures.length; t < lt; t++ ) {\r\n var textureAttributes = textures[ t ];\r\n for ( var a = 0, al = textureAttributes.length; a < al; a++ ) {\r\n createTextureAttribute( t, textureAttributes[ a ] );\r\n }\r\n }\r\n }\r\n\r\n var defer = Q.defer();\r\n Q.all( promiseArray ).then( function () {\r\n defer.resolve( stateSet );\r\n } );\r\n\r\n return defer.promise;\r\n };\r\n\r\n osgWrapper.Material = function ( input, material ) {\r\n var jsonObj = input.getJSON();\r\n\r\n var check = function ( o ) {\r\n if ( o.Diffuse !== undefined &&\r\n o.Emission !== undefined &&\r\n o.Specular !== undefined &&\r\n o.Shininess !== undefined ) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n if ( !check( jsonObj ) ) {\r\n return;\r\n }\r\n\r\n osgWrapper.Object( input, material );\r\n\r\n material.setAmbient( jsonObj.Ambient );\r\n material.setDiffuse( jsonObj.Diffuse );\r\n material.setEmission( jsonObj.Emission );\r\n material.setSpecular( jsonObj.Specular );\r\n material.setShininess( jsonObj.Shininess );\r\n return material;\r\n };\r\n\r\n\r\n osgWrapper.BlendFunc = function ( input, blend ) {\r\n var jsonObj = input.getJSON();\r\n var check = function ( o ) {\r\n if ( o.SourceRGB && o.SourceAlpha && o.DestinationRGB && o.DestinationAlpha ) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n if ( !check( jsonObj ) ) {\r\n return;\r\n }\r\n\r\n osgWrapper.Object( input, blend );\r\n\r\n blend.setSourceRGB( jsonObj.SourceRGB );\r\n blend.setSourceAlpha( jsonObj.SourceAlpha );\r\n blend.setDestinationRGB( jsonObj.DestinationRGB );\r\n blend.setDestinationAlpha( jsonObj.DestinationAlpha );\r\n return blend;\r\n };\r\n\r\n osgWrapper.CullFace = function ( input, attr ) {\r\n var jsonObj = input.getJSON();\r\n var check = function ( o ) {\r\n if ( o.Mode !== undefined ) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n if ( !check( jsonObj ) ) {\r\n return;\r\n }\r\n\r\n osgWrapper.Object( input, attr );\r\n attr.setMode( jsonObj.Mode );\r\n return attr;\r\n };\r\n\r\n osgWrapper.BlendColor = function ( input, attr ) {\r\n var jsonObj = input.getJSON();\r\n var check = function ( o ) {\r\n if ( o.ConstantColor !== undefined ) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n if ( !check( jsonObj ) ) {\r\n return;\r\n }\r\n\r\n osgWrapper.Object( input, attr );\r\n attr.setConstantColor( jsonObj.ConstantColor );\r\n return attr;\r\n };\r\n\r\n osgWrapper.Light = function ( input, light ) {\r\n var jsonObj = input.getJSON();\r\n var check = function ( o ) {\r\n if ( o.LightNum !== undefined &&\r\n o.Ambient !== undefined &&\r\n o.Diffuse !== undefined &&\r\n o.Direction !== undefined &&\r\n o.Position !== undefined &&\r\n o.Specular !== undefined &&\r\n o.SpotCutoff !== undefined &&\r\n o.LinearAttenuation !== undefined &&\r\n o.ConstantAttenuation !== undefined &&\r\n o.QuadraticAttenuation !== undefined ) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n if ( !check( jsonObj ) ) {\r\n return undefined;\r\n }\r\n\r\n osgWrapper.Object( input, light );\r\n light.setAmbient( jsonObj.Ambient );\r\n light.setConstantAttenuation( jsonObj.ConstantAttenuation );\r\n light.setDiffuse( jsonObj.Diffuse );\r\n light.setDirection( jsonObj.Direction );\r\n light.setLightNumber( jsonObj.LightNum );\r\n light.setLinearAttenuation( jsonObj.LinearAttenuation );\r\n light.setPosition( jsonObj.Position );\r\n light.setQuadraticAttenuation( jsonObj.QuadraticAttenuation );\r\n light.setSpecular( jsonObj.Specular );\r\n light.setSpotCutoff( jsonObj.SpotCutoff );\r\n light.setSpotBlend( 0.01 );\r\n if ( jsonObj.SpotExponent !== undefined ) {\r\n light.setSpotBlend( jsonObj.SpotExponent / 128.0 );\r\n }\r\n return light;\r\n };\r\n\r\n osgWrapper.Texture = function ( input, texture ) {\r\n var jsonObj = input.getJSON();\r\n var check = function ( /*o*/) {\r\n return true;\r\n };\r\n if ( !check( jsonObj ) ) {\r\n return undefined;\r\n }\r\n\r\n osgWrapper.Object( input, texture );\r\n\r\n if ( jsonObj.MinFilter !== undefined ) {\r\n texture.setMinFilter( jsonObj.MinFilter );\r\n }\r\n if ( jsonObj.MagFilter !== undefined ) {\r\n texture.setMagFilter( jsonObj.MagFilter );\r\n }\r\n\r\n if ( jsonObj.WrapT !== undefined ) {\r\n texture.setWrapT( jsonObj.WrapT );\r\n }\r\n if ( jsonObj.WrapS !== undefined ) {\r\n texture.setWrapS( jsonObj.WrapS );\r\n }\r\n\r\n // no file return dummy texture\r\n var file = jsonObj.File;\r\n if ( file === undefined ) {\r\n file = 'no-image-provided';\r\n }\r\n\r\n var defer = Q.defer();\r\n Q.when( input.readImageURL( file ) ).then(\r\n function ( img ) {\r\n texture.setImage( img );\r\n defer.resolve( texture );\r\n } );\r\n return defer.promise;\r\n };\r\n\r\n osgWrapper.Projection = function ( input, node ) {\r\n var jsonObj = input.getJSON();\r\n var check = function ( o ) {\r\n if ( o.Matrix !== undefined ) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n if ( !check( jsonObj ) ) {\r\n return;\r\n }\r\n\r\n var promise = osgWrapper.Node( input, node );\r\n\r\n if ( jsonObj.Matrix !== undefined ) {\r\n node.setMatrix( jsonObj.Matrix );\r\n }\r\n return promise;\r\n };\r\n\r\n osgWrapper.MatrixTransform = function ( input, node ) {\r\n var jsonObj = input.getJSON();\r\n var check = function ( o ) {\r\n if ( o.Matrix ) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n if ( !check( jsonObj ) ) {\r\n return undefined;\r\n }\r\n\r\n var promise = osgWrapper.Node( input, node );\r\n\r\n if ( jsonObj.Matrix !== undefined ) {\r\n node.setMatrix( jsonObj.Matrix );\r\n }\r\n return promise;\r\n };\r\n\r\n osgWrapper.LightSource = function ( input, node ) {\r\n var jsonObj = input.getJSON();\r\n var check = function ( o ) {\r\n if ( o.Light !== undefined ) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n if ( !check( jsonObj ) ) {\r\n return undefined;\r\n }\r\n\r\n var defer = Q.defer();\r\n var promise = osgWrapper.Node( input, node );\r\n Q.all( [ input.setJSON( jsonObj.Light ).readObject(), promise ] ).then( function ( args ) {\r\n var light = args[ 0 ];\r\n //var lightsource = args[ 1 ];\r\n node.setLight( light );\r\n defer.resolve( node );\r\n } );\r\n return defer.promise;\r\n };\r\n\r\n osgWrapper.Geometry = function ( input, node ) {\r\n var jsonObj = input.getJSON();\r\n var check = function ( o ) {\r\n return o.VertexAttributeList !== undefined;\r\n };\r\n if ( !check( jsonObj ) ) {\r\n return;\r\n }\r\n jsonObj.PrimitiveSetList = jsonObj.PrimitiveSetList || [];\r\n\r\n var arraysPromise = [];\r\n arraysPromise.push( osgWrapper.Node( input, node ) );\r\n\r\n var createPrimitive = function ( jsonPrimitive ) {\r\n var defer = Q.defer();\r\n arraysPromise.push( defer.promise );\r\n var promise = input.setJSON( jsonPrimitive ).readPrimitiveSet();\r\n Q.when( promise ).then( function ( primitiveSet ) {\r\n if ( primitiveSet !== undefined ) {\r\n node.getPrimitives().push( primitiveSet );\r\n }\r\n defer.resolve( primitiveSet );\r\n } );\r\n };\r\n\r\n for ( var i = 0, l = jsonObj.PrimitiveSetList.length; i < l; i++ ) {\r\n var entry = jsonObj.PrimitiveSetList[ i ];\r\n createPrimitive( entry );\r\n }\r\n\r\n var createVertexAttribute = function ( name, jsonAttribute ) {\r\n var defer = Q.defer();\r\n arraysPromise.push( defer.promise );\r\n var promise = input.setJSON( jsonAttribute ).readBufferArray();\r\n Q.when( promise ).then( function ( buffer ) {\r\n if ( buffer !== undefined ) {\r\n node.getVertexAttributeList()[ name ] = buffer;\r\n }\r\n defer.resolve( buffer );\r\n } );\r\n };\r\n for ( var key in jsonObj.VertexAttributeList ) {\r\n if ( jsonObj.VertexAttributeList.hasOwnProperty( key ) ) {\r\n createVertexAttribute( key, jsonObj.VertexAttributeList[ key ] );\r\n }\r\n }\r\n\r\n var defer = Q.defer();\r\n Q.all( arraysPromise ).then( function () {\r\n defer.resolve( node );\r\n } );\r\n return defer.promise;\r\n };\r\n\r\n osgWrapper.PagedLOD = function ( input, plod ) {\r\n var jsonObj = input.getJSON();\r\n var check = function ( /*o*/) {\r\n return true;\r\n };\r\n if ( !check( jsonObj ) ) {\r\n return undefined;\r\n }\r\n\r\n osgWrapper.Object( input, plod );\r\n // Parse center Mode\r\n if ( jsonObj.CenterMode === 'USE_BOUNDING_SPHERE_CENTER' )\r\n plod.setCenterMode( 0 );\r\n else if ( jsonObj.CenterMode === 'UNION_OF_BOUNDING_SPHERE_AND_USER_DEFINED' )\r\n plod.setCenterMode( 2 );\r\n\r\n // Parse center and radius\r\n plod.setCenter( [ jsonObj.UserCenter[ 0 ], jsonObj.UserCenter[ 1 ], jsonObj.UserCenter[ 2 ] ] );\r\n plod.setRadius( jsonObj.UserCenter[ 3 ] );\r\n\r\n // Parse RangeMode\r\n if ( jsonObj.RangeMode === 'PIXEL_SIZE_ON_SCREEN' )\r\n plod.setRangeMode( 1 );\r\n\r\n var str;\r\n\r\n // Parse Ranges\r\n var o = jsonObj.RangeList;\r\n\r\n for ( var i = 0; i < Object.keys( o ).length; i++ ) {\r\n str = 'Range ' + i;\r\n var v = o[ str ];\r\n plod.setRange( i, v[ 0 ], v[ 1 ] );\r\n }\r\n // Parse Files\r\n o = jsonObj.RangeDataList;\r\n for ( i = 0; i < Object.keys( o ).length; i++ ) {\r\n str = 'File ' + i;\r\n plod.setFileName( i, o[ str ] );\r\n }\r\n\r\n var createChildren = function ( jsonChildren ) {\r\n var promise = input.setJSON( jsonChildren ).readObject();\r\n var df = Q.defer();\r\n Q.when( promise ).then( function ( obj ) {\r\n df.resolve( obj );\r\n } );\r\n return df.promise;\r\n };\r\n\r\n var queue = [];\r\n // For each url, create a function call and add it to the queue\r\n if ( jsonObj.Children ) {\r\n for ( var j = 0, k = jsonObj.Children.length; j < k; j++ ) {\r\n queue.push( createChildren( jsonObj.Children[ j ] ) );\r\n }\r\n }\r\n\r\n var defer = Q.defer();\r\n Q.all( queue ).then( function () {\r\n // All the results from Q.all are on the argument as an array\r\n for ( i = 0; i < queue.length; i++ )\r\n plod.addChildNode( queue[ i ] );\r\n defer.resolve( plod );\r\n } );\r\n\r\n return defer.promise;\r\n };\r\n return osgWrapper;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgWrappers/serializers/osg.js\n ** module id = 216\n ** module chunks = 0 1\n **/","define( [\r\n 'q',\r\n 'osg/Notify',\r\n 'osgWrappers/serializers/osg'\r\n], function ( Q, Notify, osgWrapper ) {\r\n\r\n var osgAnimationWrapper = {};\r\n\r\n osgAnimationWrapper.Animation = function ( input, animation ) {\r\n var jsonObj = input.getJSON();\r\n // check\r\n //\r\n var check = function ( o ) {\r\n if ( o.Name && o.Channels && o.Channels.length > 0 ) {\r\n return true;\r\n }\r\n if ( !o.Name ) {\r\n Notify.log( 'animation has field Name, error' );\r\n return false;\r\n }\r\n return false;\r\n };\r\n if ( !check( jsonObj ) ) {\r\n return undefined;\r\n }\r\n\r\n if ( !osgWrapper.Object( input, animation ) ) {\r\n return undefined;\r\n }\r\n\r\n var createPromiseCallback = function ( animation ) {\r\n return function ( chan ) {\r\n if ( chan ) {\r\n animation.getChannels().push( chan );\r\n }\r\n };\r\n };\r\n // channels\r\n for ( var i = 0, l = jsonObj.Channels.length; i < l; i++ ) {\r\n Q.when( input.setJSON( jsonObj.Channels[ i ] ).readObject() ).then( createPromiseCallback( animation ) );\r\n }\r\n return animation;\r\n };\r\n\r\n osgAnimationWrapper.Vec3LerpChannel = function ( input, channel ) {\r\n var jsonObj = input.getJSON();\r\n // check\r\n //\r\n var check = function ( o ) {\r\n if ( o.KeyFrames && o.TargetName && o.Name ) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n if ( !check( jsonObj ) ) {\r\n return undefined;\r\n }\r\n\r\n // doit\r\n if ( !osgWrapper.Object( input, channel ) ) {\r\n return undefined;\r\n }\r\n\r\n channel.setTargetName( jsonObj.TargetName );\r\n\r\n // channels\r\n var keys = channel.getSampler().getKeyframes();\r\n for ( var i = 0, l = jsonObj.KeyFrames.length; i < l; i++ ) {\r\n var nodekey = jsonObj.KeyFrames[ i ];\r\n var mykey = nodekey.slice( 1 );\r\n mykey.t = nodekey[ 0 ];\r\n keys.push( mykey );\r\n }\r\n return channel;\r\n };\r\n\r\n osgAnimationWrapper.QuatLerpChannel = function ( input, channel ) {\r\n return osgAnimationWrapper.Vec3LerpChannel( input, channel );\r\n };\r\n\r\n osgAnimationWrapper.QuatSlerpChannel = function ( input, channel ) {\r\n return osgAnimationWrapper.Vec3LerpChannel( input, channel );\r\n };\r\n\r\n osgAnimationWrapper.FloatLerpChannel = function ( input, channel ) {\r\n var jsonObj = input.getJSON();\r\n // check\r\n //\r\n var check = function ( o ) {\r\n if ( o.KeyFrames && o.TargetName && o.Name ) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n if ( !check( jsonObj ) ) {\r\n return;\r\n }\r\n\r\n // doit\r\n if ( !osgWrapper.Object( input, channel ) ) {\r\n return;\r\n }\r\n\r\n channel.setTargetName( jsonObj.TargetName );\r\n\r\n // channels\r\n var keys = channel.getSampler().getKeyframes();\r\n for ( var i = 0, l = jsonObj.KeyFrames.length; i < l; i++ ) {\r\n var nodekey = jsonObj.KeyFrames[ i ];\r\n var mykey = nodekey.slice( 1 );\r\n mykey.t = nodekey[ 0 ];\r\n keys.push( mykey );\r\n }\r\n return channel;\r\n };\r\n\r\n osgAnimationWrapper.BasicAnimationManager = function ( input, manager ) {\r\n var jsonObj = input.getJSON();\r\n // check\r\n //\r\n var check = function ( o ) {\r\n if ( o.Animations ) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n if ( !check( jsonObj ) ) {\r\n return;\r\n }\r\n\r\n for ( var i = 0, l = jsonObj.Animations.length; i < l; i++ ) {\r\n var entry = jsonObj.Animations[ i ];\r\n var anim = input.setJSON( entry ).readObject();\r\n if ( anim ) {\r\n manager.registerAnimation( anim );\r\n }\r\n }\r\n return manager;\r\n };\r\n\r\n osgAnimationWrapper.UpdateMatrixTransform = function ( input, umt ) {\r\n var jsonObj = input.getJSON();\r\n // check\r\n var check = function ( o ) {\r\n if ( o.Name && o.StackedTransforms ) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n if ( !check( jsonObj ) ) {\r\n return;\r\n }\r\n\r\n if ( osgWrapper.Object( input, umt ) === undefined ) {\r\n return;\r\n }\r\n\r\n for ( var i = 0, l = jsonObj.StackedTransforms.length; i < l; i++ ) {\r\n var entry = jsonObj.StackedTransforms[ i ];\r\n var ste = input.setJSON( entry ).readObject();\r\n if ( ste ) {\r\n umt.getStackedTransforms().push( ste );\r\n }\r\n }\r\n return umt;\r\n };\r\n\r\n osgAnimationWrapper.StackedTranslate = function ( input, st ) {\r\n var jsonObj = input.getJSON();\r\n\r\n // check\r\n var check = function ( o ) {\r\n if ( o.Name ) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n if ( !check( jsonObj ) ) {\r\n return;\r\n }\r\n\r\n if ( !osgWrapper.Object( input, st ) ) {\r\n return;\r\n }\r\n\r\n if ( jsonObj.Translate ) {\r\n st.setTranslate( jsonObj.Translate );\r\n }\r\n return st;\r\n };\r\n\r\n osgAnimationWrapper.StackedQuaternion = function ( input, st ) {\r\n var jsonObj = input.getJSON();\r\n // check\r\n var check = function ( o ) {\r\n if ( o.Name ) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n if ( !check( jsonObj ) ) {\r\n return;\r\n }\r\n\r\n if ( !osgWrapper.Object( input, st ) ) {\r\n return;\r\n }\r\n\r\n if ( jsonObj.Quaternion ) {\r\n st.setQuaternion( jsonObj.Quaternion );\r\n }\r\n return st;\r\n };\r\n\r\n osgAnimationWrapper.StackedRotateAxis = function ( input, st ) {\r\n var jsonObj = input.getJSON();\r\n // check\r\n var check = function ( o ) {\r\n if ( o.Axis ) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n if ( !check( jsonObj ) ) {\r\n return;\r\n }\r\n\r\n if ( !osgWrapper.Object( input, st ) ) {\r\n return;\r\n }\r\n\r\n if ( jsonObj.Angle ) {\r\n st.setAngle( jsonObj.Angle );\r\n }\r\n\r\n st.setAxis( jsonObj.Axis );\r\n\r\n return st;\r\n };\r\n\r\n return osgAnimationWrapper;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgWrappers/serializers/osgAnimation.js\n ** module id = 217\n ** module chunks = 0 1\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_219__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external {\"root\":\"Q\",\"commonjs2\":\"q\",\"commonjs\":\"q\",\"amd\":\"q\"}\n ** module id = 219\n ** module chunks = 0 1\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_220__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external {\"root\":\"Zlib\",\"commonjs2\":\"zlib\",\"commonjs\":\"zlib\",\"amd\":\"zlib\"}\n ** module id = 220\n ** module chunks = 0 1\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_221__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external {\"root\":\"$\",\"commonjs2\":\"jquery\",\"commonjs\":\"jquery\",\"amd\":\"jquery\"}\n ** module id = 221\n ** module chunks = 0 1\n **/","define( [], function () {\r\n\r\n // user performance if available or fallback\r\n\r\n var now = ( function () {\r\n // if no window.performance\r\n if ( window.performance === undefined ) {\r\n return function () {\r\n return Date.now();\r\n };\r\n }\r\n\r\n var fn = window.performance.now || window.performance.mozNow || window.performance.msNow || window.performance.oNow || window.performance.webkitNow ||\r\n function () {\r\n return Date.now();\r\n };\r\n return function () {\r\n return fn.apply( window.performance, arguments );\r\n };\r\n } )();\r\n\r\n\r\n var Timer = function () {};\r\n\r\n Timer.instance = function () {\r\n\r\n if ( !Timer._instance )\r\n Timer._instance = new Timer();\r\n\r\n return Timer._instance;\r\n };\r\n\r\n Timer.prototype = {\r\n\r\n // delta in seconds\r\n deltaS: function ( t0, t1 ) {\r\n return ( t1 - t0 ) / 1000.0;\r\n },\r\n\r\n // delta in milliseconds\r\n deltaM: function ( t0, t1 ) {\r\n return t1 - t0;\r\n },\r\n\r\n tick: function () {\r\n return now();\r\n }\r\n\r\n\r\n };\r\n\r\n\r\n return Timer;\r\n\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/Timer.js\n ** module id = 223\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Vec3',\r\n 'osgUtil/TriangleIntersector'\r\n], function ( Vec3, TriangleIntersector ) {\r\n\r\n 'use strict';\r\n\r\n var KdTreeRayIntersector = function ( vertices, nodes, triangles, intersections, start, end, nodePath ) {\r\n this._vertices = vertices;\r\n this._kdNodes = nodes;\r\n this._triangles = triangles;\r\n this._intersector = new TriangleIntersector();\r\n this._dinvX = Vec3.create();\r\n this._dinvY = Vec3.create();\r\n this._dinvZ = Vec3.create();\r\n this.init( intersections, start, end, nodePath );\r\n };\r\n\r\n KdTreeRayIntersector.prototype = {\r\n init: function ( intersections, start, end, nodePath ) {\r\n var d = Vec3.sub( end, start, Vec3.create() );\r\n var len = Vec3.length( d );\r\n var invLen = 0.0;\r\n if ( len !== 0.0 )\r\n invLen = 1.0 / len;\r\n Vec3.mult( d, invLen, d );\r\n if ( d[ 0 ] !== 0.0 ) Vec3.mult( d, 1.0 / d[ 0 ], this._dinvX );\r\n if ( d[ 1 ] !== 0.0 ) Vec3.mult( d, 1.0 / d[ 1 ], this._dinvY );\r\n if ( d[ 2 ] !== 0.0 ) Vec3.mult( d, 1.0 / d[ 2 ], this._dinvZ );\r\n\r\n this._intersector._intersections = intersections;\r\n this._intersector.setNodePath( nodePath );\r\n this._intersector.set( start, end );\r\n },\r\n // Classic ray intersection test\r\n // If it's a leaf it does ray-triangles intersection with the triangles in the cell\r\n // If it's not a leaf, it descend in the tree in a recursive way as long as the ray\r\n // intersects the boundinbox of the nodes\r\n intersect: ( function () {\r\n\r\n var v0 = Vec3.create();\r\n var v1 = Vec3.create();\r\n var v2 = Vec3.create();\r\n\r\n return function ( node, ls, le ) {\r\n var first = node._first;\r\n var second = node._second;\r\n var triangles = this._triangles;\r\n var vertices = this._vertices;\r\n\r\n if ( first < 0 ) {\r\n // treat as a leaf\r\n var istart = -first - 1;\r\n var iend = istart + second;\r\n var intersector = this._intersector;\r\n intersector.index = istart;\r\n\r\n for ( var i = istart; i < iend; ++i ) {\r\n var id = i * 3;\r\n var iv0 = triangles[ id ] * 3;\r\n var iv1 = triangles[ id + 1 ] * 3;\r\n var iv2 = triangles[ id + 2 ] * 3;\r\n\r\n v0[ 0 ] = vertices[ iv0 ];\r\n v0[ 1 ] = vertices[ iv0 + 1 ];\r\n v0[ 2 ] = vertices[ iv0 + 2 ];\r\n\r\n v1[ 0 ] = vertices[ iv1 ];\r\n v1[ 1 ] = vertices[ iv1 + 1 ];\r\n v1[ 2 ] = vertices[ iv1 + 2 ];\r\n\r\n v2[ 0 ] = vertices[ iv2 ];\r\n v2[ 1 ] = vertices[ iv2 + 1 ];\r\n v2[ 2 ] = vertices[ iv2 + 2 ];\r\n\r\n intersector.intersect( v0, v1, v2 );\r\n }\r\n } else {\r\n var s = node._nodeRayStart;\r\n var e = node._nodeRayEnd;\r\n Vec3.copy( ls, s );\r\n Vec3.copy( le, e );\r\n if ( first > 0 ) {\r\n if ( this.intersectAndClip( s, e, this._kdNodes[ first ]._bb ) ) {\r\n this.intersect( this._kdNodes[ first ], s, e );\r\n }\r\n }\r\n if ( second > 0 ) {\r\n Vec3.copy( ls, s );\r\n Vec3.copy( le, e );\r\n if ( this.intersectAndClip( s, e, this._kdNodes[ second ]._bb ) ) {\r\n this.intersect( this._kdNodes[ second ], s, e );\r\n }\r\n }\r\n }\r\n };\r\n } )(),\r\n // This method do 2 things\r\n // It test if the ray intersects the node\r\n // If so... it clip the ray so that the start and end point of the ray are\r\n // snapped to the bounding box of the nodes\r\n intersectAndClip: ( function () {\r\n var tmp = Vec3.create();\r\n return function ( s, e, bb ) {\r\n var min = bb._min;\r\n var xmin = min[ 0 ];\r\n var ymin = min[ 1 ];\r\n var zmin = min[ 2 ];\r\n\r\n var max = bb._max;\r\n var xmax = max[ 0 ];\r\n var ymax = max[ 1 ];\r\n var zmax = max[ 2 ];\r\n\r\n var invX = this._dinvX;\r\n var invY = this._dinvY;\r\n var invZ = this._dinvZ;\r\n\r\n if ( s[ 0 ] <= e[ 0 ] ) {\r\n // trivial reject of segment wholely outside.\r\n if ( e[ 0 ] < xmin ) return false;\r\n if ( s[ 0 ] > xmax ) return false;\r\n\r\n if ( s[ 0 ] < xmin ) {\r\n // clip s to xMin.\r\n Vec3.mult( invX, xmin - s[ 0 ], tmp );\r\n Vec3.add( s, tmp, s );\r\n }\r\n\r\n if ( e[ 0 ] > xmax ) {\r\n // clip e to xMax.\r\n Vec3.mult( invX, xmax - s[ 0 ], tmp );\r\n Vec3.add( s, tmp, e );\r\n }\r\n } else {\r\n if ( s[ 0 ] < xmin ) return false;\r\n if ( e[ 0 ] > xmax ) return false;\r\n\r\n if ( e[ 0 ] < xmin ) {\r\n // clip s to xMin.\r\n Vec3.mult( invX, xmin - s[ 0 ], tmp );\r\n Vec3.add( s, tmp, e );\r\n }\r\n\r\n if ( s[ 0 ] > xmax ) {\r\n // clip e to xMax.\r\n Vec3.mult( invX, xmax - s[ 0 ], tmp );\r\n Vec3.add( s, tmp, s );\r\n }\r\n }\r\n\r\n // compate s and e against the yMin to yMax range of bb.\r\n if ( s[ 1 ] <= e[ 1 ] ) {\r\n\r\n // trivial reject of segment wholely outside.\r\n if ( e[ 1 ] < ymin ) return false;\r\n if ( s[ 1 ] > ymax ) return false;\r\n\r\n if ( s[ 1 ] < ymin ) {\r\n // clip s to yMin.\r\n Vec3.mult( invY, ymin - s[ 1 ], tmp );\r\n Vec3.add( s, tmp, s );\r\n }\r\n\r\n if ( e[ 1 ] > ymax ) {\r\n // clip e to yMax.\r\n Vec3.mult( invY, ymax - s[ 1 ], tmp );\r\n Vec3.add( s, tmp, e );\r\n }\r\n } else {\r\n if ( s[ 1 ] < ymin ) return false;\r\n if ( e[ 1 ] > ymax ) return false;\r\n\r\n if ( e[ 1 ] < ymin ) {\r\n // clip s to yMin.\r\n Vec3.mult( invY, ymin - s[ 1 ], tmp );\r\n Vec3.add( s, tmp, e );\r\n }\r\n\r\n if ( s[ 1 ] > ymax ) {\r\n // clip e to yMax.\r\n Vec3.mult( invY, ymax - s[ 1 ], tmp );\r\n Vec3.add( s, tmp, s );\r\n }\r\n }\r\n\r\n // compate s and e against the zMin to zMax range of bb.\r\n if ( s[ 2 ] <= e[ 2 ] ) {\r\n // trivial reject of segment wholely outside.\r\n if ( e[ 2 ] < zmin ) return false;\r\n if ( s[ 2 ] > zmax ) return false;\r\n\r\n if ( s[ 2 ] < zmin ) {\r\n // clip s to zMin.\r\n Vec3.mult( invZ, zmin - s[ 2 ], tmp );\r\n Vec3.add( s, tmp, s );\r\n }\r\n\r\n if ( e[ 2 ] > zmax ) {\r\n // clip e to zMax.\r\n Vec3.mult( invZ, zmax - s[ 2 ], tmp );\r\n Vec3.add( s, tmp, e );\r\n }\r\n } else {\r\n if ( s[ 2 ] < zmin ) return false;\r\n if ( e[ 2 ] > zmax ) return false;\r\n\r\n if ( e[ 2 ] < zmin ) {\r\n // clip s to zMin.\r\n Vec3.mult( invZ, zmin - s[ 2 ], tmp );\r\n Vec3.add( s, tmp, e );\r\n }\r\n\r\n if ( s[ 2 ] > zmax ) {\r\n // clip e to zMax.\r\n Vec3.mult( invZ, zmax - s[ 2 ], tmp );\r\n Vec3.add( s, tmp, s );\r\n }\r\n }\r\n return true;\r\n };\r\n } )()\r\n };\r\n\r\n return KdTreeRayIntersector;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/KdTreeRayIntersector.js\n ** module id = 224\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/Vec3',\r\n 'osg/KdTreeRayIntersector',\r\n 'osgUtil/TriangleSphereIntersector'\r\n], function ( MACROUTILS, Vec3, KdTreeRayIntersector, TriangleSphereIntersector ) {\r\n\r\n 'use strict';\r\n\r\n var KdTreeSphereIntersector = function ( vertices, nodes, triangles, intersections, center, radius, nodePath ) {\r\n this._vertices = vertices;\r\n this._kdNodes = nodes;\r\n this._triangles = triangles;\r\n this._intersector = new TriangleSphereIntersector();\r\n this._intersector._intersections = intersections;\r\n this._intersector.setNodePath( nodePath );\r\n this._intersector.set( center, radius );\r\n this._center = center;\r\n this._radius = radius;\r\n };\r\n\r\n KdTreeSphereIntersector.prototype = MACROUTILS.objectInherit( KdTreeRayIntersector.prototype, {\r\n intersect: ( function () {\r\n\r\n var v0 = [ 0.0, 0.0, 0.0 ];\r\n var v1 = [ 0.0, 0.0, 0.0 ];\r\n var v2 = [ 0.0, 0.0, 0.0 ];\r\n\r\n return function ( node ) {\r\n var first = node._first;\r\n var second = node._second;\r\n var triangles = this._triangles;\r\n var vertices = this._vertices;\r\n\r\n if ( first < 0 ) {\r\n // treat as a leaf\r\n var istart = -first - 1;\r\n var iend = istart + second;\r\n var intersector = this._intersector;\r\n intersector.index = istart;\r\n\r\n for ( var i = istart; i < iend; ++i ) {\r\n var id = i * 3;\r\n var iv0 = triangles[ id ] * 3;\r\n var iv1 = triangles[ id + 1 ] * 3;\r\n var iv2 = triangles[ id + 2 ] * 3;\r\n\r\n v0[ 0 ] = vertices[ iv0 ];\r\n v0[ 1 ] = vertices[ iv0 + 1 ];\r\n v0[ 2 ] = vertices[ iv0 + 2 ];\r\n\r\n v1[ 0 ] = vertices[ iv1 ];\r\n v1[ 1 ] = vertices[ iv1 + 1 ];\r\n v1[ 2 ] = vertices[ iv1 + 2 ];\r\n\r\n v2[ 0 ] = vertices[ iv2 ];\r\n v2[ 1 ] = vertices[ iv2 + 1 ];\r\n v2[ 2 ] = vertices[ iv2 + 2 ];\r\n\r\n intersector.intersect( v0, v1, v2 );\r\n }\r\n } else {\r\n if ( first > 0 ) {\r\n if ( this.intersectSphere( this._kdNodes[ first ]._bb ) ) {\r\n this.intersect( this._kdNodes[ first ] );\r\n }\r\n }\r\n if ( second > 0 ) {\r\n if ( this.intersectSphere( this._kdNodes[ second ]._bb ) ) {\r\n this.intersect( this._kdNodes[ second ] );\r\n }\r\n }\r\n }\r\n };\r\n } )(),\r\n intersectSphere: ( function () {\r\n var tmp = Vec3.create();\r\n return function ( bb ) {\r\n var r = this._radius + bb.radius();\r\n return Vec3.distance2( this._center, bb.center( tmp ) ) <= r * r;\r\n };\r\n } )()\r\n } );\r\n\r\n return KdTreeSphereIntersector;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/KdTreeSphereIntersector.js\n ** module id = 225\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Notify',\r\n 'osg/Stats',\r\n 'osg/Timer'\r\n\r\n], function ( Notify, Stats, Timer ) {\r\n\r\n 'use strict';\r\n\r\n var TextureProfile = function ( target, internalFormat, width, height ) {\r\n this._target = target;\r\n this._internalFormat = internalFormat;\r\n this._width = width;\r\n this._height = height;\r\n this._size = 0;\r\n this.computeSize();\r\n };\r\n\r\n TextureProfile.prototype = {\r\n match: function ( textureProfile ) {\r\n return textureProfile._target === this._target &&\r\n textureProfile._internalFormat === this._internalFormat &&\r\n textureProfile._width === this._width &&\r\n textureProfile._height === this._height;\r\n },\r\n computeSize: function () {\r\n var Texture = require( 'osg/Texture' );\r\n\r\n var numBitsPerTexel = 0;\r\n switch ( this._internalFormat ) {\r\n case ( 1 ):\r\n numBitsPerTexel = 8;\r\n break;\r\n case ( Texture.ALPHA ):\r\n numBitsPerTexel = 8;\r\n break;\r\n case ( Texture.LUMINANCE ):\r\n numBitsPerTexel = 8;\r\n break;\r\n\r\n case ( Texture.LUMINANCE_ALPHA ):\r\n numBitsPerTexel = 16;\r\n break;\r\n case ( 2 ):\r\n numBitsPerTexel = 16;\r\n break;\r\n\r\n case ( Texture.RGB ):\r\n numBitsPerTexel = 24;\r\n break;\r\n case ( 3 ):\r\n numBitsPerTexel = 24;\r\n break;\r\n\r\n case ( Texture.RGBA ):\r\n numBitsPerTexel = 32;\r\n break;\r\n case ( 4 ):\r\n numBitsPerTexel = 32;\r\n break;\r\n\r\n }\r\n var size = ( Math.ceil( this._width * this._height * numBitsPerTexel ) / 8.0 );\r\n\r\n if ( this._target === Texture.TEXTURE_CUBE_MAP )\r\n size *= 6.0;\r\n\r\n // add the mipmap overhead size even if not used\r\n size += size / 3.0;\r\n\r\n this._size = size;\r\n },\r\n\r\n getSize: function () {\r\n return this._size;\r\n }\r\n\r\n };\r\n TextureProfile.getHash = function () {\r\n var array = Array.prototype.slice.call( arguments );\r\n var hash = '';\r\n array.forEach( function ( element ) {\r\n hash += element;\r\n } );\r\n return hash;\r\n };\r\n\r\n\r\n var TextureObject = function ( texture, id, textureSet ) {\r\n this._texture = texture;\r\n this._id = id;\r\n this._textureSet = textureSet;\r\n };\r\n\r\n TextureObject.prototype = {\r\n target: function () {\r\n return this._textureSet._profile._target;\r\n },\r\n id: function () {\r\n return this._id;\r\n },\r\n getTextureSet: function () {\r\n return this._textureSet;\r\n },\r\n reset: function () {\r\n this._textureObject = null;\r\n this._texture = undefined;\r\n },\r\n bind: function ( gl ) {\r\n gl.bindTexture( this.target(), this._id );\r\n }\r\n };\r\n\r\n var TextureObjectSet = function ( profile ) {\r\n this._profile = profile;\r\n this._usedTextureObjects = [];\r\n this._orphanedTextureObjects = [];\r\n };\r\n\r\n TextureObjectSet.prototype = {\r\n getProfile: function () {\r\n return this._profile;\r\n },\r\n getUsedTextureObjects: function () {\r\n return this._usedTextureObjects;\r\n },\r\n getOrphanedTextureObjects: function () {\r\n return this._orphanedTextureObjects;\r\n },\r\n\r\n takeOrGenerate: function ( gl, texture ) {\r\n\r\n var textureObject;\r\n if ( this._orphanedTextureObjects.length > 0 ) {\r\n textureObject = this.takeFromOrphans();\r\n textureObject._texture = texture;\r\n this._usedTextureObjects.push( textureObject );\r\n return textureObject;\r\n }\r\n\r\n var textureID = gl.createTexture();\r\n textureObject = new TextureObject( texture, textureID, this );\r\n this._usedTextureObjects.push( textureObject );\r\n\r\n return textureObject;\r\n },\r\n\r\n // get texture object from pool\r\n takeFromOrphans: function () {\r\n\r\n if ( this._orphanedTextureObjects.length )\r\n return this._orphanedTextureObjects.pop();\r\n\r\n return undefined;\r\n },\r\n\r\n // release texture object\r\n orphan: function ( textureObject ) {\r\n var index = this._usedTextureObjects.indexOf( textureObject );\r\n if ( index !== -1 ) {\r\n this._orphanedTextureObjects.push( this._usedTextureObjects[ index ] );\r\n this._usedTextureObjects.splice( index, 1 );\r\n }\r\n },\r\n\r\n flushDeletedTextureObjects: function ( gl, availableTime ) {\r\n // if no time available don't try to flush objects.\r\n if ( availableTime <= 0.0 ) return availableTime;\r\n var nbTextures = this._orphanedTextureObjects.length;\r\n // Should we use a maxSizeTexturePool value?\r\n //var size = this.getProfile().getSize();\r\n // We need to test if we have time to flush\r\n var elapsedTime = 0.0;\r\n var beginTime = Timer.instance().tick();\r\n var i;\r\n for ( i = 0; i < nbTextures && elapsedTime < availableTime; i++ ) {\r\n gl.deleteTexture( this._orphanedTextureObjects[ i ].id() );\r\n this._orphanedTextureObjects[ i ].reset();\r\n elapsedTime = Timer.instance().deltaS( beginTime, Timer.instance().tick() );\r\n }\r\n this._orphanedTextureObjects.splice( 0, i );\r\n availableTime -= elapsedTime;\r\n return availableTime;\r\n //Notify.info( 'TextureManager: released ' + nbTextures + ' with ' + (nbTextures*size/(1024*1024)) + ' MB' );\r\n },\r\n\r\n flushAllDeletedTextureObjects: function ( gl ) {\r\n var nbTextures = this._orphanedTextureObjects.length;\r\n var size = this.getProfile().getSize();\r\n for ( var i = 0, j = nbTextures; i < j; ++i ) {\r\n gl.deleteTexture( this._orphanedTextureObjects[ i ].id() );\r\n this._orphanedTextureObjects[ i ].reset();\r\n }\r\n this._orphanedTextureObjects.length = 0;\r\n Notify.info( 'TextureManager: released ' + nbTextures + ' with ' + ( nbTextures * size / ( 1024 * 1024 ) ) + ' MB' );\r\n }\r\n };\r\n\r\n\r\n var TextureManager = function () {\r\n this._textureSetMap = {};\r\n this._stats = new Stats( 'Texture' );\r\n };\r\n\r\n TextureManager.prototype = {\r\n\r\n generateTextureObject: function ( gl,\r\n texture,\r\n target,\r\n internalFormat,\r\n width,\r\n height ) {\r\n var hash = TextureProfile.getHash( target, internalFormat, width, height );\r\n\r\n if ( this._textureSetMap[ hash ] === undefined ) {\r\n this._textureSetMap[ hash ] = new TextureObjectSet( new TextureProfile( target, internalFormat, width, height ) );\r\n }\r\n\r\n var textureSet = this._textureSetMap[ hash ];\r\n var textureObject = textureSet.takeOrGenerate( gl, texture );\r\n return textureObject;\r\n },\r\n\r\n updateStats: function ( frameNumber ) {\r\n var totalUsed = 0;\r\n var totalUnused = 0;\r\n Object.keys( this._textureSetMap ).forEach( function ( key ) {\r\n var profile = this._textureSetMap[ key ].getProfile();\r\n var size = profile.getSize();\r\n var nbUsed = this._textureSetMap[ key ].getUsedTextureObjects().length;\r\n var nbUnused = this._textureSetMap[ key ].getOrphanedTextureObjects().length;\r\n totalUsed += nbUsed * size;\r\n totalUnused += nbUnused * size;\r\n }, this );\r\n\r\n this._stats.setAttribute( frameNumber, 'Texture used', totalUsed );\r\n this._stats.setAttribute( frameNumber, 'Texture allocated', totalUnused );\r\n this._stats.setAttribute( frameNumber, 'Texture total', totalUsed + totalUnused );\r\n },\r\n\r\n getStats: function () {\r\n return this._stats;\r\n },\r\n\r\n reportStats: function () {\r\n var total = 0;\r\n Object.keys( this._textureSetMap ).forEach( function ( key ) {\r\n var profile = this._textureSetMap[ key ].getProfile();\r\n var size = profile.getSize() / ( 1024 * 1024 );\r\n var nb = this._textureSetMap[ key ].getUsedTextureObjects().length;\r\n size *= nb;\r\n total += size;\r\n Notify.notice( '' + size + ' MB with ' + nb + ' texture of ' + profile._width + 'x' + profile._height + ' ' + profile._internalFormat );\r\n }, this );\r\n Notify.notice( '' + total + ' MB in total' );\r\n },\r\n\r\n flushAllDeletedTextureObjects: function ( gl ) {\r\n Object.keys( this._textureSetMap ).forEach( function ( key ) {\r\n this._textureSetMap[ key ].flushAllDeletedTextureObjects( gl );\r\n }, this );\r\n },\r\n\r\n flushDeletedTextureObjects: function ( gl, availableTime ) {\r\n var key;\r\n for ( var i = 0, j = Object.keys( this._textureSetMap ).length; i < j && availableTime > 0.0; i++ ) {\r\n key = Object.keys( this._textureSetMap )[ i ];\r\n availableTime = this._textureSetMap[ key ].flushDeletedTextureObjects( gl, availableTime );\r\n }\r\n return availableTime;\r\n },\r\n\r\n releaseTextureObject: function ( textureObject ) {\r\n if ( textureObject ) {\r\n var ts = textureObject.getTextureSet();\r\n ts.orphan( textureObject );\r\n }\r\n }\r\n\r\n };\r\n\r\n return TextureManager;\r\n\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/TextureManager.js\n ** module id = 226\n ** module chunks = 0 1\n **/","define( [], function () {\r\n\r\n var defaultOptions = {\r\n\r\n // prefix to built url to load resource\r\n prefixURL: '',\r\n\r\n // callback used when loading data\r\n progressXHRCallback: undefined,\r\n\r\n // replacement of readImageURL to use your own code to load Nodes\r\n // the function will be execute in the context of Input, see Input:readNodeURL\r\n readNodeURL: undefined,\r\n\r\n // replacement of readImageURL to use your own code to load osg.Image\r\n // the function will be execute in the context of Input, see Input:readImageURL\r\n readImageURL: undefined,\r\n\r\n // replacement of readBinaryArrayURL to use your own code to load binary array\r\n // the function will be execute in the context of Input, see Input:readBinaryArrayURL\r\n readBinaryArrayURL: undefined,\r\n\r\n imageLoadingUsePromise: true, // use promise to load image instead of returning Image\r\n imageOnload: undefined, // use callback when loading an image\r\n imageCrossOrigin: undefined // use callback when loading an image\r\n };\r\n\r\n return defaultOptions;\r\n\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgDB/Options.js\n ** module id = 227\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/BufferArray',\r\n 'osg/Geometry',\r\n 'osg/PrimitiveSet',\r\n 'osg/DrawArrays',\r\n 'osg/DrawElements',\r\n 'osg/Program',\r\n 'osg/Shader'\r\n], function ( BufferArray, Geometry, PrimitiveSet, DrawArrays, DrawElements, Program, Shader ) {\r\n\r\n 'use strict';\r\n\r\n var glPrecision = [ '#ifdef GL_ES',\r\n 'precision highp float;',\r\n '#endif'\r\n ].join( '\\n' );\r\n\r\n var program;\r\n var getOrCreateShader = function () {\r\n if ( program )\r\n return program;\r\n var vertexshader = [\r\n glPrecision,\r\n 'attribute vec3 Vertex;',\r\n 'uniform mat4 ModelViewMatrix;',\r\n 'uniform mat4 ProjectionMatrix;',\r\n '',\r\n 'void main(void) {',\r\n ' gl_Position = ProjectionMatrix * ModelViewMatrix * vec4(Vertex, 1.0);',\r\n '}'\r\n ].join( '\\n' );\r\n\r\n var fragmentshader = [\r\n glPrecision,\r\n 'uniform vec4 uColor;',\r\n '',\r\n 'void main(void) {',\r\n ' gl_FragColor = uColor;',\r\n '}'\r\n ].join( '\\n' );\r\n\r\n program = new Program( new Shader( Shader.VERTEX_SHADER, vertexshader ),\r\n new Shader( Shader.FRAGMENT_SHADER, fragmentshader ) );\r\n return program;\r\n };\r\n\r\n var program2D;\r\n var getOrCreateShader2D = function () {\r\n if ( program2D )\r\n return program2D;\r\n var vertexshader = [\r\n glPrecision,\r\n 'attribute vec2 Vertex;',\r\n '',\r\n 'void main(void) {',\r\n ' gl_Position = vec4(Vertex, 0.0, 1.0);',\r\n '}'\r\n ].join( '\\n' );\r\n\r\n var fragmentshader = [\r\n glPrecision,\r\n 'void main(void) {',\r\n ' gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);',\r\n '}'\r\n ].join( '\\n' );\r\n\r\n program2D = new Program( new Shader( Shader.VERTEX_SHADER, vertexshader ),\r\n new Shader( Shader.FRAGMENT_SHADER, fragmentshader ) );\r\n return program2D;\r\n };\r\n\r\n var programQC;\r\n var getOrCreateShaderQuadCircle = function () {\r\n if ( programQC )\r\n return programQC;\r\n var vertexshader = [\r\n glPrecision,\r\n 'attribute vec3 Vertex;',\r\n 'uniform mat4 ModelViewMatrix;',\r\n 'uniform mat4 ProjectionMatrix;',\r\n 'varying vec3 vVertex;',\r\n '',\r\n 'void main(void) {',\r\n ' vVertex = Vertex;',\r\n ' gl_Position = ProjectionMatrix * ModelViewMatrix * vec4(Vertex, 1.0);',\r\n '}'\r\n ].join( '\\n' );\r\n\r\n var fragmentshader = [\r\n glPrecision,\r\n 'uniform float uAngle;',\r\n 'uniform vec3 uBase;',\r\n 'varying vec3 vVertex;',\r\n 'const float PI = 3.14159265358979323846264;',\r\n 'const float PI2 = PI * 2.0;',\r\n '',\r\n 'void main(void) {',\r\n ' if(length(vVertex) > 0.5)',\r\n ' discard;',\r\n ' vec3 vn = normalize(vVertex);',\r\n ' float angle = atan(uBase.y * vn.x - uBase.x * vn.y, dot(uBase, vn));',\r\n ' if(angle > 0.0) {',\r\n ' if(uAngle >= 0.0 && angle > uAngle) discard;',\r\n ' if(uAngle < -PI && angle < uAngle + PI2) discard;',\r\n ' if(uAngle < 0.0 && uAngle > -PI) discard;',\r\n ' }',\r\n ' if(angle < 0.0) {',\r\n ' if(uAngle <= 0.0 && angle < uAngle) discard;',\r\n ' if(uAngle > PI && angle > uAngle - PI2) discard;',\r\n ' if(uAngle > 0.0 && uAngle < PI) discard;',\r\n ' }',\r\n ' gl_FragColor = vec4(1.0, 1.0, 0.0, 0.5);',\r\n '}'\r\n ].join( '\\n' );\r\n\r\n programQC = new Program( new Shader( Shader.VERTEX_SHADER, vertexshader ),\r\n new Shader( Shader.FRAGMENT_SHADER, fragmentshader ) );\r\n return programQC;\r\n };\r\n\r\n var createDebugLineGeometry = function () {\r\n var g = new Geometry();\r\n g.getAttributes().Vertex = new BufferArray( BufferArray.ARRAY_BUFFER, new Float32Array( 4 ), 2 );\r\n var primitive = new DrawArrays( PrimitiveSet.LINES, 0, 2 );\r\n g.getPrimitives().push( primitive );\r\n g.getOrCreateStateSet().setAttributeAndModes( getOrCreateShader2D() );\r\n return g;\r\n };\r\n\r\n var createTorusGeometry = function ( radiusOut, radiusWidth, nbRadial, nbTubular, arc ) {\r\n radiusOut = radiusOut !== undefined ? radiusOut : 1.0;\r\n radiusWidth = radiusWidth !== undefined ? radiusWidth : 0.2;\r\n nbRadial = nbRadial !== undefined ? nbRadial : 6;\r\n nbTubular = nbTubular !== undefined ? nbTubular : 64;\r\n arc = arc !== undefined ? arc : Math.PI * 2;\r\n\r\n var nbVertices = ( nbRadial + 1 ) * ( nbTubular + 1 );\r\n var nbTriangles = nbRadial * nbTubular * 2;\r\n var g = new Geometry();\r\n var vertices = new Float32Array( nbVertices * 3 );\r\n var indices = new Uint16Array( nbTriangles * 3 );\r\n arc = arc || Math.PI * 2;\r\n var id = 0;\r\n var k = 0;\r\n var i = 0;\r\n var j = 0;\r\n for ( j = 0; j <= nbRadial; ++j ) {\r\n for ( i = 0; i <= nbTubular; ++i ) {\r\n var u = i / nbTubular * arc;\r\n var v = j / nbRadial * Math.PI * 2;\r\n k = id * 3;\r\n vertices[ k ] = ( radiusOut + radiusWidth * Math.cos( v ) ) * Math.cos( u );\r\n vertices[ k + 1 ] = ( radiusOut + radiusWidth * Math.cos( v ) ) * Math.sin( u );\r\n vertices[ k + 2 ] = radiusWidth * Math.sin( v );\r\n id++;\r\n }\r\n }\r\n id = 0;\r\n for ( j = 1; j <= nbRadial; ++j ) {\r\n for ( i = 1; i <= nbTubular; ++i ) {\r\n k = id * 6;\r\n indices[ k ] = ( nbTubular + 1 ) * j + i - 1;\r\n indices[ k + 1 ] = indices[ k + 3 ] = ( nbTubular + 1 ) * ( j - 1 ) + i - 1;\r\n indices[ k + 2 ] = indices[ k + 5 ] = ( nbTubular + 1 ) * j + i;\r\n indices[ k + 4 ] = ( nbTubular + 1 ) * ( j - 1 ) + i;\r\n id++;\r\n }\r\n }\r\n g.getAttributes().Vertex = new BufferArray( BufferArray.ARRAY_BUFFER, vertices, 3 );\r\n g.getOrCreateStateSet().setAttributeAndModes( getOrCreateShader() );\r\n g.getPrimitives().push( new DrawElements( PrimitiveSet.TRIANGLES, new BufferArray( BufferArray.ELEMENT_ARRAY_BUFFER, indices, 1 ) ) );\r\n return g;\r\n };\r\n\r\n var createCylinderGeometry = function ( radiusTop, radiusBottom, height, radialSegments, heightSegments, topCap, lowCap ) {\r\n radiusTop = radiusTop !== undefined ? radiusTop : 1.0;\r\n radiusBottom = radiusBottom !== undefined ? radiusBottom : 1.0;\r\n height = height !== undefined ? height : 5.0;\r\n radialSegments = radialSegments !== undefined ? radialSegments : 32;\r\n heightSegments = heightSegments !== undefined ? heightSegments : 1;\r\n topCap = topCap !== undefined ? topCap : true;\r\n lowCap = lowCap !== undefined ? lowCap : true;\r\n\r\n topCap = topCap && radiusTop > 0.0;\r\n lowCap = lowCap && radiusBottom > 0.0;\r\n var heightHalf = height * 0.5;\r\n\r\n var nbVertices = ( heightSegments + 1 ) * ( radialSegments + 1 );\r\n var nbTriangles = heightSegments * radialSegments * 2;\r\n if ( topCap ) {\r\n nbVertices += 1;\r\n nbTriangles += radialSegments;\r\n }\r\n if ( lowCap ) {\r\n nbVertices += 1;\r\n nbTriangles += radialSegments;\r\n }\r\n var g = new Geometry();\r\n var vertices = new Float32Array( nbVertices * 3 );\r\n var indices = new Uint16Array( nbTriangles * 3 );\r\n\r\n var id = 0;\r\n var k = 0;\r\n var i = 0;\r\n var j = 0;\r\n for ( i = 0; i <= heightSegments; i++ ) {\r\n var v = i / heightSegments;\r\n var radius = v * ( radiusBottom - radiusTop ) + radiusTop;\r\n for ( j = 0; j <= radialSegments; j++ ) {\r\n var u = j / radialSegments;\r\n k = id * 3;\r\n vertices[ k ] = radius * Math.sin( u * Math.PI * 2 );\r\n vertices[ k + 1 ] = radius * Math.cos( u * Math.PI * 2 );\r\n vertices[ k + 2 ] = -v * height + heightHalf;\r\n id++;\r\n }\r\n }\r\n\r\n id = 0;\r\n for ( j = 0; j < radialSegments; j++ ) {\r\n for ( i = 0; i < heightSegments; i++ ) {\r\n k = id * 6;\r\n indices[ k ] = ( radialSegments + 1 ) * i + j;\r\n indices[ k + 1 ] = indices[ k + 3 ] = ( radialSegments + 1 ) * ( i + 1 ) + j;\r\n indices[ k + 2 ] = indices[ k + 5 ] = ( radialSegments + 1 ) * i + j + 1;\r\n indices[ k + 4 ] = ( radialSegments + 1 ) * ( i + 1 ) + j + 1;\r\n id++;\r\n }\r\n }\r\n id *= 2;\r\n var last;\r\n if ( topCap ) {\r\n last = ( lowCap ? vertices.length - 6 : vertices.length - 3 ) / 3;\r\n vertices[ last * 3 + 2 ] = heightHalf;\r\n for ( j = 0; j < radialSegments; j++ ) {\r\n k = id * 3;\r\n indices[ k ] = j;\r\n indices[ k + 1 ] = j + 1;\r\n indices[ k + 2 ] = last;\r\n id++;\r\n }\r\n }\r\n\r\n if ( lowCap ) {\r\n last = ( vertices.length - 3 ) / 3;\r\n vertices[ last * 3 + 2 ] = -heightHalf;\r\n var end = ( radialSegments + 1 ) * i;\r\n for ( j = 0; j < radialSegments; j++ ) {\r\n k = id * 3;\r\n indices[ k ] = end + j + 1;\r\n indices[ k + 1 ] = end + j;\r\n indices[ k + 2 ] = last;\r\n id++;\r\n }\r\n }\r\n\r\n g.getAttributes().Vertex = new BufferArray( BufferArray.ARRAY_BUFFER, vertices, 3 );\r\n g.getOrCreateStateSet().setAttributeAndModes( getOrCreateShader() );\r\n g.getPrimitives().push( new DrawElements( PrimitiveSet.TRIANGLES, new BufferArray( BufferArray.ELEMENT_ARRAY_BUFFER, indices, 1 ) ) );\r\n return g;\r\n };\r\n\r\n var createCircleGeometry = function ( nbVertices, radius, arc ) {\r\n var g = new Geometry();\r\n var vertices = new Float32Array( nbVertices * 3 );\r\n arc = arc || Math.PI * 2;\r\n for ( var i = 0; i < nbVertices; ++i ) {\r\n var j = i * 3;\r\n var segment = ( arc * i ) / nbVertices;\r\n vertices[ j ] = Math.cos( segment ) * radius;\r\n vertices[ j + 1 ] = Math.sin( segment ) * radius;\r\n }\r\n g.getAttributes().Vertex = new BufferArray( BufferArray.ARRAY_BUFFER, vertices, 3 );\r\n var primitive = new DrawArrays( PrimitiveSet.LINE_STRIP, 0, nbVertices );\r\n g.getOrCreateStateSet().setAttributeAndModes( getOrCreateShader() );\r\n g.getPrimitives().push( primitive );\r\n return g;\r\n };\r\n\r\n var createPlaneGeometry = function ( width, height ) {\r\n var offx = width ? width * 0.5 : 0.5;\r\n var offy = height ? height * 0.5 : 0.5;\r\n\r\n var g = new Geometry();\r\n var vertices = new Float32Array( 12 );\r\n vertices[ 0 ] = -offx;\r\n vertices[ 1 ] = -offy;\r\n\r\n vertices[ 3 ] = offx;\r\n vertices[ 4 ] = -offy;\r\n\r\n vertices[ 6 ] = -offx;\r\n vertices[ 7 ] = offy;\r\n\r\n vertices[ 9 ] = offx;\r\n vertices[ 10 ] = offy;\r\n\r\n g.getAttributes().Vertex = new BufferArray( BufferArray.ARRAY_BUFFER, vertices, 3 );\r\n var primitive = new DrawArrays( PrimitiveSet.TRIANGLE_STRIP, 0, 4 );\r\n g.getOrCreateStateSet().setAttributeAndModes( getOrCreateShader() );\r\n g.getPrimitives().push( primitive );\r\n return g;\r\n };\r\n\r\n var createQuadCircleGeometry = function () {\r\n var g = createPlaneGeometry();\r\n g.getOrCreateStateSet().setAttributeAndModes( getOrCreateShaderQuadCircle() );\r\n return g;\r\n };\r\n\r\n var GizmoGeometry = {};\r\n GizmoGeometry.createCircleGeometry = createCircleGeometry;\r\n GizmoGeometry.createCylinderGeometry = createCylinderGeometry;\r\n GizmoGeometry.createTorusGeometry = createTorusGeometry;\r\n GizmoGeometry.createDebugLineGeometry = createDebugLineGeometry;\r\n GizmoGeometry.createPlaneGeometry = createPlaneGeometry;\r\n GizmoGeometry.createQuadCircleGeometry = createQuadCircleGeometry;\r\n\r\n return GizmoGeometry;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgUtil/GizmoGeometry.js\n ** module id = 228\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/Vec3',\r\n 'osgUtil/TriangleIntersector'\r\n], function ( MACROUTILS, Vec3, TriangleIntersector ) {\r\n\r\n 'use strict';\r\n\r\n var TriangleIntersection = function ( index, normal, v1, v2, v3 ) {\r\n this.index = index;\r\n this.normal = normal;\r\n this.v1 = v1;\r\n this.v2 = v2;\r\n this.v3 = v3;\r\n };\r\n\r\n var TriangleSphereIntersector = function () {\r\n TriangleIntersector.apply( this, arguments );\r\n };\r\n\r\n TriangleSphereIntersector.prototype = MACROUTILS.objectInherit( TriangleIntersector.prototype, {\r\n set: function ( center, radius ) {\r\n this._center = center;\r\n this._radius = radius;\r\n },\r\n\r\n //\r\n // \\2|\r\n // \\|\r\n // \\\r\n // 3 |\\ 1\r\n // |0\\\r\n // __|__\\___\r\n // 4 | 5 \\ 6\r\n //\r\n // from http://www.geometrictools.com/Source/Distance3D.html#PointPlanar\r\n // js : https://github.com/stephomi/sculptgl/blob/master/src/math3d/Geometry.js#L89\r\n intersect: ( function () {\r\n var edge1 = Vec3.create();\r\n var edge2 = Vec3.create();\r\n var diff = Vec3.create();\r\n return function ( v1, v2, v3 ) {\r\n this._index++;\r\n\r\n // sphere is a 'volume' here (so if the triangle is inside the ball it will intersects)\r\n\r\n Vec3.sub( v2, v1, edge1 );\r\n Vec3.sub( v3, v1, edge2 );\r\n var a00 = Vec3.length2( edge1 );\r\n var a01 = Vec3.dot( edge1, edge2 );\r\n var a11 = Vec3.length2( edge2 );\r\n\r\n Vec3.sub( v1, this._center, diff );\r\n var b0 = Vec3.dot( diff, edge1 );\r\n var b1 = Vec3.dot( diff, edge2 );\r\n var c = Vec3.length2( diff );\r\n var det = Math.abs( a00 * a11 - a01 * a01 );\r\n var s = a01 * b1 - a11 * b0;\r\n var t = a01 * b0 - a00 * b1;\r\n var sqrDistance;\r\n var zone = 4;\r\n\r\n if ( s + t <= det ) {\r\n if ( s < 0.0 ) {\r\n if ( t < 0.0 ) { // region 4\r\n zone = 4;\r\n if ( b0 < 0.0 ) {\r\n t = 0.0;\r\n if ( -b0 >= a00 ) {\r\n s = 1.0;\r\n sqrDistance = a00 + 2.0 * b0 + c;\r\n } else {\r\n s = -b0 / a00;\r\n sqrDistance = b0 * s + c;\r\n }\r\n } else {\r\n s = 0.0;\r\n if ( b1 >= 0.0 ) {\r\n t = 0.0;\r\n sqrDistance = c;\r\n } else if ( -b1 >= a11 ) {\r\n t = 1.0;\r\n sqrDistance = a11 + 2.0 * b1 + c;\r\n } else {\r\n t = -b1 / a11;\r\n sqrDistance = b1 * t + c;\r\n }\r\n }\r\n } else { // region 3\r\n zone = 3;\r\n s = 0.0;\r\n if ( b1 >= 0.0 ) {\r\n t = 0.0;\r\n sqrDistance = c;\r\n } else if ( -b1 >= a11 ) {\r\n t = 1.0;\r\n sqrDistance = a11 + 2.0 * b1 + c;\r\n } else {\r\n t = -b1 / a11;\r\n sqrDistance = b1 * t + c;\r\n }\r\n }\r\n } else if ( t < 0.0 ) { // region 5\r\n zone = 5;\r\n t = 0.0;\r\n if ( b0 >= 0.0 ) {\r\n s = 0.0;\r\n sqrDistance = c;\r\n } else if ( -b0 >= a00 ) {\r\n s = 1.0;\r\n sqrDistance = a00 + 2.0 * b0 + c;\r\n } else {\r\n s = -b0 / a00;\r\n sqrDistance = b0 * s + c;\r\n }\r\n } else { // region 0\r\n zone = 0;\r\n // minimum at interior point\r\n var invDet = 1.0 / det;\r\n s *= invDet;\r\n t *= invDet;\r\n sqrDistance = s * ( a00 * s + a01 * t + 2.0 * b0 ) + t * ( a01 * s + a11 * t + 2.0 * b1 ) + c;\r\n }\r\n } else {\r\n var tmp0, tmp1, numer, denom;\r\n\r\n if ( s < 0.0 ) { // region 2\r\n zone = 2;\r\n tmp0 = a01 + b0;\r\n tmp1 = a11 + b1;\r\n if ( tmp1 > tmp0 ) {\r\n numer = tmp1 - tmp0;\r\n denom = a00 - 2.0 * a01 + a11;\r\n if ( numer >= denom ) {\r\n s = 1.0;\r\n t = 0.0;\r\n sqrDistance = a00 + 2.0 * b0 + c;\r\n } else {\r\n s = numer / denom;\r\n t = 1.0 - s;\r\n sqrDistance = s * ( a00 * s + a01 * t + 2.0 * b0 ) + t * ( a01 * s + a11 * t + 2.0 * b1 ) + c;\r\n }\r\n } else {\r\n s = 0.0;\r\n if ( tmp1 <= 0.0 ) {\r\n t = 1.0;\r\n sqrDistance = a11 + 2.0 * b1 + c;\r\n } else if ( b1 >= 0.0 ) {\r\n t = 0.0;\r\n sqrDistance = c;\r\n } else {\r\n t = -b1 / a11;\r\n sqrDistance = b1 * t + c;\r\n }\r\n }\r\n } else if ( t < 0.0 ) { // region 6\r\n zone = 6;\r\n tmp0 = a01 + b1;\r\n tmp1 = a00 + b0;\r\n if ( tmp1 > tmp0 ) {\r\n numer = tmp1 - tmp0;\r\n denom = a00 - 2.0 * a01 + a11;\r\n if ( numer >= denom ) {\r\n t = 1.0;\r\n s = 0.0;\r\n sqrDistance = a11 + 2.0 * b1 + c;\r\n } else {\r\n t = numer / denom;\r\n s = 1.0 - t;\r\n sqrDistance = s * ( a00 * s + a01 * t + 2.0 * b0 ) + t * ( a01 * s + a11 * t + 2.0 * b1 ) + c;\r\n }\r\n } else {\r\n t = 0.0;\r\n if ( tmp1 <= 0.0 ) {\r\n s = 1.0;\r\n sqrDistance = a00 + 2.0 * b0 + c;\r\n } else if ( b0 >= 0.0 ) {\r\n s = 0.0;\r\n sqrDistance = c;\r\n } else {\r\n s = -b0 / a00;\r\n sqrDistance = b0 * s + c;\r\n }\r\n }\r\n } else { // region 1\r\n zone = 1;\r\n numer = a11 + b1 - a01 - b0;\r\n if ( numer <= 0.0 ) {\r\n s = 0.0;\r\n t = 1.0;\r\n sqrDistance = a11 + 2.0 * b1 + c;\r\n } else {\r\n denom = a00 - 2.0 * a01 + a11;\r\n if ( numer >= denom ) {\r\n s = 1.0;\r\n t = 0.0;\r\n sqrDistance = a00 + 2.0 * b0 + c;\r\n } else {\r\n s = numer / denom;\r\n t = 1.0 - s;\r\n sqrDistance = s * ( a00 * s + a01 * t + 2.0 * b0 ) + t * ( a01 * s + a11 * t + 2.0 * b1 ) + c;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Account for numerical round-off error.\r\n if ( sqrDistance < 0.0 )\r\n sqrDistance = 0.0;\r\n\r\n if ( sqrDistance > ( this._radius * this._radius ) )\r\n return;\r\n\r\n var closest = Vec3.create();\r\n if ( closest ) {\r\n closest[ 0 ] = v1[ 0 ] + s * edge1[ 0 ] + t * edge2[ 0 ];\r\n closest[ 1 ] = v1[ 1 ] + s * edge1[ 1 ] + t * edge2[ 1 ];\r\n closest[ 2 ] = v1[ 2 ] + s * edge1[ 2 ] + t * edge2[ 2 ];\r\n }\r\n\r\n var normal = Vec3.create();\r\n Vec3.cross( edge1, edge2, normal );\r\n Vec3.normalize( normal, normal );\r\n\r\n this._intersections.push( {\r\n ratio: Math.sqrt( sqrDistance ),\r\n nodepath: this._nodePath.slice( 0 ),\r\n TriangleIntersection: new TriangleIntersection( this._index - 1, normal, v1.slice( 0 ), v2.slice( 0 ), v2.slice( 0 ) ),\r\n point: closest,\r\n zone: zone\r\n } );\r\n this.hit = true;\r\n };\r\n } )()\r\n } );\r\n\r\n return TriangleSphereIntersector;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgUtil/TriangleSphereIntersector.js\n ** module id = 229\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n\r\n], function ( MACROUTILS ) {\r\n\r\n var OptionsDefault = {\r\n 'antialias': true, // activate MSAA\r\n //'overrideDevicePixelRatio': 1, // if specified override the device pixel ratio\r\n 'fullscreen': true,\r\n 'enableFrustumCulling': false,\r\n 'stats': false, // display canvas with stats for the viewer\r\n 'statsNoGraph': false, // display only text\r\n 'scrollwheel': true\r\n };\r\n\r\n var Options = function () {\r\n\r\n Object.keys( OptionsDefault ).forEach( function ( key ) {\r\n this[ key ] = OptionsDefault[ key ];\r\n }.bind( this ) );\r\n\r\n };\r\n\r\n\r\n Options.prototype = {\r\n\r\n extend: function ( options ) {\r\n MACROUTILS.objectMix( this, options );\r\n return this;\r\n },\r\n\r\n get: function ( key ) {\r\n return this[ key ];\r\n },\r\n\r\n getBoolean: function ( key ) {\r\n var val = this.getString( key );\r\n if ( val ) return Boolean( JSON.parse( val ) );\r\n return undefined;\r\n },\r\n\r\n getNumber: function ( key ) {\r\n var val = this[ key ];\r\n if ( val ) return Number( JSON.parse( val ) );\r\n return undefined;\r\n },\r\n\r\n getString: function ( key ) {\r\n var val = this[ key ];\r\n if ( val ) return this[ key ].toString();\r\n return undefined;\r\n }\r\n\r\n };\r\n\r\n return Options;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/Options.js\n ** module id = 230\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/Object',\r\n 'osgDB/DatabasePager'\r\n], function ( MACROUTILS, Object, DatabasePager ) {\r\n\r\n 'use strict';\r\n\r\n var Scene = function () {\r\n Object.call( this );\r\n this._databasePager = new DatabasePager();\r\n this._sceneData = undefined;\r\n };\r\n\r\n Scene.prototype = MACROUTILS.objectLibraryClass( MACROUTILS.objectInherit( Object.prototype, {\r\n\r\n getSceneData: function () {\r\n return this._sceneData;\r\n },\r\n\r\n setSceneData: function ( node ) {\r\n this._sceneData = node;\r\n },\r\n\r\n setDatabasePager: function ( dbpager ) {\r\n this._databasePager = dbpager;\r\n },\r\n\r\n getDatabasePager: function () {\r\n return this._databasePager;\r\n },\r\n\r\n // database pager are not implemented yet here\r\n updateSceneGraph: function ( updateVisitor ) {\r\n if ( this._databasePager )\r\n this._databasePager.updateSceneGraph( updateVisitor.getFrameStamp() );\r\n if ( this._sceneData )\r\n this._sceneData.accept( updateVisitor );\r\n }\r\n\r\n\r\n } ), 'osgViewer', 'Scene' );\r\n\r\n return Scene;\r\n\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgViewer/Scene.js\n ** module id = 231\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Notify'\r\n], function ( Notify ) {\r\n\r\n 'use strict';\r\n\r\n var GamePad = function ( viewer ) {\r\n this._viewer = viewer;\r\n this._type = 'GamePad';\r\n this._enable = true;\r\n this._gamepadIndex = -1;\r\n };\r\n\r\n GamePad.prototype = {\r\n init: function ( /*args*/) {},\r\n\r\n isValid: function () {\r\n if ( !this._enable )\r\n return false;\r\n\r\n var manipulator = this._viewer.getManipulator();\r\n if ( !manipulator )\r\n return false;\r\n\r\n var constrollerList = manipulator.getControllerList();\r\n if ( !constrollerList[ this._type ] )\r\n return false;\r\n\r\n return true;\r\n },\r\n\r\n getManipulatorController: function () {\r\n return this._viewer.getManipulator().getControllerList()[ this._type ];\r\n },\r\n\r\n gamepadPoll: function () {\r\n if ( !navigator.getGamepads )\r\n return null;\r\n var gamepads = navigator.getGamepads();\r\n var gamepad = gamepads[ this._gamepadIndex ];\r\n if ( gamepad )\r\n return gamepad;\r\n\r\n for ( var i = 0, nb = gamepads.length; i < nb; ++i ) {\r\n var gm = gamepads[ i ];\r\n // https://code.google.com/p/chromium/issues/detail?id=413805\r\n if ( gm && gm.id && gm.id.indexOf( 'Unknown Gamepad' ) === -1 ) {\r\n this._gamepadIndex = i;\r\n this.onGamepadConnect( gm );\r\n return gm;\r\n }\r\n }\r\n if ( this._gamepadIndex >= 0 ) {\r\n this._gamepadIndex = -1;\r\n this.onGamepadConnect();\r\n }\r\n return null;\r\n },\r\n\r\n onGamepadConnect: function ( gamepad ) {\r\n Notify.log( 'Detected new gamepad!', gamepad );\r\n },\r\n\r\n onGamepadDisconnect: function () {\r\n Notify.log( 'Gamepad disconnected' );\r\n },\r\n\r\n // Called in each frame\r\n update: function () {\r\n // we poll instead\r\n\r\n var gamepad = this.gamepadPoll();\r\n if ( !gamepad )\r\n return;\r\n\r\n var manipulatorAdapter = this.getManipulatorController();\r\n //manipulatorAdapter.setEventProxy(this);\r\n if ( manipulatorAdapter.update ) {\r\n manipulatorAdapter.update( gamepad );\r\n }\r\n }\r\n };\r\n return GamePad;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgViewer/eventProxy/GamePad.js\n ** module id = 232\n ** module chunks = 0 1\n **/","define( [\r\n 'hammer'\r\n], function ( Hammer ) {\r\n\r\n var HammerController = function ( viewer ) {\r\n this._enable = true;\r\n this._viewer = viewer;\r\n this._type = 'Hammer';\r\n\r\n this._eventNode = undefined;\r\n\r\n };\r\n\r\n HammerController.prototype = {\r\n init: function ( options ) {\r\n\r\n /*jshint camelcase: false */\r\n\r\n var deviceOptions = {\r\n prevent_default: true,\r\n drag_max_touches: 2,\r\n transform_min_scale: 0.08,\r\n transform_min_rotation: 180,\r\n transform_always_block: true,\r\n hold: false,\r\n release: false,\r\n swipe: false,\r\n tap: false\r\n };\r\n /*jshint camelcase: true */\r\n\r\n this._eventNode = options.eventNode;\r\n\r\n if ( this._eventNode ) {\r\n\r\n this._hammer = new Hammer( this._eventNode, deviceOptions );\r\n\r\n if ( options.getBoolean( 'scrollwheel' ) === false )\r\n this._hammer.get( 'pinch' ).set( {\r\n enable: false\r\n } );\r\n else\r\n this._hammer.get( 'pinch' ).set( {\r\n enable: true\r\n } );\r\n\r\n }\r\n },\r\n\r\n isValid: function () {\r\n if ( this._enable && this._viewer.getManipulator() && this._viewer.getManipulator().getControllerList()[ this._type ] )\r\n return true;\r\n return false;\r\n },\r\n getManipulatorController: function () {\r\n return this._viewer.getManipulator().getControllerList()[ this._type ];\r\n },\r\n\r\n // use the update to set the input device to mouse controller\r\n // it's needed to compute size\r\n update: function () {\r\n if ( !this.isValid() )\r\n return;\r\n\r\n // we pass directly hammer object\r\n this.getManipulatorController().setEventProxy( this._hammer );\r\n }\r\n\r\n };\r\n return HammerController;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgViewer/eventProxy/Hammer.js\n ** module id = 233\n ** module chunks = 0 1\n **/","define( [\r\n 'leap',\r\n 'osg/Notify'\r\n], function ( Leap, Notify ) {\r\n\r\n var LeapMotion = function ( viewer ) {\r\n this._viewer = viewer;\r\n this._type = 'LeapMotion';\r\n this._enable = true;\r\n };\r\n\r\n LeapMotion.prototype = {\r\n init: function ( args ) {\r\n\r\n // add condition if no leap in global space\r\n if ( typeof Leap === 'undefined' || !Leap.Controller )\r\n return;\r\n\r\n var self = this;\r\n this._controller = new Leap.Controller( {\r\n enableGestures: args.gestures || true,\r\n tryReconnectOnDisconnect: true,\r\n connectAttempts: 3\r\n } );\r\n this._controller.on( 'ready', function () {\r\n if ( args.readyCallback )\r\n args.readyCallback( self._controller );\r\n self._leapMotionReady = true;\r\n Notify.info( 'leapmotion ready' );\r\n } );\r\n this._controller.loop( this._update.bind( this ) );\r\n },\r\n\r\n isValid: function () {\r\n if ( !this._enable )\r\n return false;\r\n\r\n var manipulator = this._viewer.getManipulator();\r\n if ( !manipulator )\r\n return false;\r\n\r\n var constrollerList = manipulator.getControllerList();\r\n if ( !constrollerList[ this._type ] )\r\n return false;\r\n\r\n return true;\r\n },\r\n getManipulatorController: function () {\r\n return this._viewer.getManipulator().getControllerList()[ this._type ];\r\n },\r\n\r\n // this is binded\r\n _update: function ( frame ) {\r\n if ( !frame.valid || !this.isValid() ) {\r\n return;\r\n }\r\n var manipulatorAdapter = this.getManipulatorController();\r\n if ( manipulatorAdapter.update ) {\r\n manipulatorAdapter.update( frame );\r\n }\r\n }\r\n };\r\n return LeapMotion;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgViewer/eventProxy/LeapMotion.js\n ** module id = 234\n ** module chunks = 0 1\n **/","define( [], function () {\r\n\r\n var StandardMouseKeyboard = function ( viewer ) {\r\n this._enable = true;\r\n this._viewer = viewer;\r\n this._type = 'StandardMouseKeyboard';\r\n\r\n this._mouseEventNode = undefined;\r\n this._wheelEventNode = undefined;\r\n this._keyboardEventNode = undefined;\r\n this._eventList = [ 'mousedown', 'mouseup', 'mouseout', 'mousemove', 'dblclick' ];\r\n this._mousePosition = [ 0, 0 ];\r\n };\r\n\r\n StandardMouseKeyboard.prototype = {\r\n init: function ( options ) {\r\n\r\n this.removeEventListeners( this._mouseEventNode, this._wheelEventNode, this._keyboardEventNode );\r\n\r\n var mouse = options.mouseEventNode;\r\n\r\n var mousewheel = options.wheelEventNode || mouse;\r\n var keyboard = options.keyboardEventNode || mouse;\r\n\r\n if ( options.getBoolean( 'scrollwheel' ) === false )\r\n mousewheel = null;\r\n\r\n this.addEventListeners( mouse, mousewheel, keyboard );\r\n this._mouseEventNode = mouse;\r\n this._wheelEventNode = mousewheel;\r\n this._keyboardEventNode = keyboard;\r\n },\r\n\r\n addEventListeners: function ( mouse, mousewheel, keyboard ) {\r\n if ( mouse ) {\r\n for ( var i = 0, l = this._eventList.length; i < l; i++ ) {\r\n var ev = this._eventList[ i ];\r\n if ( this[ ev ] ) {\r\n mouse.addEventListener( ev, this[ ev ].bind( this ), false );\r\n }\r\n }\r\n }\r\n if ( mousewheel ) {\r\n mousewheel.addEventListener( 'DOMMouseScroll', this.mousewheel.bind( this ), false );\r\n mousewheel.addEventListener( 'mousewheel', this.mousewheel.bind( this ), false );\r\n mousewheel.addEventListener( 'MozMousePixelScroll', this.preventDefault.bind( this ), false );\r\n }\r\n\r\n if ( keyboard ) {\r\n keyboard.addEventListener( 'keydown', this.keydown.bind( this ), false );\r\n keyboard.addEventListener( 'keyup', this.keyup.bind( this ), false );\r\n }\r\n },\r\n\r\n removeEventListeners: function ( mouse, mousewheel, keyboard ) {\r\n if ( mouse ) {\r\n for ( var i = 0, l = this._eventList.length; i < l; i++ ) {\r\n var ev = this._eventList[ i ];\r\n if ( this[ ev ] ) {\r\n mouse.removeEventListener( ev, this[ ev ] );\r\n }\r\n }\r\n }\r\n if ( mousewheel ) {\r\n mousewheel.removeEventListener( 'DOMMouseScroll', this.mousewheel );\r\n mousewheel.removeEventListener( 'mousewheel', this.mousewheel );\r\n mousewheel.removeEventListener( 'MozMousePixelScroll', this.preventDefault );\r\n }\r\n if ( keyboard ) {\r\n keyboard.removeEventListener( 'keydown', this.keydown );\r\n keyboard.removeEventListener( 'keyup', this.keyup );\r\n }\r\n },\r\n\r\n isValid: function () {\r\n if ( this._enable && this._viewer.getManipulator() && this._viewer.getManipulator().getControllerList()[ this._type ] )\r\n return true;\r\n return false;\r\n },\r\n getManipulatorController: function () {\r\n return this._viewer.getManipulator().getControllerList()[ this._type ];\r\n },\r\n\r\n keyup: function ( ev ) {\r\n\r\n if ( this.isValid() && this.getManipulatorController().keyup )\r\n return this.getManipulatorController().keyup( ev );\r\n\r\n return undefined;\r\n },\r\n\r\n keydown: function ( ev ) {\r\n\r\n if ( this.isValid() && this.getManipulatorController().keydown )\r\n return this.getManipulatorController().keydown( ev );\r\n\r\n return undefined;\r\n },\r\n\r\n mousedown: function ( ev ) {\r\n\r\n if ( this.isValid() && this.getManipulatorController().mousedown )\r\n return this.getManipulatorController().mousedown( ev );\r\n\r\n return undefined;\r\n },\r\n\r\n mouseup: function ( ev ) {\r\n\r\n if ( this.isValid() && this.getManipulatorController().mouseup )\r\n return this.getManipulatorController().mouseup( ev );\r\n\r\n return undefined;\r\n },\r\n\r\n mouseout: function ( ev ) {\r\n\r\n if ( this.isValid() && this.getManipulatorController().mouseout )\r\n return this.getManipulatorController().mouseout( ev );\r\n\r\n return undefined;\r\n },\r\n\r\n mousemove: function ( ev ) {\r\n\r\n if ( this.isValid() && this.getManipulatorController().mousemove )\r\n return this.getManipulatorController().mousemove( ev );\r\n\r\n return undefined;\r\n },\r\n\r\n dblclick: function ( ev ) {\r\n\r\n if ( this.isValid() && this.getManipulatorController().dblclick )\r\n return this.getManipulatorController().dblclick( ev );\r\n\r\n return undefined;\r\n },\r\n\r\n mousewheel: function ( event ) {\r\n\r\n if ( !this.isValid() )\r\n return undefined;\r\n\r\n var manipulatorAdapter = this.getManipulatorController();\r\n\r\n if ( !manipulatorAdapter.mousewheel )\r\n return undefined;\r\n\r\n // from jquery\r\n var orgEvent = event || window.event,\r\n args = [].slice.call( arguments, 1 ),\r\n delta = 0,\r\n //returnValue = true,\r\n deltaX = 0,\r\n deltaY = 0;\r\n //event = $.event.fix(orgEvent);\r\n event.type = 'mousewheel';\r\n\r\n // Old school scrollwheel delta\r\n if ( event.wheelDelta ) {\r\n delta = event.wheelDelta / 120;\r\n }\r\n if ( event.detail ) {\r\n delta = -event.detail / 3;\r\n }\r\n\r\n // New school multidimensional scroll (touchpads) deltas\r\n deltaY = delta;\r\n\r\n // Gecko\r\n if ( orgEvent.axis !== undefined && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) {\r\n deltaY = 0;\r\n deltaX = -1 * delta;\r\n }\r\n\r\n // Webkit\r\n if ( orgEvent.wheelDeltaY !== undefined ) {\r\n deltaY = orgEvent.wheelDeltaY / 120;\r\n }\r\n if ( orgEvent.wheelDeltaX !== undefined ) {\r\n deltaX = -1 * orgEvent.wheelDeltaX / 120;\r\n }\r\n // Add event and delta to the front of the arguments\r\n args.unshift( event, delta, deltaX, deltaY );\r\n\r\n return this.getManipulatorController().mousewheel.apply( manipulatorAdapter, args );\r\n },\r\n\r\n preventDefault: function ( event ) {\r\n event.preventDefault();\r\n },\r\n\r\n divGlobalOffset: function ( obj ) {\r\n var x = 0,\r\n y = 0;\r\n x = obj.offsetLeft;\r\n y = obj.offsetTop;\r\n var body = document.getElementsByTagName( 'body' )[ 0 ];\r\n while ( obj.offsetParent && obj !== body ) {\r\n x += obj.offsetParent.offsetLeft;\r\n y += obj.offsetParent.offsetTop;\r\n obj = obj.offsetParent;\r\n }\r\n this._mousePosition[ 0 ] = x;\r\n this._mousePosition[ 1 ] = y;\r\n return this._mousePosition;\r\n },\r\n\r\n getPositionRelativeToCanvas: function ( e, result ) {\r\n var myObject = e.target;\r\n var posx, posy;\r\n if ( e.pageX || e.pageY ) {\r\n posx = e.pageX;\r\n posy = e.pageY;\r\n } else if ( e.clientX || e.clientY ) {\r\n posx = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;\r\n posy = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;\r\n }\r\n\r\n // posx and posy contain the mouse position relative to the document\r\n // Do something with this information\r\n var globalOffset = this.divGlobalOffset( myObject );\r\n posx = posx - globalOffset[ 0 ];\r\n posy = myObject.height - ( posy - globalOffset[ 1 ] );\r\n\r\n // NaN in camera check here\r\n if ( isNaN( posx ) || isNaN( posy ) ) {\r\n //debugger;\r\n }\r\n\r\n // copy data to result if need to keep result\r\n // else we use a tmp variable inside manipulator\r\n // that we override at each call\r\n if ( result === undefined ) {\r\n result = this._mousePosition;\r\n }\r\n result[ 0 ] = posx;\r\n result[ 1 ] = posy;\r\n return result;\r\n },\r\n\r\n // use the update to set the input device to mouse controller\r\n // it's needed to compute size\r\n update: function () {\r\n if ( !this.isValid() )\r\n return;\r\n\r\n this.getManipulatorController().setEventProxy( this );\r\n }\r\n\r\n };\r\n return StandardMouseKeyboard;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgViewer/eventProxy/StandardMouseKeyboard.js\n ** module id = 235\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Notify',\r\n 'osg/Quat'\r\n], function ( Notify, Quat ) {\r\n\r\n 'use strict';\r\n\r\n var Oculus = function ( viewer ) {\r\n this._viewer = viewer;\r\n this._type = 'Oculus';\r\n this._enable = true;\r\n this._hmd = undefined;\r\n this._sensor = undefined;\r\n this._quat = Quat.create();\r\n };\r\n\r\n Oculus.prototype = {\r\n\r\n init: function () {\r\n\r\n var self = this;\r\n\r\n function vrDeviceCallback( vrDevices ) {\r\n\r\n var i;\r\n\r\n // First, find a HMD -- just use the first one we find\r\n for ( i = 0; i < vrDevices.length; ++i ) {\r\n if ( vrDevices[ i ] instanceof window.HMDVRDevice ) {\r\n self._hmd = vrDevices[ i ];\r\n break;\r\n }\r\n }\r\n\r\n // Then, find a sensor corresponding to the same hardwareUnitId\r\n for ( i = 0; i < vrDevices.length; ++i ) {\r\n if ( vrDevices[ i ] instanceof window.PositionSensorVRDevice && vrDevices[ i ].hardwareUnitId === self._hmd.hardwareUnitId ) {\r\n self._sensor = vrDevices[ i ];\r\n break;\r\n }\r\n }\r\n\r\n if ( self._hmd && self._sensor )\r\n Notify.log( 'Found a HMD and Sensor' );\r\n }\r\n\r\n if ( navigator.getVRDevices ) {\r\n navigator.getVRDevices().then( vrDeviceCallback );\r\n } else if ( navigator.mozGetVRDevices ) {\r\n navigator.mozGetVRDevices( vrDeviceCallback );\r\n }\r\n\r\n },\r\n\r\n getManipulatorController: function () {\r\n return this._viewer.getManipulator().getControllerList()[ this._type ];\r\n },\r\n\r\n isValid: function () {\r\n if ( !this._enable )\r\n return false;\r\n\r\n var manipulator = this._viewer.getManipulator();\r\n if ( !manipulator )\r\n return false;\r\n\r\n if ( !manipulator.getControllerList()[ this._type ] )\r\n return false;\r\n\r\n if ( !this._hmd || !this._sensor )\r\n return false;\r\n\r\n return true;\r\n },\r\n\r\n update: function () {\r\n\r\n if ( !this.isValid() )\r\n return;\r\n\r\n var manipulatorAdapter = this.getManipulatorController();\r\n\r\n // update the manipulator with the rotation of the device\r\n if ( manipulatorAdapter.update ) {\r\n\r\n var quat = this._sensor.getState().orientation;\r\n\r\n // If no real oculus is detected, navigators (vr builds of FF and Chrome) simulate a fake oculus\r\n // On firefox, this fake oculus returns a wrong quaternion: [0, 0, 0, 0]\r\n // So we detect and set this quaternion to a neutral value: [0, 0, 0, 1]\r\n // UPDATE : it looks like that sometimes no quaternion is returned\r\n if ( !quat ) {\r\n Quat.init( this._quat );\r\n } else {\r\n if ( quat.x === 0.0 && quat.y === 0.0 && quat.y === 0.0 && quat.w === 0.0 )\r\n quat.w = 1.0;\r\n // On oculus the up vector is [0,1,0]\r\n // On osgjs the up vector is [0,0,1]\r\n this._quat[ 0 ] = quat.x;\r\n this._quat[ 1 ] = -quat.z;\r\n this._quat[ 2 ] = quat.y;\r\n this._quat[ 3 ] = quat.w;\r\n }\r\n\r\n manipulatorAdapter.update( this._quat );\r\n }\r\n },\r\n\r\n getHmd: function () {\r\n return this._hmd;\r\n }\r\n };\r\n return Oculus;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgViewer/eventProxy/Oculus.js\n ** module id = 236\n ** module chunks = 0 1\n **/","define( [], function () {\r\n\r\n 'use strict';\r\n\r\n var DeviceOrientation = function ( viewer ) {\r\n this._viewer = viewer;\r\n this._type = 'DeviceOrientation';\r\n this._enable = false;\r\n\r\n // Landscape mobile orientation testing defaults\r\n this._deviceOrientation = {\r\n alpha: 90, // angle of rotation around Z axis\r\n beta: 0, // angle of rotation around X axis\r\n gamma: -90 // angle of rotation around Y axis\r\n };\r\n this._screenOrientation = window.orientation || 90;\r\n };\r\n\r\n DeviceOrientation.prototype = {\r\n\r\n init: function () {\r\n\r\n var self = this;\r\n\r\n // Check because Chrome send _one_ event with all angles to null\r\n window.addEventListener( 'deviceorientation', function ( rawEvtData ) {\r\n if ( rawEvtData.alpha !== null && rawEvtData.alpha !== undefined )\r\n self._deviceOrientation = rawEvtData;\r\n }, false );\r\n\r\n window.addEventListener( 'orientationchange', function () {\r\n if ( window.orientation !== null && window.orientation !== undefined )\r\n self._screenOrientation = window.orientation;\r\n }, false );\r\n\r\n },\r\n\r\n getManipulatorController: function () {\r\n return this._viewer.getManipulator().getControllerList()[ this._type ];\r\n },\r\n\r\n isValid: function () {\r\n if ( !this._enable )\r\n return false;\r\n\r\n var manipulator = this._viewer.getManipulator();\r\n if ( !manipulator )\r\n return false;\r\n\r\n if ( !manipulator.getControllerList()[ this._type ] )\r\n return false;\r\n\r\n return true;\r\n },\r\n\r\n update: function () {\r\n\r\n if ( !this.isValid() )\r\n return;\r\n\r\n // update the manipulator with the rotation of the device\r\n var manipulatorAdapter = this.getManipulatorController();\r\n if ( manipulatorAdapter.update ) {\r\n manipulatorAdapter.update( this._deviceOrientation, this._screenOrientation );\r\n }\r\n }\r\n\r\n };\r\n\r\n return DeviceOrientation;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgViewer/eventProxy/DeviceOrientation.js\n ** module id = 237\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Notify'\r\n\r\n], function ( Notify ) {\r\n\r\n 'use strict';\r\n\r\n // osg/Stats.cpp\r\n // the difference here is that we dont support reference to number. Instead\r\n // we return the value. If there is no value for an attribute name\r\n // it returns Number.MAX_VALUE, that can be check with Stats.isValid( value )\r\n\r\n var Stats = function ( name, samples ) {\r\n\r\n this._nbFrames = 25;\r\n this._baseFrameNumber = 0;\r\n this._lastFrameNumber = 0;\r\n this._attributeMapList = [];\r\n this._name = name;\r\n\r\n if ( samples !== undefined )\r\n this._nbFrames = samples;\r\n\r\n for ( var i = 0; i < this._nbFrames; i++ )\r\n this._attributeMapList.push( new Map() );\r\n };\r\n\r\n Stats.isValid = function ( value ) {\r\n return value !== Number.MAX_VALUE;\r\n };\r\n\r\n Stats.prototype = {\r\n\r\n getEarliestFrameNumber: function () {\r\n return this._latestFrameNumber < this._attributeMapList.length ? 0 : ( this._latestFrameNumber - this._attributeMapList.length + 1 );\r\n },\r\n\r\n getLatestFrameNumber: function () {\r\n return this._latestFrameNumber;\r\n },\r\n\r\n getIndex: function ( frameNumber ) {\r\n // reject frame that are in the future\r\n if ( frameNumber > this._latestFrameNumber ) return -1;\r\n\r\n // reject frames that are too early\r\n if ( frameNumber < this.getEarliestFrameNumber() ) return -1;\r\n\r\n if ( frameNumber >= this._baseFrameNumber ) return frameNumber - this._baseFrameNumber;\r\n else return this._attributeMapList.length - ( this._baseFrameNumber - frameNumber );\r\n },\r\n\r\n setAttribute: function ( frameNumber, attributeName, value ) {\r\n\r\n var index = 0;\r\n if ( frameNumber > this._lastFrameNumber ) {\r\n // need to advance\r\n\r\n var attributeLength = this._attributeMapList.length;\r\n\r\n // first clear the entries up to and including the new frameNumber\r\n for ( var i = this._latestFrameNumber + 1; i <= frameNumber; ++i ) {\r\n index = ( i - this._baseFrameNumber ) % attributeLength;\r\n this._attributeMapList[ index ].clear();\r\n }\r\n\r\n if ( ( frameNumber - this._baseFrameNumber ) >= attributeLength )\r\n this._baseFrameNumber = ( frameNumber / attributeLength ) * attributeLength;\r\n\r\n this._latestFrameNumber = frameNumber;\r\n }\r\n\r\n index = this.getIndex( frameNumber );\r\n\r\n if ( index < 0 ) {\r\n Notify.log( 'Failed to assing valid index for Stats::setAttribute(', frameNumber, ',', attributeName, ',', value, ')' );\r\n return false;\r\n }\r\n\r\n this._attributeMapList[ index ].set( attributeName, value );\r\n return true;\r\n },\r\n\r\n getAttribute: function ( frameNumber, attributeName ) {\r\n var index = this.getIndex( frameNumber );\r\n if ( index < 0 ) return 0.0;\r\n\r\n var value = this._attributeMapList[ index ].get( attributeName );\r\n if ( value === undefined )\r\n value = Number.MAX_VALUE;\r\n\r\n return value;\r\n },\r\n\r\n\r\n getAveragedAttribute: function ( startFrameNumber, endFrameNumber, attributeName, averageInInverseSpace ) {\r\n\r\n var value = 0.0;\r\n\r\n if ( endFrameNumber < startFrameNumber ) {\r\n var tmp = endFrameNumber;\r\n endFrameNumber = startFrameNumber;\r\n startFrameNumber = tmp;\r\n }\r\n\r\n var total = 0.0;\r\n var numValidSamples = 0.0;\r\n for ( var i = startFrameNumber; i <= endFrameNumber; ++i ) {\r\n var v = 0.0;\r\n v = this.getAttribute( i, attributeName );\r\n\r\n if ( v !== Number.MAX_VALUE ) { // check for invalid sample\r\n\r\n if ( averageInInverseSpace ) total += 1.0 / v;\r\n else total += v;\r\n numValidSamples += 1.0;\r\n }\r\n }\r\n\r\n if ( numValidSamples === 0.0 )\r\n return Number.MAX_VALUE;\r\n\r\n if ( averageInInverseSpace )\r\n value = numValidSamples / total;\r\n else\r\n value = total / numValidSamples;\r\n\r\n return value;\r\n }\r\n\r\n\r\n };\r\n\r\n\r\n return Stats;\r\n\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osg/Stats.js\n ** module id = 238\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Timer'\r\n\r\n], function ( Timer ) {\r\n\r\n 'use strict';\r\n\r\n var CanvasStats = function ( canvas, textCanvas ) {\r\n this.layers = [];\r\n this.lastUpdate = undefined;\r\n this.canvas = canvas;\r\n this.textCanvas = textCanvas;\r\n this.numberUpdate = 0;\r\n };\r\n\r\n CanvasStats.prototype = {\r\n\r\n addLayer: function ( color, maxVal, getter, texter ) {\r\n if ( color === undefined ) {\r\n color = 'rgb(255,255,255)';\r\n }\r\n this.layers.push( {\r\n previous: 0,\r\n color: color,\r\n getValue: getter,\r\n getText: texter,\r\n average: 0,\r\n max: maxVal\r\n } );\r\n },\r\n\r\n\r\n updateGraph: function ( t ) {\r\n //4.0 * 60.0 / 1000.0;\r\n var constStep = 0.12;\r\n var delta = Timer.instance().deltaM( this.lastUpdate, t ) * constStep;\r\n if ( delta >= 1.0 ) {\r\n\r\n t -= ( delta - Math.floor( delta ) ) / constStep;\r\n delta = Math.floor( delta );\r\n\r\n var c = this.canvas;\r\n var ctx = c.getContext( '2d' );\r\n\r\n var myImageData = ctx.getImageData( delta, 0, c.width - delta, c.height );\r\n ctx.putImageData( myImageData, 0, 0 );\r\n ctx.clearRect( c.width - delta, 0, delta, c.height );\r\n\r\n for ( var i = 0, l = this.layers.length; i < l; i++ ) {\r\n var layer = this.layers[ i ];\r\n var value = layer.getValue( t );\r\n value *= c.height / layer.max;\r\n if ( value > c.height ) value = c.height;\r\n ctx.lineWidth = 1.0;\r\n ctx.strokeStyle = layer.color;\r\n ctx.beginPath();\r\n ctx.moveTo( c.width - delta, c.height - layer.previous );\r\n ctx.lineTo( c.width, c.height - value );\r\n ctx.stroke();\r\n layer.previous = value;\r\n }\r\n }\r\n },\r\n\r\n\r\n updateText: function () {\r\n\r\n if ( this.numberUpdate % 60 === 0 ) {\r\n var c = this.textCanvas;\r\n var ctx = c.getContext( '2d' );\r\n ctx.font = '14px Sans';\r\n var height = 17;\r\n var delta = height;\r\n ctx.clearRect( 0, 0, c.width, c.height );\r\n for ( var i = 0, l = this.layers.length; i < l; i++ ) {\r\n var layer = this.layers[ i ];\r\n var value = layer.getText( layer.average / this.numberUpdate );\r\n layer.average = 0;\r\n ctx.fillStyle = layer.color;\r\n ctx.fillText( value, 0, delta );\r\n delta += height;\r\n }\r\n this.numberUpdate = 0;\r\n }\r\n },\r\n\r\n update: function () {\r\n\r\n var t = Timer.instance().tick();\r\n if ( this.lastUpdate === undefined ) {\r\n this.lastUpdate = t;\r\n }\r\n\r\n this.numberUpdate++;\r\n for ( var j = 0; j < this.layers.length; j++ ) {\r\n var layer = this.layers[ j ];\r\n var value = layer.getValue( t );\r\n layer.average += value;\r\n }\r\n\r\n if ( this.canvas )\r\n this.updateGraph( t );\r\n\r\n if ( this.textCanvas )\r\n this.updateText( t );\r\n\r\n this.lastUpdate = t;\r\n }\r\n };\r\n\r\n return CanvasStats;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgViewer/CanvasStats.js\n ** module id = 239\n ** module chunks = 0 1\n **/","/* jshint ignore:start */\r\n\r\ndefine( [], function () {\r\n\r\n /*\r\n * Copyright 2010, Google Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without\r\n * modification, are permitted provided that the following conditions are\r\n * met:\r\n *\r\n * * Redistributions of source code must retain the above copyright\r\n * notice, this list of conditions and the following disclaimer.\r\n * * Redistributions in binary form must reproduce the above\r\n * copyright notice, this list of conditions and the following disclaimer\r\n * in the documentation and/or other materials provided with the\r\n * distribution.\r\n * * Neither the name of Google Inc. nor the names of its\r\n * contributors may be used to endorse or promote products derived from\r\n * this software without specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\n\r\n\r\n /**\r\n * @fileoverview This file contains functions every webgl program will need\r\n * a version of one way or another.\r\n *\r\n * Instead of setting up a context manually it is recommended to\r\n * use. This will check for success or failure. On failure it\r\n * will attempt to present an approriate message to the user.\r\n *\r\n * gl = WebGLUtils.setupWebGL(canvas);\r\n *\r\n * For animated WebGL apps use of setTimeout or setInterval are\r\n * discouraged. It is recommended you structure your rendering\r\n * loop like this.\r\n *\r\n * function render() {\r\n * window.requestAnimationFrame(render, canvas);\r\n *\r\n * // do rendering\r\n * ...\r\n * }\r\n * render();\r\n *\r\n * This will call your rendering function up to the refresh rate\r\n * of your display but will stop rendering if your app is not\r\n * visible.\r\n */\r\n\r\n var WebGLUtils = function () {\r\n\r\n /**\r\n * Creates the HTLM for a failure message\r\n * @param {string} canvasContainerId id of container of th\r\n * canvas.\r\n * @return {string} The html.\r\n */\r\n var makeFailHTML = function ( msg ) {\r\n return '' +\r\n '
' + msg + '
';\r\n // return '' +\r\n // '' +\r\n // '
' +\r\n // '
' +\r\n // '
' + msg + '
' +\r\n // '
' +\r\n // '
';\r\n };\r\n\r\n /**\r\n * Mesasge for getting a webgl browser\r\n * @type {string}\r\n */\r\n var GET_A_WEBGL_BROWSER = '' +\r\n 'This page requires a browser that supports WebGL.
' +\r\n 'Click here to upgrade your browser.';\r\n\r\n /**\r\n * Mesasge for need better hardware\r\n * @type {string}\r\n */\r\n var OTHER_PROBLEM = '' +\r\n \"It doesn't appear your computer can support WebGL.
\" +\r\n 'Click here for more information.';\r\n\r\n /**\r\n * Creates a webgl context. If creation fails it will\r\n * change the contents of the container of the \r\n * tag to an error message with the correct links for WebGL.\r\n * @return {WebGLRenderingContext} The created context.\r\n */\r\n var setupWebGL = function (\r\n /** Element */\r\n canvas,\r\n /** WebGLContextCreationAttirbutes */\r\n opt_attribs,\r\n /** function:(msg) */\r\n opt_onError ) {\r\n function handleCreationError( msg ) {\r\n var container = document.getElementsByTagName( \"body\" )[ 0 ];\r\n //var container = canvas.parentNode;\r\n if ( container ) {\r\n var str = window.WebGLRenderingContext ?\r\n OTHER_PROBLEM :\r\n GET_A_WEBGL_BROWSER;\r\n if ( msg ) {\r\n str += \"

Status: \" + msg;\r\n }\r\n container.innerHTML = makeFailHTML( str );\r\n }\r\n }\r\n\r\n opt_onError = opt_onError || handleCreationError;\r\n\r\n if ( canvas.addEventListener ) {\r\n canvas.addEventListener( \"webglcontextcreationerror\", function ( event ) {\r\n opt_onError( event.statusMessage );\r\n }, false );\r\n }\r\n var context = create3DContext( canvas, opt_attribs );\r\n if ( !context ) {\r\n if ( !window.WebGLRenderingContext ) {\r\n opt_onError( \"\" );\r\n } else {\r\n opt_onError( \"\" );\r\n }\r\n }\r\n\r\n return context;\r\n };\r\n\r\n /**\r\n * Creates a webgl context.\r\n * @param {!Canvas} canvas The canvas tag to get context\r\n * from. If one is not passed in one will be created.\r\n * @return {!WebGLContext} The created context.\r\n */\r\n var create3DContext = function ( canvas, opt_attribs ) {\r\n var names = [ \"webgl\", \"experimental-webgl\", \"webkit-3d\", \"moz-webgl\" ];\r\n var context = null;\r\n for ( var ii = 0; ii < names.length; ++ii ) {\r\n try {\r\n context = canvas.getContext( names[ ii ], opt_attribs );\r\n } catch ( e ) {}\r\n if ( context ) {\r\n break;\r\n }\r\n }\r\n return context;\r\n };\r\n\r\n return {\r\n create3DContext: create3DContext,\r\n setupWebGL: setupWebGL\r\n };\r\n }();\r\n\r\n /**\r\n * Provides requestAnimationFrame in a cross browser\r\n * way.\r\n */\r\n if ( !window.requestAnimationFrame ) {\r\n window.requestAnimationFrame = ( function () {\r\n return window.requestAnimationFrame ||\r\n window.webkitRequestAnimationFrame ||\r\n window.mozRequestAnimationFrame ||\r\n window.oRequestAnimationFrame ||\r\n window.msRequestAnimationFrame ||\r\n function ( /* function FrameRequestCallback */ callback, /* DOMElement Element */ element ) {\r\n window.setTimeout( callback, 1000 / 60 );\r\n };\r\n } )();\r\n }\r\n\r\n if ( !window.cancelRequestAnimFrame ) {\r\n window.cancelRequestAnimFrame = ( function () {\r\n return window.cancelAnimationFrame ||\r\n window.webkitCancelRequestAnimationFrame ||\r\n window.mozCancelRequestAnimationFrame ||\r\n window.oCancelRequestAnimationFrame ||\r\n window.msCancelRequestAnimationFrame ||\r\n clearTimeout;\r\n } )();\r\n }\r\n\r\n if ( !Date.now ) {\r\n Date.now = function now() {\r\n return new Date().getTime();\r\n };\r\n }\r\n\r\n return WebGLUtils;\r\n} );\r\n\r\n/* jshint ignore:end */\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgViewer/webgl-utils.js\n ** module id = 240\n ** module chunks = 0 1\n **/","/* jshint ignore:start */\r\n\r\ndefine( [\r\n\r\n 'osg/Notify'\r\n\r\n], function ( Notify ) {\r\n\r\n //Copyright (c) 2009 The Chromium Authors. All rights reserved.\r\n //Use of this source code is governed by a BSD-style license that can be\r\n //found in the LICENSE file.\r\n\r\n // Various functions for helping debug WebGL apps.\r\n\r\n var WebGLDebugUtils = function () {\r\n\r\n /**\r\n * Which arguements are enums.\r\n * @type {!Object.}\r\n */\r\n var glValidEnumContexts = {\r\n\r\n // Generic setters and getters\r\n\r\n 'enable': {\r\n 0: true\r\n },\r\n 'disable': {\r\n 0: true\r\n },\r\n 'getParameter': {\r\n 0: true\r\n },\r\n\r\n // Rendering\r\n\r\n 'drawArrays': {\r\n 0: true\r\n },\r\n 'drawElements': {\r\n 0: true,\r\n 2: true\r\n },\r\n\r\n // Shaders\r\n\r\n 'createShader': {\r\n 0: true\r\n },\r\n 'getShaderParameter': {\r\n 1: true\r\n },\r\n 'getProgramParameter': {\r\n 1: true\r\n },\r\n\r\n // Vertex attributes\r\n\r\n 'getVertexAttrib': {\r\n 1: true\r\n },\r\n 'vertexAttribPointer': {\r\n 2: true\r\n },\r\n\r\n // Textures\r\n\r\n 'bindTexture': {\r\n 0: true\r\n },\r\n 'activeTexture': {\r\n 0: true\r\n },\r\n 'getTexParameter': {\r\n 0: true,\r\n 1: true\r\n },\r\n 'texParameterf': {\r\n 0: true,\r\n 1: true\r\n },\r\n 'texParameteri': {\r\n 0: true,\r\n 1: true,\r\n 2: true\r\n },\r\n 'texImage2D': {\r\n 0: true,\r\n 2: true,\r\n 6: true,\r\n 7: true\r\n },\r\n 'texSubImage2D': {\r\n 0: true,\r\n 6: true,\r\n 7: true\r\n },\r\n 'copyTexImage2D': {\r\n 0: true,\r\n 2: true\r\n },\r\n 'copyTexSubImage2D': {\r\n 0: true\r\n },\r\n 'generateMipmap': {\r\n 0: true\r\n },\r\n\r\n // Buffer objects\r\n\r\n 'bindBuffer': {\r\n 0: true\r\n },\r\n 'bufferData': {\r\n 0: true,\r\n 2: true\r\n },\r\n 'bufferSubData': {\r\n 0: true\r\n },\r\n 'getBufferParameter': {\r\n 0: true,\r\n 1: true\r\n },\r\n\r\n // Renderbuffers and framebuffers\r\n\r\n 'pixelStorei': {\r\n 0: true,\r\n 1: true\r\n },\r\n 'readPixels': {\r\n 4: true,\r\n 5: true\r\n },\r\n 'bindRenderbuffer': {\r\n 0: true\r\n },\r\n 'bindFramebuffer': {\r\n 0: true\r\n },\r\n 'checkFramebufferStatus': {\r\n 0: true\r\n },\r\n 'framebufferRenderbuffer': {\r\n 0: true,\r\n 1: true,\r\n 2: true\r\n },\r\n 'framebufferTexture2D': {\r\n 0: true,\r\n 1: true,\r\n 2: true\r\n },\r\n 'getFramebufferAttachmentParameter': {\r\n 0: true,\r\n 1: true,\r\n 2: true\r\n },\r\n 'getRenderbufferParameter': {\r\n 0: true,\r\n 1: true\r\n },\r\n 'renderbufferStorage': {\r\n 0: true,\r\n 1: true\r\n },\r\n\r\n // Frame buffer operations (clear, blend, depth test, stencil)\r\n\r\n 'clear': {\r\n 0: true\r\n },\r\n 'depthFunc': {\r\n 0: true\r\n },\r\n 'blendFunc': {\r\n 0: true,\r\n 1: true\r\n },\r\n 'blendFuncSeparate': {\r\n 0: true,\r\n 1: true,\r\n 2: true,\r\n 3: true\r\n },\r\n 'blendEquation': {\r\n 0: true\r\n },\r\n 'blendEquationSeparate': {\r\n 0: true,\r\n 1: true\r\n },\r\n 'stencilFunc': {\r\n 0: true\r\n },\r\n 'stencilFuncSeparate': {\r\n 0: true,\r\n 1: true\r\n },\r\n 'stencilMaskSeparate': {\r\n 0: true\r\n },\r\n 'stencilOp': {\r\n 0: true,\r\n 1: true,\r\n 2: true\r\n },\r\n 'stencilOpSeparate': {\r\n 0: true,\r\n 1: true,\r\n 2: true,\r\n 3: true\r\n },\r\n\r\n // Culling\r\n\r\n 'cullFace': {\r\n 0: true\r\n },\r\n 'frontFace': {\r\n 0: true\r\n }\r\n };\r\n\r\n /**\r\n * Map of numbers to names.\r\n * @type {Object}\r\n */\r\n var glEnums = null;\r\n\r\n /**\r\n * Initializes this module. Safe to call more than once.\r\n * @param {!WebGLRenderingContext} ctx A WebGL context. If\r\n * you have more than one context it doesn't matter which one\r\n * you pass in, it is only used to pull out constants.\r\n */\r\n function init( ctx ) {\r\n if ( glEnums === null ) {\r\n glEnums = {};\r\n for ( var propertyName in ctx ) {\r\n if ( typeof ctx[ propertyName ] === 'number' ) {\r\n glEnums[ ctx[ propertyName ] ] = propertyName;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Checks the utils have been initialized.\r\n */\r\n function checkInit() {\r\n if ( glEnums === null ) {\r\n throw 'WebGLDebugUtils.init(ctx) not called';\r\n }\r\n }\r\n\r\n /**\r\n * Returns true or false if value matches any WebGL enum\r\n * @param {*} value Value to check if it might be an enum.\r\n * @return {boolean} True if value matches one of the WebGL defined enums\r\n */\r\n function mightBeEnum( value ) {\r\n checkInit();\r\n return ( glEnums[ value ] !== undefined );\r\n }\r\n\r\n /**\r\n * Gets an string version of an WebGL enum.\r\n *\r\n * Example:\r\n * var str = WebGLDebugUtil.glEnumToString(ctx.getError());\r\n *\r\n * @param {number} value Value to return an enum for\r\n * @return {string} The string version of the enum.\r\n */\r\n function glEnumToString( value ) {\r\n checkInit();\r\n var name = glEnums[ value ];\r\n return ( name !== undefined ) ? name :\r\n ( '*UNKNOWN WebGL ENUM (0x' + value.toString( 16 ) + ')' );\r\n }\r\n\r\n /**\r\n * Returns the string version of a WebGL argument.\r\n * Attempts to convert enum arguments to strings.\r\n * @param {string} functionName the name of the WebGL function.\r\n * @param {number} argumentIndx the index of the argument.\r\n * @param {*} value The value of the argument.\r\n * @return {string} The value as a string.\r\n */\r\n function glFunctionArgToString( functionName, argumentIndex, value ) {\r\n var funcInfo = glValidEnumContexts[ functionName ];\r\n if ( funcInfo !== undefined ) {\r\n if ( funcInfo[ argumentIndex ] ) {\r\n return glEnumToString( value );\r\n }\r\n }\r\n return value.toString();\r\n }\r\n\r\n function makePropertyWrapper( wrapper, original, propertyName ) {\r\n //Notify.log(\"wrap prop: \" + propertyName);\r\n wrapper.__defineGetter__( propertyName, function () {\r\n return original[ propertyName ];\r\n } );\r\n // TODO(gmane): this needs to handle properties that take more than\r\n // one value?\r\n wrapper.__defineSetter__( propertyName, function ( value ) {\r\n //Notify.log(\"set: \" + propertyName);\r\n original[ propertyName ] = value;\r\n } );\r\n }\r\n\r\n // Makes a function that calls a function on another object.\r\n function makeFunctionWrapper( original, functionName ) {\r\n //Notify.log(\"wrap fn: \" + functionName);\r\n var f = original[ functionName ];\r\n return function () {\r\n //Notify.log(\"call: \" + functionName);\r\n var result = f.apply( original, arguments );\r\n return result;\r\n };\r\n }\r\n\r\n /**\r\n * Given a WebGL context returns a wrapped context that calls\r\n * gl.getError after every command and calls a function if the\r\n * result is not gl.NO_ERROR.\r\n *\r\n * @param {!WebGLRenderingContext} ctx The webgl context to\r\n * wrap.\r\n * @param {!function(err, funcName, args): void} opt_onErrorFunc\r\n * The function to call when gl.getError returns an\r\n * error. If not specified the default function calls\r\n * Notify.log with a message.\r\n */\r\n function makeDebugContext( ctx, opt_onErrorFunc ) {\r\n init( ctx );\r\n opt_onErrorFunc = opt_onErrorFunc || function ( err, functionName, args ) {\r\n // apparently we can't do args.join(\",\");\r\n var argStr = \"\";\r\n for ( var ii = 0; ii < args.length; ++ii ) {\r\n argStr += ( ( ii === 0 ) ? '' : ', ' ) +\r\n glFunctionArgToString( functionName, ii, args[ ii ] );\r\n }\r\n Notify.log( \"WebGL error \" + glEnumToString( err ) + \" in \" + functionName +\r\n \"(\" + argStr + \")\" );\r\n };\r\n\r\n // Holds booleans for each GL error so after we get the error ourselves\r\n // we can still return it to the client app.\r\n var glErrorShadow = {};\r\n\r\n // Makes a function that calls a WebGL function and then calls getError.\r\n function makeErrorWrapper( ctx, functionName ) {\r\n return function () {\r\n var result = ctx[ functionName ].apply( ctx, arguments );\r\n var err = ctx.getError();\r\n if ( err !== 0 ) {\r\n glErrorShadow[ err ] = true;\r\n opt_onErrorFunc( err, functionName, arguments );\r\n }\r\n return result;\r\n };\r\n }\r\n\r\n // Make a an object that has a copy of every property of the WebGL context\r\n // but wraps all functions.\r\n var wrapper = {};\r\n for ( var propertyName in ctx ) {\r\n if ( typeof ctx[ propertyName ] == 'function' ) {\r\n wrapper[ propertyName ] = makeErrorWrapper( ctx, propertyName );\r\n } else {\r\n makePropertyWrapper( wrapper, ctx, propertyName );\r\n }\r\n }\r\n\r\n // Override the getError function with one that returns our saved results.\r\n wrapper.getError = function () {\r\n for ( var err in glErrorShadow ) {\r\n if ( glErrorShadow[ err ] ) {\r\n glErrorShadow[ err ] = false;\r\n return err;\r\n }\r\n }\r\n return ctx.NO_ERROR;\r\n };\r\n\r\n return wrapper;\r\n }\r\n\r\n function resetToInitialState( ctx ) {\r\n var numAttribs = ctx.getParameter( ctx.MAX_VERTEX_ATTRIBS );\r\n var tmp = ctx.createBuffer();\r\n ctx.bindBuffer( ctx.ARRAY_BUFFER, tmp );\r\n var ii;\r\n for ( ii = 0; ii < numAttribs; ++ii ) {\r\n ctx.disableVertexAttribArray( ii );\r\n ctx.vertexAttribPointer( ii, 4, ctx.FLOAT, false, 0, 0 );\r\n ctx.vertexAttrib1f( ii, 0 );\r\n }\r\n ctx.deleteBuffer( tmp );\r\n\r\n var numTextureUnits = ctx.getParameter( ctx.MAX_TEXTURE_IMAGE_UNITS );\r\n for ( ii = 0; ii < numTextureUnits; ++ii ) {\r\n ctx.activeTexture( ctx.TEXTURE0 + ii );\r\n ctx.bindTexture( ctx.TEXTURE_CUBE_MAP, null );\r\n ctx.bindTexture( ctx.TEXTURE_2D, null );\r\n }\r\n\r\n ctx.activeTexture( ctx.TEXTURE0 );\r\n ctx.useProgram( null );\r\n ctx.bindBuffer( ctx.ARRAY_BUFFER, null );\r\n ctx.bindBuffer( ctx.ELEMENT_ARRAY_BUFFER, null );\r\n ctx.bindFramebuffer( ctx.FRAMEBUFFER, null );\r\n ctx.bindRenderbuffer( ctx.RENDERBUFFER, null );\r\n ctx.disable( ctx.BLEND );\r\n ctx.disable( ctx.CULL_FACE );\r\n ctx.disable( ctx.DEPTH_TEST );\r\n ctx.disable( ctx.DITHER );\r\n ctx.disable( ctx.SCISSOR_TEST );\r\n ctx.blendColor( 0, 0, 0, 0 );\r\n ctx.blendEquation( ctx.FUNC_ADD );\r\n ctx.blendFunc( ctx.ONE, ctx.ZERO );\r\n ctx.clearColor( 0, 0, 0, 0 );\r\n ctx.clearDepth( 1 );\r\n ctx.clearStencil( -1 );\r\n ctx.colorMask( true, true, true, true );\r\n ctx.cullFace( ctx.BACK );\r\n ctx.depthFunc( ctx.LESS );\r\n ctx.depthMask( true );\r\n ctx.depthRange( 0, 1 );\r\n ctx.frontFace( ctx.CCW );\r\n ctx.hint( ctx.GENERATE_MIPMAP_HINT, ctx.DONT_CARE );\r\n ctx.lineWidth( 1 );\r\n ctx.pixelStorei( ctx.PACK_ALIGNMENT, 4 );\r\n ctx.pixelStorei( ctx.UNPACK_ALIGNMENT, 4 );\r\n ctx.pixelStorei( ctx.UNPACK_FLIP_Y_WEBGL, false );\r\n ctx.pixelStorei( ctx.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false );\r\n // TODO: Delete this IF.\r\n if ( ctx.UNPACK_COLORSPACE_CONVERSION_WEBGL ) {\r\n ctx.pixelStorei( ctx.UNPACK_COLORSPACE_CONVERSION_WEBGL, ctx.BROWSER_DEFAULT_WEBGL );\r\n }\r\n ctx.polygonOffset( 0, 0 );\r\n ctx.sampleCoverage( 1, false );\r\n ctx.scissor( 0, 0, ctx.canvas.width, ctx.canvas.height );\r\n ctx.stencilFunc( ctx.ALWAYS, 0, 0xFFFFFFFF );\r\n ctx.stencilMask( 0xFFFFFFFF );\r\n ctx.stencilOp( ctx.KEEP, ctx.KEEP, ctx.KEEP );\r\n ctx.viewport( 0, 0, ctx.canvas.width, ctx.canvas.height );\r\n ctx.clear( ctx.COLOR_BUFFER_BIT | ctx.DEPTH_BUFFER_BIT | ctx.STENCIL_BUFFER_BIT );\r\n\r\n // TODO: This should NOT be needed but Firefox fails with 'hint'\r\n while ( ctx.getError() ) {}\r\n }\r\n\r\n function makeLostContextSimulatingCanvas( canvas ) {\r\n var unwrappedContext_;\r\n //var wrappedContext_;\r\n var onLost_ = [];\r\n var onRestored_ = [];\r\n var wrappedContext_ = {};\r\n var contextId_ = 1;\r\n var contextLost_ = false;\r\n var resourceId_ = 0;\r\n var resourceDb_ = [];\r\n var numCallsToLoseContext_ = 0;\r\n var numCalls_ = 0;\r\n var canRestore_ = false;\r\n var restoreTimeout_ = 0;\r\n\r\n // Holds booleans for each GL error so can simulate errors.\r\n var glErrorShadow_ = {};\r\n\r\n canvas.getContext = function ( f ) {\r\n return function () {\r\n var ctx = f.apply( canvas, arguments );\r\n // Did we get a context and is it a WebGL context?\r\n if ( ctx instanceof WebGLRenderingContext ) {\r\n if ( ctx != unwrappedContext_ ) {\r\n if ( unwrappedContext_ ) {\r\n throw \"got different context\";\r\n }\r\n unwrappedContext_ = ctx;\r\n wrappedContext_ = makeLostContextSimulatingContext( unwrappedContext_ );\r\n }\r\n return wrappedContext_;\r\n }\r\n return ctx;\r\n };\r\n }( canvas.getContext );\r\n\r\n function wrapEvent( listener ) {\r\n if ( typeof ( listener ) == \"function\" ) {\r\n return listener;\r\n } else {\r\n return function ( info ) {\r\n listener.handleEvent( info );\r\n };\r\n }\r\n }\r\n\r\n var addOnContextLostListener = function ( listener ) {\r\n onLost_.push( wrapEvent( listener ) );\r\n };\r\n\r\n var addOnContextRestoredListener = function ( listener ) {\r\n onRestored_.push( wrapEvent( listener ) );\r\n };\r\n\r\n\r\n function wrapAddEventListener( canvas ) {\r\n var f = canvas.addEventListener;\r\n canvas.addEventListener = function ( type, listener, bubble ) {\r\n switch ( type ) {\r\n case 'webglcontextlost':\r\n addOnContextLostListener( listener );\r\n break;\r\n case 'webglcontextrestored':\r\n addOnContextRestoredListener( listener );\r\n break;\r\n default:\r\n f.apply( canvas, arguments );\r\n }\r\n };\r\n }\r\n\r\n wrapAddEventListener( canvas );\r\n\r\n canvas.loseContext = function () {\r\n if ( !contextLost_ ) {\r\n contextLost_ = true;\r\n numCallsToLoseContext_ = 0;\r\n ++contextId_;\r\n while ( unwrappedContext_.getError() ) {}\r\n clearErrors();\r\n glErrorShadow_[ unwrappedContext_.CONTEXT_LOST_WEBGL ] = true;\r\n var event = makeWebGLContextEvent( \"context lost\" );\r\n var callbacks = onLost_.slice();\r\n setTimeout( function () {\r\n //Notify.log(\"numCallbacks:\" + callbacks.length);\r\n for ( var ii = 0; ii < callbacks.length; ++ii ) {\r\n //Notify.log(\"calling callback:\" + ii);\r\n callbacks[ ii ]( event );\r\n }\r\n if ( restoreTimeout_ >= 0 ) {\r\n setTimeout( function () {\r\n canvas.restoreContext();\r\n }, restoreTimeout_ );\r\n }\r\n }, 0 );\r\n }\r\n };\r\n\r\n canvas.restoreContext = function () {\r\n if ( contextLost_ ) {\r\n if ( onRestored_.length ) {\r\n setTimeout( function () {\r\n if ( !canRestore_ ) {\r\n throw \"can not restore. webglcontestlost listener did not call event.preventDefault\";\r\n }\r\n freeResources();\r\n resetToInitialState( unwrappedContext_ );\r\n contextLost_ = false;\r\n numCalls_ = 0;\r\n canRestore_ = false;\r\n var callbacks = onRestored_.slice();\r\n var event = makeWebGLContextEvent( \"context restored\" );\r\n for ( var ii = 0; ii < callbacks.length; ++ii ) {\r\n callbacks[ ii ]( event );\r\n }\r\n }, 0 );\r\n }\r\n }\r\n };\r\n\r\n canvas.loseContextInNCalls = function ( numCalls ) {\r\n if ( contextLost_ ) {\r\n throw \"You can not ask a lost contet to be lost\";\r\n }\r\n numCallsToLoseContext_ = numCalls_ + numCalls;\r\n };\r\n\r\n canvas.getNumCalls = function () {\r\n return numCalls_;\r\n };\r\n\r\n canvas.setRestoreTimeout = function ( timeout ) {\r\n restoreTimeout_ = timeout;\r\n };\r\n\r\n function isWebGLObject( obj ) {\r\n //return false;\r\n return ( obj instanceof WebGLBuffer ||\r\n obj instanceof WebGLFramebuffer ||\r\n obj instanceof WebGLProgram ||\r\n obj instanceof WebGLRenderbuffer ||\r\n obj instanceof WebGLShader ||\r\n obj instanceof WebGLTexture );\r\n }\r\n\r\n function checkResources( args ) {\r\n for ( var ii = 0; ii < args.length; ++ii ) {\r\n var arg = args[ ii ];\r\n if ( isWebGLObject( arg ) ) {\r\n return arg.__webglDebugContextLostId__ == contextId_;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n function clearErrors() {\r\n var k = Object.keys( glErrorShadow_ );\r\n for ( var ii = 0; ii < k.length; ++ii ) {\r\n delete glErrorShadow_[ k ];\r\n }\r\n }\r\n\r\n function loseContextIfTime() {\r\n ++numCalls_;\r\n if ( !contextLost_ ) {\r\n if ( numCallsToLoseContext_ == numCalls_ ) {\r\n canvas.loseContext();\r\n }\r\n }\r\n }\r\n\r\n // Makes a function that simulates WebGL when out of context.\r\n function makeLostContextFunctionWrapper( ctx, functionName ) {\r\n var f = ctx[ functionName ];\r\n return function () {\r\n // Notify.log(\"calling:\" + functionName);\r\n // Only call the functions if the context is not lost.\r\n loseContextIfTime();\r\n if ( !contextLost_ ) {\r\n //if (!checkResources(arguments)) {\r\n // glErrorShadow_[wrappedContext_.INVALID_OPERATION] = true;\r\n // return;\r\n //}\r\n var result = f.apply( ctx, arguments );\r\n return result;\r\n }\r\n };\r\n }\r\n\r\n function freeResources() {\r\n for ( var ii = 0; ii < resourceDb_.length; ++ii ) {\r\n var resource = resourceDb_[ ii ];\r\n if ( resource instanceof WebGLBuffer ) {\r\n unwrappedContext_.deleteBuffer( resource );\r\n } else if ( resource instanceof WebGLFramebuffer ) {\r\n unwrappedContext_.deleteFramebuffer( resource );\r\n } else if ( resource instanceof WebGLProgram ) {\r\n unwrappedContext_.deleteProgram( resource );\r\n } else if ( resource instanceof WebGLRenderbuffer ) {\r\n unwrappedContext_.deleteRenderbuffer( resource );\r\n } else if ( resource instanceof WebGLShader ) {\r\n unwrappedContext_.deleteShader( resource );\r\n } else if ( resource instanceof WebGLTexture ) {\r\n unwrappedContext_.deleteTexture( resource );\r\n }\r\n }\r\n }\r\n\r\n function makeWebGLContextEvent( statusMessage ) {\r\n return {\r\n statusMessage: statusMessage,\r\n preventDefault: function () {\r\n canRestore_ = true;\r\n }\r\n };\r\n }\r\n\r\n\r\n function makeLostContextSimulatingContext( ctx ) {\r\n // copy all functions and properties to wrapper\r\n for ( var propertyName in ctx ) {\r\n if ( typeof ctx[ propertyName ] == 'function' ) {\r\n wrappedContext_[ propertyName ] = makeLostContextFunctionWrapper(\r\n ctx, propertyName );\r\n } else {\r\n makePropertyWrapper( wrappedContext_, ctx, propertyName );\r\n }\r\n }\r\n\r\n // Wrap a few functions specially.\r\n wrappedContext_.getError = function () {\r\n loseContextIfTime();\r\n var err;\r\n if ( !contextLost_ ) {\r\n while ( err = unwrappedContext_.getError() ) {\r\n glErrorShadow_[ err ] = true;\r\n }\r\n }\r\n for ( err in glErrorShadow_ ) {\r\n if ( glErrorShadow_[ err ] ) {\r\n delete glErrorShadow_[ err ];\r\n return err;\r\n }\r\n }\r\n return wrappedContext_.NO_ERROR;\r\n };\r\n\r\n var creationFunctions = [\r\n \"createBuffer\",\r\n \"createFramebuffer\",\r\n \"createProgram\",\r\n \"createRenderbuffer\",\r\n \"createShader\",\r\n \"createTexture\"\r\n ];\r\n var functionName, ii;\r\n for ( ii = 0; ii < creationFunctions.length; ++ii ) {\r\n functionName = creationFunctions[ ii ];\r\n wrappedContext_[ functionName ] = function ( f ) {\r\n return function () {\r\n loseContextIfTime();\r\n if ( contextLost_ ) {\r\n return null;\r\n }\r\n var obj = f.apply( ctx, arguments );\r\n obj.__webglDebugContextLostId__ = contextId_;\r\n resourceDb_.push( obj );\r\n return obj;\r\n };\r\n }( ctx[ functionName ] );\r\n }\r\n\r\n var functionsThatShouldReturnNull = [\r\n \"getActiveAttrib\",\r\n \"getActiveUniform\",\r\n \"getBufferParameter\",\r\n \"getContextAttributes\",\r\n \"getAttachedShaders\",\r\n \"getFramebufferAttachmentParameter\",\r\n \"getParameter\",\r\n \"getProgramParameter\",\r\n \"getProgramInfoLog\",\r\n \"getRenderbufferParameter\",\r\n \"getShaderParameter\",\r\n \"getShaderInfoLog\",\r\n \"getShaderSource\",\r\n \"getTexParameter\",\r\n \"getUniform\",\r\n \"getUniformLocation\",\r\n \"getVertexAttrib\"\r\n ];\r\n for ( ii = 0; ii < functionsThatShouldReturnNull.length; ++ii ) {\r\n functionName = functionsThatShouldReturnNull[ ii ];\r\n wrappedContext_[ functionName ] = function ( f ) {\r\n return function () {\r\n loseContextIfTime();\r\n if ( contextLost_ ) {\r\n return null;\r\n }\r\n return f.apply( ctx, arguments );\r\n };\r\n }( wrappedContext_[ functionName ] );\r\n }\r\n\r\n var isFunctions = [\r\n \"isBuffer\",\r\n \"isEnabled\",\r\n \"isFramebuffer\",\r\n \"isProgram\",\r\n \"isRenderbuffer\",\r\n \"isShader\",\r\n \"isTexture\"\r\n ];\r\n for ( ii = 0; ii < isFunctions.length; ++ii ) {\r\n functionName = isFunctions[ ii ];\r\n wrappedContext_[ functionName ] = function ( f ) {\r\n return function () {\r\n loseContextIfTime();\r\n if ( contextLost_ ) {\r\n return false;\r\n }\r\n return f.apply( ctx, arguments );\r\n };\r\n }( wrappedContext_[ functionName ] );\r\n }\r\n\r\n wrappedContext_.checkFramebufferStatus = function ( f ) {\r\n return function () {\r\n loseContextIfTime();\r\n if ( contextLost_ ) {\r\n return wrappedContext_.FRAMEBUFFER_UNSUPPORTED;\r\n }\r\n return f.apply( ctx, arguments );\r\n };\r\n }( wrappedContext_.checkFramebufferStatus );\r\n\r\n wrappedContext_.getAttribLocation = function ( f ) {\r\n return function () {\r\n loseContextIfTime();\r\n if ( contextLost_ ) {\r\n return -1;\r\n }\r\n return f.apply( ctx, arguments );\r\n };\r\n }( wrappedContext_.getAttribLocation );\r\n\r\n wrappedContext_.getVertexAttribOffset = function ( f ) {\r\n return function () {\r\n loseContextIfTime();\r\n if ( contextLost_ ) {\r\n return 0;\r\n }\r\n return f.apply( ctx, arguments );\r\n };\r\n }( wrappedContext_.getVertexAttribOffset );\r\n\r\n wrappedContext_.isContextLost = function () {\r\n return contextLost_;\r\n };\r\n\r\n return wrappedContext_;\r\n }\r\n\r\n // TODO: find why this is there ?\r\n return canvas;\r\n }\r\n\r\n return {\r\n /**\r\n * Initializes this module. Safe to call more than once.\r\n * @param {!WebGLRenderingContext} ctx A WebGL context. If\r\n }\r\n * you have more than one context it doesn't matter which one\r\n * you pass in, it is only used to pull out constants.\r\n */\r\n 'init': init,\r\n\r\n /**\r\n * Returns true or false if value matches any WebGL enum\r\n * @param {*} value Value to check if it might be an enum.\r\n * @return {boolean} True if value matches one of the WebGL defined enums\r\n */\r\n 'mightBeEnum': mightBeEnum,\r\n\r\n /**\r\n * Gets an string version of an WebGL enum.\r\n *\r\n * Example:\r\n * WebGLDebugUtil.init(ctx);\r\n * var str = WebGLDebugUtil.glEnumToString(ctx.getError());\r\n *\r\n * @param {number} value Value to return an enum for\r\n * @return {string} The string version of the enum.\r\n */\r\n 'glEnumToString': glEnumToString,\r\n\r\n /**\r\n * Converts the argument of a WebGL function to a string.\r\n * Attempts to convert enum arguments to strings.\r\n *\r\n * Example:\r\n * WebGLDebugUtil.init(ctx);\r\n * var str = WebGLDebugUtil.glFunctionArgToString('bindTexture', 0, gl.TEXTURE_2D);\r\n *\r\n * would return 'TEXTURE_2D'\r\n *\r\n * @param {string} functionName the name of the WebGL function.\r\n * @param {number} argumentIndx the index of the argument.\r\n * @param {*} value The value of the argument.\r\n * @return {string} The value as a string.\r\n */\r\n 'glFunctionArgToString': glFunctionArgToString,\r\n\r\n /**\r\n * Given a WebGL context returns a wrapped context that calls\r\n * gl.getError after every command and calls a function if the\r\n * result is not NO_ERROR.\r\n *\r\n * You can supply your own function if you want. For example, if you'd like\r\n * an exception thrown on any GL error you could do this\r\n *\r\n * function throwOnGLError(err, funcName, args) {\r\n * throw WebGLDebugUtils.glEnumToString(err) + \" was caused by call to\" +\r\n * funcName;\r\n * };\r\n *\r\n * ctx = WebGLDebugUtils.makeDebugContext(\r\n * canvas.getContext(\"webgl\"), throwOnGLError);\r\n *\r\n * @param {!WebGLRenderingContext} ctx The webgl context to wrap.\r\n * @param {!function(err, funcName, args): void} opt_onErrorFunc The function\r\n * to call when gl.getError returns an error. If not specified the default\r\n * function calls Notify.log with a message.\r\n */\r\n 'makeDebugContext': makeDebugContext,\r\n\r\n /**\r\n * Given a canvas element returns a wrapped canvas element that will\r\n * simulate lost context. The canvas returned adds the following functions.\r\n *\r\n * loseContext:\r\n * simulates a lost context event.\r\n *\r\n * restoreContext:\r\n * simulates the context being restored.\r\n *\r\n * lostContextInNCalls:\r\n * loses the context after N gl calls.\r\n *\r\n * getNumCalls:\r\n * tells you how many gl calls there have been so far.\r\n *\r\n * setRestoreTimeout:\r\n * sets the number of milliseconds until the context is restored\r\n * after it has been lost. Defaults to 0. Pass -1 to prevent\r\n * automatic restoring.\r\n *\r\n * @param {!Canvas} canvas The canvas element to wrap.\r\n */\r\n 'makeLostContextSimulatingCanvas': makeLostContextSimulatingCanvas,\r\n\r\n /**\r\n * Resets a context to the initial state.\r\n * @param {!WebGLRenderingContext} ctx The webgl context to\r\n * reset.\r\n */\r\n 'resetToInitialState': resetToInitialState\r\n };\r\n\r\n }();\r\n\r\n return WebGLDebugUtils;\r\n} );\r\n\r\n/* jshint ignore:end */\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgViewer/webgl-debug.js\n ** module id = 241\n ** module chunks = 0 1\n **/","define( [\r\n 'osgShader/node/functions.glsl',\r\n 'osgShader/node/lights.glsl',\r\n 'osgShader/node/textures.glsl',\r\n 'osgShader/node/colorEncode.glsl'\r\n], function ( functions, lights, textures, colorEncode ) {\r\n 'use strict';\r\n\r\n return {\r\n 'functions.glsl': functions,\r\n 'lights.glsl': lights,\r\n 'textures.glsl': textures,\r\n 'colorEncode.glsl': colorEncode\r\n };\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShader/shaderLib.js\n ** module id = 242\n ** module chunks = 0 1\n **/","define( [\r\n 'osgShadow/shaders/shadowsCastVert.glsl',\r\n 'osgShadow/shaders/shadowsCastFrag.glsl',\r\n 'osgShadow/shaders/shadowsReceive.glsl',\r\n 'osgShadow/shaders/shadowsReceiveMain.glsl',\r\n 'osgShadow/shaders/shadowLinearSoft.glsl',\r\n 'osgShadow/shaders/pcf.glsl',\r\n 'osgShadow/shaders/bandPCF.glsl',\r\n 'osgShadow/shaders/tapPCF.glsl',\r\n 'osgShadow/shaders/hash.glsl',\r\n 'osgShadow/shaders/arrayPoisson.glsl',\r\n 'osgShadow/shaders/poissonPCF.glsl',\r\n 'osgShadow/shaders/esm.glsl',\r\n 'osgShadow/shaders/vsm.glsl',\r\n 'osgShadow/shaders/evsm.glsl'\r\n], function ( shadowsCastVert, shadowsCastFrag, shadowsReceive, shadowsReceiveMain, shadowLinearSoft, pcf, bandPCF, tapPCF, hash, arrayPoisson, poissonPCF, esm, vsm, evsm ) {\r\n 'use strict';\r\n\r\n return {\r\n 'shadowsCastVert.glsl': shadowsCastVert,\r\n 'shadowsCastFrag.glsl': shadowsCastFrag,\r\n 'shadowsReceive.glsl': shadowsReceive,\r\n 'shadowsReceiveMain.glsl': shadowsReceiveMain,\r\n 'shadowLinearSoft.glsl': shadowLinearSoft,\r\n 'pcf.glsl': pcf,\r\n 'bandPCF.glsl': bandPCF,\r\n 'tapPCF.glsl': tapPCF,\r\n 'hash.glsl': hash,\r\n 'arrayPoisson.glsl': arrayPoisson,\r\n 'poissonPCF.glsl': poissonPCF,\r\n 'esm.glsl': esm,\r\n 'vsm.glsl': vsm,\r\n 'evsm.glsl': evsm\r\n };\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShadow/shaderLib.js\n ** module id = 243\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osgShader/utils',\r\n 'osgShader/node/Node'\r\n\r\n], function ( MACROUTILS, utils, Node ) {\r\n 'use strict';\r\n\r\n var sprintf = utils.sprintf;\r\n\r\n var Variable = function ( type, prefix ) {\r\n Node.apply( this );\r\n this._name = 'Variable';\r\n this._prefix = prefix;\r\n this._type = type;\r\n this._value = undefined;\r\n };\r\n\r\n Variable.prototype = MACROUTILS.objectInherit( Node.prototype, {\r\n\r\n getType: function () {\r\n return this._type;\r\n },\r\n\r\n getVariable: function () {\r\n return this._prefix;\r\n },\r\n\r\n setValue: function ( value ) {\r\n this._value = value;\r\n return this;\r\n },\r\n\r\n declare: function () {\r\n if ( this._value !== undefined ) {\r\n return sprintf( '%s %s = %s;', [ this._type, this.getVariable(), this._value ] );\r\n } else {\r\n return sprintf( '%s %s;', [ this._type, this.getVariable() ] );\r\n }\r\n }\r\n } );\r\n\r\n var Uniform = function ( type, prefix ) {\r\n Variable.call( this, type, prefix );\r\n };\r\n\r\n Uniform.prototype = MACROUTILS.objectInherit( Variable.prototype, {\r\n\r\n declare: function () {\r\n return undefined;\r\n },\r\n\r\n globalDeclaration: function () {\r\n return sprintf( 'uniform %s %s;', [ this._type, this.getVariable() ] );\r\n }\r\n\r\n } );\r\n\r\n\r\n\r\n var Varying = function ( type, prefix ) {\r\n Variable.call( this, type, prefix );\r\n };\r\n\r\n Varying.prototype = MACROUTILS.objectInherit( Variable.prototype, {\r\n\r\n declare: function () {\r\n return undefined;\r\n },\r\n\r\n globalDeclaration: function () {\r\n return sprintf( 'varying %s %s;', [ this._type, this.getVariable() ] );\r\n }\r\n\r\n } );\r\n\r\n\r\n\r\n\r\n var Sampler = function ( type, prefix ) {\r\n Variable.call( this, type, prefix );\r\n };\r\n\r\n Sampler.prototype = MACROUTILS.objectInherit( Variable.prototype, {\r\n\r\n declare: function () {\r\n return undefined;\r\n },\r\n\r\n globalDeclaration: function () {\r\n return sprintf( 'uniform %s %s;', [ this._type, this.getVariable() ] );\r\n }\r\n\r\n } );\r\n\r\n\r\n var FragColor = function () {\r\n Variable.call( this, 'vec4', 'gl_FragColor' );\r\n };\r\n FragColor.prototype = MACROUTILS.objectInherit( Variable.prototype, {\r\n\r\n outputs: function () { /* do nothing for variable */\r\n return this;\r\n },\r\n getVariable: function () {\r\n return this._prefix;\r\n }\r\n } );\r\n\r\n\r\n\r\n return {\r\n FragColor: FragColor,\r\n Sampler: Sampler,\r\n Variable: Variable,\r\n Varying: Varying,\r\n Uniform: Uniform\r\n };\r\n\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShader/node/data.js\n ** module id = 244\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osgShader/utils',\r\n 'osgShader/node/Node'\r\n\r\n], function ( MACROUTILS, utils, Node ) {\r\n 'use strict';\r\n\r\n var NodeTextures = function () {\r\n Node.apply( this );\r\n };\r\n\r\n NodeTextures.prototype = MACROUTILS.objectInherit( Node.prototype, {\r\n\r\n type: 'TextureAbstractNode',\r\n\r\n // functionName is here to simplify all texture base functions\r\n // it's possible later it will have to move into another class\r\n // if base class needs to be more generic. But right now it simplify\r\n // all simple class to fetch texture ( seed above )\r\n functionName: 'noTextureFunction',\r\n\r\n validInputs: [ 'sampler', 'uv' ],\r\n validOutputs: [ 'color' ],\r\n\r\n computeFragment: function () {\r\n\r\n return utils.callFunction( this.functionName,\r\n this._outputs.color, [\r\n this._inputs.sampler,\r\n this._inputs.uv.getVariable() + '.xy'\r\n ] );\r\n },\r\n\r\n globalFunctionDeclaration: function () {\r\n return '#pragma include \"textures.glsl\"';\r\n }\r\n\r\n } );\r\n\r\n\r\n\r\n var TextureRGB = function () {\r\n NodeTextures.apply( this );\r\n };\r\n\r\n TextureRGB.prototype = MACROUTILS.objectInherit( NodeTextures.prototype, {\r\n\r\n type: 'TextureRGB',\r\n functionName: 'textureRGB'\r\n\r\n } );\r\n\r\n\r\n\r\n var TextureRGBA = function () {\r\n TextureRGB.apply( this );\r\n };\r\n\r\n TextureRGBA.prototype = MACROUTILS.objectInherit( TextureRGB.prototype, {\r\n\r\n type: 'TextureRGBA',\r\n functionName: 'textureRGBA'\r\n\r\n } );\r\n\r\n\r\n var TextureAlpha = function () {\r\n TextureRGB.apply( this );\r\n };\r\n\r\n TextureAlpha.prototype = MACROUTILS.objectInherit( TextureRGB.prototype, {\r\n\r\n type: 'TextureAlpha',\r\n functionName: 'textureAlpha'\r\n\r\n } );\r\n\r\n\r\n\r\n var TextureIntensity = function () {\r\n TextureRGB.apply( this );\r\n };\r\n\r\n TextureIntensity.prototype = MACROUTILS.objectInherit( TextureRGB.prototype, {\r\n\r\n type: 'TextureIntensity',\r\n functionName: 'textureIntensity'\r\n\r\n } );\r\n\r\n return {\r\n NodeTextures: NodeTextures,\r\n TextureRGB: TextureRGB,\r\n TextureRGBA: TextureRGBA,\r\n TextureAlpha: TextureAlpha,\r\n TextureIntensity: TextureIntensity\r\n };\r\n\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShader/node/textures.js\n ** module id = 245\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osgShader/utils',\r\n 'osgShader/node/Node'\r\n\r\n], function ( MACROUTILS, utils, Node ) {\r\n 'use strict';\r\n\r\n var sprintf = utils.sprintf;\r\n\r\n // base to avoid redundant global declarations\r\n // it's to keep node more readable\r\n var NodeFunctions = function () {\r\n Node.apply( this );\r\n };\r\n\r\n NodeFunctions.prototype = MACROUTILS.objectInherit( Node.prototype, {\r\n\r\n globalFunctionDeclaration: function () {\r\n return '#pragma include \"functions.glsl\"';\r\n }\r\n\r\n } );\r\n\r\n\r\n var NormalizeNormalAndEyeVector = function () {\r\n NodeFunctions.apply( this );\r\n };\r\n\r\n NormalizeNormalAndEyeVector.prototype = MACROUTILS.objectInherit( NodeFunctions.prototype, {\r\n\r\n type: 'NormalizeNormalAndEyeVector',\r\n\r\n validInputs: [\r\n 'normal',\r\n 'position'\r\n ],\r\n validOuputs: [\r\n 'normal',\r\n 'eyeVector'\r\n ],\r\n\r\n computeFragment: function () {\r\n return utils.callFunction( 'normalizeNormalAndEyeVector', undefined, [\r\n this._inputs.normal,\r\n this._inputs.position,\r\n this._outputs.normal,\r\n this._outputs.eyeVector\r\n ] );\r\n }\r\n } );\r\n\r\n\r\n var sRGBToLinear = function () {\r\n NodeFunctions.apply( this );\r\n };\r\n\r\n sRGBToLinear.prototype = MACROUTILS.objectInherit( NodeFunctions.prototype, {\r\n\r\n type: 'sRGBToLinear',\r\n\r\n validInputs: [ 'color' /*, 'gamma'*/ ],\r\n validOuputs: [ 'color' ],\r\n\r\n computeFragment: function () {\r\n return this.computeConversion( 'sRGBToLinear' );\r\n },\r\n computeConversion: function ( funcName ) {\r\n var gamma = this._inputs.gamma ? this._inputs.gamma : 'DefaultGamma';\r\n var out = this._outputs.color;\r\n var color = this._inputs.color;\r\n var rgb = out.getType() !== color.getType() ? '.rgb' : '';\r\n\r\n return utils.callFunction( funcName, out.getVariable() + rgb, [ color.getVariable() + rgb, gamma ] );\r\n }\r\n\r\n } );\r\n\r\n var LinearTosRGB = function () {\r\n sRGBToLinear.apply( this );\r\n };\r\n\r\n LinearTosRGB.prototype = MACROUTILS.objectInherit( sRGBToLinear.prototype, {\r\n type: 'LinearTosRGB',\r\n computeFragment: function () {\r\n return this.computeConversion( 'linearTosRGB' );\r\n }\r\n } );\r\n\r\n var FrontNormal = function () {\r\n NodeFunctions.apply( this );\r\n };\r\n\r\n FrontNormal.prototype = MACROUTILS.objectInherit( NodeFunctions.prototype, {\r\n\r\n type: 'FrontNormal',\r\n validInputs: [ 'normal' ],\r\n validOuputs: [ 'normal' ],\r\n\r\n computeFragment: function () {\r\n return sprintf( '%s = gl_FrontFacing ? %s : -%s ;', [\r\n this._outputs.normal.getVariable(),\r\n this._inputs.normal.getVariable(),\r\n this._inputs.normal.getVariable()\r\n ] );\r\n }\r\n } );\r\n\r\n\r\n return {\r\n NodeFunctions: NodeFunctions,\r\n NormalizeNormalAndEyeVector: NormalizeNormalAndEyeVector,\r\n sRGBToLinear: sRGBToLinear,\r\n LinearTosRGB: LinearTosRGB,\r\n FrontNormal: FrontNormal\r\n };\r\n\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShader/node/functions.js\n ** module id = 246\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osgShader/utils',\r\n 'osgShader/node/Node'\r\n\r\n], function ( MACROUTILS, shaderUtils, Node ) {\r\n 'use strict';\r\n\r\n // base class for all point based light: Point/Directional/Spot/Hemi\r\n // avoid duplicate code\r\n var NodeLights = function () {\r\n Node.apply( this );\r\n };\r\n\r\n NodeLights.prototype = MACROUTILS.objectInherit( Node.prototype, {\r\n\r\n validOutputs: [ 'color' ],\r\n globalFunctionDeclaration: function () {\r\n return '#pragma include \"lights.glsl\"';\r\n }\r\n\r\n } );\r\n\r\n var getVec3 = function ( vec ) {\r\n return vec.getType() === 'vec4' ? vec.getVariable() + '.rgb' : vec;\r\n };\r\n\r\n var PointLight = function () {\r\n NodeLights.apply( this );\r\n };\r\n\r\n PointLight.prototype = MACROUTILS.objectInherit( NodeLights.prototype, {\r\n\r\n type: 'PointLight',\r\n\r\n validInputs: [\r\n 'normal',\r\n 'eyeVector',\r\n 'materialambient',\r\n 'materialdiffuse',\r\n 'materialspecular',\r\n 'materialshininess',\r\n\r\n 'lightambient',\r\n 'lightdiffuse',\r\n 'lightspecular',\r\n\r\n 'lightposition',\r\n 'lightattenuation',\r\n\r\n 'lightmatrix',\r\n\r\n 'lighted',\r\n 'lightEyePos',\r\n 'lightEyeDir',\r\n 'lightNDL'\r\n\r\n ],\r\n\r\n computeFragment: function () {\r\n\r\n return shaderUtils.callFunction(\r\n 'computePointLightShading',\r\n this._outputs.color, [ this._inputs.normal,\r\n this._inputs.eyeVector,\r\n\r\n getVec3( this._inputs.materialambient ),\r\n getVec3( this._inputs.materialdiffuse ),\r\n getVec3( this._inputs.materialspecular ),\r\n this._inputs.materialshininess,\r\n\r\n getVec3( this._inputs.lightambient ),\r\n getVec3( this._inputs.lightdiffuse ),\r\n getVec3( this._inputs.lightspecular ),\r\n\r\n this._inputs.lightposition,\r\n this._inputs.lightattenuation,\r\n\r\n this._inputs.lightmatrix,\r\n\r\n this._inputs.lightEyePos,\r\n this._inputs.lightEyeDir,\r\n this._inputs.lightNDL,\r\n this._inputs.lighted\r\n ] );\r\n }\r\n\r\n } );\r\n\r\n\r\n\r\n var SpotLight = function () {\r\n NodeLights.apply( this );\r\n };\r\n\r\n SpotLight.prototype = MACROUTILS.objectInherit( NodeLights.prototype, {\r\n\r\n type: 'SpotLight',\r\n\r\n validInputs: [\r\n 'normal',\r\n 'eyeVector',\r\n\r\n 'materialambient',\r\n 'materialdiffuse',\r\n 'materialspecular',\r\n 'materialshininess',\r\n\r\n 'lightambient',\r\n 'lightdiffuse',\r\n 'lightspecular',\r\n\r\n 'lightdirection',\r\n 'lightattenuation',\r\n 'lightposition',\r\n 'lightspotCutOff',\r\n 'lightspotBlend',\r\n\r\n 'lightmatrix',\r\n 'lightinvMatrix',\r\n\r\n 'lighted',\r\n 'lightEyePos',\r\n 'lightEyeDir',\r\n 'lightNDL'\r\n\r\n ],\r\n\r\n computeFragment: function () {\r\n\r\n return shaderUtils.callFunction(\r\n 'computeSpotLightShading',\r\n this._outputs.color, [ this._inputs.normal,\r\n this._inputs.eyeVector,\r\n\r\n getVec3( this._inputs.materialambient ),\r\n getVec3( this._inputs.materialdiffuse ),\r\n getVec3( this._inputs.materialspecular ),\r\n this._inputs.materialshininess,\r\n\r\n getVec3( this._inputs.lightambient ),\r\n getVec3( this._inputs.lightdiffuse ),\r\n getVec3( this._inputs.lightspecular ),\r\n\r\n this._inputs.lightdirection,\r\n this._inputs.lightattenuation,\r\n this._inputs.lightposition,\r\n this._inputs.lightspotCutOff,\r\n this._inputs.lightspotBlend,\r\n\r\n this._inputs.lightmatrix,\r\n this._inputs.lightinvMatrix,\r\n\r\n this._inputs.lightEyePos,\r\n this._inputs.lightEyeDir,\r\n this._inputs.lightNDL,\r\n this._inputs.lighted\r\n ] );\r\n }\r\n\r\n } );\r\n\r\n\r\n var SunLight = function () {\r\n NodeLights.apply( this );\r\n };\r\n\r\n SunLight.prototype = MACROUTILS.objectInherit( NodeLights.prototype, {\r\n\r\n type: 'SunLight',\r\n\r\n validInputs: [\r\n 'normal',\r\n 'eyeVector',\r\n 'materialambient',\r\n 'materialdiffuse',\r\n 'materialspecular',\r\n 'materialshininess',\r\n\r\n 'lightambient',\r\n 'lightdiffuse',\r\n 'lightspecular',\r\n\r\n 'lightposition',\r\n\r\n 'lightmatrix',\r\n\r\n 'lighted',\r\n 'lightEyeDir',\r\n 'lightNDL'\r\n\r\n ],\r\n\r\n computeFragment: function () {\r\n\r\n return shaderUtils.callFunction(\r\n 'computeSunLightShading',\r\n this._outputs.color, [ this._inputs.normal,\r\n this._inputs.eyeVector,\r\n\r\n getVec3( this._inputs.materialambient ),\r\n getVec3( this._inputs.materialdiffuse ),\r\n getVec3( this._inputs.materialspecular ),\r\n this._inputs.materialshininess,\r\n\r\n getVec3( this._inputs.lightambient ),\r\n getVec3( this._inputs.lightdiffuse ),\r\n getVec3( this._inputs.lightspecular ),\r\n\r\n this._inputs.lightposition,\r\n\r\n this._inputs.lightmatrix,\r\n\r\n this._inputs.lightEyeDir,\r\n this._inputs.lightNDL,\r\n this._inputs.lighted\r\n ] );\r\n }\r\n } );\r\n\r\n var HemiLight = function () {\r\n NodeLights.apply( this );\r\n };\r\n\r\n HemiLight.prototype = MACROUTILS.objectInherit( NodeLights.prototype, {\r\n\r\n type: 'HemiLight',\r\n\r\n validInputs: [\r\n 'normal',\r\n 'eyeVector',\r\n 'materialdiffuse',\r\n 'materialspecular',\r\n 'materialshininess',\r\n\r\n 'lightdiffuse',\r\n 'lightground',\r\n\r\n 'lightposition',\r\n\r\n 'lightmatrix',\r\n\r\n 'lighted',\r\n 'lightEyeDir',\r\n 'lightNDL'\r\n ],\r\n\r\n computeFragment: function () {\r\n\r\n return shaderUtils.callFunction(\r\n 'computeHemiLightShading',\r\n this._outputs.color, [ this._inputs.normal,\r\n this._inputs.eyeVector,\r\n\r\n getVec3( this._inputs.materialdiffuse ),\r\n getVec3( this._inputs.materialspecular ),\r\n this._inputs.materialshininess,\r\n\r\n getVec3( this._inputs.lightdiffuse ),\r\n getVec3( this._inputs.lightground ),\r\n\r\n this._inputs.lightposition,\r\n\r\n this._inputs.lightmatrix,\r\n\r\n this._inputs.lightEyeDir,\r\n this._inputs.lightNDL,\r\n this._inputs.lighted\r\n ] );\r\n }\r\n } );\r\n\r\n return {\r\n PointLight: PointLight,\r\n SpotLight: SpotLight,\r\n SunLight: SunLight,\r\n HemiLight: HemiLight\r\n };\r\n\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShader/node/lights.js\n ** module id = 247\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Notify',\r\n 'osg/Utils',\r\n 'osgShader/node/Node',\r\n 'osgShader/utils'\r\n\r\n], function ( Notify, MACROUTILS, Node, utils ) {\r\n 'use strict';\r\n\r\n var sprintf = utils.sprintf;\r\n\r\n // base operator contains helper for the constructor\r\n // it helps to do that:\r\n // arg0 = output\r\n // arg1 = input0 or [ inputs ]\r\n // arg2 = input1\r\n // ...\r\n var BaseOperator = function () {\r\n Node.apply( this );\r\n };\r\n\r\n BaseOperator.prototype = Node.prototype;\r\n\r\n\r\n // Add support this syntax:\r\n // new Add( output, input0, input1, ... )\r\n // new Add( output, [ inputs ] )\r\n var Add = function () {\r\n BaseOperator.apply( this );\r\n };\r\n\r\n Add.prototype = MACROUTILS.objectInherit( BaseOperator.prototype, {\r\n\r\n type: 'Add',\r\n\r\n operator: '+',\r\n\r\n computeFragment: function () {\r\n // force inputs type to be all the same from the output\r\n var outputType = this._outputs.getType();\r\n var addType = '';\r\n if ( outputType === 'vec4' )\r\n addType = '.rgba';\r\n else if ( outputType === 'vec3' )\r\n addType = '.rgb';\r\n else if ( outputType === 'vec2' )\r\n addType = '.rg';\r\n\r\n var str = this._outputs.getVariable() + ' = ' + this._inputs[ 0 ].getVariable() + addType;\r\n for ( var i = 1, l = this._inputs.length; i < l; i++ ) {\r\n var input = this._inputs[ i ];\r\n str += this.operator + input.getVariable();\r\n if ( input.getType() !== 'float' )\r\n str += addType;\r\n }\r\n str += ';';\r\n return str;\r\n }\r\n } );\r\n\r\n // Mult works like Add\r\n var Mult = function () {\r\n Add.apply( this );\r\n };\r\n\r\n Mult.prototype = MACROUTILS.objectInherit( Add.prototype, {\r\n type: 'Mult',\r\n operator: '*'\r\n } );\r\n\r\n\r\n\r\n var InlineCode = function () {\r\n Node.apply( this );\r\n };\r\n\r\n InlineCode.prototype = MACROUTILS.objectInherit( Node.prototype, {\r\n type: 'InlineCode',\r\n code: function ( txt ) {\r\n this._text = txt;\r\n return this;\r\n },\r\n computeFragment: function () {\r\n\r\n // merge inputs and outputs dict to search in both\r\n var replaceVariables = MACROUTILS.objectMix( {}, this._inputs );\r\n replaceVariables = MACROUTILS.objectMix( replaceVariables, this._outputs );\r\n\r\n // find all %string\r\n var r = new RegExp( '%[A-Za-z0-9_]+', 'gm' );\r\n var text = this._text;\r\n var result = this._text.match( r );\r\n\r\n var done = new Set(); // keep trace of replaced string\r\n\r\n for ( var i = 0; i < result.length; i++ ) {\r\n\r\n var str = result[ i ].substr( 1 );\r\n if ( !done.has( str ) ) {\r\n if ( !replaceVariables[ str ] ) {\r\n Notify.error( 'error with inline code\\n' + this._text );\r\n Notify.error( 'input ' + str + ' not provided for ' + result[ i ] );\r\n }\r\n var reg = new RegExp( result[ i ].toString(), 'gm' );\r\n text = text.replace( reg, replaceVariables[ str ].getVariable() );\r\n done.add( str );\r\n }\r\n }\r\n\r\n return text;\r\n }\r\n } );\r\n\r\n\r\n // output = vec4( color.rgb, alpha )\r\n var SetAlpha = function () {\r\n BaseOperator.apply( this );\r\n };\r\n\r\n SetAlpha.prototype = MACROUTILS.objectInherit( BaseOperator.prototype, {\r\n type: 'SetAlpha',\r\n validInputs: [ 'color', 'alpha' ],\r\n validOuputs: [ 'color' ],\r\n computeFragment: function () {\r\n return sprintf( '%s = vec4( %s.rgb, %s );', [\r\n this._outputs.color.getVariable(),\r\n this._inputs.color.getVariable(),\r\n this._inputs.alpha.getVariable()\r\n ] );\r\n }\r\n } );\r\n\r\n\r\n\r\n // alpha is optional, if not provided the following operation is generated:\r\n // output.rgb = color.rgb * color.a;\r\n var PreMultAlpha = function () {\r\n BaseOperator.apply( this );\r\n };\r\n\r\n // TODO put the code in glsl\r\n PreMultAlpha.prototype = MACROUTILS.objectInherit( BaseOperator.prototype, {\r\n\r\n type: 'PreMultAlpha',\r\n validInputs: [ 'color' /*,'alpha'*/ ],\r\n validOuputs: [ 'color' ],\r\n\r\n computeFragment: function () {\r\n var variable = this._inputs.alpha !== undefined ? this._inputs.alpha : this._inputs.color;\r\n\r\n var srcAlpha;\r\n if ( variable.getType() !== 'float' )\r\n srcAlpha = variable.getVariable() + '.a';\r\n else\r\n srcAlpha = variable.getVariable();\r\n\r\n return sprintf( '%s.rgb = %s.rgb * %s;', [\r\n this._outputs.color.getVariable(),\r\n this._inputs.color.getVariable(),\r\n srcAlpha\r\n ] );\r\n }\r\n } );\r\n\r\n return {\r\n BaseOperator: BaseOperator,\r\n Mult: Mult,\r\n Add: Add,\r\n InlineCode: InlineCode,\r\n SetAlpha: SetAlpha,\r\n PreMultAlpha: PreMultAlpha\r\n };\r\n\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShader/node/operations.js\n ** module id = 248\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Utils',\r\n 'osg/Texture',\r\n 'osgShader/utils',\r\n 'osgShader/node/Node'\r\n], function ( MACROUTILS, Texture, ShaderUtils, Node ) {\r\n 'use strict';\r\n\r\n var ShadowNode = function () {\r\n Node.apply( this );\r\n\r\n };\r\n\r\n ShadowNode.prototype = MACROUTILS.objectInherit( Node.prototype, {\r\n type: 'Shadow',\r\n validOutputs: [ 'float' ],\r\n\r\n globalFunctionDeclaration: function () {\r\n return '#pragma include \"shadowsReceive.glsl\"';\r\n },\r\n\r\n setShadowAttribute: function ( shadowAttr ) {\r\n this._shadow = shadowAttr;\r\n },\r\n\r\n // must return an array of defines\r\n // because it will be passed to the ShaderGenerator\r\n getDefines: function () {\r\n return this._shadow.getDefines();\r\n },\r\n getExtensions: function () {\r\n return this._shadow.getExtensions();\r\n },\r\n computeFragment: function () {\r\n\r\n\r\n // common inputs\r\n var inputs = [\r\n this._inputs.lighted,\r\n this._inputs.shadowVertexProjected,\r\n this._inputs.shadowTexture,\r\n this._inputs.shadowTextureMapSize,\r\n this._inputs.shadowTextureDepthRange,\r\n this._inputs.lightEyePos,\r\n this._inputs.lightNDL,\r\n\r\n this._inputs.normal,\r\n this._inputs.shadowbias\r\n ];\r\n\r\n\r\n var algo = this._shadow.getAlgorithm();\r\n if ( algo === 'ESM' ) {\r\n inputs.push( this._inputs.shadowexponent0 );\r\n inputs.push( this._inputs.shadowexponent1 );\r\n } else if ( algo === 'EVSM' ) {\r\n inputs.push( this._inputs.shadowepsilonVSM );\r\n inputs.push( this._inputs.shadowexponent0 );\r\n inputs.push( this._inputs.shadowexponent1 );\r\n } else if ( algo === 'VSM' ) {\r\n inputs.push( this._inputs.shadowepsilonVSM );\r\n }\r\n\r\n return ShaderUtils.callFunction(\r\n 'computeShadow',\r\n this._outputs.float,\r\n inputs );\r\n }\r\n\r\n\r\n } );\r\n\r\n return {\r\n Shadow: ShadowNode\r\n };\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShader/node/shadows.js\n ** module id = 249\n ** module chunks = 0 1\n **/","/**\r\n * @author Jordi Torres\r\n */\r\n\r\ndefine( [\r\n 'q',\r\n 'osg/Utils',\r\n 'osg/NodeVisitor',\r\n 'osg/PagedLOD',\r\n 'osg/Timer'\r\n], function ( Q, MACROUTILS, NodeVisitor, PagedLOD, Timer ) {\r\n\r\n 'use strict';\r\n /**\r\n * Database paging class which manages the loading of files\r\n * and synchronizing of loaded models with the main scene graph.\r\n * @class DatabasePager\r\n */\r\n var DatabasePager = function () {\r\n this._pendingRequests = [];\r\n this._pendingNodes = [];\r\n this._loading = false;\r\n this._progressCallback = undefined;\r\n this._lastCB = true;\r\n this._activePagedLODList = new Set();\r\n this._childrenToRemoveList = new Set();\r\n this._downloadingRequestsNumber = 0;\r\n this._maxRequestsPerFrame = 10;\r\n // In OSG the targetMaximumNumberOfPagedLOD is 300 by default\r\n // here we set 75 as we need to be more strict with memory in a browser\r\n // This value can be setted using setTargetMaximumNumberOfPageLOD method.\r\n this._targetMaximumNumberOfPagedLOD = 75;\r\n };\r\n\r\n var DatabaseRequest = function () {\r\n this._loadedModel = undefined;\r\n this._group = undefined;\r\n this._url = undefined;\r\n this._function = undefined;\r\n this._timeStamp = 0.0;\r\n this._groupExpired = false;\r\n this._priority = 0.0;\r\n };\r\n\r\n var FindPagedLODsVisitor = function ( pagedLODList, frameNumber ) {\r\n NodeVisitor.call( this, NodeVisitor.TRAVERSE_ALL_CHILDREN );\r\n this._activePagedLODList = pagedLODList;\r\n this._frameNumber = frameNumber;\r\n };\r\n FindPagedLODsVisitor.prototype = MACROUTILS.objectInherit( NodeVisitor.prototype, {\r\n apply: function ( node ) {\r\n if ( node.getTypeID() === PagedLOD.getTypeID() ) {\r\n node.setFrameNumberOfLastTraversal( this._frameNumber );\r\n this._activePagedLODList.add( node );\r\n }\r\n this.traverse( node );\r\n }\r\n } );\r\n\r\n var ReleaseVisitor = function () {\r\n NodeVisitor.call( this, NodeVisitor.TRAVERSE_ALL_CHILDREN );\r\n };\r\n ReleaseVisitor.prototype = MACROUTILS.objectInherit( NodeVisitor.prototype, {\r\n apply: function ( node ) {\r\n // mark GLResources in nodes to be released\r\n node.releaseGLObjects();\r\n this.traverse( node );\r\n }\r\n } );\r\n\r\n var ExpirePagedLODVisitor = function () {\r\n NodeVisitor.call( this, NodeVisitor.TRAVERSE_ALL_CHILDREN );\r\n this._childrenList = [];\r\n };\r\n\r\n ExpirePagedLODVisitor.prototype = MACROUTILS.objectInherit( NodeVisitor.prototype, {\r\n\r\n apply: function ( node ) {\r\n if ( node.getTypeID() === PagedLOD.getTypeID() ) {\r\n this._childrenList.push( node );\r\n this._markRequestsExpired( node );\r\n }\r\n this.traverse( node );\r\n },\r\n\r\n removeExpiredChildrenAndFindPagedLODs: function ( plod, expiryTime, expiryFrame, removedChildren ) {\r\n if ( !plod.children.length ) return false;\r\n\r\n var sizeBefore = removedChildren.length;\r\n plod.removeExpiredChildren( expiryTime, expiryFrame, removedChildren );\r\n for ( var i = sizeBefore; i < removedChildren.length; i++ ) {\r\n removedChildren[ i ].accept( this );\r\n }\r\n return sizeBefore !== removedChildren.length;\r\n },\r\n\r\n _markRequestsExpired: function ( plod ) {\r\n var numRanges = plod._perRangeDataList.length;\r\n var request;\r\n for ( var i = 0; i < numRanges; i++ ) {\r\n request = plod.getDatabaseRequest( i );\r\n if ( request !== undefined ) {\r\n request._groupExpired = true;\r\n request._loadedModel = null;\r\n }\r\n }\r\n }\r\n } );\r\n\r\n DatabasePager.prototype = MACROUTILS.objectLibraryClass( {\r\n\r\n setTargetMaximumNumberOfPageLOD: function ( target ) {\r\n this._targetMaximumNumberOfPagedLOD = target;\r\n },\r\n\r\n getTargetMaximumNumberOfPageLOD: function () {\r\n return this._targetMaximumNumberOfPagedLOD;\r\n },\r\n\r\n reset: function () {\r\n this._pendingRequests = [];\r\n this._pendingNodes = [];\r\n this._loading = false;\r\n this._lastCB = true;\r\n this._activePagedLODList.clear();\r\n this._childrenToRemoveList.clear();\r\n this._downloadingRequestsNumber = 0;\r\n this._maxRequestsPerFrame = 10;\r\n this._targetMaximumNumberOfPagedLOD = 75;\r\n },\r\n\r\n updateSceneGraph: function ( frameStamp ) {\r\n // Progress callback\r\n if ( this._progressCallback !== undefined ) {\r\n // Maybe we should encapsulate this in a promise.\r\n this.executeProgressCallback();\r\n }\r\n // We need to control the time spent in DatabasePager tasks to\r\n // avoid making the rendering slow.\r\n // Probably we can have a time parameter to manage all the tasks.\r\n // Now it is fixed to 0.0025 ms to remove expired childs\r\n // and 0.005 ms to add to the scene the loaded requests.\r\n\r\n // Remove expired nodes\r\n this.removeExpiredSubgraphs( frameStamp, 0.0025 );\r\n // Time to do the requests.\r\n if ( !this._loading ) this.takeRequests();\r\n // Add the loaded data to the graph\r\n this.addLoadedDataToSceneGraph( frameStamp, 0.005 );\r\n },\r\n\r\n executeProgressCallback: function () {\r\n if ( this._pendingRequests.length > 0 || this._pendingNodes.length > 0 ) {\r\n this._progressCallback( this._pendingRequests.length + this._downloadingRequestsNumber, this._pendingNodes.length );\r\n this._lastCB = false;\r\n } else {\r\n if ( !this._lastCB ) {\r\n this._progressCallback( this._pendingRequests.length + this._downloadingRequestsNumber, this._pendingNodes.length );\r\n this._lastCB = true;\r\n }\r\n }\r\n },\r\n\r\n setMaxRequestsPerFrame: function ( numRequests ) {\r\n this._maxRequestsPerFrame = numRequests;\r\n },\r\n\r\n getMaxRequestsPerFrame: function () {\r\n return this._maxRequestsPerFrame;\r\n },\r\n\r\n getRequestListSize: function () {\r\n return this._pendingRequests.length + this._downloadingRequestsNumber;\r\n },\r\n\r\n setProgressCallback: function ( cb ) {\r\n this._progressCallback = cb;\r\n },\r\n\r\n addLoadedDataToSceneGraph: function ( frameStamp, availableTime ) {\r\n\r\n if ( availableTime <= 0.0 ) return 0.0;\r\n\r\n // Prune the list of database requests.\r\n var elapsedTime = 0.0;\r\n var beginTime = Timer.instance().tick();\r\n this._pendingNodes.sort( function ( r1, r2 ) {\r\n return r2._timeStamp - r1._timeStamp;\r\n } );\r\n\r\n for ( var i = 0; i < this._pendingNodes.length; i++ ) {\r\n if ( elapsedTime > availableTime ) return 0.0;\r\n\r\n var request = this._pendingNodes.shift();\r\n var frameNumber = frameStamp.getFrameNumber();\r\n var timeStamp = frameStamp.getSimulationTime();\r\n\r\n // If the request is not expired, then add/register new childs\r\n if ( request._groupExpired === false ) {\r\n\r\n var plod = request._group;\r\n plod.setTimeStamp( plod.children.length, timeStamp );\r\n plod.setFrameNumber( plod.children.length, frameNumber );\r\n plod.addChildNode( request._loadedModel );\r\n\r\n // Register PagedLODs.\r\n if ( !this._activePagedLODList.has( plod ) ) {\r\n this.registerPagedLODs( plod, frameNumber );\r\n } else {\r\n this.registerPagedLODs( request._loadedModel, frameNumber );\r\n }\r\n\r\n } else {\r\n\r\n // Clean the request\r\n request._loadedModel = undefined;\r\n request = undefined;\r\n\r\n }\r\n elapsedTime = Timer.instance().deltaS( beginTime, Timer.instance().tick() );\r\n }\r\n availableTime -= elapsedTime;\r\n return availableTime;\r\n },\r\n\r\n isLoading: function () {\r\n return this._loading;\r\n },\r\n\r\n registerPagedLODs: function ( subgraph, frameNumber ) {\r\n if ( !subgraph ) return;\r\n subgraph.accept( new FindPagedLODsVisitor( this._activePagedLODList, frameNumber ) );\r\n },\r\n\r\n requestNodeFile: function ( func, url, node, timestamp, priority ) {\r\n // We don't need to determine if the dbrequest is in the queue\r\n // That is already done in the PagedLOD, so we just create the request\r\n var dbrequest = new DatabaseRequest();\r\n dbrequest._group = node;\r\n dbrequest._function = func;\r\n dbrequest._url = url;\r\n dbrequest._timeStamp = timestamp;\r\n dbrequest._priority = priority;\r\n this._pendingRequests.push( dbrequest );\r\n return dbrequest;\r\n },\r\n\r\n takeRequests: function () {\r\n if ( this._pendingRequests.length ) {\r\n var numRequests = Math.min( this._maxRequestsPerFrame, this._pendingRequests.length );\r\n this._pendingRequests.sort( function ( r1, r2 ) {\r\n // Ask for newer requests first.\r\n var value = r2._timeStamp - r1._timeStamp;\r\n // Ask for the greater priority if the timestamp is the same.\r\n if ( value === 0 ) {\r\n value = r2._priority - r1._priority;\r\n }\r\n return value;\r\n\r\n } );\r\n for ( var i = 0; i < numRequests; i++ ) {\r\n this._downloadingRequestsNumber++;\r\n this.processRequest( this._pendingRequests.shift() );\r\n }\r\n }\r\n },\r\n\r\n processRequest: function ( dbrequest ) {\r\n\r\n this._loading = true;\r\n var that = this;\r\n // Check if the request is valid;\r\n if ( dbrequest._groupExpired ) {\r\n //Notify.log( 'DatabasePager::processRequest() Request expired.' );\r\n that._downloadingRequestsNumber--;\r\n this._loading = false;\r\n return;\r\n }\r\n\r\n // Load from function\r\n if ( dbrequest._function !== undefined ) {\r\n Q.when( this.loadNodeFromFunction( dbrequest._function, dbrequest._group ) ).then( function ( child ) {\r\n that._downloadingRequestsNumber--;\r\n dbrequest._loadedModel = child;\r\n that._pendingNodes.push( dbrequest );\r\n that._loading = false;\r\n } );\r\n\r\n } else if ( dbrequest._url !== '' ) { // Load from URL\r\n Q.when( this.loadNodeFromURL( dbrequest._url ) ).then( function ( child ) {\r\n that._downloadingRequestsNumber--;\r\n dbrequest._loadedModel = child;\r\n that._pendingNodes.push( dbrequest );\r\n that._loading = false;\r\n } );\r\n }\r\n },\r\n\r\n loadNodeFromFunction: function ( func, plod ) {\r\n // Need to call with pagedLOD as parent, to be able to have multiresolution structures.\r\n var defer = Q.defer();\r\n Q.when( ( func )( plod ) ).then( function ( child ) {\r\n defer.resolve( child );\r\n } );\r\n return defer.promise;\r\n },\r\n\r\n loadNodeFromURL: function ( url ) {\r\n var ReaderParser = require( 'osgDB/ReaderParser' );\r\n var defer = Q.defer();\r\n // Call to ReaderParser just in case there is a custom readNodeURL Callback\r\n // See osgDB/Options.js and/or osgDB/Input.js\r\n // TODO: We should study if performance can be improved if separating the XHTTP request from\r\n // the parsing. This way several/many request could be done at the same time.\r\n // Also we should be able to cancel requests, so there is a need to have access\r\n // to the HTTPRequest Object\r\n Q.when( ReaderParser.readNodeURL( url ) ).then( function ( child ) {\r\n defer.resolve( child );\r\n } );\r\n return defer.promise;\r\n },\r\n\r\n releaseGLExpiredSubgraphs: function ( availableTime ) {\r\n\r\n if ( availableTime <= 0.0 ) return 0.0;\r\n // We need to test if we have time to flush\r\n var elapsedTime = 0.0;\r\n var beginTime = Timer.instance().tick();\r\n var that = this;\r\n\r\n this._childrenToRemoveList.forEach( function ( node ) {\r\n // If we don't have more time, break the loop.\r\n if ( elapsedTime > availableTime ) return;\r\n that._childrenToRemoveList.delete( node );\r\n node.accept( new ReleaseVisitor() );\r\n node.removeChildren();\r\n node = null;\r\n elapsedTime = Timer.instance().deltaS( beginTime, Timer.instance().tick() );\r\n } );\r\n\r\n availableTime -= elapsedTime;\r\n return availableTime;\r\n },\r\n\r\n removeExpiredSubgraphs: function ( frameStamp, availableTime ) {\r\n\r\n if ( frameStamp.getFrameNumber() === 0 ) return 0.0;\r\n\r\n var numToPrune = this._activePagedLODList.size - this._targetMaximumNumberOfPagedLOD;\r\n var expiryTime = frameStamp.getSimulationTime() - 0.1;\r\n var expiryFrame = frameStamp.getFrameNumber() - 1;\r\n // First traverse and remove inactive PagedLODs, as their children will\r\n // certainly have expired.\r\n // TODO: Then traverse active nodes if we still need to prune.\r\n if ( numToPrune > 0 ) {\r\n availableTime = this.removeExpiredChildren( numToPrune, expiryTime, expiryFrame, availableTime );\r\n }\r\n return availableTime;\r\n },\r\n\r\n removeExpiredChildren: function ( numToPrune, expiryTime, expiryFrame, availableTime ) {\r\n // Iterate over the activePagedLODList to remove expired children\r\n // We need to control the time spent in remove childs.\r\n var elapsedTime = 0.0;\r\n var beginTime = Timer.instance().tick();\r\n var that = this;\r\n var removedChildren = [];\r\n var expiredPagedLODVisitor = new ExpirePagedLODVisitor();\r\n\r\n this._activePagedLODList.forEach( function ( plod ) {\r\n // Check if we have time, else return 0\r\n if ( elapsedTime > availableTime ) return 0.0;\r\n if ( numToPrune < 0 ) return availableTime;\r\n // See if plod is still active, so we don't have to prune\r\n if ( expiryFrame < plod.getFrameNumberOfLastTraversal() ) return availableTime;\r\n expiredPagedLODVisitor.removeExpiredChildrenAndFindPagedLODs( plod, expiryTime, expiryFrame, removedChildren );\r\n for ( var i = 0; i < expiredPagedLODVisitor._childrenList.length; i++ ) {\r\n that._activePagedLODList.delete( expiredPagedLODVisitor._childrenList[ i ] );\r\n numToPrune--;\r\n }\r\n // Add to the remove list all the childs deleted\r\n for ( i = 0; i < removedChildren.length; i++ ) {\r\n that._childrenToRemoveList.add( removedChildren[ i ] );\r\n }\r\n expiredPagedLODVisitor._childrenList.length = 0;\r\n removedChildren.length = 0;\r\n elapsedTime = Timer.instance().deltaS( beginTime, Timer.instance().tick() );\r\n } );\r\n availableTime -= elapsedTime;\r\n return availableTime;\r\n }\r\n }, 'osgDB', 'DatabasePager' );\r\n\r\n return DatabasePager;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgDB/DatabasePager.js\n ** module id = 251\n ** module chunks = 0 1\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_252__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external {\"root\":\"Leap\",\"commonjs2\":\"leapjs\",\"commonjs\":\"leapjs\",\"amd\":\"leap\"}\n ** module id = 252\n ** module chunks = 0 1\n **/","define( [\r\n 'osg/Notify'\r\n\r\n], function ( Notify ) {\r\n 'use strict';\r\n\r\n var instance = 0;\r\n var Node = function () {\r\n this._name = 'AbstractNode';\r\n this._inputs = [];\r\n this._outputs = null;\r\n\r\n // category of node\r\n // same name implies same\r\n // define/function\r\n //this.type = '';\r\n\r\n // uuid: unicity\r\n // allows multipe node of same type\r\n // declaring multipe code paths\r\n // inside the main\r\n this._id = instance++;\r\n\r\n this._text = undefined;\r\n };\r\n\r\n Node.prototype = {\r\n\r\n getID: function () {\r\n return this._id;\r\n },\r\n\r\n getType: function () {\r\n return this.type;\r\n },\r\n\r\n toString: function () {\r\n return this._name + ' : { input: ' + this._inputs.toString() + ' }, output: { ' + this._output.toString() + ' } ';\r\n },\r\n\r\n getInputs: function () {\r\n return this._inputs;\r\n },\r\n\r\n getOutputs: function () {\r\n return this._outputs;\r\n },\r\n\r\n checkInputsOutputs: function () {\r\n\r\n var i, key;\r\n if ( this.validInputs ) {\r\n\r\n for ( i = 0; i < this.validInputs.length; i++ ) {\r\n key = this.validInputs[ i ];\r\n if ( !this._inputs[ key ] ) {\r\n Notify.error( 'Shader node ' + this.type + ' validation error input ' + key + ' is missing' );\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n if ( this.validOutputs ) {\r\n\r\n for ( i = 0; i < this.validOutputs.length; i++ ) {\r\n key = this.validOutputs[ i ];\r\n if ( !this._outputs[ key ] ) {\r\n Notify.error( 'Shader node ' + this.type + ' validation error output ' + key + ' is missing' );\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n },\r\n\r\n // accepts inputs like that:\r\n // inputs( [ a, b, c , d] )\r\n // inputs( { a: x, b: y } )\r\n // inputs( a, b, c, d )\r\n inputs: function () {\r\n // handle inputs ( a, b, c, d)\r\n for ( var i = 0, l = arguments.length; i < l; i++ ) {\r\n\r\n var input = arguments[ i ];\r\n if ( input === undefined ) {\r\n break;\r\n }\r\n\r\n // handle inputs( [a, b, c ,d] )\r\n if ( Array.isArray( input ) ) {\r\n\r\n this.inputs.apply( this, input );\r\n return this;\r\n\r\n // check for an object {} and not something from base class Node\r\n } else if ( typeof input === 'object' && input !== null && ( input instanceof Node === false ) ) {\r\n this._inputs = input;\r\n return this;\r\n\r\n } else { // add argument to the array\r\n this._inputs.push( input );\r\n }\r\n }\r\n\r\n return this;\r\n },\r\n\r\n // accepts inputs like that:\r\n // outputs( { a: x, b: y } )\r\n // outputs( a )\r\n outputs: function ( outputs ) {\r\n\r\n this._outputs = outputs;\r\n\r\n // single output\r\n if ( this._outputs instanceof Node === true ) {\r\n\r\n this.autoLink( this._outputs );\r\n\r\n } else {\r\n\r\n // iterate on objects keys\r\n var keys = Object.keys( this._outputs );\r\n for ( var i = 0; i < keys.length; i++ ) {\r\n var key = keys[ i ];\r\n this.autoLink( this._outputs[ key ] );\r\n }\r\n }\r\n\r\n return this;\r\n },\r\n\r\n autoLink: function ( output ) {\r\n\r\n if ( output === undefined )\r\n return this;\r\n\r\n output.inputs( this );\r\n\r\n return this;\r\n },\r\n\r\n computeFragment: function () {\r\n return this._text;\r\n },\r\n\r\n comment: function ( txt ) {\r\n this._comment = '//' + txt;\r\n },\r\n\r\n getComment: function () {\r\n return this._comment;\r\n }\r\n };\r\n\r\n\r\n return Node;\r\n} );\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShader/node/Node.js\n ** module id = 253\n ** module chunks = 0 1\n **/","module.exports = \"#define DefaultGamma 2.4\\r\\n\\r\\n// coding style should be camel case except for acronyme like SRGB or HDR\\r\\nfloat linearTosRGB(const in float c, const in float gamma)\\r\\n{\\r\\n float v = 0.0;\\r\\n if(c < 0.0031308) {\\r\\n if ( c > 0.0)\\r\\n v = c * 12.92;\\r\\n } else {\\r\\n v = 1.055 * pow(c, 1.0/gamma) - 0.055;\\r\\n }\\r\\n return v;\\r\\n}\\r\\n\\r\\nvec3 linearTosRGB(const in vec3 c, const in float gamma)\\r\\n{\\r\\n vec3 v = vec3(0.0);\\r\\n if(all(lessThan(c, vec3(0.0031308))))\\r\\n {\\r\\n if ( all(greaterThan(c, vec3(0.0))))\\r\\n {\\r\\n v = c * 12.92;\\r\\n }\\r\\n }\\r\\n else\\r\\n {\\r\\n v = 1.055 * pow(c, vec3(1.0/gamma)) - 0.055;\\r\\n }\\r\\n return v;\\r\\n}\\r\\n\\r\\nvec4 linearTosRGB(const in vec4 c, const in float gamma)\\r\\n{\\r\\n vec4 v = vec4(0.0);\\r\\n v.a = c.a;\\r\\n if(all(lessThan(c.rgb, vec3(0.0031308))))\\r\\n {\\r\\n if ( all(greaterThan(c.rgb, vec3(0.0))))\\r\\n {\\r\\n v.rgb = c.rgb * 12.92;\\r\\n }\\r\\n }\\r\\n else\\r\\n {\\r\\n v.rgb = 1.055 * pow(c.rgb, vec3(1.0/gamma)) - 0.055;\\r\\n }\\r\\n return v;\\r\\n}\\r\\n\\r\\nfloat sRGBToLinear(const in float c, const in float gamma)\\r\\n{\\r\\n float v = 0.0;\\r\\n if ( c < 0.04045 )\\r\\n {\\r\\n if ( c >= 0.0 )\\r\\n v = c * ( 1.0 / 12.92 );\\r\\n }\\r\\n else\\r\\n {\\r\\n v = pow( ( c + 0.055 ) * ( 1.0 / 1.055 ), gamma );\\r\\n }\\r\\n return v;\\r\\n}\\r\\n\\r\\n\\r\\nvec3 sRGBToLinear(const in vec3 c, const in float gamma)\\r\\n{\\r\\n\\r\\n vec3 v = vec3(0.0);\\r\\n if ( all(lessThan(c, vec3(0.04045)) ))\\r\\n {\\r\\n if ( all(greaterThanEqual(c, vec3(0.0))) )\\r\\n {\\r\\n v = c * ( 1.0 / 12.92 );\\r\\n }\\r\\n }\\r\\n else\\r\\n {\\r\\n v = pow( ( c + 0.055 ) * ( 1.0 / 1.055 ), vec3(gamma) );\\r\\n }\\r\\n return v;\\r\\n}\\r\\n\\r\\nvec4 sRGBToLinear(const in vec4 c, const in float gamma)\\r\\n{\\r\\n vec4 v = vec4(0.0);\\r\\n v.a = c.a;\\r\\n if ( all(lessThan(c.rgb, vec3(0.04045)) ))\\r\\n {\\r\\n if ( all(greaterThanEqual(c.rgb, vec3(0.0))) )\\r\\n {\\r\\n v.rgb = c.rgb * ( 1.0 / 12.92 );\\r\\n }\\r\\n }\\r\\n else\\r\\n {\\r\\n v.rgb = pow( ( c.rgb + 0.055 ) * ( 1.0 / 1.055 ), vec3(gamma) );\\r\\n }\\r\\n return v;\\r\\n}\\r\\n\\r\\nvoid normalizeNormalAndEyeVector( const in vec3 inputNormal, const in vec3 inputEye, out vec3 normal, out vec3 eye )\\r\\n{\\r\\n normal = normalize( inputNormal );\\r\\n eye = normalize( -inputEye );\\r\\n}\\r\\n\\r\\n//http://graphicrants.blogspot.fr/2009/04/rgbm-color-encoding.html\\r\\nvec3 RGBMToRGB( const in vec4 rgba )\\r\\n{\\r\\n const float maxRange = 8.0;\\r\\n return rgba.rgb * maxRange * rgba.a;\\r\\n}\\r\\n\\r\\nconst mat3 LUVInverse = mat3( 6.0013, -2.700, -1.7995,\\r\\n -1.332, 3.1029, -5.7720,\\r\\n 0.3007, -1.088, 5.6268 );\\r\\n\\r\\nvec3 LUVToRGB( const in vec4 vLogLuv )\\r\\n{\\r\\n float Le = vLogLuv.z * 255.0 + vLogLuv.w;\\r\\n vec3 Xp_Y_XYZp;\\r\\n Xp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\\r\\n Xp_Y_XYZp.z = Xp_Y_XYZp.y / vLogLuv.y;\\r\\n Xp_Y_XYZp.x = vLogLuv.x * Xp_Y_XYZp.z;\\r\\n vec3 vRGB = LUVInverse * Xp_Y_XYZp;\\r\\n return max(vRGB, 0.0);\\r\\n}\\r\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShader/node/functions.glsl\n ** module id = 256\n ** module chunks = 0 1\n **/","module.exports = \"////////////////\\r\\n// ATTENUATION\\r\\n/////////////\\r\\nfloat getLightAttenuation(const in float dist, const in vec4 lightAttenuation)\\r\\n{\\r\\n // lightAttenuation(constantEnabled, linearEnabled, quadraticEnabled)\\r\\n // TODO find a vector alu instead of 4 scalar\\r\\n float constant = lightAttenuation.x;\\r\\n float linear = lightAttenuation.y*dist;\\r\\n float quadratic = lightAttenuation.z*dist*dist;\\r\\n return 1.0 / ( constant + linear + quadratic );\\r\\n}\\r\\n//\\r\\n// LIGHTING EQUATION TERMS\\r\\n///\\r\\nvoid specularCookTorrance(const in vec3 n, const in vec3 l, const in vec3 v, const in float hard, const in vec3 materialSpecular, const in vec3 lightSpecular, out vec3 specularContrib)\\r\\n{\\r\\n vec3 h = normalize(v + l);\\r\\n float nh = dot(n, h);\\r\\n float specfac = 0.0;\\r\\n\\r\\n if(nh > 0.0) {\\r\\n float nv = max( dot(n, v), 0.0 );\\r\\n float i = pow(nh, hard);\\r\\n i = i / (0.1 + nv);\\r\\n specfac = i;\\r\\n }\\r\\n // ugly way to fake an energy conservation (mainly to avoid super bright stuffs with low glossiness)\\r\\n float att = hard > 100.0 ? 1.0 : smoothstep(0.0, 1.0, hard * 0.01);\\r\\n specularContrib = specfac*materialSpecular*lightSpecular*att;\\r\\n}\\r\\n\\r\\nvoid lambert(const in float ndl, const in vec3 materialDiffuse, const in vec3 lightDiffuse, out vec3 diffuseContrib)\\r\\n{\\r\\n diffuseContrib = ndl*materialDiffuse*lightDiffuse;\\r\\n}\\r\\n////////////////////////\\r\\n/// Main func\\r\\n///////////////////////\\r\\n\\r\\n/// for each light\\r\\n//direction, dist, NDL, attenuation, compute diffuse, compute specular\\r\\n\\r\\nvec3 computeSpotLightShading(\\r\\n const in vec3 normal,\\r\\n const in vec3 eyeVector,\\r\\n\\r\\n const in vec3 materialAmbient,\\r\\n const in vec3 materialDiffuse,\\r\\n const in vec3 materialSpecular,\\r\\n const in float materialShininess,\\r\\n\\r\\n const in vec3 lightAmbient,\\r\\n const in vec3 lightDiffuse,\\r\\n const in vec3 lightSpecular,\\r\\n\\r\\n const in vec3 lightSpotDirection,\\r\\n const in vec4 lightAttenuation,\\r\\n const in vec4 lightSpotPosition,\\r\\n const in float lightCosSpotCutoff,\\r\\n const in float lightSpotBlend,\\r\\n\\r\\n const in mat4 lightMatrix,\\r\\n const in mat4 lightInvMatrix,\\r\\n\\r\\n out vec3 eyeLightPos,\\r\\n out vec3 eyeLightDir,\\r\\n out float NdotL,\\r\\n out bool lighted)\\r\\n{\\r\\n lighted = false;\\r\\n eyeLightPos = vec3(lightMatrix * lightSpotPosition);\\r\\n eyeLightDir = eyeLightPos - FragEyeVector;\\r\\n // compute dist\\r\\n float dist = length(eyeLightDir);\\r\\n // compute attenuation\\r\\n float attenuation = getLightAttenuation(dist, lightAttenuation);\\r\\n if (attenuation != 0.0)\\r\\n {\\r\\n // compute direction\\r\\n eyeLightDir = dist > 0.0 ? eyeLightDir / dist : vec3( 0.0, 1.0, 0.0 );\\r\\n if (lightCosSpotCutoff > 0.0)\\r\\n {\\r\\n //compute lightSpotBlend\\r\\n vec3 lightSpotDirectionEye = normalize(mat3(vec3(lightInvMatrix[0]), vec3(lightInvMatrix[1]), vec3(lightInvMatrix[2]))*lightSpotDirection);\\r\\n\\r\\n float cosCurAngle = dot(-eyeLightDir, lightSpotDirectionEye);\\r\\n float diffAngle = cosCurAngle - lightCosSpotCutoff;\\r\\n float spot = 1.0;\\r\\n if ( diffAngle < 0.0 ) {\\r\\n spot = 0.0;\\r\\n } else {\\r\\n if ( lightSpotBlend > 0.0 )\\r\\n spot = cosCurAngle * smoothstep(0.0, 1.0, (cosCurAngle - lightCosSpotCutoff) / (lightSpotBlend));\\r\\n }\\r\\n\\r\\n if (spot > 0.0)\\r\\n {\\r\\n // compute NdL\\r\\n NdotL = dot(eyeLightDir, normal);\\r\\n if (NdotL > 0.0)\\r\\n {\\r\\n lighted = true;\\r\\n vec3 diffuseContrib;\\r\\n lambert(NdotL, materialDiffuse, lightDiffuse, diffuseContrib);\\r\\n vec3 specularContrib;\\r\\n specularCookTorrance(normal, eyeLightDir, eyeVector, materialShininess, materialSpecular, lightSpecular, specularContrib);\\r\\n return spot * attenuation * (diffuseContrib + specularContrib);\\r\\n }\\r\\n }\\r\\n }\\r\\n }\\r\\n return vec3(0.0);\\r\\n}\\r\\n\\r\\nvec3 computePointLightShading(\\r\\n const in vec3 normal,\\r\\n const in vec3 eyeVector,\\r\\n\\r\\n const in vec3 materialAmbient,\\r\\n const in vec3 materialDiffuse,\\r\\n const in vec3 materialSpecular,\\r\\n const in float materialShininess,\\r\\n\\r\\n const in vec3 lightAmbient,\\r\\n const in vec3 lightDiffuse,\\r\\n const in vec3 lightSpecular,\\r\\n\\r\\n const in vec4 lightPosition,\\r\\n const in vec4 lightAttenuation,\\r\\n\\r\\n const in mat4 lightMatrix,\\r\\n\\r\\n out vec3 eyeLightPos,\\r\\n out vec3 eyeLightDir,\\r\\n out float NdotL,\\r\\n out bool lighted)\\r\\n{\\r\\n\\r\\n eyeLightPos = vec3(lightMatrix * lightPosition);\\r\\n eyeLightDir = eyeLightPos - FragEyeVector;\\r\\n float dist = length(eyeLightDir);\\r\\n // compute dist\\r\\n // compute attenuation\\r\\n float attenuation = getLightAttenuation(dist, lightAttenuation);\\r\\n if (attenuation != 0.0)\\r\\n {\\r\\n // compute direction\\r\\n eyeLightDir = dist > 0.0 ? eyeLightDir / dist : vec3( 0.0, 1.0, 0.0 );\\r\\n // compute NdL\\r\\n NdotL = dot(eyeLightDir, normal);\\r\\n if (NdotL > 0.0)\\r\\n {\\r\\n lighted = true;\\r\\n vec3 diffuseContrib;\\r\\n lambert(NdotL, materialDiffuse, lightDiffuse, diffuseContrib);\\r\\n vec3 specularContrib;\\r\\n specularCookTorrance(normal, eyeLightDir, eyeVector, materialShininess, materialSpecular, lightSpecular, specularContrib);\\r\\n return attenuation * (diffuseContrib + specularContrib);\\r\\n }\\r\\n }\\r\\n return vec3(0.0);\\r\\n}\\r\\n\\r\\nvec3 computeSunLightShading(\\r\\n\\r\\n const in vec3 normal,\\r\\n const in vec3 eyeVector,\\r\\n\\r\\n const in vec3 materialAmbient,\\r\\n const in vec3 materialDiffuse,\\r\\n const in vec3 materialSpecular,\\r\\n const in float materialShininess,\\r\\n\\r\\n const in vec3 lightAmbient,\\r\\n const in vec3 lightDiffuse,\\r\\n const in vec3 lightSpecular,\\r\\n\\r\\n const in vec4 lightPosition,\\r\\n\\r\\n const in mat4 lightMatrix,\\r\\n\\r\\n out vec3 eyeLightDir,\\r\\n out float NdotL,\\r\\n out bool lighted)\\r\\n{\\r\\n\\r\\n lighted = false;\\r\\n eyeLightDir = normalize( vec3(lightMatrix * lightPosition ) );\\r\\n // compute NdL // compute NdL\\r\\n NdotL = dot(eyeLightDir, normal);\\r\\n if (NdotL > 0.0)\\r\\n {\\r\\n lighted = true;\\r\\n vec3 diffuseContrib;\\r\\n lambert(NdotL, materialDiffuse, lightDiffuse, diffuseContrib);\\r\\n vec3 specularContrib;\\r\\n specularCookTorrance(normal, eyeLightDir, eyeVector, materialShininess, materialSpecular, lightSpecular, specularContrib);\\r\\n return (diffuseContrib + specularContrib);\\r\\n }\\r\\n return vec3(0.0);\\r\\n}\\r\\n\\r\\nvec3 computeHemiLightShading(\\r\\n\\r\\n const in vec3 normal,\\r\\n const in vec3 eyeVector,\\r\\n\\r\\n const in vec3 materialDiffuse,\\r\\n const in vec3 materialSpecular,\\r\\n const in float materialShininess,\\r\\n\\r\\n const in vec3 lightDiffuse,\\r\\n const in vec3 lightGround,\\r\\n\\r\\n const in vec4 lightPosition,\\r\\n\\r\\n const in mat4 lightMatrix,\\r\\n\\r\\n out vec3 eyeLightDir,\\r\\n out float NdotL,\\r\\n out bool lighted)\\r\\n{\\r\\n lighted = false;\\r\\n\\r\\n eyeLightDir = normalize( vec3(lightMatrix * lightPosition ) );\\r\\n NdotL = dot(eyeLightDir, normal);\\r\\n float weight = 0.5 * NdotL + 0.5;\\r\\n vec3 diffuseContrib = materialDiffuse * mix(lightGround, lightDiffuse, weight);\\r\\n\\r\\n // same cook-torrance as above for sky/ground\\r\\n float skyWeight = 0.5 * dot(normal, normalize(eyeVector + eyeLightDir)) + 0.5;\\r\\n float gndWeight = 0.5 * dot(normal, normalize(eyeVector - eyeLightDir)) + 0.5;\\r\\n float skySpec = pow(skyWeight, materialShininess);\\r\\n float skyGround = pow(gndWeight, materialShininess);\\r\\n float divisor = (0.1 + max( dot(normal, eyeVector), 0.0 ));\\r\\n float att = materialShininess > 100.0 ? 1.0 : smoothstep(0.0, 1.0, materialShininess * 0.01);\\r\\n vec3 specularContrib = lightDiffuse * materialSpecular * weight * att * (skySpec + skyGround) / divisor;\\r\\n\\r\\n return diffuseContrib + specularContrib;\\r\\n}\\r\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShader/node/lights.glsl\n ** module id = 257\n ** module chunks = 0 1\n **/","module.exports = \"vec3 textureRGB(const in sampler2D texture, const in vec2 uv) {\\r\\n return texture2D(texture, uv.xy ).rgb;\\r\\n}\\r\\n\\r\\nvec4 textureRGBA(const in sampler2D texture, const in vec2 uv) {\\r\\n return texture2D(texture, uv.xy ).rgba;\\r\\n}\\r\\n\\r\\nfloat textureIntensity(const in sampler2D texture, const in vec2 uv) {\\r\\n return texture2D(texture, uv).r;\\r\\n}\\r\\n\\r\\nfloat textureAlpha(const in sampler2D texture, const in vec2 uv) {\\r\\n return texture2D(texture, uv.xy ).a;\\r\\n}\\r\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShader/node/textures.glsl\n ** module id = 258\n ** module chunks = 0 1\n **/","module.exports = \"\\r\\nfloat decodeFloatRGBA( vec4 rgba ) {\\r\\n return dot( rgba, vec4(1.0, 1.0/255.0, 1.0/65025.0, 1.0/160581375.0) );\\r\\n}\\r\\n\\r\\nvec4 encodeFloatRGBA( float v ) {\\r\\n vec4 enc = vec4(1.0, 255.0, 65025.0, 160581375.0) * v;\\r\\n enc = fract(enc);\\r\\n enc -= enc.yzww * vec4(1.0/255.0,1.0/255.0,1.0/255.0,0.0);\\r\\n return enc;\\r\\n}\\r\\n\\r\\nvec2 decodeHalfFloatRGBA( vec4 rgba ) {\\r\\n return vec2(rgba.x + (rgba.y / 255.0), rgba.z + (rgba.w / 255.0));\\r\\n}\\r\\n\\r\\nvec4 encodeHalfFloatRGBA( vec2 v ) {\\r\\n const vec2 bias = vec2(1.0 / 255.0, 0.0);\\r\\n vec4 enc;\\r\\n enc.xy = vec2(v.x, fract(v.x * 255.0));\\r\\n enc.xy = enc.xy - (enc.yy * bias);\\r\\n\\r\\n enc.zw = vec2(v.y, fract(v.y * 255.0));\\r\\n enc.zw = enc.zw - (enc.ww * bias);\\r\\n return enc;\\r\\n}\\r\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShader/node/colorEncode.glsl\n ** module id = 259\n ** module chunks = 0 1\n **/","module.exports = \"attribute vec3 Vertex;\\r\\n//attribute vec4 Normal;\\r\\n\\r\\nuniform mat4 ModelViewMatrix;\\r\\nuniform mat4 ProjectionMatrix;\\r\\nuniform mat4 NormalMatrix;\\r\\n\\r\\nvarying vec4 FragEyePos;\\r\\n//varying vec4 FragNormal;\\r\\n\\r\\n\\r\\n//uniform float bias;\\r\\n//uniform float texelSize;\\r\\n\\r\\nvoid main(void) {\\r\\n FragEyePos = ModelViewMatrix * vec4(Vertex,1.0);\\r\\n //FragNormal = NormalMatrix * vec4(Normal.xyz,1.0);\\r\\n\\r\\n gl_Position = ProjectionMatrix * FragEyePos;\\r\\n\\r\\n //FragEyePos.z += FragEyePos.z * FragNormal.z * bias * 1800. * texelSize;\\r\\n}\\r\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShadow/shaders/shadowsCastVert.glsl\n ** module id = 260\n ** module chunks = 0 1\n **/","module.exports = \"#ifdef GL_FRAGMENT_PRECISION_HIGH\\r\\nprecision highp float;\\r\\n#else\\r\\nprecision mediump float;\\r\\n#endif\\r\\n\\r\\nuniform float exponent;\\r\\nuniform float exponent1;\\r\\nuniform vec4 Shadow_DepthRange;\\r\\n\\r\\nvarying vec4 FragEyePos;\\r\\n\\r\\n#pragma include \\\"colorEncode.glsl\\\"\\r\\n\\r\\n// see shadowSettings.js header for shadow algo param explanations\\r\\n\\r\\n#ifdef _EVSM\\r\\n// Convert depth to EVSM coefficients\\r\\n// Input depth should be in [0, 1]\\r\\nvec2 warpDepth(float depth, vec2 exponents)\\r\\n{\\r\\n float pos = exp( exponents.x * depth);\\r\\n float neg = -exp(-exponents.y * depth);\\r\\n return vec2(pos, neg);\\r\\n}\\r\\n\\r\\n// Convert depth value to EVSM representation\\r\\nvec4 shadowDepthToEVSM(float depth)\\r\\n{\\r\\n vec2 warpedDepth = warpDepth(depth, vec2(exponent, exponent1));\\r\\n return vec4(warpedDepth.xy, warpedDepth.xy * warpedDepth.xy);\\r\\n}\\r\\n#endif // _EVSM\\r\\n\\r\\nvoid main(void) {\\r\\n float depth;\\r\\n // distance to camera\\r\\n depth = -FragEyePos.z * FragEyePos.w;\\r\\n\\r\\n //depth = (depth - Shadow_DepthRange.x )* Shadow_DepthRange.w;\\r\\n depth = depth / Shadow_DepthRange.y;\\r\\n\\r\\n#if defined (_FLOATTEX) && defined(_PCF)\\r\\n gl_FragColor = vec4(depth, 0.0, 0.0, 1.0);\\r\\n#elif defined (_FLOATTEX) && defined(_ESM)\\r\\n float depthScale = exponent1;\\r\\n depth = exp(-depth*depthScale);\\r\\n gl_FragColor = vec4(depth, 0.0, 0.0, 1.0);\\r\\n#elif defined (_FLOATTEX) && defined(_VSM)\\r\\n gl_FragColor = vec4(depth, depth*depth, 0.0, 1.0);\\r\\n#elif defined (_FLOATTEX) && defined(_EVSM)\\r\\n gl_FragColor = shadowDepthToEVSM(depth);\\r\\n#elif defined (_FLOATTEX) // && defined(_NONE)\\r\\n gl_FragColor = vec4(depth, 0.0, 0.0, 1.0);\\r\\n#elif defined(_PCF)\\r\\n gl_FragColor = encodeFloatRGBA(depth);\\r\\n#elif defined(_ESM)\\r\\n float depthScale = exponent1;\\r\\n depthScale = exp(-depth*depthScale);\\r\\n gl_FragColor = encodeFloatRGBA(depthScale);\\r\\n#elif defined(_VSM)\\r\\n gl_FragColor = encodeHalfFloatRGBA(vec2(depth, depth*depth));\\r\\n#else // NONE\\r\\n gl_FragColor = encodeFloatRGBA(depth);\\r\\n#endif\\r\\n\\r\\n\\r\\n\\r\\n}\\r\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShadow/shaders/shadowsCastFrag.glsl\n ** module id = 261\n ** module chunks = 0 1\n **/","module.exports = \"//begin shadows\\r\\n\\r\\n#pragma include \\\"colorEncode.glsl\\\"\\r\\n\\r\\n// see shadowSettings.js header for shadow algo param explanations\\r\\n\\r\\n// end Float codec\\r\\nfloat getSingleFloatFromTex(sampler2D depths, vec2 uv){\\r\\n#ifndef _FLOATTEX\\r\\n return decodeFloatRGBA(texture2D(depths, uv));\\r\\n#else\\r\\n return texture2D(depths, uv).x;\\r\\n#endif\\r\\n}\\r\\n\\r\\nvec2 getDoubleFloatFromTex(sampler2D depths, vec2 uv){\\r\\n#ifndef _FLOATTEX\\r\\n return decodeHalfFloatRGBA(texture2D(depths, uv));\\r\\n#else\\r\\n return texture2D(depths, uv).xy;\\r\\n#endif\\r\\n}\\r\\n\\r\\nvec4 getQuadFloatFromTex(sampler2D depths, vec2 uv){\\r\\n return texture2D(depths, uv).xyzw;\\r\\n}\\r\\n// end Float codec\\r\\n\\r\\n\\r\\n#pragma include \\\"vsm.glsl\\\" \\\"_VSM\\\"\\r\\n\\r\\n#pragma include \\\"evsm.glsl\\\" \\\"_EVSM\\\"\\r\\n\\r\\n#pragma include \\\"esm.glsl\\\" \\\"_ESM\\\"\\r\\n\\r\\n#pragma include \\\"pcf.glsl\\\" \\\"_NONE\\\" \\\"_PCF\\\"\\r\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShadow/shaders/shadowsReceive.glsl\n ** module id = 262\n ** module chunks = 0 1\n **/","module.exports = \"\\r\\n if (!lighted)\\r\\n return 1.;\\r\\n\\r\\n if (depthRange.x == depthRange.y)\\r\\n return 1.;\\r\\n\\r\\n if (shadowVertexProjected.w < 0.0 || - shadowVertexProjected.z < 0.0)\\r\\n return 1.0; // notably behind camera\\r\\n\\r\\n vec2 shadowUV;\\r\\n\\r\\n shadowUV.xy = shadowVertexProjected.xy / shadowVertexProjected.w;\\r\\n shadowUV.xy = shadowUV.xy * 0.5 + 0.5;// mad like\\r\\n\\r\\n bool outFrustum = any(bvec4 ( shadowUV.x > 1., shadowUV.x < 0., shadowUV.y > 1., shadowUV.y < 0. ));\\r\\n if (outFrustum )\\r\\n return 1.0;// limits of light frustum\\r\\n\\r\\n\\r\\n float shadowReceiverZ;\\r\\n // inv linearize done in vertex shader\\r\\n shadowReceiverZ = - shadowVertexProjected.z;\\r\\n // to [0,1]\\r\\n //shadowReceiverZ = (shadowReceiverZ - depthRange.x)* depthRange.w;\\r\\n shadowReceiverZ = shadowReceiverZ / depthRange.y;\\r\\n\\r\\n // depth bias: fighting shadow acne (depth imprecsion z-fighting)\\r\\n float shadowBias = 0.0;\\r\\n\\r\\n\\r\\n //float shadowBias = 0.005*tan(acos(N_Dot_L)); // cosTheta is dot( n, l ), clamped between 0 and 1\\r\\n // same but 4 cycles instead of 15\\r\\n shadowBias += 0.05 * sqrt( 1. - N_Dot_L*N_Dot_L) / N_Dot_L;\\r\\n //shadowBias += 0.005 * sqrt( 1. - N_Dot_L*N_Dot_L) / N_Dot_L;\\r\\n\\r\\n //normal offset aka Exploding Shadow Receivers\\r\\n //if(shadowVertexProjected.w != 1.0){\\r\\n // only relevant for perspective, not orthogonal\\r\\n // use shadowViewNormal\\r\\n //shadowBias *= ShadowViewNormal.z * ( shadowReceiverZ*depthRange.y * shadowBias * shadowMapSize.z);\\r\\n //}\\r\\n shadowBias = clamp(shadowBias, 0., bias);\\r\\n\\r\\n\\r\\n // shadowZ must be clamped to [0,1]\\r\\n // otherwise it's not comparable to\\r\\n // shadow caster depth map\\r\\n // which is clamped to [0,1]\\r\\n // Not doing that makes ALL shadowReceiver > 1.0 black\\r\\n // because they ALL becomes behind any point in Caster depth map\\r\\n shadowReceiverZ = clamp(shadowReceiverZ, 0., 1. - shadowBias);\\r\\n\\r\\n shadowReceiverZ -= shadowBias;\\r\\n\\r\\n // Now computes Shadow\\r\\n\\r\\n // Calculate shadow amount\\r\\n float shadow = 1.0;\\r\\n\\r\\n // return 0.0 for black;\\r\\n // return 1.0 for light;\\r\\n\\r\\n\\r\\n // pcf pbias to add on offset\\r\\n vec2 shadowBiasPCF = vec2(0.);\\r\\n#ifdef _NONE\\r\\n\\r\\n float shadowDepth = getSingleFloatFromTex(tex, shadowUV.xy);\\r\\n // shadowReceiverZ : receiver depth in light view\\r\\n // shadowDepth : caster depth in light view\\r\\n // receiver is shadowed if its depth is superior to the caster\\r\\n shadow = ( shadowReceiverZ > shadowDepth ) ? 0.0 : 1.0;\\r\\n\\r\\n#elif defined( _PCF )\\r\\n\\r\\n\\r\\n#ifdef GL_OES_standard_derivatives\\r\\n\\r\\n shadowBiasPCF.x += dFdx(shadowUV.xy).x * shadowMapSize.z;\\r\\n shadowBiasPCF.y += dFdy(shadowUV.xy).y * shadowMapSize.w;\\r\\n\\r\\n //shadowBias += dFdx(shadowReceiverZ);\\r\\n#endif\\r\\n\\r\\n\\r\\n shadow = getShadowPCF(tex, shadowMapSize, shadowUV, shadowReceiverZ, shadowBiasPCF);\\r\\n\\r\\n#elif defined( _ESM )\\r\\n\\r\\n shadow = fetchESM(tex, shadowMapSize, shadowUV, shadowReceiverZ, exponent0, exponent1);\\r\\n\\r\\n#elif defined( _VSM )\\r\\n\\r\\n vec2 moments = getDoubleFloatFromTex(tex, shadowUV.xy);\\r\\n shadow = chebyshevUpperBound(moments, shadowReceiverZ, epsilonVSM);\\r\\n\\r\\n#elif defined( _EVSM )\\r\\n\\r\\n vec4 occluder = getQuadFloatFromTex(tex, shadowUV.xy);\\r\\n vec2 exponents = vec2(exponent0, exponent1);\\r\\n vec2 warpedDepth = warpDepth(shadowReceiverZ, exponents);\\r\\n\\r\\n float derivationEVSM = epsilonVSM;\\r\\n // Derivative of warping at depth\\r\\n vec2 depthScale = derivationEVSM * exponents * warpedDepth;\\r\\n vec2 minVariance = depthScale * depthScale;\\r\\n\\r\\n float epsilonEVSM = -epsilonVSM;\\r\\n\\r\\n // Compute the upper bounds of the visibility function both for x and y\\r\\n float posContrib = chebyshevUpperBound(occluder.xz, -warpedDepth.x, minVariance.x);\\r\\n float negContrib = chebyshevUpperBound(occluder.yw, warpedDepth.y, minVariance.y);\\r\\n\\r\\n shadow = min(posContrib, negContrib);\\r\\n\\r\\n#endif\\r\\n\\r\\n\\r\\n return shadow;\\r\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShadow/shaders/shadowsReceiveMain.glsl\n ** module id = 263\n ** module chunks = 0 1\n **/","module.exports = \"\\r\\n// simulation of texture2Dshadow glsl call on HW\\r\\n// http://codeflow.org/entries/2013/feb/15/soft-shadow-mapping/\\r\\nfloat texture2DCompare(const in sampler2D depths, const in vec2 uv, const in float compare){\\r\\n\\r\\n float depth = getSingleFloatFromTex(depths, uv);\\r\\n return step(compare, depth);\\r\\n\\r\\n}\\r\\n\\r\\n// simulates linear fetch like texture2d shadow\\r\\nfloat texture2DShadowLerp(const in sampler2D depths, const in vec4 size, const in vec2 uv, const in float compare){\\r\\n#define REAL_PCF 1\\r\\n#ifdef REAL_PCF\\r\\n vec2 f = fract(uv*size.xy+0.5);\\r\\n vec2 centroidUV = floor(uv*size.xy+0.5)*size.zw;\\r\\n\\r\\n float lb = texture2DCompare(depths, centroidUV+size.zw*vec2(0.0, 0.0), compare);\\r\\n float lt = texture2DCompare(depths, centroidUV+size.zw*vec2(0.0, 1.0), compare);\\r\\n float rb = texture2DCompare(depths, centroidUV+size.zw*vec2(1.0, 0.0), compare);\\r\\n float rt = texture2DCompare(depths, centroidUV+size.zw*vec2(1.0, 1.0), compare);\\r\\n float a = mix(lb, lt, f.y);\\r\\n float b = mix(rb, rt, f.y);\\r\\n float c = mix(a, b, f.x);\\r\\n return c;\\r\\n#else\\r\\n // CHEAT: it's wrong, but 4x faster\\r\\n // wronb because http://www.eng.utah.edu/~cs5610/handouts/reeves87.pdf p2\\r\\n return texture2DCompare(depths, uv, compare);\\r\\n#endif\\r\\n\\r\\n}\\r\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShadow/shaders/shadowLinearSoft.glsl\n ** module id = 264\n ** module chunks = 0 1\n **/","module.exports = \"\\r\\n#pragma include \\\"bandPCF.glsl\\\" \\\"_BAND_PCF\\\"\\r\\n#pragma include \\\"poissonPCF.glsl\\\" \\\"_POISSON_PCF\\\"\\r\\n#pragma include \\\"tapPCF.glsl\\\" \\\"_TAP_PCF\\\"\\r\\n\\r\\nfloat computeShadow(const in bool lighted,\\r\\n in vec4 shadowVertexProjected,\\r\\n const in sampler2D tex,\\r\\n const in vec4 shadowMapSize,\\r\\n const in vec4 depthRange,\\r\\n const in vec3 LightPosition,\\r\\n const in float N_Dot_L,\\r\\n const in vec3 Normal,\\r\\n const in float bias\\r\\n )\\r\\n{\\r\\n #pragma include \\\"shadowsReceiveMain.glsl\\\" \\\"_PCF\\\" \\\"_NONE\\\"\\r\\n}\\r\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShadow/shaders/pcf.glsl\n ** module id = 265\n ** module chunks = 0 1\n **/","module.exports = \"\\r\\n\\r\\nfloat getShadowPCF(const in sampler2D tex, const in vec4 shadowMapSize, const in vec2 uv, const in float shadowZ, const in vec2 biasPcf) {\\r\\n\\r\\n vec2 o = shadowMapSize.zw;\\r\\n float shadowed = 0.0;\\r\\n\\r\\n#define TSF(off1, off2) getSingleFloatFromTex( tex, uv.xy + vec2(off1, off2)*biasPcf );\\r\\n\\r\\n // fastest bug gives banding\\r\\n#if defined(_PCFx4)\\r\\n\\r\\n float xPixelOffset = o.x;\\r\\n float yPixelOffset = o.y;\\r\\n\\r\\n float dx0 = -1.0 * xPixelOffset;\\r\\n float dy0 = -1.0 * yPixelOffset;\\r\\n float dx1 = 1.0 * xPixelOffset;\\r\\n float dy1 = 1.0 * yPixelOffset;\\r\\n\\r\\n vec4 sV;\\r\\n\\r\\n // vector ops faster alu\\r\\n sV.x = TSF( dx0, dy0 );\\r\\n sV.y = TSF( dx1, dy0 );\\r\\n sV.z = TSF( dx1, dy0 );\\r\\n sV.w = TSF( dx1, dy1 );\\r\\n sV = vec4(lessThan(vec4(shadowZ), sV ));\\r\\n shadowed = dot(sV, vec4(0.25));\\r\\n\\r\\n // here still didn't querying the real shadow at uv.\\r\\n // This could be a single func checking for branching\\r\\n // like befire going to x9, x16 or anythiong\\r\\n // or even complex \\\"blurring\\\"\\r\\n if (shadowed != 0.0) // we're on an edge\\r\\n {\\r\\n shadowed += step(shadowZ, getSingleFloatFromTex( tex, uv.xy ));\\r\\n shadowed *= 0.5;\\r\\n }\\r\\n\\r\\n#elif defined(_PCFx9)\\r\\n\\r\\n float xPixelOffset = o.x;\\r\\n float yPixelOffset = o.y;\\r\\n\\r\\n float dx0 = -1.0 * xPixelOffset;\\r\\n float dy0 = -1.0 * yPixelOffset;\\r\\n float dx1 = 1.0 * xPixelOffset;\\r\\n float dy1 = 1.0 * yPixelOffset;\\r\\n\\r\\n mat3 kern;\\r\\n mat3 depthKernel;\\r\\n\\r\\n\\r\\n depthKernel[0][0] = TSF( dx0, dy0 );\\r\\n depthKernel[0][1] = TSF( dx0, 0.0 );\\r\\n depthKernel[0][2] = TSF( dx0, dy1 );\\r\\n depthKernel[1][0] = TSF( 0.0, dy0 );\\r\\n depthKernel[1][1] = TSF( 0.0, 0.0 );\\r\\n depthKernel[1][2] = TSF( 0.0, dy1 );\\r\\n depthKernel[2][0] = TSF( dx1, dy0 );\\r\\n depthKernel[2][1] = TSF( dx1, 0.0 );\\r\\n depthKernel[2][2] = TSF( dx1, dy1 );\\r\\n\\r\\n // using 4 vector ops to save ALU\\r\\n // filter is done post dept/shadow compare\\r\\n vec3 shadowZ3 = vec3( shadowZ );\\r\\n kern[0] = vec3(lessThan(shadowZ3, depthKernel[0] ));\\r\\n kern[0] *= vec3(0.25);\\r\\n\\r\\n kern[1] = vec3(lessThan(shadowZ3, depthKernel[1] ));\\r\\n kern[1] *= vec3(0.25);\\r\\n\\r\\n kern[2] = vec3(lessThan(shadowZ3, depthKernel[2] ));\\r\\n kern[2] *= vec3(0.25);\\r\\n\\r\\n vec2 fractCoord = 1.0 - fract( uv.xy );\\r\\n\\r\\n kern[0] = mix( kern[1], kern[0], fractCoord.x );\\r\\n kern[1] = mix( kern[2], kern[1], fractCoord.x );\\r\\n\\r\\n vec4 sV;\\r\\n sV.x = mix( kern[0][1], kern[0][0], fractCoord.y );\\r\\n sV.y = mix( kern[0][2], kern[0][1], fractCoord.y );\\r\\n sV.z = mix( kern[1][1], kern[1][0], fractCoord.y );\\r\\n sV.w = mix( kern[1][2], kern[1][1], fractCoord.x );\\r\\n\\r\\n shadowed = dot( sV, vec4( 1.0 ) );\\r\\n\\r\\n#elif defined(_PCFx16)\\r\\n\\r\\n shadowed += step(shadowZ , getSingleFloatFromTex(tex, uv.xy + vec2(-2.0, -2.0)*o));\\r\\n shadowed += step(shadowZ , getSingleFloatFromTex(tex, uv.xy + vec2(-1.0, -2.0)*o));\\r\\n shadowed += step(shadowZ , getSingleFloatFromTex(tex, uv.xy + vec2(1.0, -2.0)*o));\\r\\n shadowed += step(shadowZ , getSingleFloatFromTex(tex, uv.xy + vec2(2.0, -2.0)*o));\\r\\n shadowed += step(shadowZ , getSingleFloatFromTex(tex, uv.xy + vec2(-2.0, -1.0)*o));\\r\\n shadowed += step(shadowZ , getSingleFloatFromTex(tex, uv.xy + vec2(-1.0, -1.0)*o));\\r\\n shadowed += step(shadowZ , getSingleFloatFromTex(tex, uv.xy + vec2(1.0, -1.0)*o));\\r\\n shadowed += step(shadowZ , getSingleFloatFromTex(tex, uv.xy + vec2(2.0, -1.0)*o));\\r\\n shadowed += step(shadowZ , getSingleFloatFromTex(tex, uv.xy + vec2(-2.0, 1.0)*o));\\r\\n shadowed += step(shadowZ , getSingleFloatFromTex(tex, uv.xy + vec2(-1.0, 1.0)*o));\\r\\n shadowed += step(shadowZ , getSingleFloatFromTex(tex, uv.xy + vec2(1.0, 1.0)*o));\\r\\n shadowed += step(shadowZ , getSingleFloatFromTex(tex, uv.xy + vec2(2.0, 1.0)*o));\\r\\n shadowed += step(shadowZ , getSingleFloatFromTex(tex, uv.xy + vec2(-2.0, 2.0)*o));\\r\\n shadowed += step(shadowZ , getSingleFloatFromTex(tex, uv.xy + vec2(-1.0, 2.0)*o));\\r\\n shadowed += step(shadowZ , getSingleFloatFromTex(tex, uv.xy + vec2(1.0, 2.0)*o));\\r\\n shadowed += step(shadowZ , getSingleFloatFromTex(tex, uv.xy + vec2(2.0, 2.0)*o));\\r\\n\\r\\n shadowed = shadowed / 16.0;\\r\\n#endif // pcfx16\\r\\n return shadowed;\\r\\n\\r\\n}\\r\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShadow/shaders/bandPCF.glsl\n ** module id = 266\n ** module chunks = 0 1\n **/","module.exports = \"\\r\\n\\r\\n#pragma include \\\"shadowLinearSoft.glsl\\\"\\r\\n\\r\\nfloat getShadowPCF(const in sampler2D depths, const in vec4 size, const in vec2 uv, const in float compare, const in vec2 biasPcf)\\r\\n{\\r\\n\\r\\n float res = 0.0;\\r\\n\\r\\n#if defined(_PCFx4)\\r\\n res += texture2DShadowLerp(depths, size, uv, compare);\\r\\n#else\\r\\n\\r\\n float dx0 = -size.z;\\r\\n float dy0 = -size.w;\\r\\n float dx1 = size.z;\\r\\n float dy1 = size.w;\\r\\n\\r\\n#define TSF(o1,o2) texture2DShadowLerp(depths, size, uv + vec2(o1, o2), compare)\\r\\n\\r\\n\\r\\n\\r\\n res += TSF(dx0, dx0);\\r\\n res += TSF(dx0, .0);\\r\\n res += TSF(dx0, dx1);\\r\\n\\r\\n res += TSF(.0, dx0);\\r\\n res += TSF(.0, .0);\\r\\n res += TSF(.0, dx1);\\r\\n\\r\\n res += TSF(dx1, dx0);\\r\\n res += TSF(dx1, .0);\\r\\n res += TSF(dx1, dx1);\\r\\n\\r\\n#if defined(_PCFx9)\\r\\n\\r\\n res /=9.0;\\r\\n\\r\\n#elif defined(_PCFx25)\\r\\n\\r\\n float dx02 = -2.0*size.z;\\r\\n float dy02 = -2.0*size.w;\\r\\n float dx2 = 2.0*size.z;\\r\\n float dy2 = 2.0*size.w;\\r\\n\\r\\n // complete row above\\r\\n res += TSF(dx0, dx02);\\r\\n res += TSF(dx0, dx2);\\r\\n\\r\\n res += TSF(.0, dx02);\\r\\n res += TSF(.0, dx2);\\r\\n\\r\\n res += TSF(dx1, dx02);\\r\\n res += TSF(dx1, dx2);\\r\\n\\r\\n // two new col\\r\\n res += TSF(dx02, dx02);\\r\\n res += TSF(dx02, dx0);\\r\\n res += TSF(dx02, .0);\\r\\n res += TSF(dx02, dx1);\\r\\n res += TSF(dx02, dx2);\\r\\n\\r\\n res += TSF(dx2, dx02);\\r\\n res += TSF(dx2, dx0);\\r\\n res += TSF(dx2, .0);\\r\\n res += TSF(dx2, dx1);\\r\\n res += TSF(dx2, dx2);\\r\\n\\r\\n\\r\\n res/=25.0;\\r\\n\\r\\n#endif\\r\\n\\r\\n#undef TSF\\r\\n\\r\\n#endif\\r\\n return res;\\r\\n}\\r\\n/////// end Tap\\r\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShadow/shaders/tapPCF.glsl\n ** module id = 267\n ** module chunks = 0 1\n **/","module.exports = \"//// hash glsl\\r\\n\\r\\n//note: value noise\\r\\nfloat hashNormalized11( const in float n )\\r\\n{\\r\\n return fract(sin(n)*43758.5453);\\r\\n}\\r\\n\\r\\n//note: normalized uniform random, [0;1[\\r\\nfloat hashNormalized21( const in vec2 n ) {\\r\\n return fract(sin(dot(n.xy, vec2(12.9898, 78.233)))* 43758.5453);\\r\\n}\\r\\n\\r\\nvec2 hashNormalized22( const in vec2 n )\\r\\n{\\r\\n return fract(sin(dot(n.xy, vec2(12.9898, 78.233)))* vec2(43758.5453,35458.5734));\\r\\n}\\r\\n\\r\\n//note: [-1;1]\\r\\n//note: honestly stolen from iq: https://www.shadertoy.com/view/Xsl3Dl\\r\\nvec3 hashNormalized33( in vec3 p )\\r\\n{\\r\\n p = vec3( dot(p,vec3(127.1,311.7, 74.7)),\\r\\n dot(p,vec3(269.5,183.3,246.1)),\\r\\n dot(p,vec3(113.5,271.9,124.6)));\\r\\n return fract(sin(p)*43758.5453123);\\r\\n}\\r\\n\\r\\n// Returns a random number based on a vec3 and an int.\\r\\nfloat hashNormalized41(const in vec4 seed){\\r\\n return fract(sin(dot(seed, vec4(12.9898,78.233,45.164,94.673)) * 43758.5453));\\r\\n}\\r\\n\\r\\n/////// end hash\\r\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShadow/shaders/hash.glsl\n ** module id = 268\n ** module chunks = 0 1\n **/","module.exports = \"vec2 poissonDisk[64];\\r\\n\\r\\npoissonDisk[0] = vec2(-0.613392, 0.617481);\\r\\npoissonDisk[1] = vec2(0.170019, -0.040254);\\r\\npoissonDisk[2] = vec2(-0.299417, 0.791925);\\r\\npoissonDisk[3] = vec2(0.645680, 0.493210);\\r\\npoissonDisk[4] = vec2(-0.651784, 0.717887);\\r\\npoissonDisk[5] = vec2(0.421003, 0.027070);\\r\\npoissonDisk[6] = vec2(-0.817194, -0.271096);\\r\\npoissonDisk[7] = vec2(-0.705374, -0.668203);\\r\\npoissonDisk[8] = vec2(0.977050, -0.108615);\\r\\npoissonDisk[9] = vec2(0.063326, 0.142369);\\r\\npoissonDisk[10] = vec2(0.203528, 0.214331);\\r\\npoissonDisk[11] = vec2(-0.667531, 0.326090);\\r\\npoissonDisk[12] = vec2(-0.098422, -0.295755);\\r\\npoissonDisk[13] = vec2(-0.885922, 0.215369);\\r\\npoissonDisk[14] = vec2(0.566637, 0.605213);\\r\\npoissonDisk[15] = vec2(0.039766, -0.396100);\\r\\npoissonDisk[16] = vec2(0.751946, 0.453352);\\r\\npoissonDisk[17] = vec2(0.078707, -0.715323);\\r\\npoissonDisk[18] = vec2(-0.075838, -0.529344);\\r\\npoissonDisk[19] = vec2(0.724479, -0.580798);\\r\\npoissonDisk[20] = vec2(0.222999, -0.215125);\\r\\npoissonDisk[21] = vec2(-0.467574, -0.405438);\\r\\npoissonDisk[22] = vec2(-0.248268, -0.814753);\\r\\npoissonDisk[23] = vec2(0.354411, -0.887570);\\r\\npoissonDisk[24] = vec2(0.175817, 0.382366);\\r\\npoissonDisk[25] = vec2(0.487472, -0.063082);\\r\\npoissonDisk[26] = vec2(-0.084078, 0.898312);\\r\\npoissonDisk[27] = vec2(0.488876, -0.783441);\\r\\npoissonDisk[28] = vec2(0.470016, 0.217933);\\r\\npoissonDisk[29] = vec2(-0.696890, -0.549791);\\r\\npoissonDisk[30] = vec2(-0.149693, 0.605762);\\r\\npoissonDisk[31] = vec2(0.034211, 0.979980);\\r\\npoissonDisk[32] = vec2(0.503098, -0.308878);\\r\\npoissonDisk[33] = vec2(-0.016205, -0.872921);\\r\\npoissonDisk[34] = vec2(0.385784, -0.393902);\\r\\npoissonDisk[35] = vec2(-0.146886, -0.859249);\\r\\npoissonDisk[36] = vec2(0.643361, 0.164098);\\r\\npoissonDisk[37] = vec2(0.634388, -0.049471);\\r\\npoissonDisk[38] = vec2(-0.688894, 0.007843);\\r\\npoissonDisk[39] = vec2(0.464034, -0.188818);\\r\\npoissonDisk[40] = vec2(-0.440840, 0.137486);\\r\\npoissonDisk[41] = vec2(0.364483, 0.511704);\\r\\npoissonDisk[42] = vec2(0.034028, 0.325968);\\r\\npoissonDisk[43] = vec2(0.099094, -0.308023);\\r\\npoissonDisk[44] = vec2(0.693960, -0.366253);\\r\\npoissonDisk[45] = vec2(0.678884, -0.204688);\\r\\npoissonDisk[46] = vec2(0.001801, 0.780328);\\r\\npoissonDisk[47] = vec2(0.145177, -0.898984);\\r\\npoissonDisk[48] = vec2(0.062655, -0.611866);\\r\\npoissonDisk[49] = vec2(0.315226, -0.604297);\\r\\npoissonDisk[50] = vec2(-0.780145, 0.486251);\\r\\npoissonDisk[51] = vec2(-0.371868, 0.882138);\\r\\npoissonDisk[52] = vec2(0.200476, 0.494430);\\r\\npoissonDisk[53] = vec2(-0.494552, -0.711051);\\r\\npoissonDisk[54] = vec2(0.612476, 0.705252);\\r\\npoissonDisk[55] = vec2(-0.578845, -0.768792);\\r\\npoissonDisk[56] = vec2(-0.772454, -0.090976);\\r\\npoissonDisk[57] = vec2(0.504440, 0.372295);\\r\\npoissonDisk[58] = vec2(0.155736, 0.065157);\\r\\npoissonDisk[59] = vec2(0.391522, 0.849605);\\r\\npoissonDisk[60] = vec2(-0.620106, -0.328104);\\r\\npoissonDisk[61] = vec2(0.789239, -0.419965);\\r\\npoissonDisk[62] = vec2(-0.545396, 0.538133);\\r\\npoissonDisk[63] = vec2(-0.178564, -0.596057);\\r\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShadow/shaders/arrayPoisson.glsl\n ** module id = 269\n ** module chunks = 0 1\n **/","module.exports = \"\\r\\n\\r\\n#pragma include \\\"shadowLinearSoft.glsl\\\"\\r\\n\\r\\n#pragma include \\\"hash.glsl\\\"\\r\\n\\r\\nfloat getShadowPCF(const in sampler2D tex, const in vec4 size, const in vec2 uv, const in float shadowZ, const in vec2 biasPcf) {\\r\\n\\r\\n vec2 o = size.zw;\\r\\n float s = 0.0;\\r\\n\\r\\n// Not Good, as it needs the lerp things\\r\\n#pragma include \\\"arrayPoisson.glsl\\\"\\r\\n\\r\\n int idx = 0;\\r\\n\\r\\n // Not Good, as it needs the lerp things\\r\\n#define TSF_BASE(p, m) texture2DShadowLerp(tex, size, uv + m*poissonDisk[p]*o, shadowZ)\\r\\n\\r\\n// fixed pattern in the shadow, no noise\\r\\n#define TSF_FIXED(i) TSF_BASE(i, 1.0)\\r\\n\\r\\n // rand using screenpos: No banding,\\\"moves\\\" camera\\r\\n#define TSF_SCREEN(i) TSF_BASE(i, hashNormalized22( float(i)*gl_FragCoord.xy ))\\r\\n\\r\\n//rand using worl proj +depth as world psace xyez\\r\\n#define TSF_SPACE(i) TSF_BASE(i, hashNormalized41(vec4(uv.xy, shadowZ, float(i))))\\r\\n\\r\\n#define TSF(k) TSF_SPACE(k)\\r\\n\\r\\n\\r\\n s += TSF(1);\\r\\n s += TSF(2);\\r\\n s += TSF(3);\\r\\n s += TSF(4);\\r\\n\\r\\n#ifdef _PCFx4\\r\\n const float kernSize = 4.;\\r\\n#else\\r\\n s += TSF(5);\\r\\n s += TSF(6);\\r\\n s += TSF(7);\\r\\n s += TSF(8);\\r\\n#ifdef _PCFx9\\r\\n const float kernSize = 8.;\\r\\n#else\\r\\n s += TSF(9);\\r\\n s += TSF(10);\\r\\n s += TSF(11);\\r\\n s += TSF(12);\\r\\n s += TSF(13);\\r\\n s += TSF(14);\\r\\n s += TSF(15);\\r\\n s += TSF(16);\\r\\n#ifdef _PCFx16\\r\\n const float kernSize = 16.;\\r\\n#else\\r\\n s += TSF(17);\\r\\n s += TSF(18);\\r\\n s += TSF(19);\\r\\n s += TSF(20);\\r\\n s += TSF(21);\\r\\n s += TSF(22);\\r\\n s += TSF(23);\\r\\n s += TSF(24);\\r\\n s += TSF(25);\\r\\n#ifdef _PCFx25\\r\\n const float kernSize = 25.;\\r\\n#else\\r\\n s += TSF(26);\\r\\n s += TSF(27);\\r\\n s += TSF(28);\\r\\n s += TSF(29);\\r\\n s += TSF(30);\\r\\n s += TSF(31);\\r\\n s += TSF(32);\\r\\n#ifdef _PCFx32\\r\\n const float kernSize = 32.;\\r\\n#endif // 32\\r\\n#endif // 25\\r\\n#endif // 16\\r\\n#endif // 8\\r\\n#endif // 4\\r\\n\\r\\n s /= kernSize;\\r\\n return s;\\r\\n}\\r\\n// end poisson\\r\\n#undef TSF\\r\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShadow/shaders/poissonPCF.glsl\n ** module id = 270\n ** module chunks = 0 1\n **/","module.exports = \"////////////////////////////////////////////////\\r\\n// ESM\\r\\nfloat fetchESM(const in sampler2D tex, const in vec4 shadowMapSize, const in vec2 shadowUV, const in float shadowZ, const in float exponent0, const in float exponent1) {\\r\\n\\r\\n\\r\\n#if defined(_FLOATTEX) && (!defined(_FLOATLINEAR))\\r\\n // emulate bilinear filtering (not needed if webgm/GPU support filtering FP32/FP16 textures)\\r\\n vec2 unnormalized = shadowUV * shadowMapSize.xy;\\r\\n vec2 fractional = fract(unnormalized);\\r\\n unnormalized = floor(unnormalized);\\r\\n\\r\\n vec4 occluder4;\\r\\n occluder4.x = getSingleFloatFromTex(tex, (unnormalized + vec2( -0.5, 0.5 ))* shadowMapSize.zw );\\r\\n occluder4.y = getSingleFloatFromTex(tex, (unnormalized + vec2( 0.5, 0.5 ))* shadowMapSize.zw );\\r\\n occluder4.z = getSingleFloatFromTex(tex, (unnormalized + vec2( 0.5, -0.5 ))* shadowMapSize.zw );\\r\\n occluder4.w = getSingleFloatFromTex(tex, (unnormalized + vec2( -0.5, -0.5 ))* shadowMapSize.zw );\\r\\n\\r\\n float occluder = (occluder4.w + (occluder4.x - occluder4.w) * fractional.y);\\r\\n occluder = occluder + ((occluder4.z + (occluder4.y - occluder4.z) * fractional.y) - occluder)*fractional.x;\\r\\n\\r\\n#else\\r\\n float occluder = getSingleFloatFromTex(tex, shadowUV);\\r\\n#endif\\r\\n\\r\\n\\r\\n // we're on an edge\\r\\n float depthScale = exponent1;\\r\\n float over_darkening_factor = exponent0;\\r\\n float receiver = depthScale * ( shadowZ);\\r\\n return 1.0 - clamp(over_darkening_factor*(occluder*exp(receiver)), 0.0, 1.0);\\r\\n}\\r\\n\\r\\n\\r\\nfloat computeShadow(const in bool lighted,\\r\\n in vec4 shadowVertexProjected,\\r\\n const in sampler2D tex,\\r\\n const in vec4 shadowMapSize,\\r\\n const in vec4 depthRange,\\r\\n const in vec3 LightPosition,\\r\\n const in float N_Dot_L,\\r\\n const in vec3 Normal,\\r\\n const in float bias,\\r\\n const in float exponent,\\r\\n const in float exponent1\\r\\n )\\r\\n{\\r\\n #pragma include \\\"shadowsReceiveMain.glsl\\\" \\\"_ESM\\\"\\r\\n}\\r\\n\\r\\n// end ESM\\r\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShadow/shaders/esm.glsl\n ** module id = 271\n ** module chunks = 0 1\n **/","module.exports = \"//////VSM\\r\\n//http://en.wikipedia.org/wiki/Chebyshev%27s_inequality\\r\\nfloat chebychevInequality (const in vec2 moments, const in float t)\\r\\n{\\r\\n // No shadow if depth of fragment is in front\\r\\n if ( t <= moments.x )\\r\\n return 1.0;\\r\\n\\r\\n // Calculate variance, which is actually the amount of\\r\\n // error due to precision loss from fp32 to RG/BA\\r\\n // (moment1 / moment2)\\r\\n float variance = moments.y - (moments.x * moments.x);\\r\\n variance = max(variance, 0.02);\\r\\n\\r\\n // Calculate the upper bound\\r\\n float d = t - moments.x;\\r\\n return variance / (variance + d * d);\\r\\n}\\r\\n\\r\\n// http://http.developer.nvidia.com/GPUGems3/gpugems3_ch08.html\\r\\nfloat chebyshevUpperBound(const in vec2 moments, const in float mean, const in float minVariance)\\r\\n{\\r\\n float d = mean - moments.x;\\r\\n if ( d <= 0.0 )\\r\\n return 1.0;\\r\\n // Compute variance\\r\\n float variance = moments.y - (moments.x * moments.x);\\r\\n variance = max(variance, minVariance);\\r\\n\\r\\n // Compute probabilistic upper bound\\r\\n //p represent an upper bound on the visibility percentage of the receiver. This value //attempts to estimate how much of the distribution of occluders at the surface location is //beyond the surface's distance from the light. If it is 0, then there is no probability //that the fragment is partially lit, so it will be fully in shadow. If it is a value in the //[0, 1] range, it represent the penumbrae value of the shadow edge.\\r\\n float p = smoothstep(mean, mean, moments.x);\\r\\n\\r\\n // Remove the [0, Amount] tail and linearly rescale (Amount, 1].\\r\\n /// light bleeding when shadows overlap.\\r\\n\\r\\n float pMax = smoothstep(0.2, 1.0, variance / (variance + d*d));\\r\\n // One-tailed chebyshev\\r\\n return clamp(max(p, pMax), 0.0, 1.0);\\r\\n}\\r\\n\\r\\n\\r\\nfloat computeShadow(const in bool lighted,\\r\\n in vec4 shadowVertexProjected,\\r\\n const in sampler2D tex,\\r\\n const in vec4 shadowMapSize,\\r\\n const in vec4 depthRange,\\r\\n const in vec3 LightPosition,\\r\\n const in float N_Dot_L,\\r\\n const in vec3 Normal,\\r\\n const in float bias,\\r\\n const in float epsilonVSM\\r\\n )\\r\\n{\\r\\n#pragma include \\\"shadowsReceiveMain.glsl\\\" \\\"_VSM\\\"\\r\\n}\\r\\n\\r\\n// end VSM\\r\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShadow/shaders/vsm.glsl\n ** module id = 272\n ** module chunks = 0 1\n **/","module.exports = \"// EVSM\\r\\n\\r\\n#pragma include \\\"vsm.glsl\\\"\\r\\n\\r\\n// Convert depth to EVSM coefficients\\r\\n// Input depth should be in [0, 1]\\r\\nvec2 warpDepth(const in float depth, const in vec2 exponents)\\r\\n{\\r\\n float pos = exp( exponents.x * depth);\\r\\n float neg = -exp(-exponents.y * depth);\\r\\n return vec2(pos, neg);\\r\\n}\\r\\n\\r\\n\\r\\nfloat computeShadow(const in bool lighted,\\r\\n in vec4 shadowVertexProjected,\\r\\n const in sampler2D\\r\\n tex,\\r\\n const in vec4 shadowMapSize,\\r\\n const in vec4 depthRange,\\r\\n const in vec3 LightPosition,\\r\\n const in float N_Dot_L,\\r\\n const in vec3 Normal,\\r\\n const in float bias,\\r\\n const in float epsilonVSM,\\r\\n const in float exponent,\\r\\n const in float exponent1\\r\\n )\\r\\n{\\r\\n #pragma include \\\"shadowsReceiveMain.glsl\\\" \\\"_EVSM\\\"\\r\\n}\\r\\n\\r\\n// _EVSM\\r\\n\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./sources/osgShadow/shaders/evsm.glsl\n ** module id = 273\n ** module chunks = 0 1\n **/"],"sourceRoot":""}