bg2e-js 2.0.0 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bg2e-js.js +11001 -0
- package/dist/bg2e-js.js.map +1 -0
- package/package.json +17 -6
- package/app/AppController.js +0 -32
- package/app/Canvas.js +0 -98
- package/app/EventBase.js +0 -8
- package/app/KeyboardEvent.js +0 -51
- package/app/MainLoop.js +0 -251
- package/app/MouseEvent.js +0 -77
- package/app/TouchEvent.js +0 -15
- package/base/Color.js +0 -131
- package/base/Environment.js +0 -78
- package/base/Light.js +0 -176
- package/base/Material.js +0 -619
- package/base/PolyList.js +0 -336
- package/base/Texture.js +0 -545
- package/db/Bg2LoaderPlugin.js +0 -113
- package/db/DBPluginApi.js +0 -40
- package/db/Loader.js +0 -91
- package/db/LoaderPlugin.js +0 -26
- package/db/MtlParser.js +0 -7
- package/db/ObjLoaderPlugin.js +0 -51
- package/db/ObjParser.js +0 -233
- package/db/ObjWriterPlugin.js +0 -18
- package/db/VitscnjLoaderPlugin.js +0 -87
- package/db/Writer.js +0 -49
- package/db/WriterPlugin.js +0 -20
- package/debug/DebugRenderer.js +0 -138
- package/debug/WebGLTextureViewer.js +0 -67
- package/manipulation/SelectionBuffer.js +0 -65
- package/manipulation/SelectionHighlight.js +0 -69
- package/manipulation/SelectionIdAssignVisitor.js +0 -86
- package/manipulation/SelectionManager.js +0 -134
- package/manipulation/SelectionMode.js +0 -6
- package/math/Mat3.js +0 -248
- package/math/Mat4.js +0 -694
- package/math/MatrixStrategy.js +0 -23
- package/math/Quat.js +0 -60
- package/math/Vec.js +0 -728
- package/math/constants.js +0 -44
- package/math/functions.js +0 -104
- package/math/index.js +0 -74
- package/phsics/joint.js +0 -124
- package/primitives/arrow.js +0 -58
- package/primitives/cone.js +0 -137
- package/primitives/cube.js +0 -59
- package/primitives/cylinder.js +0 -215
- package/primitives/index.js +0 -13
- package/primitives/plane.js +0 -31
- package/primitives/sphere.js +0 -808
- package/render/BRDFIntegrationMap.js +0 -4
- package/render/Environment.js +0 -105
- package/render/EnvironmentRenderer.js +0 -12
- package/render/FrameBuffer.js +0 -26
- package/render/MaterialRenderer.js +0 -28
- package/render/Pipeline.js +0 -83
- package/render/PolyListRenderer.js +0 -42
- package/render/RenderBuffer.js +0 -189
- package/render/RenderQueue.js +0 -162
- package/render/RenderState.js +0 -82
- package/render/Renderer.js +0 -202
- package/render/SceneAppController.js +0 -208
- package/render/SceneRenderer.js +0 -310
- package/render/Shader.js +0 -21
- package/render/ShadowRenderer.js +0 -159
- package/render/SkyCube.js +0 -77
- package/render/SkySphere.js +0 -94
- package/render/TextureMergerRenderer.js +0 -58
- package/render/TextureRenderer.js +0 -29
- package/render/webgl/FrameBuffer.js +0 -9
- package/render/webgl/MaterialRenderer.js +0 -99
- package/render/webgl/Pipeline.js +0 -82
- package/render/webgl/PolyListRenderer.js +0 -224
- package/render/webgl/RenderBuffer.js +0 -244
- package/render/webgl/Renderer.js +0 -239
- package/render/webgl/SceneRenderer.js +0 -43
- package/render/webgl/ShaderProgram.js +0 -348
- package/render/webgl/ShadowRenderer.js +0 -6
- package/render/webgl/SkyCube.js +0 -15
- package/render/webgl/SkySphere.js +0 -14
- package/render/webgl/State.js +0 -149
- package/render/webgl/TextureRenderer.js +0 -167
- package/render/webgl/VertexBuffer.js +0 -128
- package/scene/Camera.js +0 -378
- package/scene/Chain.js +0 -43
- package/scene/ChainJoint.js +0 -55
- package/scene/Component.js +0 -146
- package/scene/ComponentMap.js +0 -99
- package/scene/Drawable.js +0 -130
- package/scene/EnvironmentComponent.js +0 -123
- package/scene/FindNodeVisitor.js +0 -55
- package/scene/LightComponent.js +0 -146
- package/scene/MatrixState.js +0 -39
- package/scene/Node.js +0 -300
- package/scene/NodeVisitor.js +0 -12
- package/scene/OrbitCameraController.js +0 -407
- package/scene/SmoothOrbitCameraController.js +0 -92
- package/scene/Transform.js +0 -74
- package/scene/index.js +0 -24
- package/shaders/BasicDiffuseColorShader.js +0 -91
- package/shaders/BasicPBRLightShader.js +0 -238
- package/shaders/DebugRenderShader.js +0 -79
- package/shaders/DepthRenderShader.js +0 -69
- package/shaders/IrradianceMapCubeShader.js +0 -99
- package/shaders/PBRLightIBLShader.js +0 -380
- package/shaders/PickSelectionShader.js +0 -75
- package/shaders/PresentDebugFramebufferShader.js +0 -90
- package/shaders/PresentTextureShader.js +0 -73
- package/shaders/SelectionHighlightShader.js +0 -98
- package/shaders/ShaderFunction.js +0 -72
- package/shaders/SkyCubeShader.js +0 -78
- package/shaders/SkySphereShader.js +0 -77
- package/shaders/SpecularMapCubeShader.js +0 -145
- package/shaders/TextureMergerShader.js +0 -127
- package/shaders/webgl_shader_lib.js +0 -187
- package/tools/BinaryResourceProvider.js +0 -15
- package/tools/ImageResourceProvider.js +0 -65
- package/tools/MaterialModifier.js +0 -228
- package/tools/Resource.js +0 -177
- package/tools/ResourceProvider.js +0 -56
- package/tools/TextResourceProvider.js +0 -24
- package/tools/TextureCache.js +0 -44
- package/tools/TextureResourceDatabase.js +0 -87
- package/tools/UserAgent.js +0 -294
- package/tools/VideoResourceProvider.js +0 -51
- package/tools/WriteStrategy.js +0 -22
- package/tools/base64.js +0 -15
- package/tools/crypto.js +0 -15
- package/tools/endiantess.js +0 -15
- package/tools/image.js +0 -15
- package/tools/index.js +0 -33
- package/tools/processType.js +0 -56
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bg2e-js.js","sources":["../src/math/constants.js","../src/math/functions.js","../src/math/index.js","../src/math/Vec.js","../src/math/Mat3.js","../src/math/Mat4.js","../src/math/Quat.js","../src/math/MatrixStrategy.js","../src/tools/crypto.js","../src/tools/endiantess.js","../src/tools/UserAgent.js","../src/tools/processType.js","../src/tools/base64.js","../src/tools/ResourceProvider.js","../src/tools/ImageResourceProvider.js","../src/tools/VideoResourceProvider.js","../src/tools/BinaryResourceProvider.js","../src/tools/TextResourceProvider.js","../src/tools/Resource.js","../src/tools/index.js","../src/db/LoaderPlugin.js","../src/base/Color.js","../src/base/PolyList.js","../src/tools/image.js","../src/app/Canvas.js","../src/base/Texture.js","../src/tools/TextureCache.js","../src/base/Material.js","../src/render/Shader.js","../src/render/webgl/ShaderProgram.js","../src/shaders/PresentTextureShader.js","../src/shaders/IrradianceMapCubeShader.js","../src/shaders/SpecularMapCubeShader.js","../src/render/Environment.js","../src/shaders/TextureMergerShader.js","../src/render/TextureMergerRenderer.js","../src/render/Renderer.js","../src/scene/Component.js","../src/scene/ComponentMap.js","../src/scene/Node.js","../src/db/VitscnjLoaderPlugin.js","../src/scene/Drawable.js","../../../node_modules/bg2io/Bg2ioBrowser.js","../src/db/Bg2LoaderPlugin.js","../src/db/DBPluginApi.js","../src/db/Loader.js","../src/db/MtlParser.js","../src/db/ObjParser.js","../src/db/ObjLoaderPlugin.js","../src/db/WriterPlugin.js","../src/db/ObjWriterPlugin.js","../src/db/Writer.js","../src/db/index.js","../src/base/Environment.js","../src/base/Light.js","../src/base/index.js","../src/scene/NodeVisitor.js","../src/scene/Transform.js","../src/scene/Chain.js","../src/phsics/joint.js","../src/scene/ChainJoint.js","../src/scene/FindNodeVisitor.js","../src/scene/LightComponent.js","../src/scene/Camera.js","../src/app/EventBase.js","../src/app/KeyboardEvent.js","../src/app/MouseEvent.js","../src/scene/OrbitCameraController.js","../src/scene/SmoothOrbitCameraController.js","../src/scene/EnvironmentComponent.js","../src/scene/index.js","../src/app/AppController.js","../src/app/TouchEvent.js","../src/app/MainLoop.js","../src/app/index.js","../src/render/EnvironmentRenderer.js","../src/render/FrameBuffer.js","../src/render/MaterialRenderer.js","../src/render/Pipeline.js","../src/render/PolyListRenderer.js","../src/render/RenderBuffer.js","../src/render/RenderState.js","../src/render/RenderQueue.js","../src/render/SceneRenderer.js","../src/shaders/PickSelectionShader.js","../src/shaders/ShaderFunction.js","../src/shaders/webgl_shader_lib.js","../src/shaders/SelectionHighlightShader.js","../src/manipulation/SelectionHighlight.js","../src/manipulation/SelectionBuffer.js","../src/manipulation/SelectionMode.js","../src/manipulation/SelectionIdAssignVisitor.js","../src/manipulation/SelectionManager.js","../src/primitives/cube.js","../src/primitives/sphere.js","../src/primitives/cylinder.js","../src/primitives/cone.js","../src/primitives/plane.js","../src/primitives/arrow.js","../src/primitives/index.js","../src/shaders/BasicDiffuseColorShader.js","../src/shaders/DebugRenderShader.js","../src/shaders/PresentDebugFramebufferShader.js","../src/debug/DebugRenderer.js","../src/render/SceneAppController.js","../src/shaders/DepthRenderShader.js","../src/render/ShadowRenderer.js","../src/shaders/SkyCubeShader.js","../src/render/SkyCube.js","../src/shaders/SkySphereShader.js","../src/render/SkySphere.js","../src/render/TextureRenderer.js","../src/render/webgl/FrameBuffer.js","../src/render/BRDFIntegrationMap.js","../src/tools/TextureResourceDatabase.js","../src/render/webgl/MaterialRenderer.js","../src/render/webgl/Pipeline.js","../src/render/webgl/VertexBuffer.js","../src/render/webgl/PolyListRenderer.js","../src/render/webgl/RenderBuffer.js","../src/shaders/webgl/color_correction.glsl?raw","../src/shaders/webgl/constants.glsl?raw","../src/shaders/webgl/normal_map.glsl?raw","../src/shaders/webgl/pbr.glsl?raw","../src/shaders/webgl/uniforms.glsl?raw","../src/shaders/webgl/index.js","../src/shaders/PBRLightIBLShader.js","../src/render/webgl/SceneRenderer.js","../src/render/webgl/ShadowRenderer.js","../src/render/webgl/SkyCube.js","../src/render/webgl/SkySphere.js","../src/render/webgl/State.js","../src/render/webgl/TextureRenderer.js","../src/render/webgl/index.js","../src/render/webgl/Renderer.js","../src/render/index.js","../src/shaders/BasicPBRLightShader.js","../src/shaders/index.js","../src/debug/WebGLTextureViewer.js","../src/debug/index.js","../src/index.js"],"sourcesContent":["\nexport const Axis = {\n\tNONE: 0,\n\tX: 1,\n\tY: 2,\n\tZ: 3,\n name: (axis) => {\n switch (axis) {\n case Axis.NONE:\n return \"NONE\";\n case Axis.X:\n return \"X\";\n case Axis.Y:\n return \"Y\";\n case Axis.Z:\n return \"Z\";\n case Axis.W:\n return \"W\";\n default:\n return \"UNKNOWN\"\n };\n }\n};\n\nexport const PI = 3.141592653589793;\nexport const DEG_TO_RAD = 0.01745329251994;\nexport const RAD_TO_DEG = 57.29577951308233;\nexport const PI_2 = 1.5707963267948966;\nexport const PI_4 = 0.785398163397448;\nexport const PI_8 = 0.392699081698724;\nexport const TWO_PI = 6.283185307179586;\nexport const EPSILON = 0.0000001;\n\n// Default array: 32 bits\nexport const NumericArray = Float32Array;\nexport const NumericArrayHighP = Float64Array;\nexport const FLOAT_MAX = 3.402823e38;\n\nexport const checkArray = (array, length) => {\n if (array.length >= length) {\n return true;\n }\n return false;\n}","\nimport {\n EPSILON,\n DEG_TO_RAD,\n RAD_TO_DEG\n} from './constants.js';\n\nlet s_bg_math_seed = Date.now();\n\nexport const checkPowerOfTwo = (n) => {\n if (typeof n !== 'number') {\n return false;\n }\n else {\n return n && (n & (n - 1)) === 0;\n } \n}\n\nexport const checkZero = (v) => {\n return v>-EPSILON && v<EPSILON ? 0:v;\n}\n\nexport const isZero = (v) => {\n return checkZero(v) === 0;\n}\n\nexport const equals = (a,b) => {\n return Math.abs(a - b) < EPSILON;\n}\n\nexport const degreesToRadians = (d) => {\n return Math.fround(checkZero(d * DEG_TO_RAD));\n}\n\nexport const radiansToDegrees = (r) => {\n return Math.fround(checkZero(r * RAD_TO_DEG));\n}\n\nexport const sin = (val) => {\n return Math.fround(checkZero(Math.sin(val)));\n}\n\nexport const cos = (val) => {\n return Math.fround(checkZero(Math.cos(val)));\n}\n\nexport const tan = (val) => {\n return Math.fround(checkZero(Math.tan(val)));\n}\n\nexport const cotan = (val) => {\n return Math.fround(checkZero(1.0 / tan(val)));\n}\n\nexport const atan = (val) => {\n return Math.fround(checkZero(Math.atan(val)));\n}\n\nexport const atan2 = (i, j) => {\n return Math.fround(checkZero(Math.atan2f(i, j)));\n}\n\nexport const random = () => {\n return Math.random();\n}\n\nexport const seededRandom = () => {\n const max = 1;\n const min = 0;\n \n s_bg_math_seed = (s_bg_math_seed * 9301 + 49297) % 233280;\n const rnd = s_bg_math_seed / 233280;\n \n return min + rnd * (max - min);\n}\n\nexport const max = (a,b) => {\n return Math.fround(Math.max(a,b));\n}\n\nexport const min = (a,b) => {\n return Math.fround(Math.min(a,b));\n}\n\nexport const abs = (val) => {\n return Math.fround(Math.abs(val));\n}\n\nexport const sqrt = (val) => {\n return Math.fround(Math.sqrt(val));\n}\n\nexport const lerp = (from, to, t) => {\n t = t > 1 ? 1 : t;\n return Math.fround((1.0 - t) * from + t * to);\n}\n\nexport const square = (n) => {\n return Math.fround(n * n);\n}\n\nexport const clamp = (value, min, max) => {\n return Math.fround(Math.max(min, Math.min(value, max)));\n}\n","\nimport {\n Axis,\n PI,\n DEG_TO_RAD,\n RAD_TO_DEG,\n PI_2,\n PI_4,\n PI_8,\n TWO_PI,\n EPSILON,\n NumericArray,\n NumericArrayHighP,\n FLOAT_MAX\n} from \"./constants.js\";\n\nimport {\n checkPowerOfTwo,\n checkZero,\n isZero,\n equals,\n degreesToRadians,\n radiansToDegrees,\n sin,\n cos,\n tan,\n cotan,\n atan,\n atan2,\n random,\n seededRandom,\n max,\n min,\n abs,\n sqrt,\n lerp,\n square\n} from \"./functions.js\";\n\nexport default {\n Axis,\n PI,\n DEG_TO_RAD,\n RAD_TO_DEG,\n PI_2,\n PI_4,\n PI_8,\n TWO_PI,\n EPSILON,\n NumericArray,\n NumericArrayHighP,\n FLOAT_MAX,\n\n checkPowerOfTwo,\n checkZero,\n isZero,\n equals,\n degreesToRadians,\n radiansToDegrees,\n sin,\n cos,\n tan,\n cotan,\n atan,\n atan2,\n random,\n seededRandom,\n max,\n min,\n abs,\n sqrt,\n lerp,\n square\n};\n","\nimport { NumericArray } from \"./constants\";\nimport { isZero, equals, lerp, clamp } from \"./functions\";\n\nconst checkEqualLength = (v1,v2) => {\n if (v1.length!=v2.length) throw new Error(`Invalid vector length in operation`);\n}\n\nexport default class Vec extends NumericArray {\n constructor() {\n switch (arguments.length) {\n case 0:\n super([0, 0]);\n break;\n case 1:\n if (arguments[0].length>1 && arguments[0].length<5)\n {\n super(arguments[0]);\n }\n break;\n case 2:\n if (arguments[0].length === 2 && typeof(arguments[1]) === \"number\"\n ) {\n super([ arguments[0][0], arguments[0][1], arguments[1]]);\n }\n else if (arguments[0].length === 3 &&\n typeof(arguments[1]) === \"number\"\n ) {\n super([ arguments[0][0], arguments[0][1], arguments[0][2], arguments[1]]);\n }\n else if (typeof(arguments[0]) === \"number\" &&\n typeof(arguments[1]) === \"number\"\n ) {\n super([arguments[0],arguments[1]]);\n }\n break;\n case 3:\n if (arguments[0].length === 2 &&\n typeof(arguments[1]) === \"number\" && typeof(arguments[2]) === \"number\"\n ) {\n super([ arguments[0][0], arguments[0][1], arguments[1], arguments[2]])\n }\n else if (typeof(arguments[0]) === \"number\" &&\n typeof(arguments[1]) === \"number\" &&\n typeof(arguments[2]) === \"number\"\n ) {\n super([arguments[0],arguments[1],arguments[2]]);\n }\n break;\n case 4:\n super([arguments[0],arguments[1],arguments[2],arguments[3]]);\n break;\n default:\n throw new Error(`Invalid parameters in Vec constructor`);\n }\n }\n\n normalize() {\n const m = Vec.Magnitude(this);\n switch (this.length) {\n case 4:\n this[3] = this[3] / m;\n case 3:\n this[2] = this[2] / m;\n case 2:\n this[1] = this[1] / m; \n this[0] = this[0] / m;\n break;\n default:\n throw new Error(`Invalid vector size: ${ this.length }`);\n }\n return this;\n }\n\n assign(src) {\n checkEqualLength(this,src);\n switch (this.length) {\n case 4:\n this[3] = src[3];\n case 3:\n this[2] = src[2];\n case 2:\n this[1] = src[1];\n this[0] = src[0];\n break;\n default:\n throw new Error(`Invalid vector size: ${ this.length }`);\n }\n }\n\n set(x, y, z = null, w = null) {\n if (this.length === 2) {\n this[0] = x;\n this[1] = y;\n }\n else if (this.length === 3 && z !== null) {\n this[0] = x;\n this[1] = y;\n this[2] = z;\n }\n else if (this.length === 4 && w !== null) {\n this[0] = x;\n this[1] = y;\n this[2] = z;\n this[3] = w;\n }\n else {\n throw new Error(`Invalid vector size: ${ this.length }. Trying to set x=${x}, y=${y}, z=${z}, w=${w}`);\n }\n }\n\n scale(s) {\n switch (this.length) {\n case 4:\n this[3] = this[3] * s;\n case 3:\n this[2] = this[2] * s;\n case 2:\n this[1] = this[1] * s;\n this[0] = this[0] * s;\n break;\n default:\n throw new Error(`Invalid vector size: ${ v.length }`);\n }\n return this;\n }\n\n get x() {\n return this[0];\n }\n\n get y() {\n return this[1];\n }\n\n get z() {\n return this[2];\n }\n\n get w() {\n return this[3];\n }\n\n set x(v) {\n this[0] = v;\n return this;\n }\n\n set y(v) {\n this[1] = v;\n return this;\n }\n\n set z(v) {\n this[2] = v;\n return this;\n }\n\n set w(v) {\n this[3] = v;\n return this;\n }\n\n get r() {\n return this[0];\n }\n\n get g() {\n return this[1];\n }\n\n get b() {\n return this[2];\n }\n\n get a() {\n return this[3];\n }\n\n set r(v) {\n this[0] = v;\n return this;\n }\n\n set g(v) {\n this[1] = v;\n return this;\n }\n\n set b(v) {\n this[2] = v;\n return this;\n }\n\n set a(v) {\n this[3] = v;\n return this;\n }\n\n get width() {\n switch (this.length) {\n case 2:\n return this[0];\n case 4:\n return this[2];\n default:\n throw new Error(\"Vec.width function used on non size or viewport vectors (two or four elements)\");\n }\n }\n\n get height() {\n switch (this.length) {\n case 2:\n return this[1];\n case 4:\n return this[3];\n default:\n throw new Error(\"Vec.width function used on non size or viewport vectors (two or four elements)\");\n }\n }\n\n set width(w) {\n this[0] = w;\n return this;\n }\n\n set height(h) {\n this[1] = h;\n return this;\n }\n \n get xy() {\n switch (this.length) {\n case 2:\n return new Vec(this);\n case 3:\n case 4:\n return new Vec(this[0], this[1]);\n default:\n throw new Error(`Invalid vector size: ${ this.length }`);\n }\n }\n\n get xz() {\n switch (this.length) {\n case 3:\n case 4:\n return new Vec(this[0], this[2]);\n case 2:\n default:\n throw new Error(`Invalid vector size: ${ this.length }`);\n }\n }\n\n get yz() {\n switch (this.length) {\n case 3:\n case 4:\n return new Vec(this[1], this[2]);\n case 2:\n default:\n throw new Error(`Invalid vector size: ${ this.length }`);\n }\n }\n\n set xy(v) {\n this[0] = v[0];\n this[1] = v[1];\n return this;\n }\n\n set xz(v) {\n if (this.length<3) {\n throw new Error('Invalid vector size');\n }\n this[0] = v[0];\n this[2] = v[1];\n return this;\n }\n\n set yz(v) {\n if (this.length<3) {\n throw new Error('Invalid vector size');\n }\n this[1] = v[0];\n this[2] = v[1];\n return this;\n }\n\n get xyz() {\n if (this.length < 3) {\n throw new Error(`Invalid vector size: ${ this.length }`);\n }\n return new Vec(this[0], this[1], this[2]);\n }\n\n set xyz(v) {\n if (v.length<3 || this.length<3) {\n throw new Error(`Invalid vector size to set: l;${ this.length }, r:${v.length}`);\n }\n this[0] = v[0];\n this[1] = v[1];\n this[2] = v[2];\n return this;\n }\n\n // Copy operator\n get xyzw() {\n if (this.length < 4) {\n throw new Error(`Invalid vector size: ${ this.length }, 4 required`);\n }\n return new Vec(this[0], this[1], this[2], this[3]);\n }\n\n // Assign operator\n set xyzw(v) {\n if (this.length < 4 || v.length<4) {\n throw new Error(`Invalid vector size to set: l;${ this.length }, r:${v.length}`);\n }\n this[0] = v[0];\n this[1] = v[1];\n this[2] = v[2];\n this[3] = v[3];\n return this;\n }\n\n get rgb() {\n if (this.length < 3) {\n throw new Error(`Invalid vector size: ${this.length}, but at least 3 required`);\n }\n return new Vec(this[0],this[1],this[2]);\n }\n\n set rgb(v) {\n if (v.length<3 || this.length<3) {\n throw new Error(`Invalid vector size to set: l;${ this.length }, r:${v.length}`);\n }\n this[0] = v[0];\n this[1] = v[1];\n this[2] = v[2];\n return this;\n }\n\n get rg() {\n if (v.length<3 || this.length<3) {\n throw new Error(`Invalid vector size to set: l;${ this.length }, r:${v.length}`);\n }\n return new Vec(this[0], this[1]);\n }\n\n get gb() {\n if (v.length<3 || this.length<3) {\n throw new Error(`Invalid vector size to set: l;${ this.length }, r:${v.length}`);\n }\n return new Vec(this[1], this[2]);\n }\n\n get rb() {\n if (v.length<3 || this.length<3) {\n throw new Error(`Invalid vector size to set: l;${ this.length }, r:${v.length}`);\n }\n return new Vec(this[0], this[2]);\n }\n\n get hexColor() {\n const r = Math.round(this.r * 255);\n const g = Math.round(this.g * 255);\n const b = Math.round(this.b * 255);\n const hex = (color) => color.toString(16).toUpperCase();\n return `#${ hex(r) }${ hex(g) }${ hex(b) }`;\n }\n\n get cssColor() {\n // Return rgb(x,y,z) or rgba(x,y,z,w);\n }\n\n get aspectRatio() {\n return this.width / this.height;\n }\n\n toString() {\n switch (this.length) {\n case 2:\n return `[${this[0]}, ${this[1]}]`;\n case 3:\n return `[${this[0]}, ${this[1]}, ${this[2]}]`;\n case 4:\n return `[${this[0]}, ${this[1]}, ${this[2]}, ${this[3]}]`;\n }\n }\n\n static CheckEqualLength(v1,v2) {\n checkEqualLength(v1,v2);\n }\n\n static Max(v1,v2) {\n checkEqualLength(v1,v2);\n switch (v1.length) {\n case 2:\n return new Vec([\n v1[0]>v2[0] ? v1[0] : v2[0],\n v1[1]>v2[1] ? v1[1] : v2[1]\n ]);\n case 3:\n return new Vec([\n v1[0]>v2[0] ? v1[0] : v2[0],\n v1[1]>v2[1] ? v1[1] : v2[1],\n v1[2]>v2[2] ? v1[2] : v2[2]\n ]);\n case 4:\n return new Vec([\n v1[0]>v2[0] ? v1[0] : v2[0],\n v1[1]>v2[1] ? v1[1] : v2[1],\n v1[2]>v2[2] ? v1[2] : v2[2],\n v1[3]>v2[3] ? v1[3] : v2[3]\n ]);\n default:\n throw new Error(`Invalid vector size: ${ v1.length }`);\n }\n }\n\n static Min(v1,v2) {\n checkEqualLength(v1,v2);\n switch (v1.length) {\n case 2:\n return new Vec([\n v1[0]<v2[0] ? v1[0] : v2[0],\n v1[1]<v2[1] ? v1[1] : v2[1]\n ]);\n case 3:\n return new Vec([\n v1[0]<v2[0] ? v1[0] : v2[0],\n v1[1]<v2[1] ? v1[1] : v2[1],\n v1[2]<v2[2] ? v1[2] : v2[2]\n ]);\n case 4:\n return new Vec([\n v1[0]<v2[0] ? v1[0] : v2[0],\n v1[1]<v2[1] ? v1[1] : v2[1],\n v1[2]<v2[2] ? v1[2] : v2[2],\n v1[3]<v2[3] ? v1[3] : v2[3]\n ]);\n default:\n throw new Error(`Invalid vector size: ${ v1.length }`);\n }\n }\n\n static Add(v1,v2) {\n checkEqualLength(v1,v2);\n switch (v1.length) {\n case 2:\n return new Vec([\n v1[0] + v2[0],\n v1[1] + v2[1]\n ]);\n case 3:\n return new Vec([\n v1[0] + v2[0],\n v1[1] + v2[1],\n v1[2] + v2[2]\n ]);\n case 4:\n return new Vec([\n v1[0] + v2[0],\n v1[1] + v2[1],\n v1[2] + v2[2],\n v1[3] + v2[3]\n ]);\n default:\n throw new Error(`Invalid vector size: ${ v1.length }`);\n }\n }\n\n static Sub(v1,v2) {\n checkEqualLength(v1,v2);\n switch (v1.length) {\n case 2:\n return new Vec([\n v1[0] - v2[0],\n v1[1] - v2[1]\n ]);\n case 3:\n return new Vec([\n v1[0] - v2[0],\n v1[1] - v2[1],\n v1[2] - v2[2]\n ]);\n case 4:\n return new Vec([\n v1[0] - v2[0],\n v1[1] - v2[1],\n v1[2] - v2[2],\n v1[3] - v2[3]\n ]);\n default:\n throw new Error(`Invalid vector size: ${ v1.length }`);\n }\n }\n\n static Magnitude(v) {\n switch (v.length) {\n case 2:\n return Math.sqrt(v[0] * v[0] + v[1] * v[1]);\n case 3:\n return Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);\n case 4:\n return Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2] + v[3] * v[3]);\n default:\n throw new Error(`Invalid vector size: ${ v.length }`);\n }\n }\n\n static Distance(v1,v2) {\n checkEqualLength(v1,v2);\n return Vec.Magnitude(Vec.Sub(v1,v2));\n }\n\n static Dot(v1,v2) {\n checkEqualLength(v1,v2);\n switch (v1.length) {\n case 2:\n return v1[0] * v2[0] + v1[1] * v2[1];\n case 3:\n return v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2];\n case 4:\n return v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2] + v1[3] * v2[3];\n default:\n throw new Error(`Invalid vector size: ${ v1.length }`);\n }\n }\n\n static Cross(v1,v2) {\n checkEqualLength(v1,v2);\n switch (v1.length) {\n case 2:\n return v1[0] * v2[1] - v1[1] - v2[0];\n case 3:\n return new Vec([\n v1[1] * v2[2] - v1[2] * v2[1],\n v1[2] * v2[0] - v1[0] * v2[2],\n v1[0] * v2[1] - v1[1] * v2[0],\n ]);\n default:\n throw new Error(`Invalid vector size for cross product: ${ v1.length }`);\n }\n }\n\n static Normalized(v) {\n const m = Vec.Magnitude(v);\n switch (v.length) {\n case 2:\n return new Vec([ v[0] / m, v[1] / m ]);\n case 3:\n return new Vec([ v[0] / m, v[1] / m, v[2] / m ]);\n case 4:\n return new Vec([ v[0] / m, v[1] / m, v[2] / m, v[3] / m ])\n default:\n throw new Error(`Invalid vector size: ${ v.length }`);\n }\n }\n\n static Mult(v,s) {\n switch (v.length) {\n case 2:\n return new Vec([ v[0] * s, v[1] * s ]);\n case 3:\n return new Vec([ v[0] * s, v[1] * s, v[2] * s ]);\n case 4:\n return new Vec([ v[0] * s, v[1] * s, v[2] * s, v[3] * s ]);\n default:\n throw new Error(`Invalid vector size: ${ v.length }`);\n }\n }\n\n static Div(v,s) {\n switch (v.length) {\n case 2:\n return new Vec([ v[0] / s, v[1] / s ]);\n case 3:\n return new Vec([ v[0] / s, v[1] / s, v[2] / s ]);\n case 4:\n return new Vec([ v[0] / s, v[1] / s, v[2] / s, v[3] / s ]);\n default:\n throw new Error(`Invalid vector size: ${ v.length }`);\n }\n }\n\n static Distance(v1,v2) {\n if (v1.length != v2.length) {\n throw new Error(`Different vector sizes calculating distance`);\n }\n else {\n switch (v1.length) {\n case 2:\n {\n const a = v1[0] - v2[0];\n const b = v1[1] - v2[1];\n return Math.sqrt(a * a + b * b);\n }\n case 3:\n {\n const a = v1[0] - v2[0];\n const b = v1[1] - v2[1];\n const c = v1[2] - v2[2];\n return Math.sqrt(a * a + b * b + c * c);\n }\n default:\n throw new Error(`Invalid vector size: ${ v1.length }`);\n }\n }\n }\n\n static Equals(v1,v2) {\n if (v1.length != v2.length) {\n return false;\n }\n else {\n switch (v1.length) {\n case 2:\n return equals(v1[0], v2[0]) &&\n equals(v1[1], v2[1]);\n case 3:\n return equals(v1[0], v2[0]) &&\n equals(v1[1], v2[1]) &&\n equals(v1[2], v2[2]);\n case 4:\n return equals(v1[0], v2[0]) &&\n equals(v1[1], v2[1]) &&\n equals(v1[2], v2[2]) &&\n equals(v1[3], v2[3]);\n default:\n throw new Error(`Invalid vector size: ${ v1.length }`);\n }\n }\n }\n\n static IsZero(v) {\n switch (v.length) {\n case 2:\n return isZero(v[0]) || isZero(v[1]);\n case 3:\n return isZero(v[0]) || isZero(v[1]) || isZero(v[2]);\n case 4:\n return isZero(v[0]) || isZero(v[1]) || isZero(v[2]) || isZero(v[3]);\n default:\n throw new Error(`Invalid vector size: ${ v.length }`);\n }\n }\n\n static IsNaN(v) {\n switch (v.length) {\n case 2:\n return isNaN(v[0]) || isNaN(v[1]);\n case 3:\n return isNaN(v[0]) || isNaN(v[1]) || isNaN(v[2]);\n case 4:\n return isNaN(v[0]) || isNaN(v[1]) || isNaN(v[2]) || isNaN(v[3]);\n default:\n throw new Error(`Invalid vector size: ${ v.length }`);\n }\n }\n\n static Lerp(u,v,d) {\n if (u.length != v.length) {\n throw new Error(`Different vector sizes calculating linear interpolation`);\n }\n switch (u.length) {\n case 2:\n return new Vec(\n lerp(u[0], v[0], d),\n lerp(u[1], v[1], d)\n );\n case 3:\n return new Vec(\n lerp(u[0], v[0], d),\n lerp(u[1], v[1], d),\n lerp(u[2], v[2], d)\n );\n case 4:\n return new Vec(\n lerp(u[0], v[0], d),\n lerp(u[1], v[1], d),\n lerp(u[2], v[2], d),\n lerp(u[3], v[3], d)\n );\n default:\n throw new Error(`Invalid vector size: ${ u.length }`);\n }\n }\n\n static Clamp(v, min, max) {\n switch (v.length) {\n case 2:\n return new Vec(\n clamp(v[0], min[0], max[0]),\n clamp(v[1], min[1], max[1])\n );\n case 3:\n return new Vec(\n clamp(v[0], min[0], max[0]),\n clamp(v[1], min[1], max[1]),\n clamp(v[2], min[2], max[2])\n );\n case 4:\n return new Vec(\n clamp(v[0], min[0], max[0]),\n clamp(v[1], min[1], max[1]),\n clamp(v[2], min[2], max[2]),\n clamp(v[3], min[3], max[3])\n );\n default:\n throw new Error(`Invalid vector size: ${ u.length }`);\n }\n }\n\n /////// Constructors\n static Vec2() {\n return new Vec(0,0);\n }\n\n static Vec3() {\n return new Vec(0,0,0);\n }\n\n static Vec4() {\n return new Vec(0,0,0,0);\n }\n}\n","import { NumericArray } from \"./constants\";\nimport Vec from \"./Vec\";\nimport { isZero, equals } from \"./functions\";\n\nexport default class Mat3 extends NumericArray {\n constructor() {\n if (arguments.length === 9) {\n super(arguments);\n }\n else if (arguments.length === 1 && arguments[0].length === 9) {\n super(arguments[0]);\n }\n else if (arguments.length === 0) {\n super([0,0,0,0,0,0,0,0,0]);\n }\n else {\n throw new Error(`Invalid parameter size in Mat3 constructor`);\n }\n }\n\n identity() {\n this[0] = 1; this[1] = 0; this[2] = 0;\n this[3] = 0; this[4] = 1; this[5] = 0;\n this[6] = 0; this[7] = 0; this[8] = 1;\n return this;\n }\n\n zero() {\n this[0] = 0; this[1] = 0; this[2] = 0;\n this[3] = 0; this[4] = 0; this[5] = 0;\n this[6] = 0; this[7] = 0; this[8] = 0;\n return this;\n }\n\n row(i) {\n return new Vec(\n this[i * 3], \n this[i * 3 + 1],\n this[ i* 3 + 2]);\n }\n\n setRow(i, a, y = null, z = null) {\n if (a?.length>=3) {\n this[i * 3] = a[0];\n this[i * 3 + 1] = a[1];\n this[i * 3 + 2] = a[2];\n }\n else if (typeof(a) === \"number\" && \n typeof(y) === \"number\" && \n typeof(z) === \"number\"\n ) {\n this[i * 3] = a;\n this[i * 3 + 1] = y;\n this[i * 3 + 2] = z;\n }\n else {\n throw new Error(`Invalid parameter setting matrix row`);\n }\n return this;\n }\n\n col(i) {\n return new Vec(\n this[i],\n this[i + 3],\n this[i + 3 * 2]\n )\n }\n\n setCol(i, a, y = null, z = null) {\n if (a?.length>=3) {\n this[i] = a[0];\n this[i + 3] = a[1];\n this[i + 3 * 2] = a[2];\n }\n else if (typeof(a) === \"number\" && \n typeof(y) === \"number\" && \n typeof(z) === \"number\"\n ) {\n this[i] = a;\n this[i + 3] = y;\n this[i + 3 * 2] = z;\n }\n else {\n throw new Error(`Invalid parameter setting matrix row`);\n }\n return this;\n }\n\n assign(m) {\n if (m.length === 9) {\n this[0] = m[0]; this[1] = m[1]; this[2] = m[2];\n\t\t\tthis[3] = m[3]; this[4] = m[4]; this[5] = m[5];\n\t\t\tthis[6] = m[6]; this[7] = m[7]; this[8] = m[8];\n }\n else if (m.length === 16) {\n this[0] = m[0]; this[1] = m[1]; this[2] = m[2];\n\t\t\tthis[3] = m[4]; this[4] = m[5]; this[5] = m[6];\n\t\t\tthis[6] = m[8]; this[7] = m[9]; this[8] = m[10];\n }\n else {\n throw new Error(`Invalid plarameter setting matrix data`);\n }\n return this;\n }\n\n setScale(x,y,z) { \n\t\tconst rx = (new Vec(this[0], this[3], this[6])).normalize().scale(x);\n\t\tconst ry = (new Vec(this[1], this[4], this[7])).normalize().scale(y);\n\t\tconst rz = (new Vec(this[2], this[5], this[8])).normalize().scale(z);\n\t\tthis[0] = rx.x; this[3] = rx.y; this[6] = rx.z;\n\t\tthis[1] = ry.x; this[4] = ry.y; this[7] = ry.z;\n\t\tthis[2] = rz.x; this[5] = rz.y; this[8] = rz.z;\n\t\treturn this;\n\t}\n\n traspose() {\n const m3 = this[3]; // 0, 1, 2\n const m7 = this[7]; // 3, 4, 5\n const m6 = this[6]; // 6, 7, 8\n this[3] = this[1];\n this[6] = this[2];\n this[7] = this[5];\n this[1] = m3;\n this[2] = m6;\n this[5] = m7;\n return this;\n }\n\n mult(a) {\n if (typeof(a) === \"number\") {\n this[0] *= a; this[1] *= a; this[2] *= a;\n this[3] *= a; this[4] *= a; this[5] *= a;\n this[6] *= a; this[7] *= a; this[8] *= a;\n }\n else if (a instanceof NumericArray && a.length === 9) {\n const r0 = this.row(0);\n const r1 = this.row(1);\n const r2 = this.row(2);\n const c0 = a.col(0);\n const c1 = a.col(1);\n const c2 = a.col(2);\n \n this[0] = Vec.Dot(r0,c0); this[1] = Vec.Dot(r0,c1); this[2] = Vec.Dot(r0,c2);\n this[3] = Vec.Dot(r1,c0); this[4] = Vec.Dot(r1,c1); this[5] = Vec.Dot(r1,c2);\n this[6] = Vec.Dot(r2,c0); this[7] = Vec.Dot(r2,c1); this[8] = Vec.Dot(r2,c2);\n }\n else {\n throw new Error(`Invalid parameter in Mat3.mult()`);\n }\n return this;\n }\n\n multVector(v) {\n if (v.length === 2 || v.length === 3) {\n const x = v[0];\n const y = v[1];\n const z = v.length === 2 ? 1 : v[2];\n \n return new Vec(\tthis[0] * x + this[3] * y + this[6] * z,\n this[1] * x + this[4] * y + this[7] * z,\n this[2] * x + this[5] * y + this[8] * z);\n }\n else {\n throw new Error(`Invalid parameter in Mat3.multVector()`);\n }\n }\n\n toString() {\n return `[ ${this[0]}, ${this[1]}, ${this[2]}\\n` +\n ` ${this[3]}, ${this[4]}, ${this[5]}\\n` +\n ` ${this[6]}, ${this[7]}, ${this[8]} ]`;\n }\n\n static MakeIdentity() {\n const m = new Mat3();\n return m.identity();\n }\n\n static MakeZero() {\n const m = new Mat3();\n return m.zero();\n }\n\n static MakeWithQuaternion(q) {\n const m = Mat3.MakeIdentity();\n \n m.setRow(0, new Vec( 1 - 2 * q[1] * q[1] - 2 * q[2] * q[2], 2 * q[0] * q[1] - 2 * q[2] * q[3], 2 * q[0] * q[2] + 2 * q[1] * q[3]));\n m.setRow(1, new Vec( 2 * q[0] * q[1] + 2 * q[2] * q[3], 1 - 2.0 * q[0] * q[0] - 2 * q[2] * q[2], 2 * q[1] * q[2] - 2 * q[0] * q[3]));\n m.setRow(2, new Vec( 2 * q[0] * q[2] - 2 * q[1] * q[3], 2 * q[1] * q[2] + 2 * q[0] * q[3] , 1 - 2 * q[0] * q[0] - 2 * q[1] * q[1]));\n\n return m;\n }\n\n // https://en.wikipedia.org/wiki/Rotation_matrix#Rotation_matrix_from_axis_and_angle\n // Make a rotation matrix from an axis and an angle\n static MakeRotationWithDirection(direction, up = new Vec(0,1,0)) {\n const m = Mat3.MakeIdentity();\n const z = direction.normalize();\n const x = Vec.Cross(up, z).normalize();\n const y = Vec.Cross(z, x).normalize();\n\n m.setRow(0, x);\n m.setRow(1, y);\n m.setRow(2, z);\n\n return m;\n }\n\n static IsZero(m) {\n return\tisZero(v[0]) && isZero(v[1]) && isZero(v[2]) &&\n isZero(v[3]) && isZero(v[4]) && isZero(v[5]) &&\n isZero(v[6]) && isZero(v[7]) && isZero(v[8]);\n }\n \n static IsIdentity(m) {\n return\tequals(v[0], 1) && isZero(v[1]) && isZero(v[2]) &&\n isZero(v[3]) && equals(v[4], 1) && isZero(v[5]) &&\n isZero(v[6]) && isZero(v[7]) && equals(v[8], 1);\n }\n\n static GetScale(m) {\n return new Vec(\n Vec.Magnitude(new Vec(m[0], m[3], m[6])),\n Vec.Magnitude(new Vec(m[1], m[4], m[7])),\n Vec.Magnitude(new Vec(m[2], m[5], m[8]))\n );\n }\n\n static Equals(a,b) {\n return\tequals(a[0], b[0]) && equals(a[1], b[1]) && equals(a[2], b[2]) &&\n equals(a[3], b[3]) && equals(a[4], b[4]) && equals(a[5], b[5]) &&\n equals(a[6], b[6]) && equals(a[7], b[7]) && equals(a[8], b[8]);\n }\n\n static IsNaN(m) {\n return\tisNaN(m[0]) || isNaN(m[1]) || isNaN(m[2]) &&\n isNaN(m[3]) || isNaN(m[4]) || isNaN(m[5]) &&\n isNaN(m[6]) || isNaN(m[7]) || isNaN(m[8]);\n }\n\n // This function multyplies two B x A matrices. It works opposite than the non-static mult() function:\n\t// A.mult(B) is the same as Mat4.Mult(B,A)\n static Mult(A,B) {\n const result = new Mat4(B);\n\t\treturn result.mult(A);\n }\n};\n","import { NumericArray, PI, checkArray } from \"./constants\";\nimport Vec from \"./Vec\";\nimport Mat3 from \"./Mat3\";\nimport { equals, isZero } from \"./functions\";\n\nexport default class Mat4 extends NumericArray {\n constructor() {\n const inMatrix = [\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n 0, 0, 0, 0\n ];\n\n // Create from matrix3\n if (arguments.length === 9) {\n inMatrix[0] = arguments[0]; \n inMatrix[1] = arguments[1];\n inMatrix[2] = arguments[2];\n\n inMatrix[4] = arguments[3]; \n inMatrix[5] = arguments[4];\n inMatrix[6] = arguments[5];\n\n inMatrix[8] = arguments[6]; \n inMatrix[9] = arguments[7];\n inMatrix[10] = arguments[8];\n\n inMatrix[15] = 1;\n }\n else if (arguments.length === 1 && arguments[0].length === 9) {\n inMatrix[0] = arguments[0][0]; \n inMatrix[1] = arguments[0][1];\n inMatrix[2] = arguments[0][2];\n\n inMatrix[4] = arguments[0][3]; \n inMatrix[5] = arguments[0][4];\n inMatrix[6] = arguments[0][5];\n\n inMatrix[8] = arguments[0][6]; \n inMatrix[9] = arguments[0][7];\n inMatrix[10] = arguments[0][8];\n\n inMatrix[15] = 1;\n }\n // Create from matrix4\n else if (arguments.length === 16) {\n inMatrix[0 ] = arguments[0];\n inMatrix[1 ] = arguments[1 ];\n inMatrix[2 ] = arguments[2 ];\n inMatrix[3 ] = arguments[3 ];\n\n inMatrix[4 ] = arguments[4 ];\n inMatrix[5 ] = arguments[5 ];\n inMatrix[6 ] = arguments[6 ];\n inMatrix[7 ] = arguments[7 ];\n\n inMatrix[8 ] = arguments[8 ];\n inMatrix[9 ] = arguments[9 ];\n inMatrix[10] = arguments[10];\n inMatrix[11] = arguments[11];\n\n inMatrix[12] = arguments[12];\n inMatrix[13] = arguments[13];\n inMatrix[14] = arguments[14];\n inMatrix[15] = arguments[15];\n }\n else if (arguments.length === 1 && arguments[0].length === 16) {\n inMatrix[0 ] = arguments[0][0];\n inMatrix[1 ] = arguments[0][1 ];\n inMatrix[2 ] = arguments[0][2 ];\n inMatrix[3 ] = arguments[0][3 ];\n\n inMatrix[4 ] = arguments[0][4 ];\n inMatrix[5 ] = arguments[0][5 ];\n inMatrix[6 ] = arguments[0][6 ];\n inMatrix[7 ] = arguments[0][7 ];\n\n inMatrix[8 ] = arguments[0][8 ];\n inMatrix[9 ] = arguments[0][9 ];\n inMatrix[10] = arguments[0][10];\n inMatrix[11] = arguments[0][11];\n\n inMatrix[12] = arguments[0][12];\n inMatrix[13] = arguments[0][13];\n inMatrix[14] = arguments[0][14];\n inMatrix[15] = arguments[0][15];\n }\n else if (arguments.length != 0) {\n throw new Error(`Invalid parameter size in Matrix3 constructor`);\n }\n\n super(inMatrix);\n }\n\n ////// Initializers\n identity() {\n this[0 ] = 1; this[1 ] = 0; this[2 ] = 0; this[3 ] = 0\n this[4 ] = 0; this[5 ] = 1; this[6 ] = 0; this[7 ] = 0\n this[8 ] = 0; this[9 ] = 0; this[10] = 1; this[11] = 0\n this[12] = 0; this[13] = 0; this[14] = 0; this[15] = 1\n return this;\n }\n\n zero() {\n\t\tthis[ 0] = 0; this[ 1] = 0; this[ 2] = 0; this[ 3] = 0;\n\t\tthis[ 4] = 0; this[ 5] = 0; this[ 6] = 0; this[ 7] = 0;\n\t\tthis[ 8] = 0; this[ 9] = 0; this[10] = 0; this[11] = 0;\n\t\tthis[12] = 0; this[13] = 0; this[14] = 0; this[15] = 0;\n\t\treturn this;\n\t}\n\n perspective(fovy, aspect, nearPlane, farPlane) {\n\t\tlet fovy2 = Math.tan(fovy * PI / 360.0) * nearPlane;\n\t\tlet fovy2aspect = fovy2 * aspect;\n\t\tthis.frustum(-fovy2aspect,fovy2aspect,-fovy2,fovy2,nearPlane,farPlane);\n return this;\n\t}\n\n\tfrustum(left, right, bottom, top, nearPlane, farPlane) {\n\t\tlet A = right - left;\n\t\tlet B = top-bottom;\n\t\tlet C = farPlane-nearPlane;\n\t\t\n\t\tthis.setRow(0, new Vec(nearPlane*2.0/A,\t0.0,\t0.0,\t0.0));\n\t\tthis.setRow(1, new Vec(0.0,\tnearPlane*2.0/B,\t0.0,\t0.0));\n\t\tthis.setRow(2, new Vec((right+left)/A,\t(top+bottom)/B,\t-(farPlane+nearPlane)/C,\t-1.0));\n\t\tthis.setRow(3, new Vec(0.0,\t0.0,\t-(farPlane*nearPlane*2.0)/C,\t0.0));\n\t\t\n\t\treturn this;\n\t}\n\n\tortho(left, right, bottom, top, nearPlane, farPlane) {\n\t\tlet m = right-left;\n\t\tlet l = top-bottom;\n\t\tlet k = farPlane-nearPlane;;\n\t\t\n\t\tthis[0] = 2/m; this[1] = 0; this[2] = 0; this[3] = 0;\n\t\tthis[4] = 0; this[5] = 2/l; this[6] = 0; this[7] = 0;\n\t\tthis[8] = 0; this[9] = 0; this[10] = -2/k; this[11]= 0;\n\t\tthis[12]=-(left+right)/m; this[13] = -(top+bottom)/l; this[14] = -(farPlane+nearPlane)/k; this[15]=1;\n\n\t\treturn this;\n\t}\n\t\t\n\tlookAt(p_eye, p_center, p_up) {\n this.identity();\n\n\t\tconst y = new Vec(p_up);\n\t\tconst z = Vec.Sub(p_eye,p_center);\n\t\tz.normalize();\n\t\tconst x = Vec.Cross(y,z);\n\t\tx.normalize();\n\t\ty.normalize();\n\n\t\tthis.m00 = x.x;\n\t\tthis.m10 = x.y;\n\t\tthis.m20 = x.z;\n\t\tthis.m30 = -Vec.Dot(x, p_eye);\n\t\tthis.m01 = y.x;\n\t\tthis.m11 = y.y;\n\t\tthis.m21 = y.z;\n\t\tthis.m31 = -Vec.Dot(y, p_eye);\n\t\tthis.m02 = z.x;\n\t\tthis.m12 = z.y;\n\t\tthis.m22 = z.z;\n\t\tthis.m32 = -Vec.Dot(z, p_eye);\n\t\tthis.m03 = 0;\n\t\tthis.m13 = 0;\n\t\tthis.m23 = 0;\n\t\tthis.m33 = 1;\n\t\n\t\treturn this;\n\t}\n\n\n\n\n ///// Setters and getters\n get m00() { return this[0]; }\n\tget m01() { return this[1]; }\n\tget m02() { return this[2]; }\n\tget m03() { return this[3]; }\n\tget m10() { return this[4]; }\n\tget m11() { return this[5]; }\n\tget m12() { return this[6]; }\n\tget m13() { return this[7]; }\n\tget m20() { return this[8]; }\n\tget m21() { return this[9]; }\n\tget m22() { return this[10]; }\n\tget m23() { return this[11]; }\n\tget m30() { return this[12]; }\n\tget m31() { return this[13]; }\n\tget m32() { return this[14]; }\n\tget m33() { return this[15]; }\n\t\n\tset m00(v) { this[0] = v; }\n\tset m01(v) { this[1] = v; }\n\tset m02(v) { this[2] = v; }\n\tset m03(v) { this[3] = v; }\n\tset m10(v) { this[4] = v; }\n\tset m11(v) { this[5] = v; }\n\tset m12(v) { this[6] = v; }\n\tset m13(v) { this[7] = v; }\n\tset m20(v) { this[8] = v; }\n\tset m21(v) { this[9] = v; }\n\tset m22(v) { this[10] = v; }\n\tset m23(v) { this[11] = v; }\n\tset m30(v) { this[12] = v; }\n\tset m31(v) { this[13] = v; }\n\tset m32(v) { this[14] = v; }\n\tset m33(v) { this[15] = v; }\n\n\tget mat3() {\n\t\treturn new Mat3(this[0], this[1], this[ 2],\n\t\t\t\t\t\tthis[4], this[5], this[ 6],\n\t\t\t\t\t\tthis[8], this[9], this[10]);\n\t}\n\n\tget forwardVector() {\n\t\treturn Mat4.TransformDirection(this, new Vec(0.0, 0.0, 1.0));\n\t}\n\t\n\tget rightVector() {\n\t\treturn Mat4.TransformDirection(this, new Vec(1.0, 0.0, 0.0));\n\t}\n\t\n\tget upVector() {\n\t\treturn Mat4.TransformDirection(this, new Vec(0.0, 1.0, 0.0));\n\t}\n\t\n\tget backwardVector() {\n\t\treturn Mat4.TransformDirection(this, new Vec(0.0, 0.0, -1.0));\n\t}\n\t\n\tget leftVector() {\n\t\treturn Mat4.TransformDirection(this, new Vec(-1.0, 0.0, 0.0));\n\t}\n\t\n\tget downVector() {\n\t\treturn Mat4.TransformDirection(this, new Vec(0.0, -1.0, 0.0));\n\t}\n\n row(i) {\n return new Vec(\n this[i * 4], \n this[i * 4 + 1],\n this[i * 4 + 2],\n this[i * 4 + 3]);\n }\n\n setRow(i, a, y = null, z = null, w = null) {\n if (a.length>=4) {\n this[i * 4] = a[0];\n this[i * 4 + 1] = a[1];\n this[i * 4 + 2] = a[2];\n this[i * 4 + 3] = a[3];\n }\n\t\telse if (a.length == 3) {\n\t\t\tthis[i * 4] = a[0];\n this[i * 4 + 1] = a[1];\n this[i * 4 + 2] = a[2];\n\t\t}\n else if (typeof(a) === \"number\" && \n typeof(y) === \"number\" && \n typeof(z) === \"number\" &&\n typeof(w) === \"number\"\n ) {\n this[i * 4] = a;\n this[i * 4 + 1] = y;\n this[i * 4 + 2] = z;\n this[i * 4 + 3] = w;\n }\n else {\n throw new Error(`Invalid parameter setting matrix row`);\n }\n return this;\n }\n\n col(i) {\n return new Vec(\n this[i],\n this[i + 4],\n this[i + 4 * 2],\n this[i + 4 * 3]\n )\n }\n\n setCol(i, a, y = null, z = null, w = null) {\n if (a.length>=4) {\n this[i] = a[0];\n this[i + 4] = a[1];\n this[i + 4 * 2] = a[2];\n this[i + 4 * 3] = a[3];\n }\n else if (typeof(a) === \"number\" && \n typeof(y) === \"number\" && \n typeof(z) === \"number\" &&\n typeof(w) === \"number\"\n ) {\n this[i] = a;\n this[i + 4] = y;\n this[i + 4 * 2] = z;\n this[i + 4 * 3] = w;\n }\n else {\n throw new Error(`Invalid parameter setting matrix row`);\n }\n return this;\n }\n\n assign(a) {\n\t\tif (a.length==9) {\n\t\t\tthis[0] = a[0]; this[1] = a[1]; this[2] = a[2]; this[3] = 0;\n\t\t\tthis[4] = a[3]; this[5] = a[4]; this[6] = a[5]; this[7] = 0;\n\t\t\tthis[8] = a[6]; this[9] = a[7]; this[10] = a[8]; this[11] = 0;\n\t\t\tthis[12] = 0;\t this[13] = 0;\t this[14] = 0;\t this[15] = 1;\n\t\t}\n\t\telse if (a.length==16) {\n\t\t\tthis[0] = a[0]; this[1] = a[1]; this[2] = a[2]; this[3] = a[3];\n\t\t\tthis[4] = a[4]; this[5] = a[5]; this[6] = a[6]; this[7] = a[7];\n\t\t\tthis[8] = a[8]; this[9] = a[9]; this[10] = a[10]; this[11] = a[11];\n\t\t\tthis[12] = a[12]; this[13] = a[13];\tthis[14] = a[14]; this[15] = a[15];\n\t\t}\n\t\treturn this;\n\t}\n\n\ttranslate(x, y, z) {\n\t\tif (checkArray(x,3)) {\n\t\t\ty = x[1];\n\t\t\tz = x[2];\n\t\t\tx = x[0];\n\t\t}\n\t\tthis.mult(Mat4.MakeTranslation(x, y, z));\n\t\treturn this;\n\t}\n\n\trotate(alpha, x, y, z) {\n\t\tif (checkArray(x,3)) {\n\t\t\ty = x[1];\n\t\t\tz = x[2];\n\t\t\tx = x[0];\n\t\t}\n\t\tthis.mult(Mat4.MakeRotation(alpha, x, y, z));\n\t\treturn this;\n\t}\n\t\n\tscale(x, y, z) {\n\t\tif (checkArray(x,3)) {\n\t\t\ty = x[1];\n\t\t\tz = x[2];\n\t\t\tx = x[0];\n\t\t}\n\t\tthis.mult(Mat4.MakeScale(x, y, z));\n\t\treturn this;\n\t}\n\n toString() {\n return `[ ${this[ 0]}, ${this[ 1]}, ${this[ 2]}, ${this[ 3]}\\n` +\n ` ${this[ 4]}, ${this[ 5]}, ${this[ 6]}, ${this[ 7]}\\n` +\n ` ${this[ 8]}, ${this[ 9]}, ${this[10]}, ${this[11]}\\n` +\n ` ${this[12]}, ${this[13]}, ${this[14]}, ${this[15]} ]`;\n }\n\n setScale(x,y,z) {\n\t\tconst rx = new Vec(this[0], this[4], this[8]).normalize().scale(x);\n\t\tconst ry = new Vec(this[1], this[5], this[9]).normalize().scale(y);\n\t\tconst rz = new Vec(this[2], this[6], this[10]).normalize().scale(z);\n\t\tthis[0] = rx.x; this[4] = rx.y; this[8] = rx.z;\n\t\tthis[1] = ry.x; this[5] = ry.y; this[9] = ry.z;\n\t\tthis[2] = rz.x; this[6] = rz.y; this[10] = rz.z;\n\t\treturn this;\n\t}\n\n\tsetPosition(pos,y,z) {\n\t\tif (typeof(pos)==\"number\") {\n\t\t\tthis[12] = pos;\n\t\t\tthis[13] = y;\n\t\t\tthis[14] = z;\n\t\t}\n\t\telse {\n\t\t\tthis[12] = pos.x;\n\t\t\tthis[13] = pos.y;\n\t\t\tthis[14] = pos.z;\n\t\t}\n\t\treturn this;\n\t}\n\n\tsetRotation(rotationMatrix) {\n\t\tif (rotationMatrix.length === 9) {\n\t\t\tthis[0] = rotationMatrix[0]; this[1] = rotationMatrix[1]; this[2] = rotationMatrix[2];\n\t\t\tthis[4] = rotationMatrix[3]; this[5] = rotationMatrix[4]; this[6] = rotationMatrix[5];\n\t\t\tthis[8] = rotationMatrix[6]; this[9] = rotationMatrix[7]; this[10] = rotationMatrix[8];\n\t\t}\n\t\telse if (rotationMatrix.length === 16) {\n\t\t\tthis[0] = rotationMatrix[0]; this[1] = rotationMatrix[1]; this[2] = rotationMatrix[2];\n\t\t\tthis[4] = rotationMatrix[4]; this[5] = rotationMatrix[5]; this[6] = rotationMatrix[6];\n\t\t\tthis[8] = rotationMatrix[8]; this[9] = rotationMatrix[9]; this[10] = rotationMatrix[10];\n\t\t}\n\t\telse {\n\t\t\tthrow new Error(\"Invalid parameter setting rotation matrix\");\n\t\t}\n\t}\n\n mult(a) {\n\t\tif (typeof(a)=='number') {\n\t\t\tthis[ 0] *= a; this[ 1] *= a; this[ 2] *= a; this[ 3] *= a;\n\t\t\tthis[ 4] *= a; this[ 5] *= a; this[ 6] *= a; this[ 7] *= a;\n\t\t\tthis[ 8] *= a; this[ 9] *= a; this[10] *= a; this[11] *= a;\n\t\t\tthis[12] *= a; this[13] *= a; this[14] *= a; this[15] *= a;\n\t\t\treturn this;\n\t\t}\n\n const r0 = this.row(0);\n const r1 = this.row(1);\n const r2 = this.row(2);\n const r3 = this.row(3);\n const c0 = a.col(0);\n const c1 = a.col(1);\n const c2 = a.col(2);\n const c3 = a.col(3);\n\n this[0 ] = Vec.Dot(r0, c0); this[1 ] = Vec.Dot(r0, c1); this[2 ] = Vec.Dot(r0, c2); this[3 ] = Vec.Dot(r0, c3);\n this[4 ] = Vec.Dot(r1, c0); this[5 ] = Vec.Dot(r1, c1); this[6 ] = Vec.Dot(r1, c2); this[7 ] = Vec.Dot(r1, c3);\n this[8 ] = Vec.Dot(r2, c0); this[9 ] = Vec.Dot(r2, c1); this[10] = Vec.Dot(r2, c2); this[11] = Vec.Dot(r2, c3);\n this[12] = Vec.Dot(r3, c0); this[13] = Vec.Dot(r3, c1); this[14] = Vec.Dot(r3, c2); this[15] = Vec.Dot(r3, c3);\n\n\t\treturn this;\n\t}\n\n\tmultVector(vec) {\n if (vec.length<3) {\n throw new Error(\"Invalid parameter multiplying Mat4 by vector\");\n }\n\n\t\tconst x = vec[0];\n\t\tconst y = vec[1];\n\t\tconst z = vec[2];\n\t\tconst w = vec.length >3 ? vec[3] : 1.0;\n\t\n\t\treturn new Vec( this[0] * x + this[4] * y + this[ 8] * z + this[12] * w,\n\t\t\t\t\t\tthis[1] * x + this[5] * y + this[ 9] * z + this[13] * w,\n\t\t\t\t\t\tthis[2] * x + this[6] * y + this[10] * z + this[14] * w,\n\t\t\t\t\t\tthis[3] * x + this[7] * y + this[11] * z + this[15] * w);\n\t}\n\t\n\tinvert() {\n\t\tconst a00 = this[0], a01 = this[1], a02 = this[2], a03 = this[3],\n\t a10 = this[4], a11 = this[5], a12 = this[6], a13 = this[7],\n\t a20 = this[8], a21 = this[9], a22 = this[10], a23 = this[11],\n\t a30 = this[12], a31 = this[13], a32 = this[14], a33 = this[15];\n\n\t const b00 = a00 * a11 - a01 * a10,\n\t b01 = a00 * a12 - a02 * a10,\n\t b02 = a00 * a13 - a03 * a10,\n\t b03 = a01 * a12 - a02 * a11,\n\t b04 = a01 * a13 - a03 * a11,\n\t b05 = a02 * a13 - a03 * a12,\n\t b06 = a20 * a31 - a21 * a30,\n\t b07 = a20 * a32 - a22 * a30,\n\t b08 = a20 * a33 - a23 * a30,\n\t b09 = a21 * a32 - a22 * a31,\n\t b10 = a21 * a33 - a23 * a31,\n\t b11 = a22 * a33 - a23 * a32;\n\n\t let det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n\t if (!det) {\n\t\t\tthis.zero();\n\t }\n\t\telse {\n\t\t\tdet = 1.0 / det;\n\n\t\t\tthis[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n\t\t\tthis[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n\t\t\tthis[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n\t\t\tthis[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n\t\t\tthis[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n\t\t\tthis[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n\t\t\tthis[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n\t\t\tthis[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n\t\t\tthis[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n\t\t\tthis[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n\t\t\tthis[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n\t\t\tthis[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n\t\t\tthis[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n\t\t\tthis[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n\t\t\tthis[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n\t\t\tthis[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n\t\t}\n\n return this;\n\t}\n\t\n\ttraspose() {\n\t\tconst r0 = new Vec(this[0], this[4], this[ 8], this[12]);\n\t\tconst r1 = new Vec(this[1], this[5], this[ 9], this[13]);\n\t\tconst r2 = new Vec(this[2], this[6], this[10], this[14]);\n\t\tconst r3 = new Vec(this[3], this[7], this[11], this[15]);\n\t\n\t\tthis.setRow(0, r0);\n\t\tthis.setRow(1, r1);\n\t\tthis.setRow(2, r2);\n\t\tthis.setRow(3, r3);\n\t\treturn this;\n\t}\n\n ///////// Factory methods\n static MakeIdentity() {\n const m = new Mat4();\n return m.identity();\n }\n\n\tstatic MakeZero() {\n\t\tconst m = new Mat4();\n\t\treturn m.zero();\n\t}\n\n\tstatic MakeWithQuaternion(q) {\n\t\tconst m = Mat4.MakeIdentity();\n\t\tm.setRotation(Mat3.MakeWithQuaternion(q));\n return m;\n\t}\n\t\n static MakeTranslation(x, y, z) {\n\t\tif (checkArray(x,3)) {\n\t\t\ty = x[1];\n\t\t\tz = x[2];\n\t\t\tx = x[0];\n\t\t}\n\t\treturn new Mat4(\n\t\t\t1.0, 0.0, 0.0, 0.0,\n\t\t\t0.0, 1.0, 0.0, 0.0,\n\t\t\t0.0, 0.0, 1.0, 0.0,\n\t\t\t x, y, z, 1.0\n\t\t);\n\t}\n\t\t\n\tstatic MakeRotation(alpha, x, y, z) {\n\t\tconst axis = new Vec(x,y,z);\n\t\taxis.normalize();\n\t\t\t\t\n\t\tvar cosAlpha = Math.cos(alpha);\n\t\tvar acosAlpha = 1.0 - cosAlpha;\n\t\tvar sinAlpha = Math.sin(alpha);\n\t\t\n\t\treturn new Mat4(\n\t\t\taxis.x * axis.x * acosAlpha + cosAlpha, axis.x * axis.y * acosAlpha + axis.z * sinAlpha, axis.x * axis.z * acosAlpha - axis.y * sinAlpha, 0,\n\t\t\taxis.y * axis.x * acosAlpha - axis.z * sinAlpha, axis.y * axis.y * acosAlpha + cosAlpha, axis.y * axis.z * acosAlpha + axis.x * sinAlpha, 0,\n\t\t\taxis.z * axis.x * acosAlpha + axis.y * sinAlpha, axis.z * axis.y * acosAlpha - axis.x * sinAlpha, axis.z * axis.z * acosAlpha + cosAlpha, 0,\n\t\t\t0,0,0,1\n\t\t);\n\t}\n\n\tstatic MakeRotationWithDirection(direction, up = new Vec(0,1,0)) {\n\t\tconst trx = Mat4.MakeIdentity();\n\t\ttrx.setRotation(Mat3.MakeRotationWithDirection(direction, up));\n\t\treturn trx;\n\t}\n\n\tstatic MakeScale(x, y, z) {\n\t\tif (checkArray(x,3)) {\n y = x[1];\n\t\t\tz = x[2];\n\t\t\tx = x[0];\n\t\t}\n\t\treturn new Mat4(\n\t\t\tx, 0, 0, 0,\n\t\t\t0, y, 0, 0,\n\t\t\t0, 0, z, 0,\n\t\t\t0, 0, 0, 1\n\t\t)\n\t}\n \n\n static MakePerspective(fovy, aspect, nearPlane, farPlane) {\n\t\treturn (new Mat4()).perspective(fovy, aspect, nearPlane, farPlane);\n\t}\n\t\n\tstatic MakeFrustum(left, right, bottom, top, nearPlane, farPlane) {\n\t\treturn (new Mat4()).frustum(left, right, bottom, top, nearPlane, farPlane);\n\t}\n\t\n\tstatic MakeOrtho(left, right, bottom, top, nearPlane, farPlane) {\n\t\treturn (new Mat4()).ortho(left, right, bottom, top, nearPlane, farPlane);\n\t}\n\n\tstatic MakeLookAt(origin, target, up) {\n\t\treturn (new Mat4()).lookAt(origin,target,up);\n\t}\n\n\t// Other static methods. This function multyplies two B x A matrices. It works opposite than the non-static mult() function:\n\t// A.mult(B) is the same as Mat4.Mult(B,A)\n\tstatic Mult(A,B) {\n\t\tconst result = new Mat4(B);\n\t\treturn result.mult(A);\n\t}\n\n static Unproject(x, y, depth, mvMat, pMat, viewport) {\n\t\tlet mvp = new Mat4(pMat);\n\t\tmvp.mult(mvMat);\n\t\tmvp.invert();\n\n\t\tconst vin = new Vec(((x - viewport.y) / viewport.width) * 2.0 - 1.0,\n\t\t\t\t\t\t\t\t((y - viewport.x) / viewport.height) * 2.0 - 1.0,\n\t\t\t\t\t\t\t\tdepth * 2.0 - 1.0,\n\t\t\t\t\t\t\t\t1.0);\n\t\t\n\t\tconst result = new Vec4(mvp.multVector(vin));\n\t\tif (result.z==0) {\n\t\t\tresult.set(0);\n\t\t}\n\t\telse {\n\t\t\tresult.set(\tresult.x/result.w,\n\t\t\t\t\t\tresult.y/result.w,\n\t\t\t\t\t\tresult.z/result.w,\n\t\t\t\t\t\tresult.w/result.w);\n\t\t}\n\n\t\treturn result;\n\t}\n\n static GetScale(m) {\n\t\treturn new Vec(\n Vec.Magnitude([m[1], m[5], m[9]]),\n\t\t\tVec.Magnitude([m[0], m[4], m[8]]),\n\t\t\tVec.Magnitude([m[2], m[6], m[10]])\n\t\t);\n\t}\n\n static GetRotation(m) {\n\t\tconst scale = Mat4.GetScale(m);\n\t\treturn new Mat4(\n\t\t\t\tm[0] / scale.x, m[1] / scale.y, m[ 2] / scale.z, 0,\n\t\t\t\tm[4] / scale.x, m[5] / scale.y, m[ 6] / scale.z, 0,\n\t\t\t\tm[8] / scale.x, m[9] / scale.y, m[10] / scale.z, 0,\n\t\t\t\t0,\t 0,\t 0, \t1\n\t\t);\n\t}\n\n\tstatic GetPosition(m) {\n\t\treturn new Vec(m[12], m[13], m[14]);\n\t}\n\n\tstatic GetInverted(m) {\n\t\tconst inverted = new Mat4(m);\n\t\tinverted.invert();\n\t\treturn inverted;\n\t}\n\n\tstatic GetNormalMatrix(m) {\n\t\treturn new Mat4(m)\n\t\t\t.invert()\n\t\t\t.traspose()\n\t\t\t.mat3;\n\t}\n\t\n static Equals(m,n) {\n\t\treturn\tm[ 0] == n[ 0] && m[ 1] == n[ 1] && m[ 2] == n[ 2] && m[ 3] == n[ 3] &&\n\t\t\t\tm[ 4] == n[ 4] && m[ 5] == n[ 5] && m[ 6] == n[ 6] && m[ 7] == n[ 7] &&\n\t\t\t\tm[ 8] == n[ 8] && m[ 9] == n[ 9] && m[10] == n[10] && m[11] == n[11] &&\n\t\t\t\tm[12] == n[12] && m[13] == n[13] && m[14] == n[14] && m[15] == n[15];\n\t}\n\n static TransformDirection(M, /* Vec */ dir) {\n\t\tconst direction = new Vec(dir);\n\t\tconst trx = new Mat4(M);\n\t\ttrx.setRow(3, new Vec(0, 0, 0, 1));\n\t\tdirection.assign(trx.multVector(direction).xyz);\n\t\tdirection.normalize();\n\t\treturn direction;\n\t}\n\n static IsNan() {\n\t\treturn\tisNaN(this[ 0]) || isNaN(this[ 1]) || isNaN(this[ 2]) || isNaN(this[ 3]) ||\n\t\t\t\tisNaN(this[ 4]) || isNaN(this[ 5]) || isNaN(this[ 6]) || isNaN(this[ 7]) ||\n\t\t\t\tisNaN(this[ 8]) || isNaN(this[ 9]) || isNaN(this[10]) || isNaN(this[11]) ||\n\t\t\t\tisNaN(this[12]) || isNaN(this[13]) || isNaN(this[14]) || isNaN(this[15]);\n\t}\n\n\tstatic IsZero(m) {\n\t\treturn\tisZero(m[ 0]) && isZero(m[ 1]) && isZero(m[ 2]) && isZero(m[ 3]) &&\n\t\t\t\tisZero(m[ 4]) && isZero(m[ 5]) && isZero(m[ 6]) && isZero(m[ 7]) &&\n\t\t\t\tisZero(m[ 8]) && isZero(m[ 9]) && isZero(m[10]) && isZero(m[11]) &&\n\t\t\t\tisZero(m[12]) && isZero(m[13]) && isZero(m[14]) && isZero(m[15]);\n\t}\n\t\n\tstatic IsIdentity(m) {\n\t\treturn\tequals(m[ 0],1) && equals(m[ 1],0) && equals(m[ 2],0) && equals(m[ 3],0) &&\n\t\t\t\tequals(m[ 4],0) && equals(m[ 5],1) && equals(m[ 6],0) && equals(m[ 7],0) &&\n\t\t\t\tequals(m[ 8],0) && equals(m[ 9],0) && equals(m[10],1) && equals(m[11],0) &&\n\t\t\t\tequals(m[12],0) && equals(m[13],0) && equals(m[14],0) && equals(m[15],1);\n\t}\n}\n","import Vec from \"./Vec\";\n\nexport default class Quat extends Vec {\n constructor(a,b,c,d) {\n super(0,0,0,0);\n\n if (a === undefined) {\n Vec.Zero(this);\n }\n else if (b === undefined) {\n if (a.length === 4) {\n Vec.Assign(this, a);\n }\n else if (a.length === 9) {\n this.initWithMatrix3(a);\n }\n else if (a.length === 16) {\n this.initWithMatrix4(a);\n }\n else {\n throw new Error(\"Invalid parameter initializing Quaternion\");\n }\n }\n else if (a !== undefined && b !== undefined && c !== undefined && d !== undefined) {\n this.initWithValues(a, b, c, d);\n }\n else {\n throw new Error(\"Invalid parameters initializing Quaternion\");\n }\n }\n\n initWithMatrix3(m) {\n const w = Math.sqrt(1 + m[0] + m[4] + m[8]) / 2;\n const w4 = 4 * w;\n \n this[0] = (m[7] - m[5]) / w;\n this[1] = (m[2] - m[6]) / w4;\n this[2] = (m[3] - m[1]) / w4;\n this[3] = w;\n }\n\n initWithMatrix4(m) {\n const w = Math.sqrt(1 + m[0] + m[5] + m[10]) / 2;\n const w4 = 4 * w;\n \n this[0] = (m[9] - m[6]) / w;\n this[1] = (m[2] - m[8]) / w4;\n this[2] = (m[4] - m[1]) / w4;\n this[3] = w;\n }\n\n initWithValues(alpha, x, y, z) {\n this[0] = x * Math.sin( alpha / 2 );\n this[1] = y * Math.sin( alpha / 2 );\n this[2] = z * Math.sin( alpha / 2 );\n this[3] = Math.cos( alpha / 2 );\n return this;\n }\n}\n\n","import Mat4 from \"./Mat4\";\n\n\nexport default class MatrixStrategy {\n constructor(target) {\n if (!target instanceof Mat4) {\n throw Error(\"MatrixStrategy: invalid target object. Target object must be of type bg.math.Mat4\");\n }\n this._target = target;\n }\n\n get target() {\n return this._target;\n }\n\n set target(t) {\n this._target = t;\n }\n\n apply() {\n throw Error(\"MatrixStrategy.apply(): method not implemented\");\n }\n}\n","!function(r){function n(r){for(var n=\"\",t=\"\",o=0,e=0,a=0,i=r.length;i>a;a++){var f=r.charCodeAt(a);128>f?e++:(t=2048>f?String.fromCharCode(f>>6|192,63&f|128):String.fromCharCode(f>>12|224,f>>6&63|128,63&f|128),e>o&&(n+=r.slice(o,e)),n+=t,o=e=a+1)}return e>o&&(n+=r.slice(o,i)),n}function t(r){var n,t;if(r+=\"\",s=!1,v=w=r.length,w>63){for(o(r.substring(0,64)),i(A),s=!0,n=128;w>=n;n+=64)o(r.substring(n-64,n)),f(A);r=r.substring(n-64),w=r.length}for(d[0]=d[1]=d[2]=d[3]=d[4]=d[5]=d[6]=d[7]=d[8]=d[9]=d[10]=d[11]=d[12]=d[13]=d[14]=d[15]=0,n=0;w>n;n++)t=3&n,0===t?d[n>>2]=r.charCodeAt(n):d[n>>2]|=r.charCodeAt(n)<<C[t];return d[n>>2]|=h[3&n],n>55?(s?f(d):(i(d),s=!0),f([0,0,0,0,0,0,0,0,0,0,0,0,0,0,v<<3,0])):(d[14]=v<<3,void(s?f(d):i(d)))}function o(r){for(var n=16;n--;){var t=n<<2;A[n]=r.charCodeAt(t)+(r.charCodeAt(t+1)<<8)+(r.charCodeAt(t+2)<<16)+(r.charCodeAt(t+3)<<24)}}function e(r,o,e){t(o?r:n(r));var a=g[0];return u[1]=l[15&a],u[0]=l[15&(a>>=4)],u[3]=l[15&(a>>=4)],u[2]=l[15&(a>>=4)],u[5]=l[15&(a>>=4)],u[4]=l[15&(a>>=4)],u[7]=l[15&(a>>=4)],u[6]=l[15&(a>>=4)],a=g[1],u[9]=l[15&a],u[8]=l[15&(a>>=4)],u[11]=l[15&(a>>=4)],u[10]=l[15&(a>>=4)],u[13]=l[15&(a>>=4)],u[12]=l[15&(a>>=4)],u[15]=l[15&(a>>=4)],u[14]=l[15&(a>>=4)],a=g[2],u[17]=l[15&a],u[16]=l[15&(a>>=4)],u[19]=l[15&(a>>=4)],u[18]=l[15&(a>>=4)],u[21]=l[15&(a>>=4)],u[20]=l[15&(a>>=4)],u[23]=l[15&(a>>=4)],u[22]=l[15&(a>>=4)],a=g[3],u[25]=l[15&a],u[24]=l[15&(a>>=4)],u[27]=l[15&(a>>=4)],u[26]=l[15&(a>>=4)],u[29]=l[15&(a>>=4)],u[28]=l[15&(a>>=4)],u[31]=l[15&(a>>=4)],u[30]=l[15&(a>>=4)],e?u:u.join(\"\")}function a(r,n,t,o,e,a,i){return n+=r+o+i,(n<<e|n>>>a)+t<<0}function i(r){c(0,0,0,0,r),g[0]=y[0]+1732584193<<0,g[1]=y[1]-271733879<<0,g[2]=y[2]-1732584194<<0,g[3]=y[3]+271733878<<0}function f(r){c(g[0],g[1],g[2],g[3],r),g[0]=y[0]+g[0]<<0,g[1]=y[1]+g[1]<<0,g[2]=y[2]+g[2]<<0,g[3]=y[3]+g[3]<<0}function c(r,n,t,o,e){var i,f;s?(r=a((t^o)&n^o,r,n,e[0],7,25,-680876936),o=a((n^t)&r^t,o,r,e[1],12,20,-389564586),t=a((r^n)&o^n,t,o,e[2],17,15,606105819),n=a((o^r)&t^r,n,t,e[3],22,10,-1044525330)):(r=e[0]-680876937,r=(r<<7|r>>>25)-271733879<<0,o=e[1]-117830708+(2004318071&r^-1732584194),o=(o<<12|o>>>20)+r<<0,t=e[2]-1126478375+((-271733879^r)&o^-271733879),t=(t<<17|t>>>15)+o<<0,n=e[3]-1316259209+((o^r)&t^r),n=(n<<22|n>>>10)+t<<0),r=a((t^o)&n^o,r,n,e[4],7,25,-176418897),o=a((n^t)&r^t,o,r,e[5],12,20,1200080426),t=a((r^n)&o^n,t,o,e[6],17,15,-1473231341),n=a((o^r)&t^r,n,t,e[7],22,10,-45705983),r=a((t^o)&n^o,r,n,e[8],7,25,1770035416),o=a((n^t)&r^t,o,r,e[9],12,20,-1958414417),t=a((r^n)&o^n,t,o,e[10],17,15,-42063),n=a((o^r)&t^r,n,t,e[11],22,10,-1990404162),r=a((t^o)&n^o,r,n,e[12],7,25,1804603682),o=a((n^t)&r^t,o,r,e[13],12,20,-40341101),t=a((r^n)&o^n,t,o,e[14],17,15,-1502002290),n=a((o^r)&t^r,n,t,e[15],22,10,1236535329),r=a((n^t)&o^t,r,n,e[1],5,27,-165796510),o=a((r^n)&t^n,o,r,e[6],9,23,-1069501632),t=a((o^r)&n^r,t,o,e[11],14,18,643717713),n=a((t^o)&r^o,n,t,e[0],20,12,-373897302),r=a((n^t)&o^t,r,n,e[5],5,27,-701558691),o=a((r^n)&t^n,o,r,e[10],9,23,38016083),t=a((o^r)&n^r,t,o,e[15],14,18,-660478335),n=a((t^o)&r^o,n,t,e[4],20,12,-405537848),r=a((n^t)&o^t,r,n,e[9],5,27,568446438),o=a((r^n)&t^n,o,r,e[14],9,23,-1019803690),t=a((o^r)&n^r,t,o,e[3],14,18,-187363961),n=a((t^o)&r^o,n,t,e[8],20,12,1163531501),r=a((n^t)&o^t,r,n,e[13],5,27,-1444681467),o=a((r^n)&t^n,o,r,e[2],9,23,-51403784),t=a((o^r)&n^r,t,o,e[7],14,18,1735328473),n=a((t^o)&r^o,n,t,e[12],20,12,-1926607734),i=n^t,r=a(i^o,r,n,e[5],4,28,-378558),o=a(i^r,o,r,e[8],11,21,-2022574463),f=o^r,t=a(f^n,t,o,e[11],16,16,1839030562),n=a(f^t,n,t,e[14],23,9,-35309556),i=n^t,r=a(i^o,r,n,e[1],4,28,-1530992060),o=a(i^r,o,r,e[4],11,21,1272893353),f=o^r,t=a(f^n,t,o,e[7],16,16,-155497632),n=a(f^t,n,t,e[10],23,9,-1094730640),i=n^t,r=a(i^o,r,n,e[13],4,28,681279174),o=a(i^r,o,r,e[0],11,21,-358537222),f=o^r,t=a(f^n,t,o,e[3],16,16,-722521979),n=a(f^t,n,t,e[6],23,9,76029189),i=n^t,r=a(i^o,r,n,e[9],4,28,-640364487),o=a(i^r,o,r,e[12],11,21,-421815835),f=o^r,t=a(f^n,t,o,e[15],16,16,530742520),n=a(f^t,n,t,e[2],23,9,-995338651),r=a(t^(n|~o),r,n,e[0],6,26,-198630844),o=a(n^(r|~t),o,r,e[7],10,22,1126891415),t=a(r^(o|~n),t,o,e[14],15,17,-1416354905),n=a(o^(t|~r),n,t,e[5],21,11,-57434055),r=a(t^(n|~o),r,n,e[12],6,26,1700485571),o=a(n^(r|~t),o,r,e[3],10,22,-1894986606),t=a(r^(o|~n),t,o,e[10],15,17,-1051523),n=a(o^(t|~r),n,t,e[1],21,11,-2054922799),r=a(t^(n|~o),r,n,e[8],6,26,1873313359),o=a(n^(r|~t),o,r,e[15],10,22,-30611744),t=a(r^(o|~n),t,o,e[6],15,17,-1560198380),n=a(o^(t|~r),n,t,e[13],21,11,1309151649),r=a(t^(n|~o),r,n,e[4],6,26,-145523070),o=a(n^(r|~t),o,r,e[11],10,22,-1120210379),t=a(r^(o|~n),t,o,e[2],15,17,718787259),n=a(o^(t|~r),n,t,e[9],21,11,-343485551),y[0]=r,y[1]=n,y[2]=t,y[3]=o}var u=[],d=[],A=[],h=[],l=\"0123456789abcdef\".split(\"\"),C=[],g=[],s=!1,v=0,w=0,y=[];if(r.Int32Array)d=new Int32Array(16),A=new Int32Array(16),h=new Int32Array(4),C=new Int32Array(4),g=new Int32Array(4),y=new Int32Array(4);else{var I;for(I=0;16>I;I++)d[I]=A[I]=0;for(I=0;4>I;I++)h[I]=C[I]=g[I]=y[I]=0}h[0]=128,h[1]=32768,h[2]=8388608,h[3]=-2147483648,C[0]=0,C[1]=8,C[2]=16,C[3]=24,r.md5=r.md5||e}(\"undefined\"==typeof global?window:global);\n\nexport const generateMD5 = (data) => md5(data);\n\nexport const generateUUID = () => {\n let d = new Date().getTime();\n if (typeof performance !== 'undefined' && typeof performance.now === 'function'){\n d += performance.now(); //use high-precision timer if available\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n var r = (d + Math.random() * 16) % 16 | 0;\n d = Math.floor(d / 16);\n return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);\n });\n}\n","\nexport const isBigEndian = () => {\n let arr32 = new Uint32Array(1);\n let arr8 = new Uint8Array(arr32.buffer);\n arr32[0] = 255;\n return arr32[3]==255;\n};\n\nexport const isLittleEndian = () => {\n let arr32 = new Uint32Array(1);\n let arr8 = new Uint8Array(arr32.buffer);\n arr32[0] = 255;\n return arr32[0]==255;\n};\n\n","\n\nexport default class UserAgent {\n constructor(userAgentString) {\n this.system = {};\n this.browser = {};\n \n if (!userAgentString) {\n userAgentString = navigator.userAgent;\n }\n this.parseOperatingSystem(userAgentString);\n this.parseBrowser(userAgentString);\n }\n\n parseOperatingSystem(userAgentString) {\n this.system.OSX = /Macintosh/.test(userAgentString);\n this.system.Windows = /Windows/.test(userAgentString);\n this.system.iPhone = /iPhone/.test(userAgentString);\n this.system.iPodTouch = /iPod/.test(userAgentString);\n this.system.iPad = /iPad/.test(userAgentString);\n this.system.iOS = this.system.iPhone || this.system.iPad || this.system.iPodTouch;\n this.system.Android = /Android/.test(userAgentString);\n this.system.Linux = (this.system.Android) ? false:/Linux/.test(userAgentString);\n\n if (this.system.OSX) {\n this.system.OSName = \"OS X\";\n this.parseOSXVersion(userAgentString);\n }\n else if (this.system.Windows) {\n this.system.OSName = \"Windows\";\n this.parseWindowsVersion(userAgentString);\n }\n else if (this.system.Linux) {\n this.system.OSName = \"Linux\";\n this.parseLinuxVersion(userAgentString);\n }\n else if (this.system.iOS) {\n this.system.OSName = \"iOS\";\n this.parseIOSVersion(userAgentString);\n }\n else if (this.system.Android) {\n this.system.OSName = \"Android\";\n this.parseAndroidVersion(userAgentString);\n }\n }\n\n parseBrowser(userAgentString) {\n // Safari: Version/X.X.X Safari/XXX\n // Chrome: Chrome/XX.X.XX.XX Safari/XXX\n // Opera: Opera/X.XX\n // Firefox: Gecko/XXXXXX Firefox/XX.XX.XX\n // Explorer: MSIE X.X\n this.browser.Version = {};\n this.browser.Safari = /Version\\/([\\d\\.]+) Safari\\//.test(userAgentString);\n if (this.browser.Safari) {\n this.browser.Name = \"Safari\";\n this.browser.Vendor = \"Apple\";\n this.browser.Version.versionString = RegExp.$1;\n }\n\n this.browser.Chrome = /Chrome\\/([\\d\\.]+) Safari\\//.test(userAgentString);\n if (this.browser.Chrome) {\n this.browser.Name = \"Chrome\";\n this.browser.Vendor = \"Google\";\n this.browser.Version.versionString = RegExp.$1;\n }\n\n this.browser.Opera = /Opera\\/[\\d\\.]+/.test(userAgentString);\n if (this.browser.Opera) {\n this.browser.Name = \"Opera\";\n this.browser.Vendor = \"Opera Software\";\n var versionString = /Version\\/([\\d\\.]+)/.test(userAgentString);\n this.browser.Version.versionString = RegExp.$1;\n }\n\n this.browser.Firefox = /Gecko\\/[\\d\\.]+ Firefox\\/([\\d\\.]+)/.test(userAgentString);\n if (this.browser.Firefox) {\n this.browser.Name = \"Firefox\";\n this.browser.Vendor = \"Mozilla Foundation\";\n this.browser.Version.versionString = RegExp.$1;\n }\n\n this.browser.Edge = /Edge\\/(.*)/.test(userAgentString);\n if (this.browser.Edge) {\n var result = /Edge\\/(.*)/.exec(userAgentString);\n this.browser.Name = \"Edge\";\n this.browser.Chrome = false;\n this.browser.Vendor = \"Microsoft\";\n this.browser.Version.versionString = result[1];\n } \n\n this.browser.Explorer = /MSIE ([\\d\\.]+)/.test(userAgentString);\n if (!this.browser.Explorer) {\n var re = /\\Mozilla\\/5.0 \\(([^)]+)\\) like Gecko/\n var matches = re.exec(userAgentString);\n if (matches) {\n re = /rv:(.*)/\n var version = re.exec(matches[1]);\n this.browser.Explorer = true;\n this.browser.Name = \"Internet Explorer\";\n this.browser.Vendor = \"Microsoft\";\n if (version) {\n this.browser.Version.versionString = version[1];\n }\n else {\n this.browser.Version.versionString = \"unknown\";\n }\n }\n }\n else {\n this.browser.Name = \"Internet Explorer\";\n this.browser.Vendor = \"Microsoft\";\n this.browser.Version.versionString = RegExp.$1;\n }\n\n if (this.system.iOS) {\n this.browser.IsMobileVersion = true;\n this.browser.MobileSafari = /Version\\/([\\d\\.]+) Mobile/.test(userAgentString);\n if (this.browser.MobileSafari) {\n this.browser.Name = \"Mobile Safari\";\n this.browser.Vendor = \"Apple\";\n this.browser.Version.versionString = RegExp.$1;\n }\n this.browser.Android = false;\n }\n else if (this.system.Android) {\n this.browser.IsMobileVersion = true;\n this.browser.Android = /Version\\/([\\d\\.]+) Mobile/.test(userAgentString);\n if (this.browser.MobileSafari) {\n this.browser.Name = \"Android Browser\";\n this.browser.Vendor = \"Google\";\n this.browser.Version.versionString = RegExp.$1;\n }\n else {\n this.browser.Chrome = /Chrome\\/([\\d\\.]+)/.test(userAgentString);\n this.browser.Name = \"Chrome\";\n this.browser.Vendor = \"Google\";\n this.browser.Version.versionString = RegExp.$1;\n }\n\n this.browser.Safari = false;\n }\n else {\n this.browser.IsMobileVersion = false;\n }\n\n this.parseBrowserVersion(userAgentString);\n }\n\n parseBrowserVersion(userAgentString) {\n if (/([\\d]+)\\.([\\d]+)\\.*([\\d]*)/.test(this.browser.Version.versionString)) {\n this.browser.Version.major = Number(RegExp.$1);\n this.browser.Version.minor = Number(RegExp.$2);\n this.browser.Version.revision = (RegExp.$3) ? Number(RegExp.$3):0;\n }\n }\n\n parseOSXVersion(userAgentString) {\n var versionString = (/Mac OS X (\\d+_\\d+_*\\d*)/.test(userAgentString)) ? RegExp.$1:'';\n this.system.Version = {};\n // Safari/Chrome\n if (versionString!='') {\n if (/(\\d+)_(\\d+)_*(\\d*)/.test(versionString)) {\n this.system.Version.major = Number(RegExp.$1);\n this.system.Version.minor = Number(RegExp.$2);\n this.system.Version.revision = (RegExp.$3) ? Number(RegExp.$3):0;\n }\n }\n // Firefox/Opera\n else {\n versionString = (/Mac OS X (\\d+\\.\\d+\\.*\\d*)/.test(userAgentString)) ? RegExp.$1:'Unknown';\n if (/(\\d+)\\.(\\d+)\\.*(\\d*)/.test(versionString)) {\n this.system.Version.major = Number(RegExp.$1);\n this.system.Version.minor = Number(RegExp.$2);\n this.system.Version.revision = (RegExp.$3) ? Number(RegExp.$3):0;\n }\n }\n if (!this.system.Version.major) {\n this.system.Version.major = 0;\n this.system.Version.minor = 0;\n this.system.Version.revision = 0;\n }\n this.system.Version.stringValue = this.system.Version.major + '.' + this.system.Version.minor + '.' + this.system.Version.revision;\n switch (this.system.Version.minor) {\n case 0:\n this.system.Version.name = \"Cheetah\";\n break;\n case 1:\n this.system.Version.name = \"Puma\";\n break;\n case 2:\n this.system.Version.name = \"Jaguar\";\n break;\n case 3:\n this.system.Version.name = \"Panther\";\n break;\n case 4:\n this.system.Version.name = \"Tiger\";\n break;\n case 5:\n this.system.Version.name = \"Leopard\";\n break;\n case 6:\n this.system.Version.name = \"Snow Leopard\";\n break;\n case 7:\n this.system.Version.name = \"Lion\";\n break;\n case 8:\n this.system.Version.name = \"Mountain Lion\";\n break;\n }\n }\n\n parseWindowsVersion(userAgentString) {\n this.system.Version = {};\n if (/NT (\\d+)\\.(\\d*)/.test(userAgentString)) {\n this.system.Version.major = Number(RegExp.$1);\n this.system.Version.minor = Number(RegExp.$2);\n this.system.Version.revision = 0;\t// Solo por compatibilidad\n this.system.Version.stringValue = \"NT \" + this.system.Version.major + \".\" + this.system.Version.minor;\n var major = this.system.Version.major;\n var minor = this.system.Version.minor;\n var name = 'undefined';\n if (major==5) {\n if (minor==0) this.system.Version.name = '2000';\n else this.system.Version.name = 'XP';\n }\n else if (major==6) {\n if (minor==0) this.system.Version.name = 'Vista';\n else if (minor==1) this.system.Version.name = '7';\n else if (minor==2) this.system.Version.name = '8';\n }\n }\n else {\n this.system.Version.major = 0;\n this.system.Version.minor = 0;\n this.system.Version.name = \"Unknown\";\n this.system.Version.stringValue = \"Unknown\";\n }\n }\n\n parseLinuxVersion(userAgentString) {\n this.system.Version = {};\n this.system.Version.major = 0;\n this.system.Version.minor = 0;\n this.system.Version.revision = 0;\n this.system.Version.name = \"\";\n this.system.Version.stringValue = \"Unknown distribution\";\n }\n\n parseIOSVersion(userAgentString) {\n this.system.Version = {};\n if (/iPhone OS (\\d+)_(\\d+)_*(\\d*)/i.test(userAgentString)) {\n this.system.Version.major = Number(RegExp.$1);\n this.system.Version.minor = Number(RegExp.$2);\n this.system.Version.revision = (RegExp.$3) ? Number(RegExp.$3):0;\n this.system.Version.stringValue = this.system.Version.major + \".\" + this.system.Version.minor + '.' + this.system.Version.revision;\n this.system.Version.name = \"iOS\";\n }\n else {\n this.system.Version.major = 0;\n this.system.Version.minor = 0;\n this.system.Version.name = \"Unknown\";\n this.system.Version.stringValue = \"Unknown\";\n }\n }\n\n parseAndroidVersion(userAgentString) {\n this.system.Version = {};\n if (/Android (\\d+)\\.(\\d+)\\.*(\\d*)/.test(userAgentString)) {\n this.system.Version.major = Number(RegExp.$1);\n this.system.Version.minor = Number(RegExp.$2);\n this.system.Version.revision = (RegExp.$3) ? Number(RegExp.$3):0;\n this.system.Version.stringValue = this.system.Version.major + \".\" + this.system.Version.minor + '.' + this.system.Version.revision;\n }\n else {\n this.system.Version.major = 0;\n this.system.Version.minor = 0;\n this.system.Version.revision = 0;\n }\n if (/Build\\/([a-zA-Z]+)/.test(userAgentString)) {\n this.system.Version.name = RegExp.$1;\n }\n else {\n this.system.Version.name = \"Unknown version\";\n }\n this.system.Version.stringValue = this.system.Version.major + \".\" + this.system.Version.minor + '.' + this.system.Version.revision;\n }\n\n getInfoString() {\n return navigator.userAgent;\n }\n}\n","\nexport const ProcessType = {\n BROWSER: 0,\n ELECTRON_RENDERER: 1,\n ELECTRON_MAIN: 2,\n NODE: 3\n};\n\nexport const ProcessTypeName = {\n 0: \"Browser\",\n 1: \"Electron (renderer)\",\n 2: \"Electron (main)\",\n 3: \"Node\"\n};\n\nexport const getProcessType = () => {\n if (typeof process !== 'undefined' && process.release.name === 'node') {\n return ProcessType.NODE;\n }\n else if (typeof window !== 'undefined' && typeof window.process === 'object' && window.process.type === 'renderer') {\n return ProcessType.ELECTRON_RENDERER;\n }\n else if (typeof process !== 'undefined' && typeof process.versions === 'object' && !process.versions.electron) {\n return ProcessType.ELECTRON_MAIN;\n }\n else if (typeof navigator === 'object' && typeof navigator.userAgent === 'string' && navigator.userAgent.indexOf('Electron') >= 0) {\n return ProcessType.ELECTRON_RENDERER;\n }\n else {\n return ProcessType.BROWSER;\n }\n}\n\n\nexport const isElectron = () => {\n switch (getProcessType()) {\n case ProcessType.ELECTRON_RENDERER:\n case ProcessType.ELECTRON_MAIN:\n return true;\n default:\n return false;\n }\n}\n\nexport const isBrowserOrElectronRenderer = () => {\n const type = getProcessType();\n return type === ProcessType.BROWSER || type === ProcessType.ELECTRON_RENDERER;\n}\n\nexport const isBrowser = () => {\n return getProcessType() === ProcessType.BROWSER;\n}\n\nexport const isNode = () => {\n return getProcessType() === ProcessType.NODE;\n}\n","import { isNode, isBrowserOrElectronRenderer } from \"./processType\";\n\nexport const base64ToArrayBuffer = async (base64) => {\n if (isBrowserOrElectronRenderer()) {\n return new Uint8Array(atob(base64).split('').map(c => c.charCodeAt(0)));\n }\n else if (isNode()) {\n const Buffer = await import('buffer');\n return Buffer.atob(base64).split('').map(c => c.charCodeAt(0));\n }\n else {\n throw new Error(\"base64ToArrayBuffer: Unsupported platform. Valid platforms are NodeJS, Browser or ElectronRenderer\");\n }\n}\n\n","import { isBrowserOrElectronRenderer } from './processType';\nimport { base64ToArrayBuffer } from './base64';\n\nexport const DataFormat = {\n BYTES: 0, // Uint8Array\n IMAGE: 1, // DOM img\n BASE64: 2, // Base64 string. It can include or not the Base64 image prefix\n TEXT: 3, // Text string\n JSON_STRING: 4, // JSON text\n JSON_OBJECT: 5, // JSON serializable object\n FILE_PATH: 6 // File path (used to implement file copy)\n};\n\nexport default class ResourceProvider {\n set writeStrategy(ws) {\n this._writeStrategy = ws;\n }\n\n get writeStrategy() {\n if (!this._writeStrategy) {\n throw new Error(\"ResourceProvider.write(): no write strategy configured.\");\n }\n return this._writeStrategy;\n }\n\n async load(url) {\n\n }\n\n async write(url,data,format = DataFormat.TEXT) {\n switch (format) {\n case BYTES:\n return this.writeStrategy.writeBytes(url,data);\n case IMAGE:\n if (isBrowserOrElectronRenderer()) {\n return this.writeStrategy.writeImage(url, data);\n }\n else {\n throw new Error(\"ResourceProvider.write() unsupported data format: Image data format is supported only on browsers or electron renderer process.\");\n }\n case BASE64:\n const bytes = base64ToArrayBuffer(data);\n return this.writeStrategy.writeBytes(url,bytes);\n case TEXT:\n return this.writeStrategy.writeText(url,data);\n case JSON_STRING:\n return this.writeStrategy.writeText(url,data);\n case JSON_OBJECT:\n return this.writeStrategy.writeJson(url,data);\n case FILE_PATH:\n return this.copyFile(url,data);\n default:\n throw new Error(\"ResourceProvider.write() invalid format\");\n }\n }\n}\n","\nimport ResourceProvider from \"./ResourceProvider.js\";\nimport { generateUUID } from \"./crypto.js\";\n\n// In this array we keep a reference to the images being loaded to\n// prevent them from being deleted from memory\nconst g_preventImageDump = [];\n\nconst beginLoadImage = (img) => {\n if (g_preventImageDump.indexOf(img) === -1) {\n g_preventImageDump.push(img);\n }\n};\n\nconst endLoadImage = (img) => {\n const i = g_preventImageDump.indexOf(img);\n if (i !== -1) {\n g_preventImageDump.splice(i, 1);\n }\n}\n\nconst loadImage = (url,preventCache = false) => {\n return new Promise((resolve,reject) => {\n const img = new Image();\n beginLoadImage(img);\n img.crossOrigin = \"\";\n img.addEventListener(\"load\", evt => {\n endLoadImage(evt.target);\n resolve(evt.target);\n });\n img.addEventListener(\"error\", evt => {\n endLoadImage(evt.target);\n reject(new Error(`Error loading image '${ url }'.`));\n });\n img.addEventListener(\"abort\", evt => {\n endLoadImage(evt.target);\n reject(new Error(`Image load aborted '${ url }'.`));\n });\n img.src = url + (preventCache ? `?${generateUUID()}` : \"\");\n })\n}\n\nexport default class ImageResourceProvider extends ResourceProvider {\n async load(url) {\n const img = await loadImage(url, false);\n return img;\n }\n\n async write(url,img) {\n let data = null;\n if (img instanceof Image) {\n // TODO: convert to Uint8Array data\n }\n else if (typeof(img) === \"string\" && /base64/i.test(img)) {\n // Convert base64 image into Uint8Array data\n }\n else if (typeof(img) === \"string\") {\n // Path: copy image\n }\n else {\n throw new Error(\"Unsupported image type specified for write\");\n }\n return await this.writeStrategy.writeData(url,data);\n }\n}\n","\nimport ResourceProvider from \"./ResourceProvider.js\";\n\nconst g_preventVideoDump = [];\n\nconst beginLoadVideo = (video) => {\n if (g_preventVideoDump.indexOf(video) === -1) {\n g_preventVideoDump.push(video);\n }\n};\n\nconst endLoadVideo = (video) => {\n const i = g_preventVideoDump.indexOf(video);\n if (i !== -1) {\n g_preventVideoDump.splice(i, 1);\n }\n}\n\nconst loadVideo = (url) => {\n return new Promise((resolve,reject) => {\n const video = document.createElement(\"video\");\n beginLoadVideo(video);\n video.crossOrigin = \"\";\n video.autoplay = true;\n video.setAttribute(\"playsinline\", null);\n video.addEventListener(\"canplay\", evt => {\n endLoadVideo(evt.target);\n resolve(evt.target);\n });\n video.addEventListener(\"error\", evt => {\n endLoadVideo(evt.target);\n reject(new Error(`Error loading video ${ url }`));\n });\n video.addEventListener(\"abort\", evt => {\n endLoadVideo(evt.target);\n reject(new Error(`Video load aborted '${ url }'`));\n });\n video.src = url;\n });\n}\n\nexport default class VideoResourceProvider extends ResourceProvider {\n async load(url) {\n const video = await loadVideo(url);\n return video;\n }\n\n async write(url,data) {\n throw new Error(\"VideoResourceProvider.write(): not supported\");\n }\n}\n","\nimport ResourceProvider from \"./ResourceProvider.js\";\n\nexport default class BinaryResourceProvider extends ResourceProvider {\n async load(url) {\n const response = await fetch(url);\n if (response.ok) {\n const binaryData = await response.arrayBuffer();\n return binaryData;\n }\n else {\n throw new Error(`Resource not found at '${ url }'`);\n }\n }\n}\n","import ResourceProvider from './ResourceProvider.js';\n\nexport default class TextResourceProvider extends ResourceProvider {\n async load(url) {\n const response = await fetch(url);\n if (response.ok) {\n const textData = await response.text();\n try {\n const objectData = JSON.parse(textData);\n return objectData;\n }\n catch (e) {\n return textData;\n }\n }\n else {\n throw new Error(`Resource not found at '${ url }'`);\n }\n }\n\n async write(url,data) {\n return await this.writeStrategy.writeData(url,data,{encoding: 'utf-8'});\n }\n}\n","\nimport ImageResourceProvider from \"./ImageResourceProvider.js\";\nimport VideoResourceProvider from \"./VideoResourceProvider.js\";\nimport BinaryResourceProvider from \"./BinaryResourceProvider.js\";\nimport TextResourceProvider from \"./TextResourceProvider.js\";\n\nexport const ResourceType = {\n PolyList: 'PolyList', // Array of meshes\n Drawable: 'Drawable',\n Node: 'Node',\n Texture: 'Texture',\n Material: 'Material'\n};\n\nexport const getExtension = (url) => {\n const reResult = /\\.([a-z0-9]+)$/i.exec(url);\n if (reResult) {\n return reResult[1];\n }\n else {\n return \"\";\n }\n}\n\nexport const getFileName = (url) => {\n const reResult = /(.+)\\/(.+)$/.exec(url);\n if (reResult) {\n return reResult[2];\n }\n else {\n return url;\n }\n}\n\nexport const removeExtension = (url) => {\n const reResult = /(.+)\\.(.+)$/.exec(url);\n if (reResult) {\n return reResult[1];\n }\n else {\n return url;\n }\n}\n\nexport const removeFileName = (url) => {\n const i = url.lastIndexOf('/');\n if (i != -1) {\n return url.substring(0,i + 1);\n }\n return url;\n}\n\nexport const isAbsolute = (url) => {\n return /^http|^\\//i.test(url);\n}\n\nexport const jointUrl = (base,append) => {\n if (base[base.length - 1] !== '/' && append[0] !== '/') {\n return `${base}/${append}`;\n }\n else if ((base[base.length - 1] === '/' && append[0] !== '/') ||\n (base[base.length - 1] !== '/' && append[0] === '/')) {\n return `${base}${append}`;\n }\n else {\n return `${base}${append.slice(1)}`;\n }\n}\n\nexport const isFormat = (url,formats) => formats.some(fmt => (new RegExp(`\\.${fmt}`,'i')).test(url));\n\nexport const addFormats = (fmts, dst) => {\n if (!Array.isArray(fmts)) {\n fmts = [fmts]\n }\n fmts.forEach(fmt => {\n if (dst.indexOf(fmt) === -1) {\n dst.push(fmt);\n }\n });\n}\n\n\nconst g_validImageFormats = [\n \"jpg\",\n \"jpeg\",\n \"gif\",\n \"png\"\n];\n\nexport const isValidImage = (url) => isFormat(url,g_validImageFormats);\n\nexport const addImageFormats = (fmts) => {\n addFormats(fmts, g_validImageFormats);\n}\n\nexport const getValidImageFormats = () => g_validImageFormats;\n\nconst g_validVideoFormats = [\n \"mp4\",\n \"m4v\"\n];\n\nexport const isValidVideo = (url) => isFormat(url,g_validVideoFormats);\n\nexport const addVideoFormats = (fmts) => {\n addFormats(fmts, g_validVideoFormats);\n}\n\nexport const getValidVideoFormats = () => g_validVideoFormats;\n\nconst g_validBinaryFormats = [\n \"vwglb\",\n \"bg2\"\n];\n\nexport const isValidBinary = (url) => isFormat(url, g_validBinaryFormats);\n\nexport const addBinaryFormats = (fmts) => {\n addFormats(fmts, g_validBinaryFormats);\n}\n\nexport const getValidBinaryFormats = () => g_validBinaryFormats;\n\nexport default class Resource {\n\n constructor({\n imageProvider = null,\n videoProvider = null,\n binaryProvider = null,\n textProvider = null,\n writeStrategy = null\n } = {}) {\n this._imageProvider = imageProvider || new ImageResourceProvider();\n this._videoProvider = videoProvider || new VideoResourceProvider();\n this._binaryProvider = binaryProvider || new BinaryResourceProvider();\n this._textProvider = textProvider || new TextResourceProvider();\n this.writeStrategy = writeStrategy;\n }\n\n set writeStrategy(ws) {\n this._writeStrategy = ws;\n\n this._imageProvider.writeStrategy = ws;\n this._videoProvider.writeStrategy = ws;\n this._binaryProvider.writeStrategy = ws;\n this._textProvider.writeStrategy = ws;\n }\n\n get writeStrategy() {\n return this._writeStrategy;\n }\n\n getProvider(url) {\n switch (true) {\n case isValidImage(url):\n return this._imageProvider;\n case isValidVideo(url):\n return this._videoProvider;\n case isValidBinary(url):\n return this._binaryProvider;\n default:\n return this._textProvider;\n }\n }\n\n async load(url) {\n const provider = this.getProvider(url);\n const data = await provider.load(url);\n return data;\n }\n\n async write(url,data) {\n const provider = this.getProvider(url);\n return await provider.write(url,data);\n }\n}\n","import { generateUUID, generateMD5 } from './crypto';\nimport { isBigEndian, isLittleEndian } from './endiantess';\nimport UserAgent from './UserAgent';\nimport Resource, {\n isFormat,\n addFormats,\n isValidImage,\n addImageFormats,\n getValidImageFormats,\n isValidVideo,\n addVideoFormats,\n getValidVideoFormats,\n isValidBinary,\n addBinaryFormats,\n getValidBinaryFormats\n} from './Resource';\nimport ResourceProvider from './ResourceProvider';\nimport ImageResourceProvider from './ImageResourceProvider';\nimport VideoResourceProvider from './VideoResourceProvider';\nimport BinaryResourceProvider from './BinaryResourceProvider';\nimport TextResourceProvider from './TextResourceProvider';\nimport {\n ProcessType,\n ProcessTypeName,\n getProcessType,\n isBrowser, isNode\n} from './processType';\n\nexport default {\n generateUUID, generateMD5,\n isBigEndian, isLittleEndian,\n UserAgent,\n Resource, isFormat, addFormats, isValidImage, addImageFormats, getValidImageFormats, isValidVideo, addVideoFormats, getValidVideoFormats, isValidBinary, addBinaryFormats, getValidBinaryFormats,\n ResourceProvider,\n ImageResourceProvider,\n VideoResourceProvider,\n BinaryResourceProvider,\n TextResourceProvider,\n ProcessType, ProcessTypeName, getProcessType, isBrowser, isNode\n};\n","\n\nexport default class LoaderPlugin {\n // Returns an array of valid file extensions for this plugin\n // example: [\"obj\",\"dae\"]\n get supportedExtensions() {\n throw new Error(\"LoaderPlugin.supportedExtensions: attribute not implemented\");\n }\n\n // Returns the resource types that the loader plugin can handle\n // example: [ ResourceType.PolyList, ResourceType.Scene ]\n get resourceTypes() {\n throw new Error(\"LoaderPlugin.resourceTypes: attribute not implemented\");\n }\n\n // Returns the resource loaded with the path. The resource type must be one\n // of the specified in the resourceTypes attribute\n async load(path, type, loader) {\n throw new Error(\"LoaderPlugin.load(): method not implemented\");\n }\n\n // Returns an array of LoaderPlugin objects that are necessary for this plugin to work.\n get dependencies() {\n return [];\n }\n}\n","import Vec from '../math/Vec';\n\nconst checkLength = (v1,v2 = null) => {\n if (v1.length < 4 || (v2 !== null && v2.length < 4)) {\n throw new Error(`Invalid color component length`);\n }\n}\n\nexport default class Color extends Vec {\n constructor() {\n if (arguments.length === 1 && arguments[0].length === 4) {\n // 4 elements array\n super(arguments[0]);\n }\n else if (arguments.length === 1 && arguments[0].length === 3) {\n super(arguments[0][0], arguments[0][1], arguments[0][2], 1);\n }\n else if (typeof(arguments) === \"object\" &&\n arguments[0].rgb !== undefined ||\n arguments[0].r !== undefined ||\n arguments[0].g !== undefined ||\n arguments[0].b !== undefined ||\n arguments[0].a !== undefined\n ) {\n const r = arguments[0].r || arguments[0].rgb || 0;\n const g = arguments[0].g || arguments[0].rgb || 0;\n const b = arguments[0].b || arguments[0].rgb || 0;\n const a = arguments[0].a || arguments[0].a || 1;\n super(r, g, b, a);\n }\n else if (arguments.length === 0) {\n super([0, 0, 0, 1]);\n }\n else {\n throw new Error('Invalid initialization parameters in Color constructor');\n }\n }\n \n static Yellow() { return new Color([1.0,1.0,0.0,1.0]); }\n static Orange() { return new Color([1.0,0.5,0.0,1.0]); }\n static Red() { return new Color([1.0,0.0,0.0,1.0]); }\n static Violet() { return new Color([0.5,0.0,1.0,1.0]); }\n static Blue() { return new Color([0.0,0.0,1.0,1.0]); }\n static Green() { return new Color([0.0,1.0,0.0,1.0]); }\n static White() { return new Color([1.0,1.0,1.0,1.0]); }\n static LightGray() { return new Color([0.8,0.8,0.8,1.0]); }\n static Gray() { return new Color([0.5,0.5,0.5,1.0]); }\n static DarkGray() { return new Color([0.2,0.2,0.2,1.0]); }\n static Black() { return new Color([0.0,0.0,0.0,1.0]); }\n static Brown() { return new Color([0.4,0.2,0.0,1.0]); }\n static Transparent() { return new Color([0,0,0,0]); }\n\n get r() { return this[0]; }\n set r(v) { this[0] = v; }\n get g() { return this[1]; }\n set g(v) { this[1] = v; }\n get b() { return this[2]; }\n set b(v) { this[2] = v; }\n get a() { return this[3]; }\n set a(v) { this[3] = v; }\n\n get rgb() { return new Vec(this[0], this[1], this[2]); }\n set rgb(rgb) {\n if (rgb.length === 3) {\n this[0] = rgb[0];\n this[1] = rgb[1];\n this[2] = rgb[2];\n }\n else {\n throw new Error(\"Invalid parameter settings rgb values in Color\");\n }\n }\n\n static Max(v1,v2) {\n checkLength(v1, v2);\n return new Color([\n v1[0]>v2[0] ? v1[0] : v2[0],\n v1[1]>v2[1] ? v1[1] : v2[1],\n v1[2]>v2[2] ? v1[2] : v2[2],\n v1[3]>v2[3] ? v1[3] : v2[3]\n ]);\n }\n\n static Min(v1,v2) {\n checkLength(v1, v2);\n return new Color([\n v1[0]<v2[0] ? v1[0] : v2[0],\n v1[1]<v2[1] ? v1[1] : v2[1],\n v1[2]<v2[2] ? v1[2] : v2[2],\n v1[3]<v2[3] ? v1[3] : v2[3]\n ]);\n }\n\n static Add(v1,v2) {\n checkLength(v1, v2);\n return new Color([\n v1[0] + v2[0],\n v1[1] + v2[1],\n v1[2] + v2[2],\n v1[3] + v2[3]\n ]);\n }\n\n static Sub(v1,v2) {\n checkLength(v1, v2);\n return new Color([\n v1[0] - v2[0],\n v1[1] - v2[1],\n v1[2] - v2[2],\n v1[3] - v2[3]\n ]);\n }\n\n static Mult(v,s) {\n checkLength(v);\n new Color([ v[0] * s, v[1] * s, v[2] * s, v[3] * s ]);\n }\n\n static Div(v,s) {\n switch (v.length) {\n case 2:\n return new Vec([ v[0] / s, v[1] / s ]);\n case 3:\n return new Vec([ v[0] / s, v[1] / s, v[2] / s ]);\n case 4:\n return new Vec([ v[0] / s, v[1] / s, v[2] / s, v[3] / s ]);\n default:\n throw new Error(`Invalid vector size: ${ v.length }`);\n }\n }\n}\n","import Vec from \"../math/Vec\";\nimport Mat4 from \"../math/Mat4\";\nimport Color from \"./Color\";\nimport { number } from \"zod\";\n\n\nexport const BufferType = Object.freeze({\n VERTEX:\t\t 1 << 0,\n NORMAL:\t\t 1 << 1,\n TEX_COORD_0:\t1 << 2,\n TEX_COORD_1:\t1 << 3,\n TEX_COORD_2:\t1 << 4,\n COLOR:\t\t 1 << 5,\n TANGENT:\t 1 << 6,\n INDEX:\t\t 1 << 7\n});\n\nexport const DrawMode = Object.freeze({\n POINTS: 0,\n TRIANGLES: 1,\n TRIANGLE_FAN: 2,\n TRIANGLE_STRIP: 3,\n LINES: 4,\n LINE_STRIP: 5\n});\n\nexport const RenderLayer = Object.freeze({\n LAYER_0: 0x1 << 0,\n OPAQUE_DEFAULT: 0x1 << 0, // layer 0 is the default layer for opaque objects\n LAYER_1: 0x1 << 1,\n LAYER_2: 0x1 << 2,\n LAYER_3: 0x1 << 3,\n LAYER_4: 0x1 << 4,\n LAYER_5: 0x1 << 5,\n LAYER_6: 0x1 << 6,\n LAYER_7: 0x1 << 7,\n LAYER_8: 0x1 << 8,\n LAYER_9: 0x1 << 9,\n LAYER_10: 0x1 << 10,\n LAYER_11: 0x1 << 11,\n LAYER_12: 0x1 << 12,\n LAYER_13: 0x1 << 13,\n LAYER_14: 0x1 << 14,\n LAYER_15: 0x1 << 15,\n TRANSPARENT_DEFAULT: 0x1 << 15, // Layer 15 is the default layer for transparent objects\n LAYER_16: 0x1 << 16,\n LAYER_17: 0x1 << 17,\n LAYER_18: 0x1 << 18,\n LAYER_19: 0x1 << 19,\n LAYER_20: 0x1 << 20,\n LAYER_21: 0x1 << 21,\n LAYER_22: 0x1 << 22,\n LAYER_23: 0x1 << 23,\n LAYER_24: 0x1 << 24,\n LAYER_25: 0x1 << 25,\n LAYER_26: 0x1 << 26,\n LAYER_27: 0x1 << 27,\n LAYER_28: 0x1 << 28,\n LAYER_29: 0x1 << 29,\n LAYER_30: 0x1 << 30,\n LAYER_31: 0x1 << 31,\n SELECTION_DEFAULT: 0x1 << 31, // Layer 31 is the default layer for mouse pick selection\n\n ALL: 0xFFFFFFFF,\n\n AUTO: 0\n});\n\n// Process the default layer if RenderLayer is set to AUTO. To do it, you need\n// the object material to know if the layer must be set to transparent or opaque\nexport const getLayers = (polyList,material) => {\n return polyList.renderLayers === RenderLayer.AUTO ?\n (material.isTransparent ? RenderLayer.TRANSPARENT_DEFAULT : RenderLayer.OPAQUE_DEFAULT) | RenderLayer.SELECTION_DEFAULT :\n (polyList.renderLayers);\n}\n\nexport const PolyListFrontFace = Object.freeze({\n CW: 0,\n CCW: 1\n});\n\nexport const PolyListCullFace = Object.freeze({\n FRONT: 0,\n BACK: 1,\n FRONT_AND_BACK: 2\n});\n\nfunction buildTangents(plist) {\n const createVertex = (index) => {\n return {\n pos: new Vec(plist.vertex[index] * 3, plist.vertex[index + 1] * 3, plist.vertex[index + 2] * 3 ),\n uv: new Vec(plist.texCoord0[index] * 2, plist.texCoord0[index + 1] * 2 )\n }\n }\n\n const result = [];\n for (let i = 0; i < plist.index.length; i += 3) {\n const i1 = plist.index[i];\n const i2 = plist.index[i + 1];\n const i3 = plist.index[i + 2];\n\n const v0 = createVertex(i1);\n const v1 = createVertex(i2);\n const v2 = createVertex(i3);\n\n const pos1 = v0.pos;\n const pos2 = v1.pos;\n const pos3 = v2.pos;\n\n const uv1 = v0.uv;\n const uv2 = v1.uv;\n const uv3 = v2.uv;\n\n let edge1 = Vec.Sub(pos2, pos1);\n let edge2 = Vec.Sub(pos3, pos1);\n let deltaUV1 = Vec.Sub(uv2, uv1);\n let deltaUV2 = Vec.Sub(uv3, uv1);\n\n let f = 1 / (deltaUV1.x * deltaUV2.y - deltaUV2.x * deltaUV1.y);\n let numberOfAttempts = 0;\n while ((isNaN(f) || !isFinite(f)) && numberOfAttempts < 4) {\n if (numberOfAttempts === 0) {\n edge1 = Vec.Sub(pos1, pos2);\n edge2 = Vec.Sub(pos3, pos2);\n deltaUV1 = Vec.Sub(uv1, uv2);\n deltaUV2 = Vec.Sub(uv3, uv2);\n } else if (numberOfAttempts === 1) {\n edge1 = Vec.Sub(pos2, pos3);\n edge2 = Vec.Sub(pos1, pos3);\n deltaUV1 = Vec.Sub(uv2, uv3);\n deltaUV2 = Vec.Sub(uv1, uv3);\n } else if (numberOfAttempts === 2) {\n uv1.x = uv1.x * 1.3;\n uv1.y = uv1.y * 0.8;\n deltaUV1 = Vec.Sub(uv2, uv1);\n deltaUV2 = Vec.Sub(uv3, uv1);\n } else if (numberOfAttempts === 3) {\n uv3.x = uv3.x * 1.1;\n uv3.y = uv3.y * 0.9;\n deltaUV1 = Vec.Sub(uv2, uv1);\n deltaUV2 = Vec.Sub(uv3, uv1);\n }\n \n\n f = 1 / (deltaUV1.x * deltaUV2.y - deltaUV2.x * deltaUV1.y);\n\n numberOfAttempts++;\n }\n\n const tangent = new Vec(\n f * (deltaUV2.y * edge1.x - deltaUV1.y * edge2.x),\n f * (deltaUV2.y * edge1.y - deltaUV1.y * edge2.y),\n f * (deltaUV2.y * edge1.z - deltaUV1.y * edge2.z)\n );\n tangent.normalize();\n\n result.push(tangent.x);\n result.push(tangent.y);\n result.push(tangent.z);\n\n result.push(tangent.x);\n result.push(tangent.y);\n result.push(tangent.z);\n\n result.push(tangent.x);\n result.push(tangent.y);\n result.push(tangent.z);\n\n result[i1 * 3] = tangent.x;\n result[i1 * 3 + 1] = tangent.y;\n result[i1 * 3 + 2] = tangent.z;\n\n result[i2 * 3] = tangent.x;\n result[i2 * 3 + 1] = tangent.y;\n result[i2 * 3 + 2] = tangent.z;\n\n result[i3 * 3] = tangent.x;\n result[i3 * 3 + 1] = tangent.y;\n result[i3 * 3 + 2] = tangent.z;\n }\n\n plist._tangent = result;\n}\n\n// function buildTangents(plist) {\n// const result = [];\n\n// const createVertex = (index) => {\n// return {\n// pos: new Vec(plist.vertex[index] * 3, plist.vertex[index + 1] * 3, plist.vertex[index + 2] * 3 ),\n// uv: new Vec(plist.texCoord0[index] * 2, plist.texCoord0[index + 1] * 2 )\n// }\n// }\n\n// const createUV = (v1, v2) => Vec.Sub(v1.uv, v2.uv);\n\n// const calcR = (uv1, uv2) => 1.0 / (uv1.x * uv2.y - uv1.y * uv2.x);\n\n// if (plist.index.length % 3 === 0) {\n// for (let i = 0; i < plist.index.length - 2; i += 3) {\n// let v0 = createVertex(plist.index[i + 1]);\n// let v1 = createVertex(plist.index[i]);\n// let v2 = createVertex(plist.index[i + 2]);\n\n// let edge1 = Vec.Sub(v1.pos, v0.pos);\n// let edge2 = Vec.Sub(v2.pos, v0.pos);\n\n// let uv1 = createUV(v1, v0);\n// let uv2 = createUV(v2, v0);\n// let r = calcR(uv1, uv2);\n\n// if (!isFinite(r)) {\n// v0.uv.x = v0.uv.x * 1.3;\n// v0.uv.y = v0.uv.y * 0.8;\n// uv1 = createUV(v1, v0);\n// uv2 = createUV(v2, v0);\n// r = calcR(uv1, uv2);\n// }\n\n// if (!isFinite(r)) {\n// v2.uv.x = v2.uv.x * 1.1;\n// v2.uv.y = v2.uv.y * 0.9;\n// uv1 = createUV(v1, v0);\n// uv2 = createUV(v2, v0);\n// r = calcR(uv1, uv2);\n// }\n\n// const tangent = new Vec(\n// ((edge1.x * uv2.y) - (edge2.x * uv1.y)) * r,\n// ((edge1.y * uv2.y) - (edge2.y * uv1.y)) * r,\n// ((edge1.z * uv2.y) - (edge2.z * uv1.y)) * r\n// );\n// tangent.normalize();\n \n// result.push(tangent.x);\n// result.push(tangent.y);\n// result.push(tangent.z);\n \n// result.push(tangent.x);\n// result.push(tangent.y);\n// result.push(tangent.z);\n \n// result.push(tangent.x);\n// result.push(tangent.y);\n// result.push(tangent.z);\n// }\n// }\n// else {\n// for (let i=0; i<plist.vertex.length; i+=3) {\n// result.push(0,0,1);\n// }\n\n// console.warn(\"Could not generate tangents: invalid type of faces found.\");\n// }\n\n// plist._tangent = result;\n// }\n\nexport default class PolyList {\n constructor() {\n // The object will be rendered in the default layer for\n // transparent or opaque objects\n this._renderLayers = RenderLayer.AUTO;\n\n this._drawMode = DrawMode.TRIANGLES;\n this._lineWidth = 1.0;\n\n this._name = \"\";\n this._groupName = \"\";\n this._visible = true;\n this._visibleToShadows = true;\n\n this._cullFace = PolyListCullFace.BACK;\n this._frontFace = PolyListFrontFace.CCW;\n this._enableCullFace = true;\n\n this._vertex = [];\n this._normal = [];\n this._texCoord0 = [];\n this._texCoord1 = [];\n this._texCoord2 = [];\n this._color = [];\n this._index = [];\n\n // Internal use: the following properties will not be serialized\n this._colorCode = Color.Black();\n this._selected = false;\n this._selectable = true;\n }\n\n clone() {\n const result = new PolyList();\n result.assign(this);\n result.name = this.name + \" clone\";\n return result;\n }\n\n assign(other) {\n this.drawMode = other.drawMode;\n this.lineWidth = other.lineWidth;\n this.name = other.name;\n this.groupName = other.groupName;\n this.visible = other.visible;\n this.visibleToShadows = other.visibleToSh\n this.vertex = [...other.vertex];\n this.normal = [...other.normal];\n this.texCoord0 = [...other.texCoord0];\n this.texCoord1 = [...other.texCoord1];\n this.texCoord2 = [...other.texCoord2];\n this.color = [...other.color];\n this.index = [...other.index];\n this.rebuildTangents();\n }\n\n // render layers aren't serialized/deserialized, they are used only by the graphics engine\n get renderLayers() { return this._renderLayers; }\n set renderLayers(layers) { this._renderLayers = layers; }\n enableLayer(layer) { this._renderLayers = this._renderLayers | layer; }\n disableLayer(layer) { this._renderLayers = this._renderLayers & ~layer; }\n\n set cullFace(v) { this._cullFace = v; }\n get cullFace() { return this._cullFace; }\n set frontFace(v) { this._frontFace = v; }\n get frontFace() { return this._frontFace; }\n set enableCullFace(v) { this._enableCullFace = v; }\n get enableCullFace() { return this._enableCullFace; }\n\n get drawMode() { return this._drawMode; }\n set drawMode(m) { this._drawMode = m; }\n get lineWidth() { return this._lineWidth; }\n set lineWidth(w) { this._lineWidth = w; }\n\n get name() { return this._name; }\n set name(v) { this._name = v; }\n get groupName() { return this._groupName; }\n set groupName(v) { this._groupName = v; }\n get visible() { return this._visible; }\n set visible(v) { this._visible = v; }\n get visibleToShadows() { return this._visibleToShadows; }\n set visibleToShadows(v) { this._visibleToShadows = v; }\n\n get vertex() { return this._vertex; }\n set vertex(v) { this._vertex = v; }\n get normal() { return this._normal; }\n set normal(v) { this._normal = v; }\n get texCoord0() { return this._texCoord0; }\n set texCoord0(v) { this._texCoord0 = v; }\n get texCoord1() { return this._texCoord1; }\n set texCoord1(v) { this._texCoord1 = v; }\n get texCoord2() { return this._texCoord2; }\n set texCoord2(v) { this._texCoord2 = v; }\n get color() { return this._color; }\n set color(v) { this._color = v; }\n get index() { return this._index; }\n set index(v) { this._index = v; }\n\n // Internal use: non serializable properties\n set colorCode(c) {\n this._colorCode = c;\n }\n\n get colorCode() {\n return this._colorCode;\n }\n\n set selected(s) {\n this._selected = s;\n }\n\n get isSelected() {\n return this._selected;\n }\n\n get isSelectable() {\n return this._selectable;\n }\n\n set selectable(s) {\n this._selectable = s;\n }\n\n // The this._renderer variable is initialized by the polyListRenderer factory\n get renderer() {\n return this._renderer\n }\n\n rebuildTangents() {\n buildTangents(this);\n }\n\n get tangent() {\n if (!this.validTangents) {\n buildTangents(this);\n }\n return this._tangent;\n }\n\n get validTangents() {\n return this._tangent &&\n this._tangent.length === this._vertex.length &&\n this._tangent.length / 3 === this._texCoord0.length / 2;\n }\n\n destroy() {\n if (this.renderer) {\n this.renderer.destroy();\n }\n }\n\n static ApplyTransform(plist, trx) {\n const transform = new Mat4(trx);\n const rotation = new Mat4(trx.mat3);\n\n if (plist.normal.length > 0 && plist.normal.length != plist.vertex.length) {\n throw new Error(`Unexpected number of normal coordinates found in polyList '${ plist.name }'`);\n }\n\n for (let i = 0; i < plist.vertex.length - 2; i += 3) {\n let vertex = new Vec(plist.vertex[i], plist.vertex[i+1], plist.vertex[i+2], 1.0);\n vertex = transform.multVector(vertex);\n plist.vertex[i] = vertex.x;\n plist.vertex[i + 1] = vertex.y;\n plist.vertex[i + 2] = vertex.z;\n \n if (plist.normal.length) {\n let normal = new Vec(plist.normal[i], plist.normal[i+1], plist.normal[i+2], 1.0);\n normal = rotation.multVector(normal);\n plist.normal[i] = normal.x;\n plist.normal[i + 1] = normal.y;\n plist.normal[i + 2] = normal.z;\n }\n }\n }\n}\n","import { generateMD5 } from '../tools/crypto';\n\nexport const imageToBase64 = (image, format = 'image/jpeg') => {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n canvas.height = image.naturalHeight;\n canvas.width = image.naturalWidth;\n ctx.drawImage(image, 0, 0);\n return canvas.toDataURL(format);\n}\n\nexport const generateImageHash = (image) => {\n const base64 = imageToBase64(image);\n return generateMD5(base64);\n}\n","import { generateUUID } from \"../tools/crypto\";\n\nexport const getMouseEventOffset = (evt,canvas) => {\n const offset = canvas.domElement.getBoundingClientRect();\n return {\n x: evt.clientX - offset.left,\n y: evt.clientY - offset.top\n };\n}\n\nexport const getEventTouches = (evt,canvas) => {\n const offset = canvas.domElement.getBoundingClientRect();\n const touches = Array.from(evt.touches).map(touch => {\n return {\n identifier: touch.identifier,\n x: touch.clientX - offset.left,\n y: touch.clientY - offset.top,\n force: touch.force,\n rotationAngle: touch.rotationAngle,\n radiusX: touch.radiusX,\n radiusY: touch.radiusY\n };\n });\n return touches;\n}\n\nlet g_firstCanvas = null;\n\nexport default class Canvas {\n static FirstCanvas() {\n return g_firstCanvas;\n }\n\n constructor(domElement,renderer) {\n this._renderer = renderer;\n this._domElement = domElement;\n this._domElement._bg2e_id = generateUUID();\n\n g_firstCanvas = g_firstCanvas || this;\n\n // Initialized in mainLoop constructor\n this._mainLoop = null;\n }\n\n get id() {\n return this._domElement._bg2e_id;\n }\n\n async init() {\n await this._renderer.init(this);\n }\n\n get mainLoop() { return this._mainLoop; }\n\n get renderer() { return this._renderer; }\n\n get domElement() { return this._domElement; }\n\n get width() { return this._domElement.clientWidth; }\n\n get height() { return this._domElement.clientHeight; }\n\n get viewport() { return { width: this.width, height: this.height, aspectRatio: this.width / this.height }; }\n\n updateViewportSize() {\n const sizeInPx = { w: this.domElement.clientWidth, h: this.domElement.clientHeight };\n this.domElement.width = sizeInPx.w * window.devicePixelRatio;\n this.domElement.height = sizeInPx.h * window.devicePixelRatio;\n }\n\n screenshot(format, width, height) {\n let canvasStyle = \"\";\n const prevSize = {};\n\n if (width) {\n height = height ? height : width;\n canvasStyle = this.domElement.style.cssText;\n prevSize.width = this.domElement.width;\n prevSize.height = this.domElement.height;\n\n this.domElement.style.cssText = `top:auto;left:auto;bottom:auto;right:auto;width:${width}px;height:${height}px;`;\n this.domElement.width = width;\n this.domElement.height = height;\n this.mainLoop.appController.reshape(width,height);\n this.mainLoop.appController.display();\n }\n\n const data = this.domElement.toDataURL(format);\n if (width) {\n this.domElement.cssText = canvasStyle;\n this.domElement.width = prevSize.width;\n this.domElement.height = prevSize.height;\n this.mainLoop.appController.reshape(prevSize.width, prevSize.heigth);\n this.mainLoop.appController.display();\n }\n return data;\n }\n}\n","\nimport Vec from '../math/Vec';\nimport Resource from '../tools/Resource';\nimport { generateImageHash } from '../tools/image';\nimport Color from './Color';\nimport Canvas from '../app/Canvas';\n\nexport const TextureDataType = Object.freeze({\n NONE: 0,\n IMAGE: 1,\n IMAGE_DATA: 2,\n CUBEMAP: 3,\n CUBEMAP_DATA: 4,\n VIDEO: 5,\n PROCEDURAL: 6,\n RENDER_TARGET: 7\n});\n\nexport const TextureWrap = Object.freeze({\n REPEAT: 0,\n CLAMP: 1,\n MIRRORED_REPEAT: 2\n});\n\nexport const TextureFilter = Object.freeze({\n NEAREST_MIPMAP_NEAREST: 0,\n LINEAR_MIPMAP_NEAREST: 1,\n NEAREST_MIPMAP_LINEAR: 2,\n LINEAR_MIPMAP_LINEAR: 3,\n NEAREST: 4,\n LINEAR: 5\n});\n\nexport const TextureTarget = Object.freeze({\n TEXTURE_2D: 0,\n CUBE_MAP: 1\n});\n\nexport const ProceduralTextureFunction = Object.freeze({\n PLAIN_COLOR: 0,\n RANDOM_NOISE: 1,\n DYNAMIC_CUBEMAP: 2,\n FROM_BASE64: 3,\n CANVAS_2D: 4\n});\n\nexport const TextureRenderTargetAttachment = Object.freeze({\n COLOR_ATTACHMENT_0: 0,\n COLOR_ATTACHMENT_1: 1,\n COLOR_ATTACHMENT_2: 2,\n COLOR_ATTACHMENT_3: 3,\n COLOR_ATTACHMENT_4: 4,\n COLOR_ATTACHMENT_5: 5,\n COLOR_ATTACHMENT_6: 6,\n COLOR_ATTACHMENT_7: 7,\n COLOR_ATTACHMENT_8: 8,\n COLOR_ATTACHMENT_9: 9,\n COLOR_ATTACHMENT_10: 10,\n COLOR_ATTACHMENT_11: 11,\n COLOR_ATTACHMENT_12: 12,\n COLOR_ATTACHMENT_13: 13,\n COLOR_ATTACHMENT_14: 14,\n COLOR_ATTACHMENT_15: 15,\n DEPTH_ATTACHMENT: 100,\n STENCIL_ATTACHMENT: 200\n});\n\nexport const TextureComponentFormat = Object.freeze({\n UNSIGNED_BYTE: 0,\n FLOAT32: 1\n});\n\nexport const TextureChannel = Object.freeze({\n R: 1,\n G: 2,\n B: 3,\n A: 4\n});\n\nexport const TextureDataTypeName = Object.freeze({\n 0: \"NONE\",\n 1: \"IMAGE\",\n 2: \"IMAGE_DATA\",\n 3: \"CUBEMAP\",\n 4: \"CUBEMAP_DATA\",\n 5: \"VIDEO\",\n 6: \"PROCEDURAL\",\n 7: \"RENDER_TARGET\"\n});\n\nexport const TextureWrapName = Object.freeze({\n 0: \"REPEAT\",\n 1: \"CLAMP\",\n 2: \"MIRRORED_REPEAT\"\n});\n\nexport const TextureFilterName = Object.freeze({\n 0: \"NEAREST_MIPMAP_NEAREST\",\n 1: \"LINEAR_MIPMAP_NEAREST\",\n 2: \"NEAREST_MIPMAP_LINEAR\",\n 3: \"LINEAR_MIPMAP_LINEAR\",\n 4: \"NEAREST\",\n 5: \"LINEAR\"\n});\n\nexport const TextureTargetName = Object.freeze({\n 0: \"TEXTURE_2D\",\n 1: \"CUBE_MAP\"\n});\n\nexport const ProceduralTextureFunctionName = Object.freeze({\n 0: \"PLAIN_COLOR\",\n 1: \"RANDOM_NOISE\",\n 2: \"DYNAMIC_CUBEMAP\",\n 3: \"FROM_BASE64\",\n 4: \"CANVAS_2D\"\n});\n\nexport const TextureRenderTargetAttachmentNames = Object.freeze({\n 0: \"COLOR_ATTACHMENT_0\",\n 1: \"COLOR_ATTACHMENT_1\",\n 2: \"COLOR_ATTACHMENT_2\",\n 3: \"COLOR_ATTACHMENT_3\",\n 4: \"COLOR_ATTACHMENT_4\",\n 5: \"COLOR_ATTACHMENT_5\",\n 6: \"COLOR_ATTACHMENT_6\",\n 7: \"COLOR_ATTACHMENT_7\",\n 8: \"COLOR_ATTACHMENT_8\",\n 9: \"COLOR_ATTACHMENT_9\",\n 10: \"COLOR_ATTACHMENT_10\",\n 11: \"COLOR_ATTACHMENT_11\",\n 12: \"COLOR_ATTACHMENT_12\",\n 13: \"COLOR_ATTACHMENT_13\",\n 14: \"COLOR_ATTACHMENT_14\",\n 15: \"COLOR_ATTACHMENT_15\",\n 100: \"DEPTH_ATTACHMENT\",\n 200: \"STENCIL_ATTACHMENT\"\n});\n\nexport const TextureComponentFormatNames = Object.freeze({\n 0: \"UNSIGNED_BYTE\",\n 1: \"FLOAT32\"\n});\n\nexport const TextureChannelNames = Object.freeze({\n 1: \"R\",\n 2: \"G\",\n 3: \"B\",\n 4: \"A\"\n});\n\nconst g_loadedImages = {};\nlet g_resource = null;\nconst g_loadPromises = {};\nconst loadImageFromFile = async fileUrl => {\n if (!g_resource) {\n g_resource = new Resource();\n }\n\n if (g_loadPromises[fileUrl]) {\n console.log(`Image already loaded or loading: ${fileUrl}`);\n }\n else {\n console.log(`Loading image: ${fileUrl}`);\n g_loadPromises[fileUrl] = new Promise(async (resolve, reject) => {\n const image = await g_resource.load(fileUrl);\n // Flip image Y coord\n const canvas = document.createElement(\"canvas\");\n canvas.width = image.naturalWidth;\n canvas.height = image.naturalHeight;\n \n const ctx = canvas.getContext('2d');\n ctx.fillStyle = '#00000000';\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.scale(1, -1);\n ctx.drawImage(image, 0, 0, canvas.width, -canvas.height);\n const flipImage = new Image();\n const loadFlipImage = () => {\n return new Promise(resolve => {\n flipImage.onload = () => {\n flipImage._hash = generateImageHash(flipImage);\n resolve();\n }\n flipImage.src = canvas.toDataURL();\n })\n } \n await loadFlipImage(); \n \n resolve(flipImage);\n })\n }\n\n return g_loadPromises[fileUrl];\n}\nconst loadBase64Image = async base64Img => {\n const loadImage = () => {\n return new Promise(resolve => {\n const image = new Image();\n image.onload = () => {\n resolve(image);\n }\n image.src = base64Img;\n });\n }\n\n const image = await loadImage();\n \n // Flip image Y coord\n const canvas = document.createElement(\"canvas\");\n canvas.width = image.naturalWidth;\n canvas.height = image.naturalHeight;\n\n const ctx = canvas.getContext('2d');\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.scale(1, -1);\n ctx.drawImage(image, 0, 0, canvas.width, -canvas.height);\n const flipImage = new Image();\n const loadFlipImage = () => {\n return new Promise(resolve => {\n flipImage.onload = () => {\n flipImage._hash = generateImageHash(flipImage);\n resolve();\n }\n flipImage.src = canvas.toDataURL(\"image/png\");\n })\n } \n await loadFlipImage(); \n \n return flipImage;\n}\n\nexport default class Texture {\n constructor(canvas = null) {\n this._canvas = canvas || Canvas.FirstCanvas();\n\n // This flag allows to the renderer to know if the texture object\n // has been updated. In this case, the renderer texture must to\n // be regenerated.\n this._dirty = true;\n\n this._dataType = TextureDataType.NONE;\n this._wrapModeX = TextureWrap.REPEAT;\n this._wrapModeY = TextureWrap.REPEAT;\n this._magFilter = TextureFilter.LINEAR;\n this._minFilter = TextureFilter.LINEAR;\n this._target = TextureTarget.TEXTURE_2D;\n this._size = new Vec(64, 64);\n this._fileName = \"\";\n this._proceduralFunction = ProceduralTextureFunction.PLAIN_COLOR;\n this._proceduralParameters = {};\n this._renderTargetAttachment = TextureRenderTargetAttachment.COLOR_ATTACHMENT_0;\n this._componentFormat = TextureComponentFormat.UNSIGNED_BYTE;\n\n // This attribute is generated from the previous attributes, for example,\n // calling loadImageData() after setting the fileName attribute\n this._imageData = null;\n\n // Reference counter, to know if a texture can be purged\n this._references = 0;\n\n // Object name, form debugging purposes\n this._name = \"\";\n }\n\n get canvas() {\n return this._canvas;\n }\n\n get references() {\n return this._references;\n }\n\n incReferences() {\n this._references++;\n }\n\n decReferences() {\n this._references--;\n }\n\n clone() {\n const copy = new Texture(this.canvas);\n copy.assign(this);\n return copy;\n }\n\n assign(other) {\n this._dataType = other._dataType;\n this._wrapModeX = other._wrapModeX;\n this._wrapModeY = other._wrapModeY;\n this._magFilter = other._magFilter;\n this._minFilter = other._minFilter;\n this._target = other._target;\n this._size = new Vec(other._size);\n this._fileName = other._fileName;\n this._proceduralFunction = other._proceduralFunction;\n this._proceduralParameters = other._proceduralParameters;\n this._imageData = other._imageData;\n this._renderTargetAttachment = other._renderTargetAttachment;\n this._componentFormat = other._componentFormat;\n\n this._dirty = true;\n }\n\n get dirty() {\n return this._dirty;\n }\n\n setUpdated(updated = true) {\n this._dirty = !updated;\n }\n\n get dataType() { return this._dataType; }\n set dataType(v) {\n this._dataType = v;\n if (!this.isPowerOfTwo) {\n this.wrapModeXY = TextureWrap.CLAMP;\n }\n this.magFilter = TextureFilter.LINEAR;\n this.minFilter = TextureFilter.LINEAR;\n this._dirty = true;\n }\n\n get isPowerOfTwo() {\n const pot = (n) => n!==0 && (n & (n - 1)) === 0;\n return pot(this.size[0]) && pot(this.size[1]);\n }\n\n get wrapModeX() { return this._wrapModeX; }\n set wrapModeX(v) { this._wrapModeX = v; this._dirty = true; }\n get wrapModeY() { return this._wrapModeY; }\n set wrapModeY(v) { this._wrapModeY = v; this._dirty = true; }\n set wrapModeXY(xy) {\n this.wrapModeX = xy;\n this.wrapModeY = xy;\n this._dirty = true; \n }\n get magFilter() { return this._magFilter; }\n set magFilter(v) {\n if (v === TextureFilter.LINEAR || v === TextureFilter.NEAREST) {\n this._magFilter = v;\n this._dirty = true;\n }\n else {\n console.warn(`Unsupported texture magnification filter: ${TextureFilterName[v]}. Command ignored.`);\n }\n }\n get minFilter() { return this._minFilter; }\n set minFilter(v) { this._minFilter = v; this._dirty = true; }\n get target() { return this._target; }\n set target(v) { this._target = v; this._dirty = true; }\n get size() { return this._size; }\n set size(v) {\n if (!v.length) {\n throw new Error(\"Invalid parameter specified setting texture size.\");\n }\n this._size = new Vec(v[0],v[1]);\n this._dirty = true; \n }\n get fileName() { return this._fileName; }\n set fileName(v) { this._fileName = v; this._dirty = true; this._imageData = null; this._name = v; }\n get proceduralFunction() { return this._proceduralFunction; }\n set proceduralFunction(v) { this._proceduralFunction = v; this._dirty = true; }\n get proceduralParameters() { return this._proceduralParameters; }\n set proceduralParameters(v) {\n if (typeof(v) !== 'object' || !v) {\n throw new Error(\"Invalid parameter specified setting procedural texture parameters.\");\n }\n this._proceduralParameters = v;\n this._dirty = true; \n }\n get renderTargetAttachment() { return this._renderTargetAttachment; }\n set renderTargetAttachment(att) { this._renderTargetAttachment = att; this._dirty = true; }\n get componentFormat() { return this._componentFormat; }\n set componentFormat(fmt) { this._componentFormat = fmt; this._dirty = true; }\n\n get mipmapRequired() {\n return this._minFilter === TextureFilter.NEAREST_MIPMAP_NEAREST ||\n this._minFilter === TextureFilter.LINEAR_MIPMAP_NEAREST ||\n this._minFilter === TextureFilter.NEAREST_MIPMAP_LINEAR ||\n this._minFilter === TextureFilter.LINEAR_MIPMAP_LINEAR ||\n this._magFilter === TextureFilter.NEAREST_MIPMAP_NEAREST ||\n this._magFilter === TextureFilter.LINEAR_MIPMAP_NEAREST ||\n this._magFilter === TextureFilter.NEAREST_MIPMAP_LINEAR ||\n this._magFilter === TextureFilter.LINEAR_MIPMAP_LINEAR;\n }\n\n // If imageData === undefined it's because the function loadImageData() has not been called\n get imageData() {\n return this._imageData;\n }\n\n // The this._renderer variable is initialized by the texture renderer\n get renderer() {\n return this._renderer;\n }\n\n get name() {\n return this._name;\n }\n\n set name(n) {\n this._name = n;\n }\n\n destroy() {\n if (this.renderer) {\n this.renderer.destroy();\n }\n }\n\n async deserialize(sceneData) {\n this._dataType = sceneData.dataType !== undefined ? TextureDataType[sceneData.dataType] : TextureDataType.NONE;\n this._wrapModeX = sceneData.wrapModeX !== undefined ? TextureWrap[sceneData.wrapModeX] : TextureWrap.REPEAT;\n this._wrapModeY = sceneData.wrapModeY !== undefined ? TextureWrap[sceneData.wrapModeY] : TextureWrap.REPEAT;\n this._magFilter = sceneData.magFilter !== undefined ? TextureFilter[sceneData.magFilter] : TextureFilter.LINEAR;\n this._minFilter = sceneData.minFilter !== undefined ? TextureFilter[sceneData.minFilter] : TextureFilter.LINEAR;\n this._target = sceneData.target !== undefined ? TextureTarget[sceneData.target] : TextureTarget.TEXTURE_2D;\n this._size = sceneData.size?.length === 2 ? new Vec(sceneData.size[0], sceneData.size[1]) : new Vec(64, 64);\n this._fileName = sceneData.fileName !== undefined ? sceneData.fileName : \"\";\n this._proceduralFunction = sceneData.proceduralFunction !== undefined ? ProceduralTextureFunction[sceneData.proceduralFunction] : ProceduralTextureFunction.PLAIN_COLOR;\n this._proceduralParameters = sceneData.proceduralParameters !== undefined ? sceneData.proceduralParameters : {};\n this._renderTargetAttachment = sceneData.renderTargetAttachment !== undefined ? sceneData.renderTargetAttachment : TextureRenderTargetAttachment.COLOR_ATTACHMENT_0;\n this._componentFormat = sceneData.componentFormat !== undefined ? sceneData.componentFormat : TextureComponentFormat.UNSIGNED_BYTE;\n this._name = sceneData.name !== undefined ? sceneData.name : this._name;\n this._dirty = true; \n }\n\n async serialize(sceneData) {\n sceneData.dataType = TextureDataTypeName[this.dataType];\n sceneData.wrapModeX = TextureWrapName[this.wrapModeX];\n sceneData.wrapModeY = TextureWrapName[this.wrapModeY];\n sceneData.magFilter = TextureFilterName[this.magFilter];\n sceneData.minFilter = TextureFilterName[this.minFilter];\n sceneData.target = TextureTargetName[this.target];\n sceneData.size = this.size;\n sceneData.fileName = this.fileName;\n sceneData.proceduralFunction = ProceduralTextureFunctionName[this.proceduralFunction];\n sceneData.proceduralParameters = this.proceduralParameters;\n sceneData.renderTargetAttachment = TextureRenderTargetAttachmentNames[this.renderTargetAttachment];\n sceneData.componentFormat = TextureComponentFormatNames[this.componentFormat];\n sceneData.name = this._name;\n }\n\n async loadImageData(refresh = false) {\n if (this.fileName) {\n if (g_loadedImages[this.fileName] && refresh) {\n delete g_loadedImages[this.fileName];\n }\n\n let loadPromise = g_loadedImages[this.fileName];\n if (!loadPromise) {\n loadPromise = loadImageFromFile(this.fileName);\n g_loadedImages[this.fileName] = loadPromise;\n }\n else {\n console.debug(`Texture: loadImageData(): image already loaded or is loading: ${this.fileName}`)\n }\n this._imageData = await loadPromise;\n\n this._size = new Vec(this._imageData.width, this._imageData.height);\n\n this._dirty = true; \n }\n else if (this.dataType === TextureDataType.RENDER_TARGET) {\n // This object will store data to determine if the \n // texture must to be resized, and other information\n // from the framebuffer\n this._imageData = {\n currentSize: new Vec(this.size)\n };\n this._dirty = true;\n }\n else if (this.proceduralFunction === ProceduralTextureFunction.PLAIN_COLOR) {\n if (this._imageData && refresh === false) {\n return;\n }\n\n if ((!Array.isArray(this.proceduralParameters) && !(this.proceduralParameters instanceof Vec)) || this.proceduralParameters.length<3) {\n throw new Error(\"Error generating procedural plain color texture. invalid 'proceduralParameters' set.\")\n }\n const color = new Color(this.proceduralParameters);\n const canvas = document.createElement('canvas');\n canvas.width = this.size.x;\n canvas.height = this.size.y;\n const ctx = canvas.getContext('2d');\n ctx.fillStyle = color.hexColor;\n ctx.fillRect(0, 0, this.size.x, this.size.y);\n\n const loadProceduralImage = () => {\n return new Promise(resolve => {\n this._imageData = new Image();\n this._imageData.onload = () => {\n resolve();\n }\n this._imageData.src = canvas.toDataURL(\"image/png\");\n //document.body.appendChild(canvas);\n })\n } \n await loadProceduralImage(); \n\n this._dirty = true;\n }\n else if (this.proceduralFunction === ProceduralTextureFunction.FROM_BASE64) {\n if (this._imageData && refresh === false) {\n return;\n }\n\n if (!/;base64/i.test(this.proceduralParameters?.imageData)) {\n throw new Error(\"Error generating procedural texture from base64 string. Invalid base64 image\");\n }\n\n this._imageData = await loadBase64Image(this.proceduralParameters.imageData);\n this._size = new Vec(this._imageData.width, this._imageData.height);\n this._dirty = true;\n }\n else if (this.proceduralFunction == ProceduralTextureFunction.CANVAS_2D) {\n if (this._imageData && refresh === false) {\n return;\n }\n\n const canvas = this.proceduralParameters?.canvas;\n if (!/canvas/i.test(canvas?.tagName)) {\n throw new Error(\"Error generating procedural texture from HTML canvas. Invalid 'canvas' parameter.\");\n }\n\n const imageData = canvas.toDataURL();\n this._imageData = await loadBase64Image(imageData);\n this._size = new Vec(this._imageData.width, this._imageData.height);\n this._dirty = true;\n }\n else {\n // TODO: load other classes of procedural image data\n throw new Error(\"Texture: loadImageData(): not implemented\");\n }\n }\n\n async updateImageData() {\n // TODO: improve this function. It is possible to optimize the\n // texture refresh in some cases\n this.loadImageData(true);\n }\n\n};\n","\nimport Canvas from '../app/Canvas';\n\nconst g_canvasCache = {};\n\nexport default class TextureCache {\n static Get(canvas = null) {\n canvas = canvas || Canvas.FirstCanvas();\n if (!canvas && !g_canvasCache[\"__no_canvas__\"]) {\n console.warn(\"TextureCache.Get() No canvas available. If your application uses a canvas, ensure that it has been created before using TexturCache. If your application does not use a canvas, you may disregard this message.\");\n }\n\n if (canvas && !g_canvasCache[canvas.id]) {\n g_canvasCache[canvas.id] = new TextureCache(canvas);\n }\n else if (!canvas && !g_canvasCache[\"__no_canvas__\"]) {\n g_canvasCache[\"__no_canvas__\"] = new TextureCache(null);\n }\n\n return g_canvasCache[canvas ? canvas.id : \"__no_canvas__\"];\n }\n\n constructor(canvas) {\n this._canvas = canvas;\n this._cache = {};\n }\n\n get canvas() { return this._canvas; }\n\n registerTexture(texture) {\n if (!texture.fileName) {\n throw new Error(\"TextureCache.registerTexture() texture path is empty\");\n }\n this._cache[texture.fileName] = texture;\n }\n\n getTexture(texturePath) {\n return this._cache[texturePath];\n }\n\n findTexture(texturePath) {\n return this._cache[texturePath] != null;\n }\n\n clear() {\n this._cache = {};\n }\n}","\nimport Vec from '../math/Vec';\nimport Color from './Color';\nimport Texture, { TextureDataType, TextureFilter, TextureWrap } from './Texture';\nimport Canvas from '../app/Canvas';\nimport TextureCache from '../tools/TextureCache';\n\n\nexport const MaterialType = Object.freeze({\n PBR: \"pbr\"\n});\n\nexport const MaterialAttributeNames = [\n \"type\",\n \"class\", // Alias of \"type\"\n \"diffuse\",\n \"diffuseScale\",\n \"diffuseUV\",\n \"alphaCutoff\",\n \"isTransparent\",\n \"metallic\",\n \"metallicChannel\",\n \"metallicScale\",\n \"metallicUV\",\n \"roughness\",\n \"roughnessChannel\",\n \"roughnessScale\",\n \"roughnessUV\",\n \"fresnel\",\n \"lightEmission\",\n \"lightEmissionChannel\",\n \"lightEmissionScale\",\n \"lightEmissionUV\",\n \"ambientOcclussion\",\n \"ambientOcclussionChannel\",\n \"ambientOcclussionUV\",\n \"normal\",\n \"normalScale\",\n \"normalUV\",\n \"height\",\n \"heightChannel\",\n \"heightScale\",\n \"heightUV\",\n \"heightIntensity\",\n \"castShadows\",\n \"unlit\"\n];\n\nexport const ColorTextureAttributes = [\n \"diffuse\",\n \"normal\"\n];\n\nexport const ValueTextureAttributes = [\n \"metallic\",\n \"roughness\",\n \"lightEmission\",\n \"ambientOcclussion\",\n \"height\"\n];\n\nexport const VectorAttribures = [\n \"diffuseScale\",\n \"metallicScale\",\n \"roughnessScale\",\n \"lightEmissionScale\",\n \"normalScale\",\n \"heightScale\"\n];\n\nexport const ColorAttributes = [\n \"fresnel\"\n];\n\nexport const PrimitiveTypeAttributes = [\n \"type\",\n \"class\", // alias off type\n \"alphaCutoff\",\n \"isTransparent\",\n \"diffuseUV\",\n \"metallicChannel\",\n \"metallicUV\",\n \"roughnessChannel\",\n \"roughnessUV\",\n \"lightEmissionChannel\",\n \"lightEmissionUV\",\n \"ambientOcclussionChannel\",\n \"ambientOcclussionUV\",\n \"normalUV\",\n \"heightChannel\",\n \"heightUV\",\n \"heightIntensity\",\n \"castShadows\",\n \"unlit\"\n];\n\n\nexport const assertColorTexture = (v, name) => {\n if (!v instanceof Color && !v instanceof Texture) {\n throw new Error(`Invalid parameter setting '${ name }' material attribute. The required parameter type is Color or Texture`);\n }\n}\n\nexport const assertColor = (v, name) => {\n if (!v instanceof Color) {\n throw new Error(`Invalid parameter setting '${ name }' material attribute. The required parameter type is Color`);\n }\n}\n\nexport const assertScale = (v, name) => {\n if (!v instanceof Vec || v.length != 2) {\n throw new Error(`Invalid parameter setting '${ name }' material attribute. The required parameter type is Vec with two elements.`);\n }\n}\n\nexport const assertValueTexture = (v, name) => {\n if (!v instanceof Texture && typeof(v) !== \"number\") {\n throw new Error(`Invalid parameter setting '${ name }' material attribute. The required parameter type is Texture or numeric value.`);\n }\n}\n\n// Clone the `obj` parameter if it is\n// - Vec\n// - Color\n// - Texture\n// Returns the same parameter if not\nexport const cloneObject = (obj) => {\n if (obj instanceof Color) {\n return new Color(obj);\n }\n else if (obj instanceof Vec) {\n return new Vec(obj);\n }\n else if (obj instanceof Texture) {\n return obj.clone();\n }\n else {\n return obj;\n }\n}\n\nexport const serializeColorTexture = (obj) => {\n const result = { type: \"\", data: {} };\n if (obj instanceof Color) {\n result.type = \"Color\";\n result.data = obj;\n }\n else if (obj instanceof Texture) {\n result.type = \"Texture\";\n obj.serialize(result.data);\n }\n else {\n throw new Error(`Invalid parameter found in material serialization`);\n }\n return result;\n}\n\n\nexport const deserializeColorTexture = (obj,relativePath = \"\", canvas = null) => {\n if (obj === null || obj === undefined) {\n return null;\n }\n else if (typeof(obj) === \"string\") {\n // bg2e v1 texture compatibility\n const texturePath = relativePath + obj;\n const textureCache = TextureCache.Get(canvas);\n if (textureCache.findTexture(texturePath)) {\n console.debug(`Texture '${ texturePath }' already loaded. Reusing texture.`);\n return textureCache.getTexture(texturePath);\n }\n else {\n console.log(`Texture not found in cache. Loading texture '${ texturePath }'`);\n const tex = new Texture(canvas);\n tex.fileName = relativePath + obj;\n tex.dataType = TextureDataType.IMAGE;\n tex.minFilter = TextureFilter.LINEAR_MIPMAP_LINEAR;\n tex.magFilter = TextureFilter.LINEAR;\n tex.wrapModeX = TextureWrap.REPEAT;\n tex.wrapModeY = TextureWrap.REPEAT;\n textureCache.registerTexture(tex);\n return tex;\n }\n }\n else if (Array.isArray(obj) && (obj.length === 3 || obj.length === 4)) {\n // bg2e v1 color compatibility\n if (obj.length === 3) {\n return new Vec(obj[0], obj[1], obj[2], 1);\n }\n else if (obj.length === 4) {\n return new Vec(obj[0], obj[1], obj[2], obj[3]);\n }\n }\n else if (obj.type === \"Color\") {\n return new Color(obj.data);\n }\n else if (obj.type === \"Texture\") {\n const tex = new Texture(canvas);\n tex.deserialize(obj.data);\n return tex;\n }\n else {\n reject(new Error(`Invalid parameter found in material deserialization`));\n }\n}\n\nexport const deserializeVector = (obj) => {\n if (!obj) {\n return null;\n }\n else if (obj.length >= 2 && obj.length <= 4) {\n return new Vec(obj);\n }\n else if (obj._v && obj._v.length >= 2 && obj._v.length <= 4) {\n return new Vec(obj._v);\n }\n else {\n throw new Error(`Invalid parameter found in material serialization`);\n }\n}\n\nexport const serializeValueTexture = (obj) => {\n const result = { type: \"\", data: \"\" };\n if (obj instanceof Texture) {\n result.type = \"Texture\";\n obj.serialize(result.data);\n }\n else if (typeof(obj) === \"number\") {\n result.type = \"number\";\n result.data = obj;\n }\n else {\n throw new Error(`Invalid parameter found in material serialization`);\n }\n return result;\n}\n\nexport const deserializeValueTexture = (obj,relativePath, canvas = null) => {\n if (obj === null || obj === undefined) {\n return null;\n }\n else if (typeof(obj) === \"string\") {\n const texturePath = relativePath + obj;\n const textureCache = TextureCache.Get(canvas);\n if (textureCache.findTexture(texturePath)) {\n console.debug(`Texture '${ texturePath }' already loaded. Reusing texture.`);\n return textureCache.getTexture(texturePath);\n }\n else {\n console.log(`Texture not found in cache. Loading texture '${ texturePath }'`);\n const tex = new Texture(canvas);\n tex.fileName = relativePath + obj;\n tex.dataType = TextureDataType.IMAGE;\n tex.wrapModeX = TextureWrap.REPEAT;\n tex.wrapModeY = TextureWrap.REPEAT;\n tex.minFilter = TextureFilter.LINEAR_MIPMAP_LINEAR;\n tex.magFilter = TextureFilter.LINEAR;\n textureCache.registerTexture(tex);\n return tex;\n }\n }\n else if (typeof(obj) === \"number\") {\n return obj;\n }\n else if (Array.isArray(obj)) {\n // Obsolete option. Return the mean array value\n return obj.reduce((a,b) => a + b) / obj.length;\n }\n else if (obj.type === \"Texture\") {\n const tex = new Texture(canvas);\n tex.deserialize(obj.data);\n return tex;\n }\n else if (obj.type === \"number\") {\n return obj.data;\n }\n else {\n throw new Error(`Invalid parameter found in material serialization`)\n }\n}\n\nexport const serializeAttribute = (att,mat) => {\n if (ColorTextureAttributes.indexOf(att) !== -1) {\n return serializeColorTexture(mat[att]);\n }\n else if (ValueTextureAttributes.indexOf(att) !== -1) {\n return serializeValueTexture(mat[att]);\n }\n else if (VectorAttribures.indexOf(att) !== -1 ||\n ColorAttributes.indexOf(att) !== -1 ||\n PrimitiveTypeAttributes.indexOf(att) !== -1\n ) {\n return mat[att];\n }\n else {\n throw new Error(`Error in material attribute deserialization: invalid attribute '${ att }'`);\n }\n}\n\nexport const deserializeAttribute = (att,obj,relativePath,canvas = null) => {\n if (ColorTextureAttributes.indexOf(att) !== -1) {\n return deserializeColorTexture(obj[att],relativePath,canvas);\n }\n else if (ValueTextureAttributes.indexOf(att) !== -1) {\n return deserializeValueTexture(obj[att],relativePath,canvas);\n }\n else if (VectorAttribures.indexOf(att) !== -1) {\n return deserializeVector(obj[att]);\n }\n else if (ColorAttributes.indexOf(att) !== -1) {\n return new Color(obj[att]);\n }\n else if (PrimitiveTypeAttributes.indexOf(att) !== -1) {\n return obj[att];\n }\n else {\n throw new Error(`Error in material attribute deserialization: invalid attribute '${ att }'`);\n }\n}\n\nexport default class Material {\n static async Deserialize(sceneData,relativePath = \"\",canvas = null) {\n const result = new Material(canvas);\n await result.deserialize(sceneData,relativePath,canvas);\n return result;\n }\n\n constructor(canvas = null) {\n this._canvas = canvas || Canvas.FirstCanvas();\n this._type = MaterialType.PBR;\n this._renderer = null;\n\n this._diffuse = Color.White();\n this._diffuseScale = new Vec(1, 1);\n this._diffuseUV = 0;\n this._alphaCutoff = 0.5;\n this._isTransparent = false;\n this._metallic = 0;\n this._metallicChannel = 0;\n this._metallicScale = new Vec(1, 1);\n this._metallicUV = 0;\n this._roughness = 1;\n this._roughnessChannel = 0;\n this._roughnessScale = new Vec(1, 1);\n this._roughnessUV = 0;\n this._fresnel = Color.White();\n this._lightEmission = 0;\n this._lightEmissionChannel = 0;\n this._lightEmissionScale = new Vec(1, 1);\n this._lightEmissionUV = 0;\n this._ambientOcclussion = 1;\n this._ambientOcclussionChannel = 0;\n this._ambientOcclussionUV = 1;\n this._normal = new Color({ r: 0.5, g: 0.5, b: 1 });\n this._normalScale = new Vec(1, 1);\n this._normalUV = 0;\n this._height = 0;\n this._heightChannel = 0;\n this._heightScale = new Vec(1, 1);\n this._heightUV = 0;\n this._heightIntensity = 1.0;\n this._castShadows = true;\n this._unlit = false;\n\n this._dirty = true;\n }\n\n get canvas() {\n return this._canvas;\n }\n\n get renderer() {\n return this._renderer;\n }\n\n get dirty() {\n return this._dirty;\n }\n\n set dirty(d) {\n this._dirty = d;\n }\n\n clone() {\n const result = new Material();\n result.assign(this);\n return result;\n }\n\n assign(other) {\n this.type = other._type;\n this.diffuse = cloneObject(other._diffuse);\n this.diffuseScale = cloneObject(other._diffuseScale);\n this.diffuseUV = other._diffuseUV;\n this.alphaCutoff = other._alphaCutoff;\n this.isTransparent = other._isTransparent;\n this.metallic = cloneObject(other._metallic);\n this.metallicChannel = other._metallicChannel;\n this.metallicScale = cloneObject(other._metallicScale);\n this.metallicUV = other._metallicUV;\n this.roughness = cloneObject(other._roughness);\n this.roughnessChannel = other._roughnessChannel;\n this.roughnessScale = cloneObject(other._roughnessScale);\n this.roughnessUV = other._roughnessUV;\n this.fresnel = cloneObject(other._fresnel);\n this.lightEmission = cloneObject(other._lightEmission);\n this.lightEmissionChannel = other._lightEmissionChannel;\n this.lightEmissionScale = cloneObject(other._lightEmissionScale);\n this.lightEmissionUV = other._lightEmissionUV;\n this.ambientOcclussion = cloneObject(other._ambientOcclussion);\n this.ambientOcclussionChannel = other._ambientOcclussionChannel;\n this.ambientOcclussionUV = other._ambientOcclussionUV;\n this.normal = cloneObject(other._normal);\n this.normalScale = cloneObject(other._normalScale);\n this.normalUV = other._normalUV;\n this.height = cloneObject(other._height);\n this.heightChannel = other._heightChannel;\n this.heightScale = cloneObject(other._heightScale);\n this.heightUV = other._heightUV;\n this.heightIntensity = other._heightIntensity;\n this.castShadows = other._castShadows;\n this.unlit = other._unlit;\n this._dirty = true;\n }\n\n get type() { return this._type; }\n set type(v) {\n // Compatibility with v1.4\n if (v === \"PBRMaterial\") {\n v = \"pbr\";\n }\n this._type = v;\n this._dirty = true;\n }\n\n // Compatibility with v1.4\n set class(v) { this.type = v; this._dirty = true; }\n get class() { return this.type; }\n\n\n get diffuse() { return this._diffuse; }\n set diffuse(v) { \n assertColorTexture(v, \"diffuse\");\n if (this._diffuse instanceof Texture) {\n this._diffuse.decReferences();\n }\n this._diffuse = v;\n if (this._diffuse instanceof Texture) {\n this._diffuse.incReferences();\n }\n this._dirty = true;\n }\n\n get diffuseScale() { return this._diffuseScale; }\n set diffuseScale(v) { assertScale(v, \"diffuseScale\"); this._diffuseScale = new Vec(v); this._dirty = true; }\n get diffuseUV() { return this._diffuseUV; }\n set diffuseUV(v) { this._diffuseUV = v; this._dirty = true; }\n get alphaCutoff() { return this._alphaCutoff; }\n set alphaCutoff(v) { this._alphaCutoff = v; this._dirty = true; }\n get isTransparent() { return this._isTransparent; }\n set isTransparent(v) { this._isTransparent = v; this._dirty = true; }\n \n get metallic() { return this._metallic; }\n set metallic(v) {\n assertValueTexture(v, \"metallic\");\n if (this._metallic instanceof Texture) {\n this._metallic.decReferences();\n }\n this._metallic = v;\n if (this._metallic instanceof Texture) {\n this._metallic.incReferences();\n }\n this._dirty = true;\n }\n \n get metallicChannel() { return this._metallicChannel; }\n set metallicChannel(v) { this._metallicChannel = v; this._dirty = true; }\n get metallicScale() { return this._metallicScale; }\n set metallicScale(v) { assertScale(v, \"metallicScale\"); this._metallicScale = new Vec(v); this._dirty = true; }\n get metallicUV() { return this._metallicUV; }\n set metallicUV(v) { this._metallicUV = v; this._dirty = true; }\n\n get roughness() { return this._roughness; }\n set roughness(v) {\n assertValueTexture(v, \"roughness\");\n if (this._roughness instanceof Texture) {\n this._roughness.decReferences();\n }\n this._roughness = v;\n if (this._roughness instanceof Texture) {\n this._roughness.incReferences();\n }\n this._dirty = true;\n }\n \n get roughnessChannel() { return this._roughnessChannel; }\n set roughnessChannel(v) { this._roughnessChannel = v; this._dirty = true; }\n get roughnessScale() { return this._roughnessScale; }\n set roughnessScale(v) { assertScale(v, \"roughnessScale\"); this._roughnessScale = new Vec(v); this._dirty = true; }\n get roughnessUV() { return this._roughnessUV; }\n set roughnessUV(v) { this._roughnessUV = v; this._dirty = true; }\n get fresnel() { return this._fresnel; }\n set fresnel(v) { assertColor(v, \"fresnel\"); this._fresnel = v; this._dirty = true; }\n \n get lightEmission() { return this._lightEmission; }\n set lightEmission(v) {\n assertValueTexture(v, 'lightEmission'); \n if (this._lightEmission instanceof Texture) {\n this._lightEmission.decReferences();\n }\n this._lightEmission = v;\n if (this._lightEmission instanceof Texture) {\n this._lightEmission.incReferences();\n }\n this._dirty = true;\n }\n \n get lightEmissionChannel() { return this._lightEmissionChannel; }\n set lightEmissionChannel(v) { this._lightEmissionChannel = v; this._dirty = true; }\n get lightEmissionScale() { return this._lightEmissionScale; }\n set lightEmissionScale(v) { assertScale(v, \"lightEmissionScale\"); this._lightEmissionScale = new Vec(v); this._dirty = true; }\n get lightEmissionUV() { return this._lightEmissionUV; }\n set lightEmissionUV(v) { this._lightEmissionUV = v; this._dirty = true; }\n\n get ambientOcclussion() { return this._ambientOcclussion; }\n set ambientOcclussion(v) {\n assertColorTexture(v, \"ambientOcclussion\");\n if (this._ambientOcclussion instanceof Texture) {\n this._ambientOcclussion.decReferences();\n }\n this._ambientOcclussion = v;\n if (this._ambientOcclussion instanceof Texture) {\n this._ambientOcclussion.incReferences();\n }\n this._dirty = true;\n }\n\n get ambientOcclussionChannel() { return this._ambientOcclussionChannel; }\n set ambientOcclussionChannel(v) { this._ambientOcclussionChannel = v; this._dirty = true; }\n get ambientOcclussionUV() { return this._ambientOcclussionUV; }\n set ambientOcclussionUV(v) { this._ambientOcclussionUV = v; this._dirty = true; }\n\n get normal() { return this._normal; }\n set normal(v) {\n assertColorTexture(v, \"normal\");\n if (this._normal instanceof Texture) {\n this._normal.decReferences();\n }\n this._normal = v;\n if (this._normal instanceof Texture) {\n this._normal.incReferences();\n }\n this._dirty = true;\n }\n \n get normalScale() { return this._normalScale; }\n set normalScale(v) { assertScale(v, \"normalScale\"); this._normalScale = new Vec(v); this._dirty = true; }\n get normalUV() { return this._normalUV; }\n set normalUV(v) { this._normalUV = v; this._dirty = true; }\n get height() { return this._height; }\n set height(v) { assertValueTexture(v, \"height\"); this._height = v; this._dirty = true; }\n get heightChannel() { return this._heightChannel; }\n set heightChannel(v) { this._heightChannel = v; this._dirty = true; }\n get heightScale() { return this._heightScale; }\n set heightScale(v) { assertScale(v, \"heightScale\"); this._heightScale = new Vec(v); this._dirty = true; }\n get heightUV() { return this._heightUV; }\n set heightUV(v) { this._heightUV = v; this._dirty = true; }\n get heightIntensity() { return this._heightIntensity; }\n set heightIntensity(v) { this._heightIntensity = v; this._dirty = true; }\n get castShadows() { return this._castShadows; }\n set castShadows(v) { this._castShadows = v; this._dirty = true; }\n get unlit() { return this._unlit; }\n set unlit(v) { this._unlit = v; this._dirty = true; }\n\n async serialize(sceneData) {\n MaterialAttributeNames.forEach(att => {\n const value = serializeAttribute(att, this);\n sceneData[att] = value;\n });\n }\n\n async deserialize(sceneData, relativePath) {\n const P = [];\n for (const i in MaterialAttributeNames) {\n const att = MaterialAttributeNames[i];\n if (sceneData[att] !== undefined) {\n let value = null;\n if (att === \"type\") {\n value = deserializeAttribute(\"class\", sceneData, relativePath, this.canvas);\n }\n else {\n value = deserializeAttribute(att, sceneData, relativePath, this.canvas);\n if (value instanceof Texture) {\n P.push(value.loadImageData());\n }\n }\n\n if (value !== null) {\n this[att] = value;\n }\n }\n }\n return await Promise.all(P);\n }\n\n destroy() {\n const decReferences = (attrib) => {\n if (this[attrib] instanceof Texture) {\n this[attrib].decReferences();\n }\n }\n\n ColorTextureAttributes.forEach(decReferences);\n ValueTextureAttributes.forEach(decReferences);\n\n if (this.renderer) {\n this.renderer.destroy();\n }\n }\n}\n","import Material from \"../base/Material\";\n\nexport default class Shader {\n constructor(renderer) {\n this._renderer = renderer;\n }\n\n get renderer() { return this._renderer; }\n\n async load() {\n\n }\n \n setup(plistRenderer, materialRenderer, modelMatrix, viewMatrix, projectionMatrix) {\n throw new Error(\"Error: using an abstract implementation of render.Shader.\");\n }\n\n destroy() {\n throw new Error(\"Error: using an abstract implementation of render.Shader.destroy()\");\n }\n}\n","import Mat4 from \"../../math/Mat4\";\nimport Mat3 from \"../../math/Mat3\";\nimport { TextureTarget, TextureTargetName } from \"../../base/Texture\";\n\nexport const ShaderType = {\n VERTEX: 0,\n FRAGMENT: 1\n};\n\nfunction destroy() {\n delete this._program.__shaderProgram__;\n this._gl.deleteProgram(this._program);\n this._program = null;\n}\n\nexport default class ShaderProgram {\n static Create(gl,name,vertexCode,fragmentCode) {\n if (!vertexCode || !fragmentCode) {\n throw new Error(\"ShaderProgram.Create(): Invalid vertex or fragment code\");\n }\n const result = new ShaderProgram(gl,name);\n if (!Array.isArray(vertexCode)) {\n vertexCode = [vertexCode];\n }\n if (!Array.isArray(fragmentCode)) {\n fragmentCode = [fragmentCode];\n }\n vertexCode.forEach(shaderCode => result.attachVertexSource(shaderCode));\n fragmentCode.forEach(shaderCode => result.attachFragmentSource(shaderCode));\n result.link();\n return result;\n }\n\n static GetShaderProgram(glProgram) {\n return glProgram.__shaderProgram__;\n }\n\n static Delete(shaderProgram) {\n destroy.apply(shaderProgram);\n }\n\n constructor(gl, name = \"\") {\n this._gl = gl;\n this._name = name;\n this._program = gl.createProgram();\n this._program.__id__ = Symbol(this._program);\n this._program.__shaderProgram__ = this;\n this._attribLocations = {};\n this._uniformLocations = {};\n this._failed = false;\n }\n\n get program() {\n return this._program;\n }\n\n get name() {\n return this._name;\n }\n\n attachSource(src,type) {\n if (this._failed) {\n return;\n }\n\n const gl = this._gl;\n if (type === ShaderType.VERTEX) {\n type = gl.VERTEX_SHADER;\n }\n else if (type === ShaderType.FRAGMENT) {\n type = gl.FRAGMENT_SHADER;\n }\n const shader = gl.createShader(type);\n gl.shaderSource(shader, src);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n this._failed = true;\n const debugCode = src.split(/\\r?\\n/)\n .map((line,i) => `${i + 1} | ${line}`)\n .join('\\n');\n throw new Error(`Error compiling shader: \\n${gl.getShaderInfoLog(shader)} \n ${debugCode}\n `);\n }\n gl.attachShader(this._program, shader);\n }\n\n attachVertexSource(src) {\n this.attachSource(src, ShaderType.VERTEX);\n }\n\n attachFragmentSource(src) {\n this.attachSource(src, ShaderType.FRAGMENT);\n }\n\n link() {\n if (this._failed) {\n return false;\n }\n const gl = this._gl;\n gl.linkProgram(this._program);\n if (!gl.getProgramParameter(this._program, gl.LINK_STATUS)) {\n throw new Error(`Error linking program: \\n${gl.getProgramInfoLog(this._program)}`);\n }\n }\n\n useProgram() {\n this._gl.useProgram(this._program);\n }\n\n getAttribLocation(name) {\n this._attribLocations[name] = this._attribLocations[name] || this._gl.getAttribLocation(this._program, name);\n return this._attribLocations[name];\n }\n\n checkInvalidLocations() {\n let status = true;\n for (const name in this._attribLocations) {\n if (this._attribLocations[name] == -1) {\n console.warn(`Invalid attrib location for name '${name}'`);\n status = false;\n }\n }\n return status;\n }\n\n getUniformLocation(name) {\n this._uniformLocations[name] = this._gl.getUniformLocation(this._program, name);\n return this._uniformLocations[name];\n }\n\n vertexAttribPointer(name,size,format,normalize,stride,offset) {\n const location = this.getAttribLocation(name);\n this._gl.vertexAttribPointer(location, size, format, normalize, stride, offset);\n }\n\n enableVertexAttribArray(name) {\n const location = this.getAttribLocation(name);\n this._gl.enableVertexAttribArray(location);\n }\n\n positionAttribPointer({ name, stride, size = 3, offset = 0, enable = false, bytesPerElement = Float32Array.BYTES_PER_ELEMENT }) {\n this.vertexAttribPointer(name, size, this._gl.FLOAT, false, stride * bytesPerElement, offset * bytesPerElement);\n if (enable) {\n this.enableVertexAttribArray(name);\n }\n }\n\n normalAttribPointer({ name, size = 3, stride, offset = 0, enable = false, bytesPerElement = Float32Array.BYTES_PER_ELEMENT }) {\n this.vertexAttribPointer(name, size, this._gl.FLOAT, true, stride * bytesPerElement, offset * bytesPerElement);\n if (enable) {\n this.enableVertexAttribArray(name);\n }\n }\n\n tangentAttribPointer({ name, size = 3, stride, offset = 0, enable = false, bytesPerElement = Float32Array.BYTES_PER_ELEMENT }) {\n this.vertexAttribPointer(name, size, this._gl.FLOAT, true, stride * bytesPerElement, offset * bytesPerElement);\n if (enable) {\n this.enableVertexAttribArray(name);\n }\n }\n\n texCoordAttribPointer({ name, stride, offset, enable = false, bytesPerElement = Float32Array.BYTES_PER_ELEMENT }) {\n this.vertexAttribPointer(name, 2, this._gl.FLOAT, false, stride * bytesPerElement, offset * bytesPerElement);\n if (enable) {\n this.enableVertexAttribArray(name);\n }\n }\n\n colorAttribPointer({ name, size = 4, stride, offset = 0, enable = false, bytesPerElement = Float32Array.BYTES_PER_ELEMENT }) {\n this.vertexAttribPointer(name, size, this._gl.FLOAT, false, stride * bytesPerElement, offset * bytesPerElement);\n if (enable) {\n this.enableVertexAttribArray(name);\n }\n }\n\n uniformMatrix2fv(name, transpose, value) {\n const location = this._uniformLocations[name] || this.getUniformLocation(name);\n this._gl.uniformMatrix2fv(location, transpose, value);\n }\n\n uniformMatrix3fv(name, transpose, value) {\n const location = this._uniformLocations[name] || this.getUniformLocation(name);\n this._gl.uniformMatrix3fv(location, transpose, value);\n }\n\n uniformMatrix4fv(name, transpose, value) {\n const location = this._uniformLocations[name] || this.getUniformLocation(name);\n this._gl.uniformMatrix4fv(location, transpose, value);\n }\n\n uniform1f(name, v0) {\n const location = this._uniformLocations[name] || this.getUniformLocation(name);\n this._gl.uniform1f(location, v0);\n }\n\n uniform1fv(name, value) {\n const location = this._uniformLocations[name] || this.getUniformLocation(name);\n this._gl.uniform1fv(location, value);\n }\n\n uniform1i(name, v0) {\n const location = this._uniformLocations[name] || this.getUniformLocation(name);\n this._gl.uniform1i(location, v0);\n }\n\n uniform1iv(name, value) {\n const location = this._uniformLocations[name] || this.getUniformLocation(name);\n this._gl.uniform1iv(location, value);\n }\n\n uniform2f(name, v0, v1) {\n const location = this._uniformLocations[name] || this.getUniformLocation(name);\n this._gl.uniform2f(location, v0, v1);\n }\n\n uniform2fv(name, value) {\n const location = this._uniformLocations[name] || this.getUniformLocation(name);\n this._gl.uniform2fv(location, value);\n }\n\n uniform2i(name, v0, v1) {\n const location = this._uniformLocations[name] || this.getUniformLocation(name);\n this._gl.uniform2i(location, v0, v1);\n }\n\n uniform2iv(name, value) {\n const location = this._uniformLocations[name] || this.getUniformLocation(name);\n this._gl.uniform2iv(location, value);\n }\n\n uniform3f(name, v0, v1, v2) {\n const location = this._uniformLocations[name] || this.getUniformLocation(name);\n this._gl.uniform3f(location, v0, v1, v2);\n }\n\n uniform3fv(name, value) {\n const location = this._uniformLocations[name] || this.getUniformLocation(name);\n this._gl.uniform3fv(location, value);\n }\n\n uniform3i(name, v0, v1, v2) {\n const location = this._uniformLocations[name] || this.getUniformLocation(name);\n this._gl.uniform3i(location, v0, v1, v2);\n }\n\n uniform3iv(name, value) {\n const location = this._uniformLocations[name] || this.getUniformLocation(name);\n this._gl.uniform3iv(location, value);\n }\n\n uniform4f(name, v0, v1, v2, v3) {\n const location = this._uniformLocations[name] || this.getUniformLocation(name);\n this._gl.uniform4f(location, v0, v1, v2, v3);\n }\n\n uniform4fv(name, value) {\n const location = this._uniformLocations[name] || this.getUniformLocation(name);\n this._gl.uniform4fv(location, value);\n }\n\n uniform4i(name, v0, v1, v2, v3) {\n const location = this._uniformLocations[name] || this.getUniformLocation(name);\n this._gl.uniform4i(location, v0, v1, v2, v3);\n }\n\n uniform4iv(name, value) {\n const location = this._uniformLocations[name] || this.getUniformLocation(name);\n this._gl.uniform4iv(location, value);\n }\n\n // Utility functions\n bindAttribs(polyListRenderer, { \n position, \n normal = null, \n tex0 = null, \n tex1 = null, \n tex2 = null, \n color = null, \n tangent = null\n }) {\n this.positionAttribPointer(polyListRenderer.positionAttribParams(position));\n if (normal) {\n this.normalAttribPointer(polyListRenderer.normalAttribParams(normal));\n }\n if (tex0) {\n this.texCoordAttribPointer(polyListRenderer.texCoord0AttribParams(tex0));\n }\n if (tex1) {\n this.texCoordAttribPointer(polyListRenderer.texCoord1AttribParams(tex1));\n }\n if (tex2) {\n this.texCoordAttribPointer(polyListRenderer.texCoord2AttribParams(tex1));\n }\n if (tangent) {\n this.tangentAttribPointer(polyListRenderer.tangentAttribParams(tangent));\n }\n if (color) {\n this.colorAttribPointer(polyListRenderer.colorAttribParams(color));\n }\n }\n\n bindMatrix(uniformName, matrix) {\n if (matrix instanceof Mat4) {\n this.uniformMatrix4fv(uniformName, false, matrix);\n }\n else if (matrix instanceof Mat3) {\n this.uniformMatrix3fv(uniformName, false, matrix);\n }\n }\n\n bindVector(uniformName, vec) {\n switch (vec.length) {\n case 2:\n this.uniform2fv(uniformName, vec);\n break;\n case 3:\n this.uniform3fv(uniformName, vec);\n break;\n case 4:\n this.uniform4fv(uniformName, vec);\n break;\n default:\n throw new Error(\"ShaderProgram.bindVector(): invalid vector size\");\n }\n }\n\n bindTexture(uniformName, textureRenderer, textureUnit) {\n const gl = this._gl;\n const webglTexture = textureRenderer.getApiObject();\n \n gl.activeTexture(gl.TEXTURE0 + textureUnit);\n switch (textureRenderer.texture.target) {\n case TextureTarget.TEXTURE_2D:\n gl.bindTexture(gl.TEXTURE_2D, webglTexture);\n break;\n case TextureTarget.CUBE_MAP:\n gl.bindTexture(gl.TEXTURE_CUBE_MAP, webglTexture);\n break;\n }\n this.uniform1i(uniformName, textureUnit);\n }\n\n validate() {\n gl.validateProgram(this._program);\n if (!gl.getProgramParameter(this._program, gl.VALIDATE_STATUS)) {\n throw new Error(`Error validating program:\\n${gl.getProgramInfoLog(this._program)}`);\n }\n }\n}\n","\nimport Texture, { TextureTargetName } from '../base/Texture';\nimport Shader from '../render/Shader';\nimport ShaderProgram from '../render/webgl/ShaderProgram';\n\nconst g_code = {\n webgl: {\n vertex: `precision mediump float;\n\n attribute vec3 position;\n attribute vec2 texCoord;\n \n varying vec2 fragTexCoord;\n\n void main() {\n fragTexCoord = texCoord;\n gl_Position = vec4(position, 1.0);\n }`,\n\n fragment: `precision mediump float;\n \n varying vec2 fragTexCoord;\n \n uniform sampler2D uTexture;\n \n void main() {\n vec4 texColor = texture2D(uTexture, fragTexCoord);\n gl_FragColor = vec4(texColor.rgb, 1.0);\n }`\n }\n}\n\nexport default class PresentTextureShader extends Shader {\n constructor(renderer) {\n super(renderer);\n\n if (renderer.typeId !== \"WebGL\") {\n throw Error(\"PresentTextureShader is only compatible with WebGL renderer\");\n }\n }\n\n async load() {\n const { gl } = this.renderer;\n\n this._program = new ShaderProgram(gl, \"DefaultPresentTextureShader\");\n this._program.attachVertexSource(g_code.webgl.vertex);\n this._program.attachFragmentSource(g_code.webgl.fragment);\n this._program.link();\n }\n\n setup(plistRenderer, materialRenderer, modelMatrix, viewMatrix, projectionMatrix) {\n const { gl } = this.renderer;\n\n this.renderer.state.shaderProgram = this._program;\n\n gl.activeTexture(gl.TEXTURE0);\n this._program.uniform1i('uTexture', 0);\n\n const material = materialRenderer.material;\n if (material.diffuse instanceof Texture) {\n const webglTexture = materialRenderer.getTextureRenderer('diffuse').getApiObject();\n const target = TextureTargetName[material.diffuse.target];\n gl.bindTexture(gl[target], webglTexture);\n\n }\n else {\n throw new Error(\"PresentTextureShader: invalid material setup. The diffuse material attribute must to be a texture\");\n }\n\n this._program.positionAttribPointer(plistRenderer.positionAttribParams(\"position\"));\n this._program.texCoordAttribPointer(plistRenderer.texCoord0AttribParams(\"texCoord\"));\n }\n}\n","\nimport Shader from \"../render/Shader\";\nimport ShaderProgram from \"../render/webgl/ShaderProgram\";\nimport Mat4 from \"../math/Mat4\";\nimport Vec from \"../math/Vec\";\n\nconst g_code = {\n webgl: {\n vertex: `precision mediump float;\n \n attribute vec3 vertPosition;\n \n uniform mat4 uMVP;\n \n varying vec3 fragNormal;\n\n void main() {\n gl_Position = uMVP * vec4(vertPosition, 1.0);\n fragNormal = normalize(vertPosition);\n }\n `,\n\n fragment: (sampleDelta) => `precision mediump float;\n varying vec3 fragNormal;\n \n uniform samplerCube uCubemap;\n \n void main() {\n vec3 normal = normalize(fragNormal);\n vec3 irradiance = vec3(0.0);\n\n vec3 up = vec3(0.0, 1.0, 0.0);\n vec3 right = cross(up, normal);\n up = cross(normal,right);\n\n float nrSamples = 0.0;\n for (float phi = 0.0; phi < ${ 2 * Math.PI }; phi += ${ sampleDelta })\n {\n for (float theta = 0.0; theta < ${ 0.5 * Math.PI }; theta += ${ sampleDelta })\n {\n // Spherical to cartesian\n vec3 tangentSample = vec3(sin(theta) * cos(phi), sin(theta) * sin(phi), cos(theta));\n\n // tangent space to world space\n vec3 sampleVec = tangentSample.x * right + tangentSample.y * up + tangentSample.z * normal;\n\n irradiance += textureCube(uCubemap, sampleVec).rgb * cos(theta) * sin(theta);\n nrSamples++;\n }\n }\n irradiance = ${ Math.PI } * irradiance * (1.0 / float(nrSamples));\n\n gl_FragColor = vec4(irradiance, 1.0);\n }`\n }\n};\n\nexport default class IrradianceMapCubeShader extends Shader {\n constructor(renderer) {\n super(renderer);\n\n if (renderer.typeId !== \"WebGL\") {\n throw Error(\"PresentTextureShader is only compatible with WebGL renderer\");\n }\n }\n\n async load() {\n const { gl } = this.renderer;\n\n this._program = new ShaderProgram(gl, \"IrradianceMapCubeShader\");\n this._program.attachVertexSource(g_code.webgl.vertex);\n this._program.attachFragmentSource(g_code.webgl.fragment(0.1));\n this._program.link();\n }\n\n setup(plistRenderer, materialRenderer, modelMatrix, viewMatrix, projectionMatrix) {\n const { material } = materialRenderer;\n const { gl } = this.renderer;\n this.renderer.state.shaderProgram = this._program;\n\n const mvp = Mat4.Mult(projectionMatrix, viewMatrix);\n this._program.uniformMatrix4fv('uMVP', false, mvp);\n\n gl.activeTexture(gl.TEXTURE0);\n this._program.uniform1i('uCubemap', 0);\n if (material.diffuse instanceof Vec) {\n throw new Error(\"Invalid material configuration in IrradianceMapCubeShader: diffuse component must be a cube map texture\");\n }\n const webglTexture = materialRenderer.getTextureRenderer('diffuse').getApiObject();\n gl.bindTexture(gl.TEXTURE_CUBE_MAP, webglTexture);\n\n this._program.positionAttribPointer(plistRenderer.positionAttribParams(\"vertPosition\"));\n }\n\n destroy() {\n ShaderProgram.Delete(this._program);\n this._program = null;\n }\n}","import Shader from \"../render/Shader\";\nimport ShaderProgram from \"../render/webgl/ShaderProgram\";\nimport Mat4 from \"../math/Mat4\";\nimport Vec from \"../math/Vec\";\n\nconst g_code = {\n webgl: {\n vertex: `precision mediump float;\n \n attribute vec3 vertPosition;\n \n uniform mat4 uMVP;\n \n varying vec3 fragNormal;\n \n void main() {\n gl_Position = uMVP * vec4(vertPosition, 1.0);\n fragNormal = normalize(vertPosition);\n }`,\n\n fragment: (sampleCount,roughness) => `precision mediump float;\n \n varying vec3 fragNormal;\n \n uniform samplerCube uCubemap;\n \n float vanDerCorpus(int n, int base) {\n float invBase = 1.0 / float(base);\n float denom = 1.0;\n float result = 0.0;\n\n for(int i = 0; i < 16; ++i)\n {\n if(n > 0)\n {\n denom = mod(float(n), 2.0);\n result += denom * invBase;\n invBase = invBase / 2.0;\n n = int(float(n) / 2.0);\n }\n }\n\n return result;\n }\n\n vec2 hammersleyNoBitOps(int i, int N) {\n return vec2(float(i)/float(N), vanDerCorpus(i, 2));\n }\n\n vec3 importanceSampleGGX(vec2 Xi, vec3 N) {\n // compute roughness^4 outside the gpu\n float a = ${ roughness*roughness*roughness*roughness };\n \n float phi = ${ 2.0 * Math.PI } * Xi.x;\n float cosTheta = sqrt((1.0 - Xi.y) / (1.0 + (a - 1.0) * Xi.y));\n float sinTheta = sqrt(1.0 - cosTheta*cosTheta);\n \n // from spherical coordinates to cartesian coordinates\n vec3 H;\n H.x = sin(phi) * sinTheta;\n H.y = cos(phi) * sinTheta;\n H.z = cosTheta;\n \n // from tangent-space vector to world-space sample vector\n vec3 up = abs(N.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0);\n vec3 tangent = normalize(cross(up, N));\n vec3 bitangent = cross(N, tangent);\n \n vec3 sampleVec = tangent * H.x + bitangent * H.y + N * H.z;\n return normalize(sampleVec);\n } \n\n void main() {\n vec3 N = normalize(fragNormal);\n vec3 R = N;\n vec3 V = R;\n\n float totalWeight = 0.0;\n vec3 prefilteredColor = vec3(0.0);\n for (int i = 0; i < ${ sampleCount }; ++i)\n {\n vec2 Xi = hammersleyNoBitOps(i, ${ sampleCount });\n vec3 H = importanceSampleGGX(Xi, N);\n vec3 L = normalize(2.0 * dot(V, H) * H - V);\n\n float NdotL = max(dot(N,L), 0.0);\n if (NdotL > 0.0)\n {\n prefilteredColor += textureCube(uCubemap, L).rgb * NdotL;\n totalWeight += NdotL;\n }\n }\n prefilteredColor = prefilteredColor / totalWeight;\n\n gl_FragColor = vec4(prefilteredColor, 1.0);\n }`\n }\n};\n\nexport default class SpecularMapCubeShader extends Shader {\n constructor(renderer) {\n super(renderer);\n\n if (renderer.typeId !== \"WebGL\") {\n throw Error(\"SpecularMapCubeShader is only compatible with WebGL renderer\");\n }\n }\n\n get roughness() { return this._roughness; }\n\n async load() {\n const { gl } = this.renderer;\n\n // This matches with the getPrefilteredColor function in pbr.glsl\n this._roughness = 0.4;\n\n this._program = new ShaderProgram(gl, \"SpecularMapCubeShader\");\n this._program.attachVertexSource(g_code.webgl.vertex);\n this._program.attachFragmentSource(g_code.webgl.fragment(128, this._roughness));\n this._program.link();\n }\n\n setup(plistRenderer, materialRenderer, modelMatrix, viewMatrix, projectionMatrix) {\n const { material } = materialRenderer;\n const { gl } = this.renderer;\n this.renderer.state.shaderProgram = this._program;\n\n const mvp = Mat4.Mult(projectionMatrix, viewMatrix);\n this._program.uniformMatrix4fv('uMVP', false, mvp);\n\n gl.activeTexture(gl.TEXTURE0);\n this._program.uniform1i('uCubemap', 0);\n if (material.diffuse instanceof Vec) {\n throw new Error('Invalid material configuration in SpecularMapCubeShader: diffuse component must be a cube map')\n }\n const webglTexture = materialRenderer.getTextureRenderer('diffuse').getApiObject();\n gl.bindTexture(gl.TEXTURE_CUBE_MAP, webglTexture);\n\n this._program.positionAttribPointer(plistRenderer.positionAttribParams('vertPosition'));\n }\n\n destroy() {\n ShaderProgram.Delete(this._program);\n this._program = null;\n }\n}","import Texture, { TextureRenderTargetAttachment, TextureTarget } from \"../base/Texture\";\nimport IrradianceMapCubeShader from \"../shaders/IrradianceMapCubeShader\";\nimport SpecularMapCubeShader from \"../shaders/SpecularMapCubeShader\";\n\nconst createTextureResources = async (renderer, size) => {\n const texture = new Texture();\n texture.renderTargetAttachment = TextureRenderTargetAttachment.COLOR_ATTACHMENT_0;\n texture.target = TextureTarget.CUBE_MAP;\n \n const renderBuffer = renderer.factory.renderBuffer();\n await renderBuffer.attachTexture(texture);\n renderBuffer.size = size;\n\n return { renderer, texture, renderBuffer };\n}\n\nconst destroyTextureResources = (resources) => {\n resources.texture.destroy();\n resources.renderBuffer.destroy();\n}\n\nconst updateMap = (mapResources) => {\n const { state } = mapResources.renderer; \n const { renderBuffer, skyShape } = mapResources;\n renderBuffer.update((face,viewMatrix,projectionMatrix) => {\n state.clear();\n skyShape.updateRenderState({ viewMatrix, projectionMatrix });\n skyShape.draw();\n })\n}\n\nexport default class Environment {\n constructor(renderer) {\n this._renderer = renderer;\n\n this._environmentMap = null;\n this._specularMap = null;\n this._irradianceMap = null;\n\n this._updated = false;\n }\n\n get renderer() {\n return this._renderer;\n }\n\n get updated() {\n return this._updated;\n }\n\n get environmentMap() {\n return this._environmentMapResources.texture;\n }\n\n get specularMap() {\n return this._specularMapResources.texture;\n }\n\n get irradianceMap() {\n return this._irradianceMapResources.texture;\n }\n\n async load({ \n textureUrl = null,\n environmentMapSize = [ 512, 512 ],\n specularMapSize = [ 128, 128 ],\n irradianceMapSize = [32, 32]\n } = {}) {\n this._envMapSize = environmentMapSize;\n this._specMapSize = specularMapSize;\n this._irrMapSize = irradianceMapSize;\n\n this._environmentMapResources = await createTextureResources(this.renderer, environmentMapSize);\n this._environmentMapResources.skyShape = this.renderer.factory.skySphere();\n await this._environmentMapResources.skyShape.load(textureUrl);\n\n this._specularMapResources = await createTextureResources(this.renderer, specularMapSize);\n this._specularMapResources.skyShape = this.renderer.factory.skyCube();\n await this._specularMapResources.skyShape.load(this._environmentMapResources.texture, SpecularMapCubeShader, [0.5]);\n\n this._irradianceMapResources = await createTextureResources(this.renderer, irradianceMapSize);\n this._irradianceMapResources.skyShape = this.renderer.factory.skyCube();\n await this._irradianceMapResources.skyShape.load(this._environmentMapResources.texture, IrradianceMapCubeShader);\n this._updated = false;\n }\n\n destroy() {\n destroyTextureResources(this._environmentMapResources);\n destroyTextureResources(this._specularMapResources);\n destroyTextureResources(this._irradianceMapResources);\n this._updated = false;\n }\n\n updateMaps() {\n updateMap(this._environmentMapResources);\n updateMap(this._specularMapResources);\n updateMap(this._irradianceMapResources);\n this._updated = true;\n }\n\n async reloadImage(imageUrl) {\n await this._environmentMapResources.skyShape.setTexture(imageUrl);\n this._updated = false;\n }\n}","\nimport { TextureChannel } from '../base/Texture';\nimport Shader from '../render/Shader';\nimport ShaderProgram from '../render/webgl/ShaderProgram';\n\nconst g_code = {\n webgl: {\n vertex: `precision mediump float;\n\n attribute vec3 position;\n attribute vec2 texCoord;\n \n varying vec2 fragTexCoord;\n\n void main() {\n fragTexCoord = texCoord;\n gl_Position = vec4(position, 1.0);\n }`,\n\n fragment: `precision mediump float;\n \n varying vec2 fragTexCoord;\n \n uniform sampler2D uTextureR;\n uniform sampler2D uTextureG;\n uniform sampler2D uTextureB;\n uniform sampler2D uTextureA;\n\n uniform int uRChannel;\n uniform int uGChannel;\n uniform int uBChannel;\n uniform int uAChannel;\n \n float getChannel(vec4 color, int channel) {\n if (channel == 1) {\n return color.r;\n }\n else if (channel == 2) {\n return color.g;\n }\n else if (channel == 3) {\n return color.b;\n }\n else {\n return color.a;\n }\n }\n\n void main() {\n vec4 result = vec4(\n getChannel(texture2D(uTextureR, fragTexCoord), uRChannel),\n getChannel(texture2D(uTextureG, fragTexCoord), uGChannel),\n getChannel(texture2D(uTextureB, fragTexCoord), uBChannel),\n getChannel(texture2D(uTextureA, fragTexCoord), uAChannel)\n );\n \n gl_FragColor = result;\n }`\n }\n}\n\nconst g_renderers = {};\nexport default class TextureMergerShader extends Shader {\n static GetUnique(renderer) {\n if (!g_renderers[renderer.uniqueId]) {\n g_renderers[renderer.uniqueId] = new TextureMergerShader(renderer);\n g_renderers[renderer.uniqueId].load();\n }\n return g_renderers[renderer.uniqueId];\n }\n\n constructor(renderer) {\n super(renderer);\n\n if (renderer.typeId !== \"WebGL\") {\n throw Error(\"TextureMergerShader is only compatible with WebGL renderer\");\n }\n\n this._textures = {};\n this._textureChannels = {};\n }\n\n load() {\n const { gl } = this.renderer;\n\n this._program = new ShaderProgram(gl, \"DefaultTextureMergerShader\");\n this._program.attachVertexSource(g_code.webgl.vertex);\n this._program.attachFragmentSource(g_code.webgl.fragment);\n this._program.link();\n }\n\n setTexture(tex,channel,dstChannel = TextureChannel.R) {\n if (channel<TextureChannel.R || channel>TextureChannel.A) {\n throw new Error(`TextureMergerShader: invalid texture channel set ${ channel }`);\n }\n this._textures[channel] = tex;\n this._textureChannels[channel] = dstChannel;\n }\n\n get isComplete() {\n return this._textures[TextureChannel.R] &&\n this._textures[TextureChannel.G] &&\n this._textures[TextureChannel.B] &&\n this._textures[TextureChannel.A] && true;\n }\n\n setup(plistRenderer, materialRenderer, modelMatrix, viewMatrix, projectionMatrix) {\n if (!this.isComplete) {\n throw new Error(\"TextureMergerShader: the texture shader is not complete. Check that the textures are set for all channels\");\n }\n\n this.renderer.state.shaderProgram = this._program;\n\n this._program.bindTexture(\"uTextureR\", this.renderer.factory.texture(this._textures[TextureChannel.R]), 0);\n this._program.bindTexture(\"uTextureG\", this.renderer.factory.texture(this._textures[TextureChannel.G]), 1);\n this._program.bindTexture(\"uTextureB\", this.renderer.factory.texture(this._textures[TextureChannel.B]), 2);\n this._program.bindTexture(\"uTextureA\", this.renderer.factory.texture(this._textures[TextureChannel.A]), 3);\n\n this._program.uniform1i(\"uRChannel\", this._textureChannels[TextureChannel.R]);\n this._program.uniform1i(\"uGChannel\", this._textureChannels[TextureChannel.G]);\n this._program.uniform1i(\"uBChannel\", this._textureChannels[TextureChannel.B]);\n this._program.uniform1i(\"uAChannel\", this._textureChannels[TextureChannel.A]);\n\n this._program.positionAttribPointer(plistRenderer.positionAttribParams(\"position\"));\n this._program.texCoordAttribPointer(plistRenderer.texCoord0AttribParams(\"texCoord\"));\n }\n}\n","\nimport Texture, { TextureChannel, TextureComponentFormat, TextureRenderTargetAttachment, TextureWrap } from \"../base/Texture\";\nimport TextureMergerShader from \"../shaders/TextureMergerShader\";\nexport default class TextureMergerRenderer {\n constructor(renderer) {\n this._renderer = renderer;\n\n this._shader = TextureMergerShader.GetUnique(this.renderer);\n\n this._dirty = true;\n\n this._mergedTexture = new Texture();\n this._mergedTexture.renderTargetAttachment = TextureRenderTargetAttachment.COLOR_ATTACHMENT_0;\n this._mergedTexture.componentFormat = TextureComponentFormat.UNSIGNED_BYTE;\n this._mergedTexture.wrapModeXY = TextureWrap.REPEAT;\n\n this._renderBuffer = this.renderer.factory.renderBuffer();\n this._renderBuffer.attachTexture(this._mergedTexture);\n\n this._shader.load();\n }\n\n get renderer() {\n return this._renderer;\n }\n\n get dirty() {\n return this._dirty;\n }\n\n set dirty(d) {\n this._dirty = d;\n }\n\n setTexture(tex,channel,dstChannel = TextureChannel.R) {\n this._shader.setTexture(tex,channel,dstChannel);\n this._dirty = true;\n }\n\n get mergedTexture() {\n return this._mergedTexture;\n }\n\n get isComplete() {\n return this._shader.isComplete;\n }\n\n update() {\n if (this._dirty) {\n this._renderBuffer.update(() => {\n // DEBUG: check why it's neccesary to present texture twice\n this.renderer.presentTexture(null, { clear: true, shader: this._shader });\n this.renderer.presentTexture(null, { shader: this._shader });\n });\n this._dirty = false;\n }\n }\n}\n","\nimport PresentTextureShader from \"../shaders/PresentTextureShader\";\nimport Material from \"../base/Material\";\nimport PolyList from \"../base/PolyList\";\nimport Environment from \"./Environment\";\nimport TextureMergerRenderer from \"./TextureMergerRenderer\";\n\nexport const EngineFeatures = {\n RENDER_TARGET_TEXTURES: 0x1 << 0,\n RENDER_TARGET_FLOAT: 0x1 << 1,\n RENDER_TARGET_DEPTH: 0x1 << 2\n};\n\nexport default class Renderer {\n constructor(identifier) {\n this._identifier = identifier;\n this._frameBuffer = null;\n }\n\n get uniqueId() {\n throw new Error(\"Calling Renderer.uniqueId base implementation.\");\n }\n\n get typeId() {\n throw new Error(\"Calling Renderer.typeId base implementation\");\n }\n\n async init(canvas) {\n this._canvas = canvas;\n }\n\n get canvas() {\n return this._canvas;\n }\n\n get frameBuffer() {\n throw new Error(\"Calling Renderer.frameBuffer base implementation.\");\n }\n\n set viewport(vp) {\n throw new Error(\"Calling Renderer.viewport setter base implementation.\");\n }\n\n get viewport() {\n throw new Error(\"Calling Renderer.viewport getter base implementation.\");\n }\n\n get presentTextureSurfaceRenderer() {\n if (!this._presentTextureSurface) {\n const plist = new PolyList();\n plist.vertex = [\n -1, -1, 0,\n 1, -1, 0,\n 1, 1, 0,\n -1, 1, 0\n ];\n plist.texCoord0 = [\n 0, 0,\n 1, 0,\n 1, 1,\n 0, 1\n ];\n plist.index = [\n 0, 1, 2,\n 2, 3, 0\n ];\n this._presentTextureSurface = this.factory.polyList(plist);\n }\n return this._presentTextureSurface;\n }\n\n async initPresentTextureShader() {\n if (!this._presentTextureShader) {\n this._presentTextureShader = new PresentTextureShader(this);\n this._presentTextureShader.load();\n }\n return this._presentTextureShader;\n }\n\n get presentTextureShader() {\n return this._presentTextureShader;\n }\n\n get presentTextureMaterialRenderer() {\n if (!this._presentTextureMaterial) {\n this._presentTextureMaterial = this.factory.material(new Material());\n }\n return this._presentTextureMaterial;\n }\n\n postReshape(width,height) {\n\n }\n\n postRedisplay() {\n\n }\n\n polyListFactory(plist) {\n throw new Error(\"Calling base implementation of Renderer.polyListFactory()\");\n }\n\n materialFactory(material) {\n throw new Error(\"Calling base implementation of Renderer.materialFactory()\");\n }\n\n textureFactory(texture) {\n throw new Error(\"Calling base implementation of Renderer.textureFactory()\");\n }\n\n renderBufferFactory() {\n throw new Error(\"Calling base implementation of Renderer.renderBufferFactory()\");\n }\n\n skySphereFactory() {\n throw new Error(\"Calling base implementation of Renderer.skySphereFactory()\");\n }\n \n skyCubeFactory() {\n throw new Error(\"Calling base implementation of Renderer.skyCubeFactory()\");\n }\n\n environmentFactory() {\n return new Environment(this);\n }\n\n textureMergerFactory() {\n return new TextureMergerRenderer(this);\n }\n\n pipelineFactory() {\n throw new Error(\"Calling base implementation of Renderer.pipelineFactory()\");\n }\n\n sceneRendererFactory() {\n throw new Error(\"Calling base implementation of Renderer.sceneRendererFactory()\");\n }\n\n shadowRendererFactory() {\n throw new Error(\"Calling base implementation of Renderer.shadowRendererFactory()\");\n }\n\n get clearColor() {\n throw new Error(\"Calling base implementation of Renderer.clearColor getter.\");\n }\n\n set clearColor(c) {\n throw new Error(\"Calling base implementation of Renderer.clearColor setter.\");\n }\n\n get factory() {\n const renderer = this;\n return {\n polyList(plist) {\n return renderer.polyListFactory(plist);\n },\n material(material) {\n return renderer.materialFactory(material);\n },\n texture(texture) {\n return renderer.textureFactory(texture);\n },\n renderBuffer() {\n return renderer.renderBufferFactory();\n },\n skySphere() {\n return renderer.skySphereFactory();\n },\n skyCube() {\n return renderer.skyCubeFactory();\n },\n environment() {\n return renderer.environmentFactory();\n },\n textureMerger() {\n return renderer.textureMergerFactory();\n },\n pipeline() {\n return renderer.pipelineFactory();\n },\n scene() {\n return renderer.sceneRendererFactory();\n },\n shadowRenderer() {\n return renderer.shadowRendererFactory();\n }\n }\n }\n\n presentTexture(texture, { clearBuffers = true, shader = null, viewport = null } = {}) {\n \n }\n\n // Compatibility function\n supportsFeatures(feature) {\n return false;\n }\n\n getMaximumRenderTargets() {\n return 1;\n }\n}\n","import Renderer from \"../render/Renderer\";\n\nconst g_componentClasses = {}\n\nexport const registerComponent = (typeId,componentClass) => {\n g_componentClasses[typeId] = componentClass;\n}\n\nexport const createComponent = (typeId) => {\n const ComponentClass = g_componentClasses[typeId];\n if (ComponentClass) {\n try {\n const compInstance = new ComponentClass();\n return compInstance;\n }\n catch (err) {\n if (err.code === -1) {\n throw new Error(`Error in component constructor definition. Check the implementation of the '${ typeId }' component constructor. It should call super('typeId') to configure the component type id.`);\n }\n }\n }\n else {\n console.debug(`Ignoring component with type id='${typeId}'. If this is not expected, check if the component is registered in the component factory.`);\n return null;\n }\n}\n\nexport const deserializeComponent = async (sceneData,loader) => {\n const componentInstance = createComponent(sceneData.type);\n if (!componentInstance) {\n return null;\n }\n \n await componentInstance.deserialize(sceneData,loader);\n return componentInstance;\n}\n\nexport default class Component {\n constructor(typeId) {\n this._node = null;\n if (!typeId) {\n const e = new Error(\"Invalid typeId specified creating component.\");\n e.code = -1;\n throw e;\n }\n this._typeId = typeId;\n }\n\n get node() { return this._node; }\n\n get typeId() { return this._typeId; }\n\n clone() {\n throw new Error(\"Component.clone() not implemented\");\n }\n\n assign(other) {\n throw new Error(\"Component.assign() not implemented\");\n }\n\n destroy() {\n\n }\n\n addedToNode(node) {\n\n }\n\n removedFromNode(node) {\n\n }\n\n async deserialize(sceneData,loader) {\n }\n\n async serialize(sceneData,writer) {\n sceneData.type = this.typeId;\n }\n\n bindRenderer(renderer) {\n if (!renderer instanceof Renderer) {\n throw Error(\"Component.bindRenderer(): invalid renderer. Object is not instance of render.Renderer\");\n }\n\n this._renderer = renderer;\n }\n\n async init() {\n \n }\n\n get ready() {\n return this._renderer !== null;\n }\n\n get renderer() {\n return this._renderer;\n }\n\n // Access to brother components\n component(identifier) {\n return this.node.component(identifier);\n }\n\n get transform() {\n return this.component(\"Transform\");\n }\n\n get lightComponent() {\n return this.component(\"Light\");\n }\n\n get drawable() {\n return this.component(\"Drawable\");\n }\n\n get camera() {\n return this.component(\"Camera\");\n }\n\n // Life cycle functions and properties\n get requireWillUpdate() { return typeof(this.willUpdate) === \"function\" }\n get requireUpdate() { return typeof(this.update) === \"function\" }\n get requireDraw() { return typeof(this.draw) === \"function\"; }\n\n // The following functions can be implemented in component classes to complete the \n // life cycle functions\n // async init() {}\n // willUpdate(delta) {}\n // update(delta,modelMatrix) {}\n // draw(renderQueue,modelMatrix) {}\n\n // Event callbacks\n keyDown(evt) {}\n keyUp(evt) {}\n mouseUp(evt) {}\n mouseDown(evt) {}\n mouseMove(evt) {}\n mouseOut(evt) {}\n mouseDrag(evt) {}\n mouseWheel(evt) {}\n touchStart(evt) {}\n touchMove(evt) {}\n touchEnd(evt) {}\n}\n\n","\nimport Component from \"./Component\";\n\nfunction syncArray() {\n this._array = [];\n for (const type in this._obj) {\n const c = this._obj[type];\n this._array.push(c);\n } \n}\n\nexport default class ComponentMap {\n constructor(node) {\n this._node = node;\n this._obj = {};\n this._array = [];\n }\n\n get array() {\n return this._array;\n }\n\n add(comp) {\n const typeId = comp.typeId;\n const existingComp = this._obj[typeId];\n if (existingComp) {\n existingComp._node = null;\n existingComp.removedFromNode(this._node);\n }\n this._obj[typeId] = comp;\n comp._node = this._node;\n comp.addedToNode(this._node);\n syncArray.apply(this);\n }\n\n remove(compOrType) {\n const typeId = compOrType instanceof Component ? compOrType.typeId : compOrType;\n const existingComp = this._obj[typeId];\n if (existingComp) {\n existingComp._node = null;\n existingComp.removedFromNode(this._node);\n delete this._obj[typeId];\n syncArray.apply(this);\n }\n }\n\n empty() {\n for (const typeId in this._obj) {\n const comp = this._obj[typeId];\n comp._node = null;\n comp.removedFromNode(this._node);\n }\n this._obj = {};\n this._array = [];\n }\n\n find(typeId) {\n return this._obj[typeId];\n }\n\n forEach(cb) {\n return this._array.forEach(cb);\n }\n\n every(cb) {\n return this._array.every(cb);\n }\n\n some(cb) {\n return this._array.some(cb);\n }\n\n map(cb) {\n return this._array.map(cb);\n }\n\n filter(cb) {\n return this._array.filter(cb);\n }\n\n clone(parentNode) {\n const result = new Components(parentNode);\n result.assign(this);\n return result;\n }\n\n // Note: this function clones the components from 'other'\n // instance to this instance.\n // This function doesn't modify this._node reference\n assign(other) {\n this.empty();\n for (const typeId in other._obj) {\n const comp = other._obj[typeId];\n const compClone = comp.clone();\n this._obj[typeId] = compClone;\n }\n syncArray.apply(this);\n }\n}","import Mat4 from '../math/Mat4';\nimport ComponentMap from './ComponentMap';\n\nexport function bindRenderer(node, renderer) {\n node._bindedRenderer = renderer;\n node.components.forEach(comp => {\n comp.bindRenderer(renderer);\n });\n}\n\nexport async function init(node) {\n for (const i in node.components.array) {\n const comp = node.components.array[i];\n if (!comp._initialized) {\n await comp.init();\n comp._initialized = true;\n }\n }\n node._sceneChanged = false;\n}\n\nexport default class Node {\n constructor(name = \"\") {\n this._name = name;\n this._enabled = true;\n this._steady = false;\n\n this._components = new ComponentMap(this);\n\n this._parent = null;\n this._children = [];\n }\n\n get name() { return this._name; }\n set name(n) { this._name = n; }\n\n get enabled() { return this._enabled; }\n set enabled(e) { this._enabled = e; }\n\n get steady() { return this._steady; }\n set steady(s) { this._steady = s; }\n\n get components() { return this._components; }\n\n get parent() { return this._parent; }\n get children() { return this._children; }\n\n clone(cloneChildren=false) {\n const newNode = new Node();\n newNode.assign(this,cloneChildren);\n return newNode;\n }\n\n assign(other,cloneChildren=false) {\n this._name = other.name + \"-copy\";\n this._enabled = other.enabled;\n this._steady = other.steady;\n this._components.assign(other._components);\n if (cloneChildren) {\n this._children = [];\n other._children.forEach(c => {\n this._children.push(c.clone(cloneChildren));\n });\n }\n }\n\n destroy() {\n this._components.empty();\n this.emptyChildren();\n }\n\n async deserialize(sceneData,loader) {\n throw new Error(\"Node.deserialize() not implemented\");\n }\n\n async serialize(sceneData,writer) {\n throw new Error(\"Node.serialice() not implemented\");\n }\n\n addComponent(component) {\n this.components.add(component);\n this.setSceneChanged();\n return component;\n }\n\n component(typeId) {\n return this.components.find(typeId);\n }\n\n removeComponent(component) {\n this.components.remove(component);\n this.setSceneChanged();\n return component;\n }\n\n addedToNode(node) {\n\n }\n\n removedFromNode(node) {\n\n }\n\n // This attribute returns true if a node or component\n // has been added or removed to this node or any child node\n get sceneChanged() {\n return this._sceneChanged;\n }\n\n setSceneChanged() {\n this._sceneChanged = true;\n if (this._parent) {\n this._parent.setSceneChanged();\n }\n }\n\n addChild(node) {\n if (node._parent) {\n node._parent.removeChild(node);\n }\n node._parent = this;\n this._children.push(node);\n node.addedToNode(this);\n\n // If this node has been binded to a renderer, we need to bind\n // the same renderer to any node that is added as child\n if (this._bindedRenderer) {\n bindRenderer(node, this._bindedRenderer);\n }\n\n this.setSceneChanged();\n }\n\n removeChild(node) {\n if (node._parent === this) {\n node._parent = null;\n node.removedFromNode(this);\n const index = this._children.indexOf(node);\n if (index !== -1) {\n this._children.splice(index, 1);\n this.setSceneChanged();\n }\n else {\n console.warn(`Scene inconsistency found removing node '${ node.name }' from node '${ this.name }'. The parent node is valid, but the child is not present in the children array.`);\n }\n }\n else {\n throw new Error(`Node.removeChild() - the specified node is not a child of this node.`);\n }\n }\n\n emptyChildren() {\n this._children.forEach(ch => {\n ch._parent = null;\n ch.removedFromNode(this);\n });\n this._children = [];\n this.setSceneChanged();\n }\n\n haveChild(node) {\n return this._children.indexOf(node) !== -1;\n }\n\n isAncientOf(node) {\n const isNodeAncient = (node, ancient) => {\n if (!node || !ancient) {\n return false;\n }\n else if (node._parent === ancient) {\n return true;\n }\n else {\n return isNodeAncient(node._parent, ancient);\n }\n }\n isNodeAncient(this,node);\n }\n\n // Visitor functions\n accept(nodeVisitor) {\n if (!nodeVisitor.ignoreDisabled || this.enabled) {\n nodeVisitor.visit(this);\n this._children.forEach(ch => ch.accept(nodeVisitor));\n nodeVisitor.didVisit(this);\n }\n }\n\n acceptReverse(nodeVisitor) {\n if (!nodeVisitor.ignoreDisabled || this.enabled) {\n if (this._parent) {\n this._parent.acceptReverse(nodeVisitor);\n }\n nodeVisitor.visit(this);\n }\n }\n\n async asyncAccept(nodeVisitor) {\n if (!nodeVisitor.ignoreDisabled || this.enabled) {\n await nodeVisitor.asyncVisit(this);\n for (const ch in this._children) {\n await this._children[ch].asyncAccept(nodeVisitor);\n }\n }\n }\n \n // Most usual components\n get transform() {\n return this.component(\"Transform\");\n }\n\n get lightComponent() {\n return this.component(\"Light\");\n }\n\n get drawable() {\n return this.component(\"Drawable\");\n }\n\n get camera() {\n return this.component(\"Camera\");\n }\n\n frame(delta, modelMatrix, renderQueue) {\n const willUpdateComponents = [];\n const updateComponents = [];\n const drawComponents = [];\n this._components.forEach(comp => {\n if (comp.requireWillUpdate) {\n willUpdateComponents.push(comp);\n }\n if (comp.requireUpdate) {\n updateComponents.push(comp);\n }\n if (comp.requireDraw) {\n drawComponents.push(comp);\n }\n })\n\n willUpdateComponents.forEach(comp => comp.willUpdate(delta));\n updateComponents.forEach(comp => comp.update(delta, modelMatrix));\n drawComponents.forEach(comp => comp.draw(renderQueue, modelMatrix));\n }\n\n keyDown(evt) {\n this._components.forEach(comp => {\n comp.keyDown(evt);\n })\n }\n keyUp(evt) {\n this._components.forEach(comp => {\n comp.keyUp(evt);\n })\n }\n mouseUp(evt) {\n this._components.forEach(comp => {\n comp.mouseUp(evt);\n })\n }\n mouseDown(evt) {\n this._components.forEach(comp => {\n comp.mouseDown(evt);\n })\n }\n mouseMove(evt) {\n this._components.forEach(comp => {\n comp.mouseMove(evt);\n })\n }\n mouseOut(evt) {\n this._components.forEach(comp => {\n comp.mouseOut(evt);\n })\n }\n mouseDrag(evt) {\n this._components.forEach(comp => {\n comp.mouseDrag(evt);\n })\n }\n mouseWheel(evt) {\n this._components.forEach(comp => {\n comp.mouseWheel(evt);\n })\n }\n touchStart(evt) {\n this._components.forEach(comp => {\n comp.touchStart(evt);\n })\n }\n touchMove(evt) {\n this._components.forEach(comp => {\n comp.touchMove(evt);\n })\n }\n touchEnd(evt) {\n this._components.forEach(comp => {\n comp.touchEnd(evt);\n })\n }\n}\n","import Resource, { removeFileName, ResourceType } from \"../tools/Resource\";\nimport LoaderPlugin from \"./LoaderPlugin\";\nimport Node from \"../scene/Node\";\nimport { deserializeComponent } from \"../scene/Component\";\nimport Bg2LoaderPlugin from \"./Bg2LoaderPlugin\";\n\nconst deserializeNode = async (nodeData, loader) => {\n nodeData.children = nodeData.children || [];\n nodeData.components = nodeData.components || [];\n\n const node = new Node(nodeData.name);\n node.enabled = nodeData.enabled !== undefined ? nodeData.enabled : true;\n node.steady = nodeData.steady !== undefined ? nodeData.steady : false;\n\n for (const componentData of nodeData.components) {\n try {\n const component = await deserializeComponent(componentData, loader);\n if (component) {\n node.addComponent(component);\n }\n }\n catch (err) {\n console.warn(`Deserialization of node with name \"${node.name}\": ${err.message}`);\n }\n }\n\n for (const childData of nodeData.children) {\n const child = await deserializeNode(childData, loader);\n node.addChild(child);\n }\n\n return node;\n}\n\nexport const DrawableFormat = {\n LEGACY: 'vwglb',\n BG2: 'bg2'\n};\n\nlet g_prefDrawableFormat = DrawableFormat.BG2;\nexport default class VitscnjLoaderPlugin extends LoaderPlugin {\n static PreferredDrawableFormat() {\n return g_prefDrawableFormat;\n }\n\n constructor({ bg2ioPath = null, preferedDrawableFormat = DrawableFormat.BG2 }) {\n super();\n\n this._bg2ioPath = bg2ioPath;\n g_prefDrawableFormat = preferedDrawableFormat;\n }\n\n get supportedExtensions() { return [\"vitscnj\"]; }\n\n get resourceTypes() {\n return [\n ResourceType.Node\n ];\n }\n\n async load(path,resourceType,loader) {\n if (resourceType !== ResourceType.Node) {\n throw new Error(`VitscnjLoaderPlugin.load() unexpected resource type received: ${resourceType}`);\n }\n\n const prevPath = loader.currentPath;\n loader.currentPath = removeFileName(path);\n\n const resource = new Resource();\n\n const root = new Node(\"Scene Root\");\n\n const { scene } = await resource.load(path);\n for (const nodeData of scene) {\n const node = await deserializeNode(nodeData, loader);\n root.addChild(node);\n }\n\n loader.currentPath = prevPath;\n\n return root;\n }\n\n get dependencies() {\n return [new Bg2LoaderPlugin({ bg2ioPath: this._bg2ioPath })];\n }\n}","\nimport Component from \"./Component\";\nimport Mat4 from \"../math/Mat4\";\nimport PolyList from \"../base/PolyList\";\nimport Material from \"../base/Material\";\nimport VitscnjLoaderPlugin, { DrawableFormat } from \"../db/VitscnjLoaderPlugin\";\n\nexport default class Drawable extends Component {\n constructor(name) {\n super(\"Drawable\");\n this._name = name || \"\";\n this._items = [];\n }\n\n get name() {\n return this._name;\n }\n\n set name(n) {\n this._name = n;\n }\n\n get valid() {\n return this._items.length>0 && this._items.every(item => item.polyList !== null && item.material !== null);\n }\n\n get items() {\n return this._items;\n }\n\n clone() {\n const result = new Drawable();\n result.assign(this);\n return result;\n }\n\n assign(other) {\n this.destroy();\n this._name = other._name;\n this._items = [];\n other._items.forEach(item => {\n const pl = item.polyList.clone();\n const mat = item.material.clone();\n const trx = new Mat4(item.transform);\n this.addPolyList(pl,mat,trx);\n });\n }\n\n addPolyList(polyList,material,transform = Mat4.MakeIdentity(),r) {\n if (!polyList instanceof PolyList) {\n throw new Error(\"Error adding polyList to drawable object: polyList is not an instance of PolyList\");\n }\n if (!material instanceof Material) {\n throw new Error(\"Error adding polyList to drawable object: material is not an instance of Material\");\n }\n if (!transform instanceof Mat4) {\n throw new Error(\"Error adding polyList to drawable object: transform is not an instance of Mat4\");\n }\n this._items.push({ polyList, material, transform });\n }\n\n removePolyList(plist) {\n this._items = this._items.filter(item => item.polyList != plist);\n }\n\n destroy() {\n\n }\n\n addedToNode(node) {\n\n }\n\n removedFromNode(node) {\n\n }\n\n makeSelectable(selectable = true) {\n this._items.forEach(({polyList}) => {\n polyList.selectable = selectable;\n })\n }\n\n async deserialize(sceneData,loader) {\n const tryload = async (drawablePath) => {\n try {\n const result = await loader.loadDrawable(drawablePath);\n return result;\n }\n catch (err) {\n\n }\n }\n\n const drwFormat = VitscnjLoaderPlugin.PreferredDrawableFormat();\n const drw = drwFormat === DrawableFormat.BG2\n ? (await tryload(sceneData.name + '.bg2') || await tryload(sceneData.name + '.vwglb'))\n : (await tryload(sceneData.name + '.vwglb') || await tryload(sceneData.name + '.bg2'));\n\n if (!drw) {\n throw new Error(`Drawable.deserialize(): could not load drawable with name ${sceneData.name}`);\n }\n drw.items.forEach(({polyList,material,transform}) => this.addPolyList(polyList,material,transform));\n this.name = drw.name;\n }\n\n async serialize(sceneData,writer) {\n await super.serialize(sceneData,writer);\n throw new Error(\"Drawable.serialice() not implemented\");\n }\n\n bindRenderer(renderer) {\n super.bindRenderer(renderer);\n this._items.forEach(item => {\n item.polyListRenderer = renderer.factory.polyList(item.polyList);\n item.materialRenderer = renderer.factory.material(item.material);\n });\n }\n\n draw(renderQueue,modelMatrix) {\n if (this.ready) {\n this._items.forEach(({transform,polyListRenderer,materialRenderer}) => {\n renderQueue.addPolyList(\n polyListRenderer,\n materialRenderer,\n Mat4.Mult(transform, modelMatrix));\n });\n }\n }\n}\n","const BufferType = {\n VERTEX : 1,\n NORMAL : 2,\n TEXCOORD0 : 3,\n TEXCOORD1 : 4,\n TEXCOORD2 : 5,\n INDEX : 10\n};\n\nclass Bg2ioWrapper {\n constructor({ instance, debug = false } = {}) {\n this._instance = instance;\n this._debug = debug;\n }\n\n get instance() {\n return this._instance;\n }\n\n loadBg2File(arrayBuffer) {\n const buffer = new Uint8Array(arrayBuffer);\n const cPtr = this.instance._malloc(buffer.length * buffer.BYTES_PER_ELEMENT);\n this.instance.HEAPU8.set(buffer, cPtr);\n const bg2File = this._instance._loadBg2File(cPtr, buffer.length, this._debug ? 1 : 0);\n return bg2File;\n }\n\n loadBg2FileAsJson(arrayBuffer) {\n const bg2File = this.loadBg2File(arrayBuffer);\n const header = this.getBg2FileHeader(bg2File);\n const components = this.getComponentData(bg2File);\n const materials = this.getMaterialsData(bg2File);\n const joints = this.getJointData(bg2File);\n const polyLists = [];\n for (let i = 0; i < header.numberOfPlist; ++i) {\n polyLists.push(this.getPolyList(bg2File, i));\n }\n this.freeBg2File(bg2File);\n return { header, components, materials, joints, polyLists }\n }\n\n getBg2BufferFromJson(jsonData) {\n const { header, materials, joints, polyLists, components } = jsonData;\n const bg2File = this.instance._createBg2File(this._debug ? 1 : 0);\n let result = null;\n\n if (bg2File) {\n this.instance._setFileHeader(\n bg2File,\n header.endianess,\n header.version.major,\n header.version.minor,\n header.version.revision,\n header.numberOfPlist,\n this._debug ? 1 : 0);\n \n this.instance.ccall(\"setMaterialData\",null,[\"number\",\"string\",\"number\"],[bg2File,JSON.stringify(materials),this._debug ? 1 : 0]);\n this.instance.ccall(\"setComponentData\",null,[\"number\",\"string\",\"number\"],[bg2File,JSON.stringify(components),this._debug ? 1 : 0]);\n this.instance.ccall(\"setJointData\",null,[\"number\",\"string\",\"number\"],[bg2File,JSON.stringify(joints),this._debug ? 1 : 0]);\n \n this.instance.ccall(\"createPolyListArray\",null,[\"number\",\"number\",\"number\"],[bg2File,polyLists.length,this._debug ? 1 : 0]);\n polyLists.forEach((pl,index) => {\n const plist = this.instance.ccall(\"createPolyList\",\"number\",[\"string\",\"string\",\"number\"],[pl.name,pl.matName,this._debug ? 1 : 0]);\n this.instance._addPolyList(bg2File, plist, index, this._debug ? 1 : 0);\n this.addFloatBuffer(plist, pl.vertex, BufferType.VERTEX);\n this.addFloatBuffer(plist, pl.normal, BufferType.NORMAL);\n this.addFloatBuffer(plist, pl.texCoord0, BufferType.TEXCOORD0);\n this.addFloatBuffer(plist, pl.texCoord1, BufferType.TEXCOORD1);\n this.addFloatBuffer(plist, pl.texCoord2, BufferType.TEXCOORD2);\n this.addIndexBuffer(plist, pl.index, BufferType.INDEX);\n });\n\n /* buffer =>\n typedef struct BufferWrapperT {\n int length;\n Bg2ioBytePtr buffer; // (unsigned char *)\n } BufferWrapper;\n */\n const bufferPtr = this.instance._createBufferWithBg2File(bg2File, this._debug ? 1 : 0);\n if (bufferPtr) {\n const length = new Int32Array(this.instance.HEAPU8.buffer, bufferPtr, 1)[0];\n const dataPtr = new Uint32Array(this.instance.HEAPU8.buffer, bufferPtr + 4, 1)[0];\n const resultView = new Uint8Array(this.instance.HEAPU8.buffer, dataPtr, length);\n result = resultView.slice();\n this.instance._freeBufferWrapper(bufferPtr, this._debug ? 1 : 0);\n }\n\n this.instance._freeBg2File(bg2File, this._debug ? 1 : 0);\n }\n return result;\n }\n\n getBg2FileHeader(file) {\n const headerPtr = this._instance._getBg2FileHeader(file, this._debug ? 1 : 0);\n const charData = new Uint8Array(this.instance.HEAPU8.buffer, headerPtr, 4);\n const numberOfPlist = new Int32Array(this.instance.HEAP32.buffer, headerPtr + 4, 1)[0];\n return {\n endianess: charData[0],\n version: {\n major: charData[1],\n minor: charData[2],\n revision: charData[3]\n },\n numberOfPlist\n }\n }\n\n getMaterialsData(file) {\n const materialStringPtr = this._instance._getMaterialStringRef(file, this._debug ? 1 : 0);\n if (materialStringPtr) {\n const materialString = this.getStringRef(materialStringPtr);\n return JSON.parse(materialString);\n }\n else {\n return {}\n }\n }\n\n getComponentData(file) {\n const componentStringPtr = this._instance._getComponentStringRef(file, this._debug ? 1 : 0);\n if (componentStringPtr) {\n const componentStringRef = this.getStringRef(componentStringPtr);\n return JSON.parse(componentStringRef);\n }\n else {\n return {}\n }\n }\n\n getJointData(file) {\n \n const jointStringPtr = this._instance._getJointStringRef(file, this._debug ? 1 : 0);\n if (jointStringPtr) {\n const jointStringRef = this.getStringRef(jointStringPtr);\n return JSON.parse(jointStringRef);\n }\n else {\n return {}\n }\n }\n\n getPolyList(file,index) {\n const plistPtr = this._instance._getPolyList(file, index, this._debug ? 1 : 0);\n if (plistPtr) {\n /*\n typedef struct Bg2ioFloatArrayT {\n int length; 4 bytes\n float * data; 4 bytes\n } Bg2ioFloatArray;\n\n typedef struct Bg2ioIntArrayT {\n int length; 4 bytes\n int * data; 4 bytes\n } Bg2ioIntArray;\n\n typedef struct Bg2ioPolyListT {\n char * name; 4 bytes\n char * matName; 4 bytes\n char * groupName; 4 bytes\n int visible; 4 bytes\n Bg2ioFloatArray vertex; 8 bytes\n Bg2ioFloatArray normal; 8 bytes\n Bg2ioFloatArray texCoord0; 8 bytes\n Bg2ioFloatArray texCoord1; 8 bytes\n Bg2ioFloatArray texCoord2; 8 bytes\n Bg2ioIntArray index; 8 bytes\n } Bg2ioPolyList; total: 64 bytes (16 elements)\n */\n const structData = new Int32Array(this.instance.HEAPU8.buffer, plistPtr, 16);\n const namePtr = structData[0];\n const matNamePtr = structData[1];\n const groupNamePtr = structData[2];\n const visible = structData[3];\n const vertexCount = structData[4];\n const vertexPtr = structData[5];\n const normalCount = structData[6];\n const normalPtr = structData[7];\n const texCoord0Count = structData[8];\n const texCoord0Ptr = structData[9];\n const texCoord1Count = structData[10];\n const texCoord1Ptr = structData[11];\n const texCoord2Count = structData[12];\n const texCoord2Ptr = structData[13];\n const indexCount = structData[14];\n const indexPtr = structData[15];\n\n const result = {\n name: this.getStringFromCStr(namePtr),\n matName: this.getStringFromCStr(matNamePtr),\n groupName: this.getStringFromCStr(groupNamePtr),\n visible: visible === 1,\n vertex: this.getFloatArray(vertexPtr, vertexCount),\n normal: this.getFloatArray(normalPtr, normalCount),\n texCoord0: this.getFloatArray(texCoord0Ptr, texCoord0Count),\n texCoord1: this.getFloatArray(texCoord1Ptr, texCoord1Count),\n texCoord2: this.getFloatArray(texCoord2Ptr, texCoord2Count),\n index: this.getIntArray(indexPtr, indexCount)\n };\n\n return result;\n }\n else {\n return null;\n }\n }\n\n getFloatArray(ptr,count) {\n if (ptr) {\n const data = new Float32Array(this.instance.HEAPU8.buffer, ptr, count);\n return Array.from(data);\n }\n else {\n return [];\n }\n }\n\n getIntArray(ptr,count) {\n if (ptr) {\n const data = new Int32Array(this.instance.HEAPU8.buffer, ptr, count);\n return Array.from(data);\n }\n else {\n return []\n }\n }\n\n // Get a JS string from a c string\n getStringFromCStr(ptr) {\n if (!ptr) {\n return \"\";\n }\n\n const structPtr = this._instance._getStringStructRefFromCStr(ptr, this._debug ? 1 : 0);\n return this.getStringRef(structPtr);\n }\n\n freeBg2File(file) {\n this._instance._freeBg2File(file, this._debug ? 1 : 0);\n }\n \n getString(structPtr) {\n const strSize = new Int32Array(this.instance.HEAPU8.buffer, structPtr, 1)[0];\n const strPtr = new Int32Array(this.instance.HEAPU8.buffer, structPtr + 4)[0];\n const strData = new Uint8Array(this.instance.HEAPU8.buffer, strPtr, strSize);\n const str = new TextDecoder().decode(strData);\n this.instance._freeString(structPtr, this._debug ? 1 : 0);\n return str;\n }\n\n getStringRef(structPtr) {\n const strSize = new Int32Array(this.instance.HEAPU8.buffer, structPtr, 1)[0];\n const strPtr = new Int32Array(this.instance.HEAPU8.buffer, structPtr + 4)[0];\n const strData = new Uint8Array(this.instance.HEAPU8.buffer, strPtr, strSize);\n const str = new TextDecoder().decode(strData);\n this.instance._freeStringRef(structPtr, this._debug ? 1 : 0);\n return str;\n }\n\n addFloatBuffer(plist,bufferArray,destBuffer) {\n if (bufferArray && bufferArray.length > 0) {\n const jsTypedArray = new Float32Array(bufferArray);\n const jsToCPtr = this.instance._malloc(jsTypedArray.length * jsTypedArray.BYTES_PER_ELEMENT);\n this.instance.HEAPF32.set(jsTypedArray, jsToCPtr / 4);\n this.instance._addFloatBuffer(plist, jsToCPtr, bufferArray.length, destBuffer, this._debug ? 1 : 0);\n }\n }\n\n addIndexBuffer(plist,indexArray) {\n if (indexArray && indexArray.length>0) {\n const jsTypedArray = new Int32Array(indexArray);\n const jsToCPtr = this.instance._malloc(jsTypedArray.length * jsTypedArray.BYTES_PER_ELEMENT);\n this.instance.HEAP32.set(jsTypedArray, jsToCPtr / 4);\n this.instance._addIndexBuffer(plist, jsToCPtr, indexArray.length, this._debug ? 1 : 0);\n }\n }\n}\n\nlet g_bg2ioModuleLoadingPromise = null;\nconst loadBg2ioModule = (path) => {\n if (!g_bg2ioModuleLoadingPromise) {\n g_bg2ioModuleLoadingPromise = new Promise((resolve) => {\n const script = document.createElement('script');\n script.type = 'text/javascript';\n script.src = path;\n let loaded = false;\n script.onload = script.onreadystatechange = () => {\n if (!loaded) {\n loaded = true;\n resolve();\n }\n };\n document.head.appendChild(script);\n });\n }\n return g_bg2ioModuleLoadingPromise;\n};\n\nvar Bg2ioBrowser = async ({ debug = false, wasmPath = '' } = {}) => {\n if (wasmPath !== \"\" && !/\\/$/.test(wasmPath)) {\n wasmPath += '/';\n }\n await loadBg2ioModule(wasmPath + 'bg2io.js');\n const instance = await Bg2ioModule();\n return new Bg2ioWrapper({ instance, debug });\n};\n\nexport { Bg2ioBrowser as default };\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmcyaW9Ccm93c2VyLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvd2FzbS9zcmMvanMvQmcyaW9XcmFwcGVyLm1qcyIsIi4uLy4uLy4uL3NyYy93YXNtL3NyYy9qcy9CZzJpb0Jyb3dzZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXG5cbmV4cG9ydCBjb25zdCBCdWZmZXJUeXBlID0ge1xuICAgIFZFUlRFWCAgICAgIDogMSxcbiAgICBOT1JNQUwgICAgICA6IDIsXG4gICAgVEVYQ09PUkQwICAgOiAzLFxuICAgIFRFWENPT1JEMSAgIDogNCxcbiAgICBURVhDT09SRDIgICA6IDUsXG4gICAgSU5ERVggICAgICAgOiAxMFxufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmcyaW9XcmFwcGVyIHtcbiAgICBjb25zdHJ1Y3Rvcih7IGluc3RhbmNlLCBkZWJ1ZyA9IGZhbHNlIH0gPSB7fSkge1xuICAgICAgICB0aGlzLl9pbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgICAgICB0aGlzLl9kZWJ1ZyA9IGRlYnVnO1xuICAgIH1cblxuICAgIGdldCBpbnN0YW5jZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlO1xuICAgIH1cblxuICAgIGxvYWRCZzJGaWxlKGFycmF5QnVmZmVyKSB7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKTtcbiAgICAgICAgY29uc3QgY1B0ciA9IHRoaXMuaW5zdGFuY2UuX21hbGxvYyhidWZmZXIubGVuZ3RoICogYnVmZmVyLkJZVEVTX1BFUl9FTEVNRU5UKTtcbiAgICAgICAgdGhpcy5pbnN0YW5jZS5IRUFQVTguc2V0KGJ1ZmZlciwgY1B0cik7XG4gICAgICAgIGNvbnN0IGJnMkZpbGUgPSB0aGlzLl9pbnN0YW5jZS5fbG9hZEJnMkZpbGUoY1B0ciwgYnVmZmVyLmxlbmd0aCwgdGhpcy5fZGVidWcgPyAxIDogMCk7XG4gICAgICAgIHJldHVybiBiZzJGaWxlO1xuICAgIH1cblxuICAgIGxvYWRCZzJGaWxlQXNKc29uKGFycmF5QnVmZmVyKSB7XG4gICAgICAgIGNvbnN0IGJnMkZpbGUgPSB0aGlzLmxvYWRCZzJGaWxlKGFycmF5QnVmZmVyKTtcbiAgICAgICAgY29uc3QgaGVhZGVyID0gdGhpcy5nZXRCZzJGaWxlSGVhZGVyKGJnMkZpbGUpO1xuICAgICAgICBjb25zdCBjb21wb25lbnRzID0gdGhpcy5nZXRDb21wb25lbnREYXRhKGJnMkZpbGUpO1xuICAgICAgICBjb25zdCBtYXRlcmlhbHMgPSB0aGlzLmdldE1hdGVyaWFsc0RhdGEoYmcyRmlsZSk7XG4gICAgICAgIGNvbnN0IGpvaW50cyA9IHRoaXMuZ2V0Sm9pbnREYXRhKGJnMkZpbGUpO1xuICAgICAgICBjb25zdCBwb2x5TGlzdHMgPSBbXVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlYWRlci5udW1iZXJPZlBsaXN0OyArK2kpIHtcbiAgICAgICAgICAgIHBvbHlMaXN0cy5wdXNoKHRoaXMuZ2V0UG9seUxpc3QoYmcyRmlsZSwgaSkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZnJlZUJnMkZpbGUoYmcyRmlsZSk7XG4gICAgICAgIHJldHVybiB7IGhlYWRlciwgY29tcG9uZW50cywgbWF0ZXJpYWxzLCBqb2ludHMsIHBvbHlMaXN0cyB9XG4gICAgfVxuXG4gICAgZ2V0QmcyQnVmZmVyRnJvbUpzb24oanNvbkRhdGEpIHtcbiAgICAgICAgY29uc3QgeyBoZWFkZXIsIG1hdGVyaWFscywgam9pbnRzLCBwb2x5TGlzdHMsIGNvbXBvbmVudHMgIH0gPSBqc29uRGF0YTtcbiAgICAgICAgY29uc3QgYmcyRmlsZSA9IHRoaXMuaW5zdGFuY2UuX2NyZWF0ZUJnMkZpbGUodGhpcy5fZGVidWcgPyAxIDogMCk7XG4gICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xuXG4gICAgICAgIGlmIChiZzJGaWxlKSB7XG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlLl9zZXRGaWxlSGVhZGVyKFxuICAgICAgICAgICAgICAgIGJnMkZpbGUsXG4gICAgICAgICAgICAgICAgaGVhZGVyLmVuZGlhbmVzcyxcbiAgICAgICAgICAgICAgICBoZWFkZXIudmVyc2lvbi5tYWpvcixcbiAgICAgICAgICAgICAgICBoZWFkZXIudmVyc2lvbi5taW5vcixcbiAgICAgICAgICAgICAgICBoZWFkZXIudmVyc2lvbi5yZXZpc2lvbixcbiAgICAgICAgICAgICAgICBoZWFkZXIubnVtYmVyT2ZQbGlzdCxcbiAgICAgICAgICAgICAgICB0aGlzLl9kZWJ1ZyA/IDEgOiAwKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZS5jY2FsbChcInNldE1hdGVyaWFsRGF0YVwiLG51bGwsW1wibnVtYmVyXCIsXCJzdHJpbmdcIixcIm51bWJlclwiXSxbYmcyRmlsZSxKU09OLnN0cmluZ2lmeShtYXRlcmlhbHMpLHRoaXMuX2RlYnVnID8gMSA6IDBdKTtcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UuY2NhbGwoXCJzZXRDb21wb25lbnREYXRhXCIsbnVsbCxbXCJudW1iZXJcIixcInN0cmluZ1wiLFwibnVtYmVyXCJdLFtiZzJGaWxlLEpTT04uc3RyaW5naWZ5KGNvbXBvbmVudHMpLHRoaXMuX2RlYnVnID8gMSA6IDBdKTtcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UuY2NhbGwoXCJzZXRKb2ludERhdGFcIixudWxsLFtcIm51bWJlclwiLFwic3RyaW5nXCIsXCJudW1iZXJcIl0sW2JnMkZpbGUsSlNPTi5zdHJpbmdpZnkoam9pbnRzKSx0aGlzLl9kZWJ1ZyA/IDEgOiAwXSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UuY2NhbGwoXCJjcmVhdGVQb2x5TGlzdEFycmF5XCIsbnVsbCxbXCJudW1iZXJcIixcIm51bWJlclwiLFwibnVtYmVyXCJdLFtiZzJGaWxlLHBvbHlMaXN0cy5sZW5ndGgsdGhpcy5fZGVidWcgPyAxIDogMF0pO1xuICAgICAgICAgICAgcG9seUxpc3RzLmZvckVhY2goKHBsLGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGxpc3QgPSB0aGlzLmluc3RhbmNlLmNjYWxsKFwiY3JlYXRlUG9seUxpc3RcIixcIm51bWJlclwiLFtcInN0cmluZ1wiLFwic3RyaW5nXCIsXCJudW1iZXJcIl0sW3BsLm5hbWUscGwubWF0TmFtZSx0aGlzLl9kZWJ1ZyA/IDEgOiAwXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnN0YW5jZS5fYWRkUG9seUxpc3QoYmcyRmlsZSwgcGxpc3QsIGluZGV4LCB0aGlzLl9kZWJ1ZyA/IDEgOiAwKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEZsb2F0QnVmZmVyKHBsaXN0LCBwbC52ZXJ0ZXgsIEJ1ZmZlclR5cGUuVkVSVEVYKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEZsb2F0QnVmZmVyKHBsaXN0LCBwbC5ub3JtYWwsIEJ1ZmZlclR5cGUuTk9STUFMKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEZsb2F0QnVmZmVyKHBsaXN0LCBwbC50ZXhDb29yZDAsIEJ1ZmZlclR5cGUuVEVYQ09PUkQwKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEZsb2F0QnVmZmVyKHBsaXN0LCBwbC50ZXhDb29yZDEsIEJ1ZmZlclR5cGUuVEVYQ09PUkQxKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEZsb2F0QnVmZmVyKHBsaXN0LCBwbC50ZXhDb29yZDIsIEJ1ZmZlclR5cGUuVEVYQ09PUkQyKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEluZGV4QnVmZmVyKHBsaXN0LCBwbC5pbmRleCwgQnVmZmVyVHlwZS5JTkRFWCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLyogYnVmZmVyID0+XG4gICAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgQnVmZmVyV3JhcHBlclQge1xuICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBCZzJpb0J5dGVQdHIgYnVmZmVyOyAvLyAodW5zaWduZWQgY2hhciAqKVxuICAgICAgICAgICAgICAgIH0gQnVmZmVyV3JhcHBlcjtcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgY29uc3QgYnVmZmVyUHRyID0gdGhpcy5pbnN0YW5jZS5fY3JlYXRlQnVmZmVyV2l0aEJnMkZpbGUoYmcyRmlsZSwgdGhpcy5fZGVidWcgPyAxIDogMCk7XG4gICAgICAgICAgICBpZiAoYnVmZmVyUHRyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gbmV3IEludDMyQXJyYXkodGhpcy5pbnN0YW5jZS5IRUFQVTguYnVmZmVyLCBidWZmZXJQdHIsIDEpWzBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFQdHIgPSBuZXcgVWludDMyQXJyYXkodGhpcy5pbnN0YW5jZS5IRUFQVTguYnVmZmVyLCBidWZmZXJQdHIgKyA0LCAxKVswXTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRWaWV3ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5pbnN0YW5jZS5IRUFQVTguYnVmZmVyLCBkYXRhUHRyLCBsZW5ndGgpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdFZpZXcuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluc3RhbmNlLl9mcmVlQnVmZmVyV3JhcHBlcihidWZmZXJQdHIsIHRoaXMuX2RlYnVnID8gMSA6IDApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlLl9mcmVlQmcyRmlsZShiZzJGaWxlLCB0aGlzLl9kZWJ1ZyA/IDEgOiAwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGdldEJnMkZpbGVIZWFkZXIoZmlsZSkge1xuICAgICAgICBjb25zdCBoZWFkZXJQdHIgPSB0aGlzLl9pbnN0YW5jZS5fZ2V0QmcyRmlsZUhlYWRlcihmaWxlLCB0aGlzLl9kZWJ1ZyA/IDEgOiAwKTtcbiAgICAgICAgY29uc3QgY2hhckRhdGEgPSBuZXcgVWludDhBcnJheSh0aGlzLmluc3RhbmNlLkhFQVBVOC5idWZmZXIsIGhlYWRlclB0ciwgNCk7XG4gICAgICAgIGNvbnN0IG51bWJlck9mUGxpc3QgPSBuZXcgSW50MzJBcnJheSh0aGlzLmluc3RhbmNlLkhFQVAzMi5idWZmZXIsIGhlYWRlclB0ciArIDQsIDEpWzBdO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZW5kaWFuZXNzOiBjaGFyRGF0YVswXSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBtYWpvcjogY2hhckRhdGFbMV0sXG4gICAgICAgICAgICAgICAgbWlub3I6IGNoYXJEYXRhWzJdLFxuICAgICAgICAgICAgICAgIHJldmlzaW9uOiBjaGFyRGF0YVszXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG51bWJlck9mUGxpc3RcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldE1hdGVyaWFsc0RhdGEoZmlsZSkge1xuICAgICAgICBjb25zdCBtYXRlcmlhbFN0cmluZ1B0ciA9IHRoaXMuX2luc3RhbmNlLl9nZXRNYXRlcmlhbFN0cmluZ1JlZihmaWxlLCB0aGlzLl9kZWJ1ZyA/IDEgOiAwKTtcbiAgICAgICAgaWYgKG1hdGVyaWFsU3RyaW5nUHRyKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRlcmlhbFN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nUmVmKG1hdGVyaWFsU3RyaW5nUHRyKTtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKG1hdGVyaWFsU3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7fVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0Q29tcG9uZW50RGF0YShmaWxlKSB7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudFN0cmluZ1B0ciA9IHRoaXMuX2luc3RhbmNlLl9nZXRDb21wb25lbnRTdHJpbmdSZWYoZmlsZSwgdGhpcy5fZGVidWcgPyAxIDogMCk7XG4gICAgICAgIGlmIChjb21wb25lbnRTdHJpbmdQdHIpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFN0cmluZ1JlZiA9IHRoaXMuZ2V0U3RyaW5nUmVmKGNvbXBvbmVudFN0cmluZ1B0cik7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShjb21wb25lbnRTdHJpbmdSZWYpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHt9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRKb2ludERhdGEoZmlsZSkge1xuICAgICAgICBcbiAgICAgICAgY29uc3Qgam9pbnRTdHJpbmdQdHIgPSB0aGlzLl9pbnN0YW5jZS5fZ2V0Sm9pbnRTdHJpbmdSZWYoZmlsZSwgdGhpcy5fZGVidWcgPyAxIDogMCk7XG4gICAgICAgIGlmIChqb2ludFN0cmluZ1B0cikge1xuICAgICAgICAgICAgY29uc3Qgam9pbnRTdHJpbmdSZWYgPSB0aGlzLmdldFN0cmluZ1JlZihqb2ludFN0cmluZ1B0cik7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShqb2ludFN0cmluZ1JlZik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ge31cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFBvbHlMaXN0KGZpbGUsaW5kZXgpIHtcbiAgICAgICAgY29uc3QgcGxpc3RQdHIgPSB0aGlzLl9pbnN0YW5jZS5fZ2V0UG9seUxpc3QoZmlsZSwgaW5kZXgsIHRoaXMuX2RlYnVnID8gMSA6IDApO1xuICAgICAgICBpZiAocGxpc3RQdHIpIHtcbiAgICAgICAgICAgIC8qXG4gICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCBCZzJpb0Zsb2F0QXJyYXlUIHtcbiAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoOyAgICAgICAgIDQgYnl0ZXNcbiAgICAgICAgICAgICAgICBmbG9hdCAqIGRhdGE7ICAgICAgIDQgYnl0ZXNcbiAgICAgICAgICAgIH0gQmcyaW9GbG9hdEFycmF5O1xuXG4gICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCBCZzJpb0ludEFycmF5VCB7XG4gICAgICAgICAgICAgICAgaW50IGxlbmd0aDsgICAgICAgICA0IGJ5dGVzXG4gICAgICAgICAgICAgICAgaW50ICogZGF0YTsgICAgICAgICA0IGJ5dGVzXG4gICAgICAgICAgICB9IEJnMmlvSW50QXJyYXk7XG5cbiAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0IEJnMmlvUG9seUxpc3RUIHtcbiAgICAgICAgICAgICAgICBjaGFyICogbmFtZTsgICAgICAgICAgICAgICAgICAgIDQgYnl0ZXNcbiAgICAgICAgICAgICAgICBjaGFyICogbWF0TmFtZTsgICAgICAgICAgICAgICAgIDQgYnl0ZXNcbiAgICAgICAgICAgICAgICBjaGFyICogZ3JvdXBOYW1lOyAgICAgICAgICAgICAgIDQgYnl0ZXNcbiAgICAgICAgICAgICAgICBpbnQgdmlzaWJsZTsgICAgICAgICAgICAgICAgICAgIDQgYnl0ZXNcbiAgICAgICAgICAgICAgICBCZzJpb0Zsb2F0QXJyYXkgdmVydGV4OyAgICAgICAgIDggYnl0ZXNcbiAgICAgICAgICAgICAgICBCZzJpb0Zsb2F0QXJyYXkgbm9ybWFsOyAgICAgICAgIDggYnl0ZXNcbiAgICAgICAgICAgICAgICBCZzJpb0Zsb2F0QXJyYXkgdGV4Q29vcmQwOyAgICAgIDggYnl0ZXNcbiAgICAgICAgICAgICAgICBCZzJpb0Zsb2F0QXJyYXkgdGV4Q29vcmQxOyAgICAgIDggYnl0ZXNcbiAgICAgICAgICAgICAgICBCZzJpb0Zsb2F0QXJyYXkgdGV4Q29vcmQyOyAgICAgIDggYnl0ZXNcbiAgICAgICAgICAgICAgICBCZzJpb0ludEFycmF5IGluZGV4OyAgICAgICAgICAgIDggYnl0ZXNcbiAgICAgICAgICAgIH0gQmcyaW9Qb2x5TGlzdDsgICAgICAgICAgICB0b3RhbDogNjQgYnl0ZXMgKDE2IGVsZW1lbnRzKVxuICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0IHN0cnVjdERhdGEgPSBuZXcgSW50MzJBcnJheSh0aGlzLmluc3RhbmNlLkhFQVBVOC5idWZmZXIsIHBsaXN0UHRyLCAxNik7XG4gICAgICAgICAgICBjb25zdCBuYW1lUHRyID0gc3RydWN0RGF0YVswXTtcbiAgICAgICAgICAgIGNvbnN0IG1hdE5hbWVQdHIgPSBzdHJ1Y3REYXRhWzFdO1xuICAgICAgICAgICAgY29uc3QgZ3JvdXBOYW1lUHRyID0gc3RydWN0RGF0YVsyXTtcbiAgICAgICAgICAgIGNvbnN0IHZpc2libGUgPSBzdHJ1Y3REYXRhWzNdO1xuICAgICAgICAgICAgY29uc3QgdmVydGV4Q291bnQgPSBzdHJ1Y3REYXRhWzRdO1xuICAgICAgICAgICAgY29uc3QgdmVydGV4UHRyID0gc3RydWN0RGF0YVs1XTtcbiAgICAgICAgICAgIGNvbnN0IG5vcm1hbENvdW50ID0gc3RydWN0RGF0YVs2XTtcbiAgICAgICAgICAgIGNvbnN0IG5vcm1hbFB0ciA9IHN0cnVjdERhdGFbN107XG4gICAgICAgICAgICBjb25zdCB0ZXhDb29yZDBDb3VudCA9IHN0cnVjdERhdGFbOF07XG4gICAgICAgICAgICBjb25zdCB0ZXhDb29yZDBQdHIgPSBzdHJ1Y3REYXRhWzldO1xuICAgICAgICAgICAgY29uc3QgdGV4Q29vcmQxQ291bnQgPSBzdHJ1Y3REYXRhWzEwXTtcbiAgICAgICAgICAgIGNvbnN0IHRleENvb3JkMVB0ciA9IHN0cnVjdERhdGFbMTFdO1xuICAgICAgICAgICAgY29uc3QgdGV4Q29vcmQyQ291bnQgPSBzdHJ1Y3REYXRhWzEyXTtcbiAgICAgICAgICAgIGNvbnN0IHRleENvb3JkMlB0ciA9IHN0cnVjdERhdGFbMTNdO1xuICAgICAgICAgICAgY29uc3QgaW5kZXhDb3VudCA9IHN0cnVjdERhdGFbMTRdO1xuICAgICAgICAgICAgY29uc3QgaW5kZXhQdHIgPSBzdHJ1Y3REYXRhWzE1XTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMuZ2V0U3RyaW5nRnJvbUNTdHIobmFtZVB0ciksXG4gICAgICAgICAgICAgICAgbWF0TmFtZTogdGhpcy5nZXRTdHJpbmdGcm9tQ1N0cihtYXROYW1lUHRyKSxcbiAgICAgICAgICAgICAgICBncm91cE5hbWU6IHRoaXMuZ2V0U3RyaW5nRnJvbUNTdHIoZ3JvdXBOYW1lUHRyKSxcbiAgICAgICAgICAgICAgICB2aXNpYmxlOiB2aXNpYmxlID09PSAxLFxuICAgICAgICAgICAgICAgIHZlcnRleDogdGhpcy5nZXRGbG9hdEFycmF5KHZlcnRleFB0ciwgdmVydGV4Q291bnQpLFxuICAgICAgICAgICAgICAgIG5vcm1hbDogdGhpcy5nZXRGbG9hdEFycmF5KG5vcm1hbFB0ciwgbm9ybWFsQ291bnQpLFxuICAgICAgICAgICAgICAgIHRleENvb3JkMDogdGhpcy5nZXRGbG9hdEFycmF5KHRleENvb3JkMFB0ciwgdGV4Q29vcmQwQ291bnQpLFxuICAgICAgICAgICAgICAgIHRleENvb3JkMTogdGhpcy5nZXRGbG9hdEFycmF5KHRleENvb3JkMVB0ciwgdGV4Q29vcmQxQ291bnQpLFxuICAgICAgICAgICAgICAgIHRleENvb3JkMjogdGhpcy5nZXRGbG9hdEFycmF5KHRleENvb3JkMlB0ciwgdGV4Q29vcmQyQ291bnQpLFxuICAgICAgICAgICAgICAgIGluZGV4OiB0aGlzLmdldEludEFycmF5KGluZGV4UHRyLCBpbmRleENvdW50KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRGbG9hdEFycmF5KHB0cixjb3VudCkge1xuICAgICAgICBpZiAocHRyKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLmluc3RhbmNlLkhFQVBVOC5idWZmZXIsIHB0ciwgY291bnQpO1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRJbnRBcnJheShwdHIsY291bnQpIHtcbiAgICAgICAgaWYgKHB0cikge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KHRoaXMuaW5zdGFuY2UuSEVBUFU4LmJ1ZmZlciwgcHRyLCBjb3VudCk7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBbXVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2V0IGEgSlMgc3RyaW5nIGZyb20gYSBjIHN0cmluZ1xuICAgIGdldFN0cmluZ0Zyb21DU3RyKHB0cikge1xuICAgICAgICBpZiAoIXB0cikge1xuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdHJ1Y3RQdHIgPSB0aGlzLl9pbnN0YW5jZS5fZ2V0U3RyaW5nU3RydWN0UmVmRnJvbUNTdHIocHRyLCB0aGlzLl9kZWJ1ZyA/IDEgOiAwKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nUmVmKHN0cnVjdFB0cik7XG4gICAgfVxuXG4gICAgZnJlZUJnMkZpbGUoZmlsZSkge1xuICAgICAgICB0aGlzLl9pbnN0YW5jZS5fZnJlZUJnMkZpbGUoZmlsZSwgdGhpcy5fZGVidWcgPyAxIDogMCk7XG4gICAgfVxuICAgIFxuICAgIGdldFN0cmluZyhzdHJ1Y3RQdHIpIHtcbiAgICAgICAgY29uc3Qgc3RyU2l6ZSA9IG5ldyBJbnQzMkFycmF5KHRoaXMuaW5zdGFuY2UuSEVBUFU4LmJ1ZmZlciwgc3RydWN0UHRyLCAxKVswXTtcbiAgICAgICAgY29uc3Qgc3RyUHRyID0gbmV3IEludDMyQXJyYXkodGhpcy5pbnN0YW5jZS5IRUFQVTguYnVmZmVyLCBzdHJ1Y3RQdHIgKyA0KVswXTtcbiAgICAgICAgY29uc3Qgc3RyRGF0YSA9IG5ldyBVaW50OEFycmF5KHRoaXMuaW5zdGFuY2UuSEVBUFU4LmJ1ZmZlciwgc3RyUHRyLCBzdHJTaXplKTtcbiAgICAgICAgY29uc3Qgc3RyID0gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKHN0ckRhdGEpO1xuICAgICAgICB0aGlzLmluc3RhbmNlLl9mcmVlU3RyaW5nKHN0cnVjdFB0ciwgdGhpcy5fZGVidWcgPyAxIDogMCk7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgZ2V0U3RyaW5nUmVmKHN0cnVjdFB0cikge1xuICAgICAgICBjb25zdCBzdHJTaXplID0gbmV3IEludDMyQXJyYXkodGhpcy5pbnN0YW5jZS5IRUFQVTguYnVmZmVyLCBzdHJ1Y3RQdHIsIDEpWzBdO1xuICAgICAgICBjb25zdCBzdHJQdHIgPSBuZXcgSW50MzJBcnJheSh0aGlzLmluc3RhbmNlLkhFQVBVOC5idWZmZXIsIHN0cnVjdFB0ciArIDQpWzBdO1xuICAgICAgICBjb25zdCBzdHJEYXRhID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5pbnN0YW5jZS5IRUFQVTguYnVmZmVyLCBzdHJQdHIsIHN0clNpemUpO1xuICAgICAgICBjb25zdCBzdHIgPSBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoc3RyRGF0YSk7XG4gICAgICAgIHRoaXMuaW5zdGFuY2UuX2ZyZWVTdHJpbmdSZWYoc3RydWN0UHRyLCB0aGlzLl9kZWJ1ZyA/IDEgOiAwKTtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG5cbiAgICBhZGRGbG9hdEJ1ZmZlcihwbGlzdCxidWZmZXJBcnJheSxkZXN0QnVmZmVyKSB7XG4gICAgICAgIGlmIChidWZmZXJBcnJheSAmJiBidWZmZXJBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBqc1R5cGVkQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KGJ1ZmZlckFycmF5KTtcbiAgICAgICAgICAgIGNvbnN0IGpzVG9DUHRyID0gdGhpcy5pbnN0YW5jZS5fbWFsbG9jKGpzVHlwZWRBcnJheS5sZW5ndGggKiBqc1R5cGVkQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpO1xuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZS5IRUFQRjMyLnNldChqc1R5cGVkQXJyYXksIGpzVG9DUHRyIC8gNCk7XG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlLl9hZGRGbG9hdEJ1ZmZlcihwbGlzdCwganNUb0NQdHIsIGJ1ZmZlckFycmF5Lmxlbmd0aCwgZGVzdEJ1ZmZlciwgdGhpcy5fZGVidWcgPyAxIDogMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRJbmRleEJ1ZmZlcihwbGlzdCxpbmRleEFycmF5KSB7XG4gICAgICAgIGlmIChpbmRleEFycmF5ICYmIGluZGV4QXJyYXkubGVuZ3RoPjApIHtcbiAgICAgICAgICAgIGNvbnN0IGpzVHlwZWRBcnJheSA9IG5ldyBJbnQzMkFycmF5KGluZGV4QXJyYXkpO1xuICAgICAgICAgICAgY29uc3QganNUb0NQdHIgPSB0aGlzLmluc3RhbmNlLl9tYWxsb2MoanNUeXBlZEFycmF5Lmxlbmd0aCAqIGpzVHlwZWRBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7XG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlLkhFQVAzMi5zZXQoanNUeXBlZEFycmF5LCBqc1RvQ1B0ciAvIDQpO1xuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZS5fYWRkSW5kZXhCdWZmZXIocGxpc3QsIGpzVG9DUHRyLCBpbmRleEFycmF5Lmxlbmd0aCwgdGhpcy5fZGVidWcgPyAxIDogMCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgQmcyaW9XcmFwcGVyIGZyb20gJy4vQmcyaW9XcmFwcGVyJztcblxubGV0IGdfYmcyaW9Nb2R1bGVMb2FkaW5nUHJvbWlzZSA9IG51bGw7XG5jb25zdCBsb2FkQmcyaW9Nb2R1bGUgPSAocGF0aCkgPT4ge1xuICAgIGlmICghZ19iZzJpb01vZHVsZUxvYWRpbmdQcm9taXNlKSB7XG4gICAgICAgIGdfYmcyaW9Nb2R1bGVMb2FkaW5nUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgICAgICAgIHNjcmlwdC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7XG4gICAgICAgICAgICBzY3JpcHQuc3JjID0gcGF0aDtcbiAgICAgICAgICAgIGxldCBsb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHNjcmlwdC5vbmxvYWQgPSBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghbG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZ19iZzJpb01vZHVsZUxvYWRpbmdQcm9taXNlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBhc3luYyAoeyBkZWJ1ZyA9IGZhbHNlLCB3YXNtUGF0aCA9ICcnIH0gPSB7fSkgPT4ge1xuICAgIGlmICh3YXNtUGF0aCAhPT0gXCJcIiAmJiAhL1xcLyQvLnRlc3Qod2FzbVBhdGgpKSB7XG4gICAgICAgIHdhc21QYXRoICs9ICcvJztcbiAgICB9XG4gICAgYXdhaXQgbG9hZEJnMmlvTW9kdWxlKHdhc21QYXRoICsgJ2JnMmlvLmpzJyk7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBhd2FpdCBCZzJpb01vZHVsZSgpO1xuICAgIHJldHVybiBuZXcgQmcyaW9XcmFwcGVyKHsgaW5zdGFuY2UsIGRlYnVnIH0pO1xufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3Mi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\n","import LoaderPlugin from \"./LoaderPlugin\";\nimport { ResourceType, getFileName, removeExtension, removeFileName } from \"./../tools/Resource\";\nimport Resource from \"../tools/Resource\";\nimport PolyList from \"../base/PolyList\";\nimport Drawable from \"../scene/Drawable\";\nimport Node from \"../scene/Node\";\nimport Material from \"../base/Material\";\nimport { deserializeComponent } from \"../scene/Component\";\n\nimport Bg2ioWrapper from 'bg2io/Bg2ioBrowser';\n\nlet g_bg2Wrapper = null;\n\nconst bg2ioFactory = async (path) => {\n if (g_bg2Wrapper === null) {\n const params = path ? { wasmPath: path } : {};\n g_bg2Wrapper = await Bg2ioWrapper(params);\n }\n return g_bg2Wrapper;\n}\n\nconst createPolyList = (jsonData,loader) => {\n const result = jsonData.polyLists.map(plData => {\n const plist = new PolyList();\n const materialData = jsonData.materials.find(m => m.name === plData.matName);\n plist.name = plData.name\n plist.visible = plData.visible;\n if (materialData) {\n plist.groupName = materialData.groupName || \"\";\n plist.enableCullFace = materialData.cullFace;\n }\n plist.vertex = plData.vertex;\n plist.normal = plData.normal;\n plist.texCoord0 = plData.texCoord0\n plist.texCoord1 = plData.texCoord1\n plist.texCoord2 = plData.texCoord2\n plist.index = plData.index;\n return { plist, materialData };\n });\n\n return result;\n}\n\nconst createDrawable = async (jsonData,filePath,loader) => {\n const name = removeExtension(getFileName(filePath));\n const relativePath = removeFileName(filePath);\n const drawable = new Drawable(name);\n for (const item of createPolyList(jsonData)) {\n const mat = new Material(loader.canvas);\n await mat.deserialize(item.materialData, relativePath);\n drawable.addPolyList(item.plist, mat);\n }\n //createPolyList(jsonData).forEach(item => {\n // const mat = new Material();\n // mat.deserialize(item.materialData, relativePath);\n // drawable.addPolyList(item.plist, mat);\n //});\n return drawable;\n}\n\nconst createNode = async (jsonData,filePath,loader) => {\n const name = removeExtension(getFileName(filePath));\n const drawable = await createDrawable(jsonData,filePath,loader);\n const node = new Node(name);\n node.addChild(drawable);\n for (const compData of jsonData.components) {\n try {\n const comp = await deserializeComponent(compData,loader);\n node.addComponent(comp);\n }\n catch (err) {\n console.warn(err.message);\n }\n }\n console.log(jsonData);\n return node;\n}\n\nexport default class Bg2LoaderPlugin extends LoaderPlugin {\n constructor( { bg2ioPath = null } = {}) {\n super();\n this._bg2ioPath = bg2ioPath;\n this._resource = new Resource();\n }\n\n get supportedExtensions() { return [\"bg2\",\"vwglb\"]; }\n\n get resourceTypes() {\n return [\n ResourceType.PolyList, \n ResourceType.Drawable,\n ResourceType.Node\n ]; \n }\n\n async load(path,resourceType,loader) {\n const bg2io = await bg2ioFactory(this._bg2ioPath);\n\n const buffer = await this._resource.load(path);\n const jsonData = bg2io.loadBg2FileAsJson(buffer);\n\n switch (resourceType) {\n case ResourceType.PolyList:\n return createPolyList(jsonData,loader).map(item => item.plist);\n case ResourceType.Drawable:\n return createDrawable(jsonData,path,loader);\n case ResourceType.Node:\n return await createNode(jsonData,path,loader);\n default:\n throw new Error(`Bg2LoaderPlugin.load() unexpected resource type received: ${resourceType}`);\n }\n }\n}\n","import { getExtension, ResourceType } from '../tools/Resource';\n\nexport const PluginOperationType = {\n Read: \"read\",\n Write: \"write\"\n};\n\nexport const createPluginDatabase = (operationType) => {\n return {\n operationType,\n plugins: {}\n }\n}\n\nexport const registerPluginInDatabase = (pluginInstance, pluginDatabase) => {\n pluginInstance.resourceTypes.forEach(type => {\n pluginDatabase.plugins[type] = pluginDatabase.plugins[type] || [];\n pluginDatabase.plugins[type].push(pluginInstance);\n });\n}\n\nexport const getPluginFromDatabase = function(path, type, pluginDatabase) {\n const ext = getExtension(path);\n const extCheck = new RegExp(ext, \"i\");\n const errMsg = `Could not find a plugin to ${pluginDatabase.operationType} file '${path}' of type '${type}'.`;\n\n const plugins = pluginDatabase.plugins[type];\n if (!plugins) {\n throw new Error(errMsg);\n }\n else {\n for (const plugin of plugins) {\n if (plugin.supportedExtensions.find(e => extCheck.test(e))) {\n return plugin;\n }\n }\n throw new Error(errMsg);\n }\n}\n\n","\nimport { isAbsolute, jointUrl, ResourceType } from '../tools/Resource';\nimport { \n PluginOperationType,\n createPluginDatabase, \n registerPluginInDatabase, \n getPluginFromDatabase \n} from './DBPluginApi';\nimport Canvas from '../app/Canvas';\n\nconst g_loadPluginDatabase = createPluginDatabase(PluginOperationType.Read);\n\nexport const registerLoaderPlugin = (pluginInstance) => {\n pluginInstance.dependencies.forEach(dep => registerPluginInDatabase(dep, g_loadPluginDatabase));\n registerPluginInDatabase(pluginInstance, g_loadPluginDatabase);\n}\n\nexport const getLoaderPlugin = (path, type) => {\n return getPluginFromDatabase(path, type, g_loadPluginDatabase);\n}\n\nconst getClearedCache = () => {\n return {\n PolyList: {},\n Drawable: {},\n Node: {},\n Texture: {},\n Material: {}\n }\n}\n\nexport default class Loader {\n constructor(canvas) {\n this._canvas = canvas || Canvas.FirstCanvas();\n this._cache = getClearedCache();\n this._currentPath = \"\";\n }\n\n get canvas() {\n return this._canvas;\n }\n\n get currentPath() {\n return this._currentPath;\n }\n\n set currentPath(p) {\n this._currentPath = p;\n }\n\n clearCache() {\n this._cache = getClearedCache();\n }\n\n findCache(path,type) {\n return this._cache[type] && this._cache[type][path];\n }\n\n async loadResource(path,type) {\n if (!isAbsolute(path) && this.currentPath !== \"\") {\n path = jointUrl(this.currentPath, path);\n }\n let result = this.findCache(path, type);\n if (!result) {\n const plugin = getLoaderPlugin(path, type);\n result = await plugin.load(path, type, this);\n }\n return result;\n }\n\n async loadPolyList(path) {\n return await this.loadResource(path, ResourceType.PolyList);\n }\n\n async loadDrawable(path) {\n return await this.loadResource(path, ResourceType.Drawable);\n }\n\n async loadNode(path) {\n return await this.loadResource(path, ResourceType.Node);\n }\n\n async loadTexture(path) {\n return await this.loadResource(path, ResourceType.Texture);\n }\n\n async loadMaterial(path) {\n return await this.loadResource(path, ResourceType.Material);\n }\n}\n\n","\n\nexport default class MtlParser {\n constructor(mtlText) {\n \n }\n}\n","\nimport PolyList from \"../base/PolyList\";\n\nfunction parseM(line) {\n // mtllib\n let res = /mtllib\\s+(.*)/.exec(line);\n if (res) {\n this._mtlLib = res[1];\n }\n}\n\nfunction parseG(line) {\n // g\n let res = /g\\s+(.*)/.exec(line);\n if (res) {\n this._currentPlist.name = res[1];\n }\n}\n\nfunction parseU(line) {\n // usemtl\n let res = /usemtl\\s+(.*)/.exec(line);\n if (res) {\n this._currentPlist._matName = res[1];\n if (this._currentPlist.name==\"\") {\n this._currentPlist.name = res[1];\n }\n }\n}\n\nfunction parseS(line) {\n // s\n let res = /s\\s+(.*)/.exec(line);\n if (res) {\n // TODO: Do something with smoothing groups\n }\n}\n\nfunction addPoint(pointData) {\n this._currentPlist.vertex.push(pointData.vertex[0],pointData.vertex[1],pointData.vertex[2]);\n if (pointData.normal) {\n this._currentPlist.normal.push(pointData.normal[0],pointData.normal[1],pointData.normal[2]);\n }\n if (pointData.tex) {\n this._currentPlist.texCoord0.push(pointData.tex[0],pointData.tex[1]);\n }\n this._currentPlist.index.push(this._currentPlist.index.length);\n}\n\nfunction isValid(point) {\n return point && point.vertex && point.tex && point.normal;\n}\n\nfunction addPolygon(polygonData) {\n let currentVertex = 0;\n let sides = polygonData.length;\n if (sides<3) return;\n while (currentVertex<sides) {\n let i0 = currentVertex;\n let i1 = currentVertex + 1;\n let i2 = currentVertex + 2;\n if (i2==sides) {\n i2 = 0;\n }\n else if (i1==sides) {\n i1 = 0;\n i2 = 2;\n }\n\n let p0 = polygonData[i0];\n let p1 = polygonData[i1];\n let p2 = polygonData[i2];\n\n if (isValid(p0) && isValid(p1) && isValid(p2)) {\n addPoint.apply(this,[p0]);\n addPoint.apply(this,[p1]);\n addPoint.apply(this,[p2]);\n }\n else {\n console.warn(\"Invalid point data found loading OBJ file\");\n }\n currentVertex+=3;\n }\n}\n\nfunction parseF(line) {\n // f\n this._addPlist = true;\n let res = /f\\s+(.*)/.exec(line);\n if (res) {\n let params = res[1];\n let vtnRE = /([\\d\\-]+)\\/([\\d\\-]*)\\/([\\d\\-]*)/g;\n if (params.indexOf('/')==-1) {\n let vRE = /([\\d\\-]+)/g;\n }\n let polygon = [];\n while ( (res=vtnRE.exec(params)) ) {\n let iV = Number(res[1]);\n let iN = res[3] ? Number(res[3]):null;\n let iT = res[2] ? Number(res[2]):null;\n iV = iV<0 ? this._vertexArray.length + iV : iV - 1;\n iN = iN<0 ? this._normalArray.length + iN : (iN===null ? null : iN - 1);\n iT = iT<0 ? this._texCoordArray.length + iT : (iT===null ? null : iT - 1)\n\n let v = this._vertexArray[iV];\n let n = iN!==null ? this._normalArray[iN] : null;\n let t = iT!==null ? this._texCoordArray[iT] : null;\n polygon.push({\n vertex:v,\n normal:n,\n tex:t\n });\n }\n addPolygon.apply(this,[polygon]);\n }\n}\n\nfunction parseO(line) {\n // o\n let res = /s\\s+(.*)/.exec(line);\n if (res && this._currentPlist.name==\"\") {\n this._currentPlist.name = res[1];\n }\n}\n\nfunction checkAddPlist() {\n if (this._addPlist) {\n if (this._currentPlist) {\n this._plistArray.push(this._currentPlist);\n }\n this._currentPlist = new PolyList();\n this._addPlist = false;\n }\n}\n\nfunction loadObjData() {\n let lines = this._textData.split('\\n');\n let multiLine = \"\";\n lines.forEach(line => {\n line = line.trim();\n\n // This section controls the break line character \\\n // to concatenate this new line with the next one\n if (multiLine) {\n line = multiLine + line;\n }\n if (line[line.length - 1] === '\\\\') {\n line = line.substring(0,line.length - 1);\n multiLine += line;\n return;\n }\n else {\n multiLine = \"\";\n }\n\n // First optimization: parse the first character and string length\n if (line.length>1 && line[0] !== '#') {\n // Second optimization: parse by the first character\n switch (line[0]) {\n case 'v':\n let res = /v\\s+([\\d\\.\\-e]+)\\s+([\\d\\.\\-e]+)\\s+([\\d\\.\\-e]+)/.exec(line);\n if (res) {\n this._vertexArray.push(\n [ Number(res[1]), Number(res[2]), Number(res[3]) ]\n );\n }\n else if ( (res = /vn\\s+([\\d\\.\\-e]+)\\s+([\\d\\.\\-e]+)\\s+([\\d\\.\\-e]+)/.exec(line)) ) {\n this._normalArray.push(\n [ Number(res[1]), Number(res[2]), Number(res[3]) ]\n );\n }\n else if ( (res = /vt\\s+([\\d\\.\\-e]+)\\s+([\\d\\.\\-e]+)/.exec(line)) ) {\n this._texCoordArray.push(\n [ Number(res[1]), Number(res[2]) ]\n );\n }\n else {\n console.warn(\"Error parsing line \" + line);\n }\n break;\n case 'm':\n checkAddPlist.apply(this);\n parseM.apply(this,[line]);\n break;\n case 'g':\n checkAddPlist.apply(this);\n parseG.apply(this,[line]);\n break;\n case 'u':\n checkAddPlist.apply(this);\n parseU.apply(this,[line]);\n break;\n case 's':\n parseS.apply(this,[line]);\n break;\n case 'f':\n parseF.apply(this,[line]);\n break;\n case 'o':\n checkAddPlist.apply(this);\n parseO.apply(this,[line]);\n break;\n }\n }\n });\n\n if (this._currentPlist && this._addPlist) {\n this._plistArray.push(this._currentPlist);\n }\n}\n\nexport default class ObjParser {\n constructor(objText) {\n this._textData = objText;\n\n this._plistArray = [];\n\n this._vertexArray = [];\n this._normalArray = [];\n this._texCoordArray = [];\n\n this._mtlLib = \"\";\n\n this._addPlist = true;\n\n loadObjData.apply(this);\n }\n\n\n get polyListArray() {\n return this._plistArray;\n }\n}\n","import LoaderPlugin from './LoaderPlugin';\nimport Resource, { getFileName, removeExtension, removeFileName, ResourceType } from './../tools/Resource';\nimport ObjParser from './ObjParser';\nimport Drawable from '../scene/Drawable';\nimport Material from '../base/Material';\n\nconst buildDrawable = (polyListArray,mtlData,filePath) => {\n const name = removeExtension(getFileName(filePath));\n const drawable = new Drawable(name);\n\n polyListArray.forEach(plist => {\n // TODO: set mtl data\n const mat = new Material();\n drawable.addPolyList(plist,mat);\n });\n\n return drawable;\n}\n\nexport default class ObjLoaderPlugin extends LoaderPlugin {\n constructor() {\n super();\n this._resource = new Resource();\n }\n\n get supportedExtensions() { return ['obj']; }\n\n get resourceTypes() {\n return [\n ResourceType.PolyList,\n ResourceType.Drawable\n ];\n }\n\n async load(path,resourceType,loader) {\n const objText = await this._resource.load(path);\n const parser = new ObjParser(objText);\n\n // TODO: load material from mtl file\n // const relativePath = removeFileName(filePath);\n\n switch (resourceType) {\n case ResourceType.PolyList:\n return parser.polyListArray;\n case ResourceType.Drawable:\n return buildDrawable(parser.polyListArray, null, path);\n default:\n throw new Error(`ObjLoaderPlugin.load() unexpected resource type received: ${resourceType}`);\n }\n }\n}","\nexport default class WriterPlugin {\n // Returns an array of valid file extensions for this plugin\n // example: ['obj','dae']\n get supportedExtensions() {\n throw new Error(\"WriterPlugin.supportedExtensions: attribute not implemented\");\n }\n\n // Returns the resource types that the loader plugin can handle\n // example: [ResourceType.PolyList, ResourceType.Drawable]\n get resourceTypes() {\n throw new Error(\"WriterPlugin.resourceTypes: attribute not implemented\");\n }\n\n // Performs the write action to the specified path, using the specified data\n // and for the specified type.\n async write(path, data, type) {\n throw new Error(\"WriterPlugin.write(): method not implemented\");\n }\n}\n","import { ResourceType } from \"../tools/Resource\";\nimport WriterPlugin from \"./WriterPlugin\";\n\nexport default class ObjWriterPlugin extends WriterPlugin {\n get supportedExtensions() {\n return [\"obj\"];\n }\n\n get resourceTypes() {\n return ResourceType.Drawable;\n }\n\n async write(path, data, type) {\n console.log(path);\n console.log(data);\n console.log(type);\n }\n}","import { ResourceType } from '../tools/Resource';\nimport { \n PluginOperationType,\n createPluginDatabase, \n registerPluginInDatabase, \n getPluginFromDatabase \n} from './DBPluginApi';\n\nconst g_writePluginDatabase = createPluginDatabase(PluginOperationType.Write);\n\nexport const registerWriterPlugin = (pluginInstance) => {\n registerPluginInDatabase(pluginInstance, g_writePluginDatabase);\n}\n\nexport const getWriterPlugin = (path, type) => {\n return getPluginFromDatabase(path, type, g_writePluginDatabase);\n}\n\nexport default class Writer {\n constructor() {\n\n }\n\n async writeResource(path, data, type) {\n const plugin = getWriterPlugin(path, type);\n const result = await plugin.write(path, data, type, this);\n return result;\n }\n\n async writePolyList(path, data) {\n return await this.writeResource(path, data, ResourceType.PolyList);\n }\n\n async writeDrawable(path, data) {\n return await this.writeResource(path, data, ResourceType.Drawable);\n }\n\n async writeNode(path, data) {\n return await this.writeResource(path, data, ResourceType.Node);\n }\n\n async writeTexture(path, data) {\n return await this.writeResource(path, data, ResourceType.Texture);\n }\n\n async writeMaterial(path, data) {\n return await this.writeResource(path, data, ResourceType.Material);\n }\n}\n","\nimport Bg2LoaderPlugin from \"./Bg2LoaderPlugin\";\nimport {\n PluginOperationType,\n createPluginDatabase,\n registerPluginInDatabase,\n getPluginFromDatabase\n} from \"./DBPluginApi\";\nimport Loader, {\n registerLoaderPlugin,\n getLoaderPlugin\n} from \"./Loader\"\nimport LoaderPlugin from \"./LoaderPlugin\";\nimport MtlParser from \"./MtlParser\";\nimport ObjLoaderPlugin from \"./ObjLoaderPlugin\";\nimport ObjParser from \"./ObjParser\";\nimport ObjWriterPlugin from \"./ObjWriterPlugin\";\nimport VitscnjLoaderPlugin from \"./VitscnjLoaderPlugin\";\nimport Writer, {\n registerWriterPlugin,\n getWriterPlugin\n} from \"./Writer\"\nimport WriterPlugin from \"./WriterPlugin\";\n\nexport default {\n Bg2LoaderPlugin,\n PluginOperationType,\n createPluginDatabase,\n registerPluginInDatabase,\n getPluginFromDatabase,\n Loader,\n registerLoaderPlugin,\n getLoaderPlugin,\n LoaderPlugin,\n MtlParser,\n ObjLoaderPlugin,\n ObjParser,\n ObjWriterPlugin,\n VitscnjLoaderPlugin,\n Writer,\n registerWriterPlugin,\n getWriterPlugin,\n WriterPlugin\n}\n","\n\nexport default class Environment {\n constructor() {\n this._renderer = null;\n\n this._equirectangularTexture = null;\n this._irradianceIntensity = 1;\n this._showSkybox = true;\n this._cubemapSize = 512;\n this._irradianceMapSize = 32;\n this._specularMapSize = 32;\n this._specularMapL2Size = 32;\n\n this._dirty = true;\n }\n\n get equirectangularTexture() { return this._equirectangularTexture; }\n set equirectangularTexture(t) { this._equirectangularTexture = t; this._dirty = true; }\n get irradianceIntensity() { return this._irradianceIntensity; }\n set irradianceIntensity(value) { this._irradianceIntensity = value; this._dirty = true}\n get showSkybox() { return this._showSkybox; }\n set showSkybox(value) { this._showSkybox = value; this._dirty = true}\n get cubemapSize() { return this._cubemapSize; }\n set cubemapSize(value) { this._cubemapSize = value; this._dirty = true}\n get irradianceMapSize() { return this._irradianceMapSize; }\n set irradianceMapSize(value) { this._irradianceMapSize = value; this._dirty = true}\n get specularMapSize() { return this._specularMapSize; }\n set specularMapSize(value) { this._specularMapSize = value; this._dirty = true}\n get specularMapL2Size() { return this._specularMapL2Size; }\n set specularMapL2Size(value) { this._specularMapL2Size = value; this._dirty = true}\n\n get renderer() {\n return this._renderer;\n }\n\n destroy() {\n if (this.renderer) {\n this.renderer.destroy();\n }\n }\n \n clone() {\n const result = new SkyCube();\n result.assign(this);\n return result;\n }\n\n assign(other) {\n this.equirectangularTexture = other.equirectangularTexture;\n this.irradianceIntensity = other.irradianceIntensity;\n this.showSkybox = other.showSkybox;\n this.cubemapSize = other.cubemapSize;\n this.irradianceMapSize = other.irradianceMapSize;\n this.specularMapSize = other.specularMapSize;\n this.specularMapL2Size = other.specularMapL2Size;\n }\n\n async deserialize(sceneData) {\n this.equirectangularTexture = sceneData.equirectangularTexture || this.equirectangularTexture;\n this.irradianceIntensity = sceneData.irradianceIntensity || this.irradianceIntensity;\n this.showSkybox = sceneData.showSkybox || this.showSkybox;\n this.cubemapSize = sceneData.cubemapSize || this.cubemapSize;\n this.irradianceMapSize = sceneData.irradianceMapSize || this.irradianceMapSize;\n this.specularMapSize = sceneData.specularMapSize || this.specularMapSize;\n this.specularMapL2Size = sceneData.specularMapL2Size || this.specularMapL2Size;\n }\n\n async serialize(sceneData) {\n sceneData.equirectangularTexture = this.equirectangularTexture;\n sceneData.irradianceIntensity = this.irradianceIntensity;\n sceneData.showSkybox = this.showSkybox;\n sceneData.cubemapSize = this.cubemapSize;\n sceneData.irradianceMapSize = this.irradianceMapSize;\n sceneData.specularMapSize = this.specularMapSize;\n sceneData.specularMapL2Size = this.specularMapL2Size;\n } \n}","\nimport Vec from '../math/Vec';\nimport Mat4 from '../math/Mat4';\nimport Color from './Color';\n\nexport const LightType = Object.freeze({\n DIRECTIONAL: 4,\n SPOT: 1,\n POINT: 5,\n DISABLED: 10\n});\n\nexport default class Light {\n constructor() {\n this._enabled = true;\n \n this._type = LightType.DIRECTIONAL;\n \n this._direction = new Vec(0,0,-1);\n this._position = new Vec(0,0,0);\n \n this._color = new Color({ rgb: 0.9 });\n this._intensity = 20;\n this._spotCutoff = 20;\n this._spotExponent = 30;\n this._shadowStrength = 0.7;\n this._castShadows = true;\n this._shadowBias = 0.00002;\n \n this._projection = Mat4.MakeOrtho(-10,10,-10,10,0.1,500.0);\n\n // Internal engine use. This attribute will not be serialized\n this._depthTexture = null;\n }\n \n clone() {\n const newLight = new Light();\n newLight.assign(this);\n return newLight;\n }\n \n assign(other) {\n this.enabled = other.enabled;\n this.type = other.type;\n this.direction.assign(other.direction);\n this.position.assign(other.position);\n this.color.assign(other.color);\n this.spotCutoff = other.spotCutoff;\n this.spotExponent = other.spotExponent;\n this.shadowStrength = other.shadowStrength;\n this.castShadows = other.castShadows;\n this.shadowBias = other.shadowBias;\n this.intensity = other.intensity;\n this.projection.assign(other.projection);\n }\n \n get enabled() { return this._enabled; }\n set enabled(v) { this._enabled = v; }\n \n get type() { return this._type; }\n set type(t) { this._type = t; }\n \n get direction() { return this._direction; }\n set direction(d) { this._direction = d; }\n\n get position() { return this._position; }\n set position(p) { this._position = p; }\n \n get color() { return this._color; }\n set color(c) {\n if (c.length === 3) {\n this._color = new Vec([c[0], c[1], c[2], 1]);\n }\n else if (c.length === 4) {\n this._color = new Vec(c);\n }\n else {\n throw new Error(`Invalid light color assignment. Parameter must be a three or four component array.`);\n }\n }\n get intensity() { return this._intensity; }\n set intensity(i) { this._intensity = i; }\n \n get spotCutoff() { return this._spotCutoff; }\n set spotCutoff(c) { this._spotCutoff = c; }\n get spotExponent() { return this._spotExponent; }\n set spotExponent(e) { this._spotExponent = e; }\n \n get shadowStrength() { return this._shadowStrength; }\n set shadowStrength(s) { this._shadowStrength = s; }\n get castShadows() { return this._castShadows; }\n set castShadows(s) { this._castShadows = s; }\n get shadowBias() { return this._shadowBias; }\n set shadowBias(s) { this._shadowBias = s; }\n \n get projection() { return this._projection; }\n set projection(p) { this._projection = p; }\n\n get depthTexture() {\n return this._depthTexture;\n }\n\n set depthTexture(t) {\n this._depthTexture = t;\n }\n\n get viewMatrix() {\n return this._viewMatrix;\n }\n\n set viewMatrix(m) {\n this._viewMatrix = m;\n }\n\n async deserialize(sceneData) {\n switch (sceneData.lightType) {\n case 'kTypeDirectional':\n case LightType.DIRECTIONAL:\n this._type = LightType.DIRECTIONAL;\n // Use the predefined shadow bias for directional lights\n //this._shadowBias = sceneData.shadowBias;\n break;\n case 'kTypeSpot':\n case LightType.SPOT:\n this._type = LightType.SPOT;\n this._shadowBias = sceneData.shadowBias;\n break;\n case 'kTypePoint':\n case LightType.POINT:\n this._type = LightType.POINT;\n break;\n default:\n this._type = LightType.DIRECTIONAL;\n }\n\n const defaultIntensity = () => this._type === LightType.DIRECTIONAL ? 1 : 20;\n\n this._position = sceneData.position || new Vec(0,0,0);\n this._direction = sceneData.direction || new Vec(0, 0, -1);\n\n if (sceneData.diffuse) {\n this._color = new Color(sceneData.diffuse);\n this._intensity = (sceneData.intensity || 1) * defaultIntensity();\n }\n else if (sceneData.color) {\n this._color = new Color(sceneData.color);\n this._intensity = sceneData.intensity || defaultIntensity();\n }\n \n this._spotCutoff = sceneData.spotCutoff || 20;\n this._spotExponent = sceneData.spotExponent || 30;\n this._shadowStrength = sceneData.shadowStrength || 1;\n if (sceneData.projection) {\n this._projection = new Mat4(sceneData.projection);\n }\n this._castShadows = sceneData.castShadows !== undefined ? sceneData.castShadows : true;\n }\n\n async serialize(sceneData) {\n const lightTypes = [];\n lightTypes[LightType.DIRECTIONAL] = \"kTypeDirectional\";\n lightTypes[LightType.SPOT] = \"kTypeSpot\";\n lightTypes[LightType.POINT] = \"kTypePoint\";\n sceneData.lightType = lightTypes[this._type];\n sceneData.position = this._position;\n sceneData.direction = this._direction;\n sceneData.color = this._color;\n sceneData.intensity = this._intensity;\n sceneData.spotCutoff = this._spotCutoff || 20;\n sceneData.spotExponent = this._spotExponent || 30;\n sceneData.shadowStrength = this._shadowStrength;\n sceneData.projection = this._projection;\n sceneData.castShadows = this._castShadows;\n sceneData.shadowBias = this._shadowBias || 0.0029;\n }\n}\n","import Color from './Color';\nimport Environment from './Environment';\nimport Light, {\n LightType\n} from './Light';\nimport Material from './Material';\nimport PolyList, {\n BufferType,\n DrawMode,\n RenderLayer,\n getLayers,\n PolyListFrontFace,\n PolyListCullFace\n} from './PolyList';\nimport Texture, {\n TextureDataType,\n TextureWrap,\n TextureFilter,\n TextureTarget,\n ProceduralTextureFunction,\n TextureRenderTargetAttachment,\n TextureComponentFormat,\n TextureChannel,\n TextureDataTypeName,\n TextureWrapName,\n TextureFilterName,\n TextureTargetName,\n ProceduralTextureFunctionName,\n TextureRenderTargetAttachmentNames,\n TextureComponentFormatNames,\n TextureChannelNames\n} from './Texture';\n\nexport default {\n Color,\n Environment,\n Light,\n LightType,\n Material,\n PolyList,\n BufferType,\n DrawMode,\n RenderLayer,\n getLayers,\n PolyListFrontFace,\n PolyListCullFace,\n Texture,\n TextureDataType,\n TextureWrap,\n TextureFilter,\n TextureTarget,\n ProceduralTextureFunction,\n TextureRenderTargetAttachment,\n TextureComponentFormat,\n TextureChannel,\n TextureDataTypeName,\n TextureWrapName,\n TextureFilterName,\n TextureTargetName,\n ProceduralTextureFunctionName,\n TextureRenderTargetAttachmentNames,\n TextureComponentFormatNames,\n TextureChannelNames\n}\n\n","\nexport default class NodeVisitor {\n constructor() {\n this._ignoreDisabled = true;\n }\n\n get ignoreDisabled() { return this._ignoreDisabled; }\n set ignoreDisabled(i) { this._ignoreDisabled = i; }\n\n visit(node) {}\n didVisit(node) {}\n}\n","import Component from './Component';\nimport Mat4 from \"../math/Mat4\";\nimport NodeVisitor from './NodeVisitor';\n\nexport class TransformVisitor extends NodeVisitor {\n constructor() {\n super();\n this._matrix = Mat4.MakeIdentity();\n }\n\n get matrix() {\n return this._matrix;\n }\n\n visit(node) {\n if (node.transform) {\n this._matrix = Mat4.Mult(this._matrix, node.transform.matrix);\n }\n }\n}\n\nexport default class Transform extends Component {\n static GetWorldMatrix(node) {\n if (!node instanceof Node && !node instanceof Component) {\n throw new Error(\"Invalid parameter in Transform.GetWorldMatrix() function. The parameter is not an instance of Node or Component\");\n }\n else if (node instanceof Component) {\n node = node.node;\n }\n const visitor = new TransformVisitor();\n node.acceptReverse(visitor);\n return visitor.matrix;\n }\n\n constructor(mat = Mat4.MakeIdentity()) {\n super(\"Transform\");\n if (!mat instanceof Mat4) {\n throw new Error(\"Invalid parameter in Transform component initialization. The parameter must be a Mat4 instance.\");\n }\n this._matrix = mat;\n }\n\n get matrix() { return this._matrix; }\n set matrix(m) { this._matrix = m; }\n\n clone() {\n const result = new Transform();\n result.assign(this);\n return result;\n }\n\n assign(other) {\n this._matrix = new Mat4(other.matrix);\n }\n\n async deserialize(sceneData,loader) {\n if (Array.isArray(sceneData.transformMatrix) && sceneData.transformMatrix.length === 16) {\n this._matrix.assign(sceneData.transformMatrix);\n }\n else {\n console.warn(\"Transform.deserialize(): invalid transformMatrix attribute found in scene data\");\n }\n }\n\n async serialize(sceneData,writer) {\n await super.serialize(sceneData,writer);\n throw new Error(\"Transform.serialice() not implemented\");\n }\n\n update(delta,modelMatrix) {\n //modelMatrix.mult(this._matrix);\n modelMatrix.assign(Mat4.Mult(modelMatrix, this._matrix));\n }\n}\n","\nimport Mat4 from \"../math/Mat4\";\nimport Component from \"./Component\";\n\nexport default class Chain extends Component {\n constructor() {\n super('Chain');\n }\n\n willUpdate(frame,matrixState) {\n if (this.node) {\n const matrix = Mat4.MakeIdentity();\n this.node.children.forEach((child, index) => {\n const trx = child.component(\"Transform\");\n const inJoint = child.component(\"InputChainJoint\");\n const outJoint = child.component(\"OutputChainJoint\");\n\n if (index>0 && inJoint) {\n inJoint.joint.applyTransform(matrix);\n }\n else {\n matrix.identity();\n }\n\n if (trx) {\n trx.matrix.assign(matrix);\n }\n\n if (outJoint) {\n outJoint.joint.applyTransform(matrix);\n }\n });\n }\n }\n \n clone() { return new Chain(); }\n assign(other) {}\n async deserialize(sceneData,loader) {}\n\n async serialize(sceneData,writer) {\n await super.serialize(sceneData,writer);\n }\n}\n","import Vec from '../math/Vec';\nimport Mat4 from '../math/Mat4';\n\nexport default class Joint {\n static Factory(linkData) {\n let result = null;\n switch (linkData.type) {\n case 'LinkJoint':\n result = new LinkJoint();\n result.deserialize(linkData);\n break;\n }\n return result;\n }\n\n constructor() {\n this._transform = Mat4.MakeIdentity();\n }\n\n get transform() { return this._transform; }\n set transform(t) { this._transform.assign(t); }\n\n applyTransform(matrix) {\n\n }\n\n calculateTransform() {\n\n }\n}\n\nexport const LinkTransformOrder = {\n TRANSLATE_ROTATE: 1,\n ROTATE_TRANSLATE: 0\n};\n\nexport class LinkJoint extends Joint {\n constructor() {\n super();\n this._offset = new Vec(0, 0, 0);\n this._eulerRotation = new Vec(0, 0, 0);\n this._transformOrder = LinkTransformOrder.TRANSLATE_ROTATE;\n }\n\n get offset() { return this._offset; }\n set offset(o) { this._offset = new Vec(o); this.calculateTransform(); }\n\n get eulerRotation() { return this._eulerRotation; }\n set eulerRotation(e) { this._eulerRotation = new Vec(e); this.calculateTransform(); }\n\n get yaw() { return this._eulerRotation.x; }\n get pitch() { return this._eulerRotation.y; }\n get roll() { return this._eulerRotation.z; }\n\n set yaw(y) { this._eulerRotation.x = y; this.calculateTransform(); }\n set pitch(p) { this._eulerRotation.y = p; this.calculateTransform(); }\n set roll(r) { this._eulerRotation.z = r; this.calculateTransform(); }\n\n get transformOrder() { return this._transformOrder; }\n set transformOrder(t) { this._transformOrder = t; this.calculateTransform(); }\n\n applyTransform(matrix) {\n matrix.mult(this.transform);\n }\n\n multTransform(dst) {\n const offset = this.offset;\n switch (this.transformOrder) {\n case LinkTransformOrder.TRANSLATE_ROTATE:\n dst.translate(offset.x, offset.y, offset.z);\n this.multRotation(dst);\n break;\n case LinkTransformOrder.ROTATE_TRANSLATE:\n this.multRotation(dst);\n dst.translate(offset.x, offset.y, offset.z);\n break;\n }\n }\n\n multRotation(dst) {\n dst .rotate(this.eulerRotation.z, 0, 0, 1)\n .rotate(this.eulerRotation.y, 0, 1, 0)\n .rotate(this.eulerRotation.x, 1, 0, 0);\n }\n\n calculateTransform() {\n this.transform.identity();\n this.multTransform(this.transform);\n }\n\n clone() {\n const other = new LinkJoint();\n other.assign(this);\n return other;\n }\n\n assign(other) {\n this._offset = new Vec(other._offset);\n this._eulerRotation = new Vec(other._eulerRotation);\n this._transformOrder = other._transformOrder;\n this.calculateTransform();\n }\n\n serialize(sceneData) {\n if (sceneData.offset && sceneData.offset.length >= 3) {\n this._offset = new Vec(sceneData.offset);\n }\n this._eulerRotation = new Vec(\n sceneData.yaw || 0,\n sceneData.pitch || 0,\n sceneData.roll || 0\n );\n this._transformOrder = sceneData.order !== undefined ? sceneData.order : LinkTransformOrder.TRANSLATE_ROTATE;\n }\n\n deserialize(sceneData) {\n sceneData.type = 'LinkJoint';\n sceneData.offset = Array.from(this._offset);\n sceneData.yaw = this.yaw;\n sceneData.pitch = this.pitch;\n sceneData.roll = this.roll;\n sceneData.order = this.transformOrder;\n }\n}\n","import Component from \"./Component\";\nimport Joint, { LinkTransformOrder, LinkJoint } from \"../phsics/joint\";\n\nexport class ChainJoint extends Component {\n constructor(typeId) {\n super(typeId);\n\n this._joint = new LinkJoint();\n }\n\n get joint() { return this._joint; }\n set joint(j) { this._joint = j; }\n\n assign(other) {\n this.joint.assign(other.joint);\n }\n\n async deserialize(sceneData,loader) {\n if (sceneData.joint) {\n this.joint = Joint.Factory(sceneData.joint);\n }\n }\n\n async serialize(sceneData,writer) {\n await super.serialize(sceneData,writer);\n sceneData.joint = {};\n this.joint.serialize(sceneData.joint);\n }\n}\n\nexport class InputChainJoint extends ChainJoint {\n constructor() {\n super('InputChainJoint');\n this.joint.transformOrder = LinkTransformOrder.ROTATE_TRANSLATE;\n }\n\n clone() {\n const result = new InputChainJoint();\n result.assign(this);\n return result;\n }\n}\n\nexport class OutputChainJoint extends ChainJoint {\n constructor() {\n super('OutputChainJoint');\n this.joint.transformOrder = LinkTransformOrder.TRANSLATE_ROTATE;\n }\n\n clone() {\n const result = new OutputChainJoint();\n result.assign(this);\n return result;\n }\n}\n","import NodeVisitor from \"./NodeVisitor\";\n\nexport default class FindNodeVisitor extends NodeVisitor {\n constructor() {\n super();\n\n this._name;\n this._result = [];\n this._hasComponents = [];\n }\n\n set name(n) {\n this._name = n;\n }\n\n get name() {\n return this._name;\n }\n\n get result() {\n return this._result;\n }\n\n clear() {\n this._result = [];\n }\n\n hasComponents(components) {\n if (!Array.isArray(components)) {\n components = [components];\n }\n this._hasComponents = components;\n }\n\n visit(node) {\n let add = false;\n if (typeof(this._name) === \"string\") {\n add = this._name === node.name;\n }\n else if (this._name instanceof RegExp) {\n add = this._name.test(node.name);\n }\n else {\n add = true;\n }\n\n add = add && (\n this._hasComponents.some(compId => node.component(compId)) ||\n this._hasComponents.length == 0\n );\n if (add) {\n this._result.push(node);\n }\n }\n}","import Component from \"./Component\";\nimport Light, { LightType } from \"../base/Light\";\nimport FindNodeVisitor from \"./FindNodeVisitor\";\n\n\nexport default class LightComponent extends Component {\n static GetLights(sceneRoot) {\n if (sceneRoot.sceneChanged || !sceneRoot.__lights) {\n sceneRoot.__lights = [];\n let findLights = new FindNodeVisitor();\n findLights.hasComponents([\"Light\"]);\n sceneRoot.accept(findLights);\n sceneRoot.__lights = findLights.result.map(n => n.lightComponent);\n }\n return sceneRoot.__lights;\n }\n\n static GetFirstShadowCastingLight(sceneRoot) {\n if (sceneRoot.sceneChanged || !sceneRoot.__mainDirectionalLight) {\n sceneRoot.__mainDirectionalLight = LightComponent.GetLights(sceneRoot)\n .find(l => l.light.type === LightType.DIRECTIONAL || l.light.type === LightType.SPOT);\n }\n return sceneRoot.__mainDirectionalLight;\n }\n\n static GetMainDirectionalLight(sceneRoot) {\n if (sceneRoot.sceneChanged || !sceneRoot.__mainDirectionalLight) {\n sceneRoot.__mainDirectionalLight = LightComponent.GetLights(sceneRoot)\n .find(l => l.light.type === LightType.DIRECTIONAL);\n }\n return sceneRoot.__mainDirectionalLight || LightComponent.GetFirstShadowCastingLight(sceneRoot);\n }\n\n constructor(light = null) {\n super(\"Light\");\n\n this._light = light || new Light();\n }\n\n get light() { return this._light; }\n set light(l) { this._light = l; }\n\n set depthTexture(t) {\n this._light.depthTexture = t;\n }\n\n get depthTexture() {\n return this._light.depthTexture;\n }\n\n set viewMatrix(vm) {\n this._light.viewMatrix = vm;\n }\n\n get viewMatrix() {\n return this._light.viewMatrix;\n }\n \n set mvpMatrix(m) {\n this._light.mvpMatrix = m;\n }\n\n get mvpMatrix() {\n return this._light.mvpMatrix;\n }\n\n clone() {\n const result = new Light();\n result.assign(this);\n return result;\n }\n\n assign(other) {\n this._light = other._light.clone();\n }\n\n setProperties({\n enabled,\n type,\n lightType, // alias of type\n direction,\n position,\n color,\n spotCutoff,\n spotExponent,\n shadowStrength,\n castShadows,\n shadowBias,\n intensity,\n projection \n }) {\n if (enabled !== undefined) {\n this.light.enabled = enabled;\n }\n if (type !== undefined) {\n this.light.type = type;\n }\n if (lightType !== undefined) {\n this.light.type = lightType;\n }\n if (direction !== undefined) {\n this.light.direction = direction;\n }\n if (position !== undefined) {\n this.light.position = position;\n }\n if (color !== undefined) {\n this.light.color = color;\n }\n if (spotCutoff !== undefined) {\n this.light.spotCutoff = spotCutoff;\n }\n if (spotExponent !== undefined) {\n this.light.spotExponent = spotExponent;\n }\n if (shadowStrength !== undefined) {\n this.light.shadowStrength = shadowStrength;\n }\n if (castShadows !== undefined) {\n this.light.castShadows = castShadows;\n }\n if (shadowBias !== undefined) {\n this.light.shadowBias = shadowBias;\n }\n if (intensity !== undefined) {\n this.light.intensity = intensity;\n }\n if (projection !== undefined) {\n this.light.projection = projection;\n }\n }\n\n async deserialize(sceneData,loader) {\n await this._light.deserialize(sceneData);\n }\n\n async serialize(sceneData,writer) {\n await super.serialize(sceneData,writer);\n await this._light.serialize(sceneData);\n throw new Error(\"LightComponent.serialize() not implemented\");\n }\n\n draw(renderQueue,modelMatrix) {\n renderQueue.addLight(this.light, modelMatrix);\n }\n}","import Mat4 from \"../math/Mat4\";\nimport Vec from \"../math/Vec\";\nimport Component from \"./Component\";\nimport MatrixStrategy from \"../math/MatrixStrategy\";\nimport { radiansToDegrees } from \"../math/functions\";\nimport NodeVisitor from \"./NodeVisitor\";\nimport Node from \"./Node\";\n\nexport class ProjectionStrategy extends MatrixStrategy {\n static Factory(jsonData) {\n const create = () => {\n switch (jsonData?.type) {\n case \"PerspectiveProjectionMethod\":\n return new PerspectiveProjectionStrategy();\n case \"OpticalProjectionMethod\":\n return new OpticalProjectionStrategy();\n case \"OrthographicProjectionStrategy\":\n return new OrthographicProjectionStrategy();\n default:\n return null;\n }\n }\n\n const result = create();\n if (result) {\n result.deserialize(jsonData);\n }\n return result;\n }\n\n constructor(target) {\n super(target);\n\n this._near = 0.1;\n this._far = 1000.0;\n this._viewport = new Vec([0, 0, 512, 512]);\n }\n\n clone() {\n throw Error(\"ProjectionStrategy.clone(): method not implemented by child class.\");\n }\n\n assign(other) {\n this.near = other.near;\n this.far = other.far;\n this.viewport = new Vec(other.viewport);\n }\n\n set near(v) { this._near = v; this.apply(); }\n get near() { return this._near; }\n set far(v) { this._far = v; this.apply(); }\n get far() { return this._far; }\n set viewport(v) { this._viewport = v; this.apply(); }\n get viewport() { return this._viewport; }\n\n get fov() { return 0; }\n\n serialize(jsonData) {\n jsonData.near = this.near;\n jsonData.far = this.far;\n jsonData.viewport = this.viewport;\n }\n\n deserialize(jsonData) {\n this.near = jsonData.near || this.near;\n this.far = jsonData.far || this.far;\n this.viewport = Array.isArray(jsonData.viewport) ? new Vec(jsonData.viewport) : this.viewport;\n }\n}\n\nexport class PerspectiveProjectionStrategy extends ProjectionStrategy {\n constructor(target) {\n super(target);\n this._fov = 60;\n }\n\n set fov(f) { this._fov = f; this.apply(); }\n get fov() { return this._fov; }\n\n clone() {\n const other = new PerspectiveProjectionStrategy(this._target);\n other.assign(this);\n return other;\n }\n\n assign(other) {\n super.assign(other);\n this.fov = other.fov;\n }\n\n apply() {\n if (this.target) {\n this.target.perspective(this.fov, this.viewport.aspectRatio, this.near, this.far);\n }\n }\n\n serialize(jsonData) {\n jsonData.type = \"PerspectiveProjectionMethod\";\n jsonData.fov = this.fov;\n super.serialize(jsonData);\n }\n\n deserialize(jsonData) {\n super.deserialize(jsonData);\n this.fov = jsonData.fov || this.fov;\n }\n}\n\nexport class OpticalProjectionStrategy extends ProjectionStrategy {\n constructor(target) {\n super(target);\n this._focalLength = 50;\n this._frameSize = 35;\n }\n\n set focalLength(v) { this._focalLength; this.apply(); }\n get focalLength() { return this._focalLength; }\n set frameSize(v) { this._frameSize; this.apply(); }\n get frameSize() { return this._frameSize; }\n\n get fov() {\n return 2 * Math.atan((this.frameSize / 2.0) / this.focalLength);\n }\n\n clone() {\n const other = new OpticalProjectionStrategy(this._target);\n other.assign(this);\n return other;\n }\n\n assign(other) {\n super.assign(other);\n this.focalLength = other.focalLength;\n this.frameSize = other.frameSize;\n }\n\n apply() {\n if (this.target) {\n const fov = radiansToDegrees(this.fov);\n this.target.perspective(fov, this.viewport.aspectRatio, this.near, this.far);\n }\n }\n\n serialize(jsonData) {\n super.serialize(jsonData);\n jsonData.type = \"OpticalProjectionMethod\";\n jsonData.frameSize = this.frameSize;\n jsonData.focalLength = this.focalLength;\n }\n\n deserialize(jsonData) {\n super.deserialize(jsonData);\n this.frameSize = jsonData.frameSize || this.frameSize;\n this.focalLength = jsonData.focalLength || this.focalLength;\n }\n}\n\nexport class OrthographicProjectionStrategy extends ProjectionStrategy {\n constructor(target) {\n super(target);\n this._viewWidth = 100;\n }\n\n set viewWidth(v) { this._viewWidth = v; this.apply(); }\n get viewWidth() { return this._viewWidth; }\n\n clone() {\n const other = new OrthographicProjectionStrategy(this._target);\n other.assign(this);\n return other;\n }\n\n asign(other) {\n super.assign(other);\n this.viewWidth = other.viewWidth;\n }\n\n apply() {\n if (this.target) {\n const height = this.viewWidth / this.viewport.aspectRatio;\n const x = this.viewWidth / 2;\n const y = height / 2;\n this.target.ortho(-x, x, -y, y, -this._far, this._far);\n }\n }\n\n serialize(jsonData) {\n jsonData.type = \"OrthographicProjectionStrategy\";\n jsonData.viewWidth = this.viewWidth;\n super.serialize(jsonData);\n }\n\n deserialize(jsonData) {\n this.viewWidth = jsonData.viewWidth || this.viewWidth;\n super.deserialize(jsonData);\n }\n}\n\nclass SetMainCameraVisitor extends NodeVisitor {\n constructor(mainCamera) {\n super();\n if (!mainCamera) {\n throw Error(\"Set main camera: invalid parameter. The camera paremeter is null.\")\n }\n if (!(mainCamera instanceof Camera)) {\n throw Error(\"Set main camera: invalid parameter. The object is not an instance of Camera class.\")\n }\n this._mainCamera = mainCamera;\n }\n\n visit(node) {\n const cam = node.camera;\n if (cam && cam === this._mainCamera) {\n cam._isMain = true;\n }\n else if (cam && cam !== this._mainCamera) {\n cam._isMain = false;\n }\n }\n}\n\nclass GetMainCameraVisitor extends NodeVisitor {\n constructor() {\n super();\n this._mainCamera;\n this._firstCameraFound;\n }\n\n get mainCamera() {\n return this._mainCamera;\n }\n\n get firstCameraFound() {\n return this._firstCameraFound;\n }\n\n clear() {\n this._mainCamera = null;\n this._firstCameraFound = null;\n }\n\n visit(node) {\n // Note: The _isMain flag is set in Cmaer.SetMain() function\n if (node.camera && node.camera.isMain) {\n node.camera._isMain = false;\n if (this._mainCamera) {\n console.warn(\"More than one main cameras found in the scene\");\n }\n this._mainCamera = node.camera;\n }\n else if (node.camera && !this._firstCameraFound) {\n node.camera._isMain = false;\n this._firstCameraFound = node.camera;\n }\n }\n}\n\nexport default class Camera extends Component {\n static SetMain(sceneRoot,camera) {\n const isNode = sceneRoot instanceof Node;\n if (!isNode || sceneRoot.parent !== null) {\n throw Error(\"Camera.setMain(): invalid parameter. Object is not a scene root\");\n }\n const visitor = new SetMainCameraVisitor(camera);\n sceneRoot.accept(visitor);\n sceneRoot.__mainCamera__ = camera;\n }\n\n static GetMain(sceneRoot) {\n if (!sceneRoot.__mainCamera__) {\n const visitor = new GetMainCameraVisitor();\n sceneRoot.accept(visitor);\n sceneRoot.__mainCamera__ = visitor.result || visitor.firstCameraFound;\n if (sceneRoot.__mainCamera__) {\n sceneRoot.__mainCamera__._isMain = true;\n }\n }\n return sceneRoot.__mainCamera__;\n }\n\n setMain(sceneRoot) {\n Camera.SetMain(sceneRoot,this);\n }\n\n constructor() {\n super(\"Camera\");\n\n this._projectionStrategy = null;\n this._isMain = false;\n\n this._projectionMatrix = Mat4.MakePerspective(45.0, 1, 0.1, 100.0);\n this._viewport = new Vec(0, 0, 512, 512);\n\n this._focusDistance = 5;\n }\n\n clone() {\n const other = new Camera();\n other.assign(this);\n return other;\n }\n\n assign(other) {\n other._projectionStrategy = this._projectionStrategy?.clone() || null;\n // This attribute cannot be assigned, because there can only be one main camera.\n other._isMain = false;\n other._projectionMatrix = new Mat4(this._projectionMatrix);\n other._viewport = new Vec(this._viewport);\n other._focusDistance = this._focusDistance;\n }\n\n get isMain() {\n return this._isMain;\n }\n\n get projectionMatrix() {\n return this._projectionMatrix;\n }\n\n set projectionMatrix(p) {\n this._projectionStrategy = null;\n this._projectionMatrix = p;\n }\n\n get viewport() {\n return this._viewport;\n }\n\n set viewport(vp) {\n this._viewport = vp;\n }\n\n get projectionStrategy() {\n return this._projectionStrategy;\n }\n\n set projectionStrategy(ps) {\n this._projectionStrategy = ps;\n this._projectionStrategy.target = this._projectionMatrix;\n }\n\n get focusDistance() {\n return this._focusDistance;\n }\n\n set focusDistance(fd) {\n this._focusDistance = fd;\n }\n\n // This function regenerate the projection matrix with the new\n // aspect ratio, if the projectionStrategy is set.\n resize(width,height) {\n this._viewport = new Vec([0, 0, width, height]);\n if (this._projectionStrategy) {\n this._projectionStrategy.viewport = this._viewport;\n this._projectionStrategy.apply();\n }\n }\n\n async deserialize(sceneData,loader) {\n this.focusDistance = sceneData.focusDistance ?? this._focusDistance;\n if (sceneData.projectionMethod) {\n this.projectionStrategy = ProjectionStrategy.Factory(sceneData.projectionMethod || {});\n }\n }\n\n async serialize(sceneData,writer) {\n super.serialize(sceneData,writer);\n sceneData.isMain = this._isMain;\n sceneData.focusDistance = this._focusDistance;\n if (this.projectionStrategy) {\n const projMethod = {};\n sceneData.projectionMethod = projMethod;\n this.projectionStrategy.serialize(projMethod);\n }\n }\n}\n\n","\nexport default class EventBase {\n stopPropagation() {\n this._stopPropagation = true;\n }\n\n get isEventPropagationStopped() { return this._stopPropagation; }\n}\n","import EventBase from \"./EventBase\";\n\nexport const SpecialKey = {\n BACKSPACE: \"Backspace\",\n TAB: \"Tab\",\n ENTER: \"Enter\",\n SHIFT: \"Shift\",\n SHIFT_LEFT: \"ShiftLeft\",\n SHIFT_RIGHT: \"ShiftRight\",\n CTRL: \"Control\",\n CTRL_LEFT: \"ControlLeft\",\n CTRL_LEFT: \"ControlRight\",\n ALT: \"Alt\",\n ALT_LEFT: \"AltLeft\",\n ALT_RIGHT: \"AltRight\",\n PAUSE: \"Pause\",\n CAPS_LOCK: \"CapsLock\",\n ESCAPE: \"Escape\",\n PAGE_UP: \"PageUp\",\n PAGEDOWN: \"PageDown\",\n END: \"End\",\n HOME: \"Home\",\n LEFT_ARROW: \"ArrowLeft\",\n UP_ARROW: \"ArrowUp\",\n RIGHT_ARROW: \"ArrowRight\",\n DOWN_ARROW: \"ArrowDown\",\n INSERT: \"Insert\",\n DELETE: \"Delete\",\n SPACE: \"Space\"\n};\n\nexport const createKeyboardEvent = (evt) => {\n const code = SpecialKey[evt.code] != null ? evt.keyCode : evt.code;\n return new KeyboardEvent(code, evt);\n}\n\nexport default class KeyboardEvent extends EventBase {\n static IsSpecialKey(event) {\n return SpecialKey[event.code]!=null;\n }\n \n constructor(key,event) {\n super();\n this.key = key;\n this.event = event;\n }\n \n get isSpecialKey() {\n return KeyboardEvent.IsSpecialKey(this.event);\n }\n}\n","import { getMouseEventOffset } from \"./Canvas\";\nimport EventBase from \"./EventBase\";\n\nexport const MouseButton = {\n LEFT: 0,\n MIDDLE: 1,\n RIGHT: 2,\n NONE: -1\n};\n\nexport const MouseButtonEventType = {\n NONE: 0,\n UP: 1,\n DOWN: 2\n};\n\nexport const createMouseEvent = (evt,mainLoop,buttonType) => {\n mainLoop.mouseStatus.pos = getMouseEventOffset(evt, mainLoop.canvas);\n if (buttonType !== MouseButtonEventType.NONE) {\n const buttonStatus = buttonType === MouseButtonEventType.DOWN;\n if (evt.button === MouseButton.LEFT) {\n mainLoop.mouseStatus.leftButton = buttonStatus;\n }\n else if (evt.button === MouseButton.MIDDLE) {\n mainLoop.mouseStatus.middleButton = buttonStatus;\n }\n else if (evt.button === MouseButton.RIGHT) {\n mainLoop.mouseStatus.rightButton = buttonStatus;\n }\n }\n\n return new MouseEvent(evt.button, mainLoop.mouseStatus.pos.x, mainLoop.mouseStatus.pos.y, 0, evt);\n}\n\nconst g_mouseButtons = [false,false,false];\nexport const leftMouseButton = () => {\n return g_mouseButtons[0];\n}\n\nexport const middleMouseButton = () => {\n return g_mouseButtons[1];\n}\n\nexport const rightMouseButton = () => {\n return g_mouseButtons[2];\n}\n\nexport const clearMouseButtons = () => {\n g_mouseButtons[0] = false;\n g_mouseButtons[1] = false;\n g_mouseButtons[2] = false;\n}\n\nexport const setMouseButton = (event, status) => {\n switch (event.button) {\n case MouseButton.LEFT:\n g_mouseButtons[0] = status;\n break;\n case MouseButton.MIDDLE:\n g_mouseButtons[1] = status;\n break;\n case MouseButton.RIGHT:\n g_mouseButtons[2] = status;\n break;\n }\n}\nexport default class MouseEvent extends EventBase {\n\n constructor(button = MouseButton.NONE, x=-1, y=-1, delta=0,event=null) {\n super();\n this.button = button;\n this.x = x;\n this.y = y;\n this.delta = delta;\n this.event = event;\n }\n}\n","import Color from \"../base/Color\";\nimport Vec from \"../math/Vec\";\nimport { ProjectionStrategy, OrthographicProjectionStrategy } from \"./Camera\";\nimport Component from \"./Component\";\nimport { SpecialKey } from \"../app/KeyboardEvent\";\nimport MouseEvent, {\n leftMouseButton, \n middleMouseButton, \n rightMouseButton\n} from \"../app/MouseEvent\";\nimport { degreesToRadians } from \"../math/functions\";\n\nexport const Action = {\n NONE: 0,\n ROTATE: 1,\n PAN: 2,\n ZOOM: 3\n};\n\nexport function getOrbitAction(cameraCtrl) {\n let left = leftMouseButton(),\n middle = middleMouseButton(),\n right = rightMouseButton();\n \n switch (true) {\n case left==cameraCtrl._rotateButtons.left &&\n middle==cameraCtrl._rotateButtons.middle &&\n right==cameraCtrl._rotateButtons.right:\n return Action.ROTATE;\n case left==cameraCtrl._panButtons.left &&\n middle==cameraCtrl._panButtons.middle &&\n right==cameraCtrl._panButtons.right:\n return Action.PAN;\n case left==cameraCtrl._zoomButtons.left &&\n middle==cameraCtrl._zoomButtons.middle &&\n right==cameraCtrl._zoomButtons.right:\n return Action.ZOOM;\n }\n}\nexport default class OrbitCameraController extends Component {\n constructor(id = null) {\n super(id ?? \"OrbitCameraController\");\n\n this._rotateButtons = { left:true, middle:false, right:false };\n this._panButtons = { left:false, middle:false, right:true };\n this._zoomButtons = { left:false, middle:true, right:false };\n \n this._rotation = new Vec([0, 0]);\n this._distance = 5;\n this._center = new Vec([0, 0, 0]);\n this._rotationSpeed = 0.2;\n this._forward = 0;\n this._left = 0;\n this._wheelSpeed = 1;\n this._minFocus = 2;\n\n this._minPitch = -85.0;\n this._maxPitch = 85.0;\n this._minDistance = 0.4;\n this._maxDistance = 24.0;\n \n this._maxX = 45;\n this._minX = -45;\n this._minY = -45;\n this._maxY = 45;\n this._maxZ = 45;\n this._minZ = -45;\n\n this._displacementSpeed = 0.1;\n\n this._enabled = true;\n\n // Non-serializable attributes\n this._keys = {};\n this._lastTouch = [];\n }\n\n clone() {\n const result = new OrbitCameraController();\n result.assign(this);\n return result;\n }\n\n assign(other) {\n this._rotateButtons.left = other._rotateButtons.left;\n this._rotateButtons.middle = other._rotateButtons.middle;\n this._rotateButtons.right = other._rotateButtons.right;\n \n this._panButtons.left = other._panButtons.left;\n this._panButtons.middle = other._panButtons.middle;\n this._panButtons.right = other._panButtons.right;\n \n this._zoomButtons.left = other._zoomButtons.left;\n this._zoomButtons.middle = other._zoomButtons.middle;\n this._zoomButtons.right = other._zoomButtons.right;\n\n this._rotation = new Vec(other.rotation);\n this._distance = other.distance;\n this._center = new Vec(other.center);\n this._rotationSpeed = other.rotationSpeed;\n this._forward = other.forward;\n this._left = other.left;\n this._wheelSpeed = other.wheelSpeed;\n this._minFocus = other.minCameraFocus;\n this._minPitch = other.minPitch;\n this._maxPitch = other.maxPitch;\n this._minDistance = other.minDistance;\n this._maxDistance = other.maxDistance;\n this._maxX = other.maxX;\n this._minX = other.minX;\n this._minY = other.minY;\n this._maxY = other.maxY;\n this._maxZ = other.maxZ;\n this._minZ = other.minZ;\n this._displacementSpeed = other.displacementSpeed;\n this._enabled = other.enabled;\n }\n\n get rotation() { return this._rotation; }\n set rotation(r) { this._rotation = r; }\n get distance() { return this._distance; }\n set distance(d) { this._distance = d; }\n get center() { return this._center; }\n set center(c) { this._center = c; }\n get rotationSpeed() { return this._rotationSpeed; }\n set rotationSpeed(rs) { this._rotationSpeed = rs; }\n get forward() { return this._forward; }\n set forward(f) { this._forward = f; }\n get left() { return this._left; }\n set left(l) { this._left = l; }\n get wheelSpeed() { return this._wheelSpeed; }\n set wheelSpeed(w) { this._wheelSpeed = w; }\n\n get viewWidth() { return this._viewWidth; }\n \n get minCameraFocus() { return this._minFocus; }\n set minCameraFocus(f) { this._minFocus = f; }\n get minPitch() { return this._minPitch; }\n set minPitch(p) { this._minPitch = p; }\n get maxPitch() { return this._maxPitch; }\n set maxPitch(p) { this._maxPitch = p; }\n get minDistance() { return this._minDistance; }\n set minDistance(d) { this._minDistance = d; }\n get maxDistance() { return this._maxDistance; }\n set maxDistance(d) { this._maxDistance = d; }\n\n get minX() { return this._minX; }\n get maxX() { return this._maxX; }\n get minY() { return this._minY; }\n get maxY() { return this._maxY; }\n get minZ() { return this._minZ; }\n get maxZ() { return this._maxZ; }\n\n set minX(val) { this._minX = val; }\n set maxX(val) { this._maxX = val; }\n set minY(val) { this._minY = val; }\n set maxY(val) { this._maxY = val; }\n set minZ(val) { this._minZ = val; }\n set maxZ(val) { this._maxZ = val; }\n\n get displacementSpeed() { return this._displacementSpeed; }\n set displacementSpeed(s) { this._displacementSpeed = s; }\n\n get enabled() { return this._enabled; }\n set enabled(e) { this._enabled = e; }\n\n setRotateButtons(left,middle,right) {\n this._rotateButtons = { left:left, middle:middle, right:right };\n }\n \n setPanButtons(left,middle,right) {\n this._panButtons = { left:left, middle:middle, right:right };\n }\n \n setZoomButtons(left,middle,right) {\n this._zoomButtons = { left:left, middle:middle, right:right };\n }\n\n async deserialize(sceneData,loader) {\n this._rotateButtons = sceneData.rotateButtons || this._rotateButtons;\n this._panButtons = sceneData.panButtons || this._panButtons;\n this._zoomButtons = sceneData.zoomButtons || this._zoomButtons;\n this._rotation = new Vec(sceneData.rotation) || this._rotation;\n this._distance = sceneData.distance!==undefined ? sceneData.distance : this._distance;\n this._center = new Vec(sceneData.center) || this._center;\n this._rotationSpeed = sceneData.rotationSpeed!==undefined ? sceneData.rotationSpeed : this._rotationSpeed;\n this._forward = sceneData.forward!==undefined ? sceneData.forward : this._forward;\n this._left = sceneData.left!==undefined ? sceneData.left : this._left;\n this._wheelSpeed = sceneData.wheelSpeed!==undefined ? sceneData.wheelSpeed : this._wheelSpeed;\n this._minFocus = sceneData.minFocus!==undefined ? sceneData.minFocus : this._minFocus;\n this._minPitch = sceneData.minPitch!==undefined ? sceneData.minPitch : this._minPitch;\n this._maxPitch = sceneData.maxPitch!==undefined ? sceneData.maxPitch : this._maxPitch;\n this._minDistance = sceneData.minDistance!==undefined ? sceneData.minDistance : this._minDistance;\n this._maxDistance = sceneData.maxDistance!==undefined ? sceneData.maxDistance : this._maxDistance;\n this._maxX = sceneData.maxX!==undefined ? sceneData.maxX : this._maxX;\n this._minX = sceneData.minX!==undefined ? sceneData.minX : this._minX;\n this._minY = sceneData.minY!==undefined ? sceneData.minY : this._minY;\n this._maxY = sceneData.maxY!==undefined ? sceneData.maxY : this._maxY;\n this._maxZ = sceneData.maxZ!==undefined ? sceneData.maxZ : this._maxZ;\n this._minZ = sceneData.minZ!==undefined ? sceneData.minZ : this._minZ;\n this._displacementSpeed = sceneData.displacementSpeed!==undefined ? sceneData.displacementSpeed : this._displacementSpeed;\n this._enabled = sceneData.enabled!==undefined ? sceneData.enabled : this._enabled;\n }\n\n async serialize(sceneData,writer) {\n super.serialize(sceneData,writer);\n sceneData.rotateButtons = this._rotateButtons;\n sceneData.panButtons = this._panButtons;\n sceneData.zoomButtons = this._zoomButtons;\n sceneData.rotation = this._rotation.toArray();\n sceneData.distance = this._distance;\n sceneData.center = this._center.toArray();\n sceneData.rotationSpeed = this._rotationSpeed;\n sceneData.forward = this._forward;\n sceneData.left = this._left;\n sceneData.wheelSpeed = this._wheelSpeed;\n sceneData.minFocus = this._minFocus;\n sceneData.minPitch = this._minPitch;\n sceneData.maxPitch = this._maxPitch;\n sceneData.minDistance = this._minDistance;\n sceneData.maxDistance = this._maxDistance;\n sceneData.maxX = this._maxX;\n sceneData.minX = this._minX;\n sceneData.minY = this._minY;\n sceneData.maxY = this._maxY;\n sceneData.maxZ = this._maxZ;\n sceneData.minZ = this._minZ;\n sceneData.displacementSpeed = this._displacementSpeed;\n sceneData.enabled = this._enabled;\n }\n\n willUpdate(delta) {\n let orthoStrategy = this.camera && this.camera.projectionStrategy instanceof OrthographicProjectionStrategy ?\n this.camera.projectionStrategy : null;\n \n if (this.transform && this.enabled) {\n let forward = this.transform.matrix.forwardVector;\n let left = this.transform.matrix.leftVector;\n forward.scale(this._forward);\n left.scale(this._left);\n this._center = Vec.Add(Vec.Add(this._center, forward), left);\n \n let pitch = this._rotation.x>this._minPitch ? this._rotation.x:this._minPitch;\n pitch = pitch<this._maxPitch ? pitch : this._maxPitch;\n this._rotation.x = pitch;\n\n this._distance = this._distance>this._minDistance ? this._distance:this._minDistance;\n this._distance = this._distance<this._maxDistance ? this._distance:this._maxDistance;\n\n if (this._mouseButtonPressed) {\n let displacement = new Vec([0,0,0]);\n if (this._keys[SpecialKey.UP_ARROW]) {\n displacement = Vec.Add(displacement, this.transform.matrix.backwardVector);\n }\n if (this._keys[SpecialKey.DOWN_ARROW]) {\n displacement = Vec.Add(displacement, this.transform.matrix.forwardVector);\n }\n if (this._keys[SpecialKey.LEFT_ARROW]) {\n displacement = Vec.Add(displacement, this.transform.matrix.leftVector);\n }\n if (this._keys[SpecialKey.RIGHT_ARROW]) {\n displacement = Vec.Add(displacement, this.transform.matrix.rightVector);\n }\n displacement.scale(this._displacementSpeed);\n this._center = Vec.Add(this._center, displacement);\n }\n\n if (this._center.x<this._minX) this._center.x = this._minX;\n else if (this._center.x>this._maxX) this._center.x = this._maxX;\n\n if (this._center.y<this._minY) this._center.y = this._minY;\n else if (this._center.y>this._maxY) this._center.y = this._maxY;\n\n if (this._center.z<this._minZ) this._center.z = this._minZ;\n else if (this._center.z>this._maxZ) this._center.z = this._maxZ;\n\n \n this.transform.matrix.identity();\n\n if (orthoStrategy) {\n orthoStrategy.viewWidth = this._viewWidth;\n }\n else {\n this.transform.matrix.translate(0,0,this._distance);\n if (this.camera) {\n // Update the camera focus distance to optimize the shadow map rendering\n this.camera.focusDistance = this._distance;\n }\n }\n this.transform.matrix.rotate(degreesToRadians(pitch), -1,0,0)\n .rotate(degreesToRadians(this._rotation.y), 0,1,0)\n .translate(this._center);\n }\n\n }\n\n mouseDown(evt) {\n if (!this.enabled) return;\n this._mouseButtonPressed = true;\n this._lastPos = new Vec(evt.x,evt.y);\n }\n\n mouseUp(evt) {\n this._mouseButtonPressed = false;\n }\n \n mouseDrag(evt) {\n if (this.transform && this._lastPos && this.enabled) {\n let delta = new Vec(this._lastPos.y - evt.y,\n this._lastPos.x - evt.x);\n this._lastPos.set(evt.x,evt.y);\n let orthoStrategy = this.camera && this.camera.projectionStrategy instanceof OrthographicProjectionStrategy || false;\n\n switch (getOrbitAction(this)) {\n case Action.ROTATE:\n delta.x = delta.x * -1;\n this._rotation = Vec.Add(this._rotation, delta.scale(0.5));\n break;\n case Action.PAN:\n let up = this.transform.matrix.upVector;\n let left = this.transform.matrix.leftVector;\n \n if (orthoStrategy) {\n up.scale(delta.x * -0.0005 * this._viewWidth);\n left.scale(delta.y * -0.0005 * this._viewWidth);\n }\n else {\n up.scale(delta.x * -0.001 * this._distance);\n left.scale(delta.y * -0.001 * this._distance);\n }\n this._center = Vec.Add(Vec.Add(this._center, up), left);\n break;\n case Action.ZOOM:\n this._distance += delta.x * 0.01 * this._distance;\n this._viewWidth += delta.x * 0.01 * this._viewWidth;\n if (this._viewWidth<0.5) this._viewWidth = 0.5;\n break;\n }\t\t\t\t\n }\n }\n\n mouseWheel(evt) {\n if (!this.enabled) return;\n let mult = this._distance>0.01 ? this._distance:0.01;\n let wMult = this._viewWidth>1 ? this._viewWidth:1;\n this._distance += evt.delta * 0.001 * mult * this._wheelSpeed;\n this._viewWidth += evt.delta * 0.0001 * wMult * this._wheelSpeed;\n if (this._viewWidth<0.5) this._viewWidth = 0.5;\n }\n \n touchStart(evt) {\n if (!this.enabled) return;\n this._lastTouch = evt.touches;\n evt.stopPropagation();\n }\n \n touchMove(evt) {\n if (this._lastTouch.length==evt.touches.length && this.transform && this.enabled) {\n if (this._lastTouch.length==1) {\n // Rotate\n let last = this._lastTouch[0];\n let t = evt.touches[0];\n let delta = new Vec((last.y - t.y) * -1.0, last.x - t.x);\n \n this._rotation = Vec.Add(this._rotation, delta.scale(0.5));\n }\n else if (this._lastTouch.length==2) {\n // Pan/zoom\n let l0 = this._lastTouch[0];\n let l1 = this._lastTouch[1];\n let t0 = null;\n let t1 = null;\n evt.touches.forEach((touch) => {\n if (touch.identifier==l0.identifier) {\n t0 = touch;\n }\n else if (touch.identifier==l1.identifier) {\n t1 = touch;\n }\n });\n const dist0 = Vec.Magnitude(Vec.Sub(new Vec(l0.x,l0.y), new Vec(l1.x,l1.y)));\n const dist1 = Vec.Magnitude(Vec.Sub(new Vec(t0.x,t0.y), new Vec(t1.x,t1.y)));\n const delta = new Vec(l0.y - t0.y, l1.x - t1.x);\n const up = this.transform.matrix.upVector;\n const left = this.transform.matrix.leftVector;\n \n up.scale(delta.x * -0.001 * this._distance);\n left.scale(delta.y * -0.001 * this._distance);\n this._center = Vec.Add(this._center, Vec.Add(up, left));\n \n this._distance += (dist0 - dist1) * 0.005 * this._distance;\n }\n evt.stopPropagation();\n }\n this._lastTouch = evt.touches;\n }\n\n keyDown(evt) {\n if (!this.enabled) return;\n this._keys[evt.key] = true;\n }\n\n keyUp(evt) {\n if (!this.enabled) return;\n this._keys[evt.key] = false;\n }\n}\n","import Component from './Component';\nimport OrbitCameraController, { Action, getOrbitAction } from './OrbitCameraController';\nimport MouseEvent, {\n leftMouseButton,\n middleMouseButton,\n rightMouseButton\n} from '../app/MouseEvent';\nimport { SpecialKey } from '../app/KeyboardEvent';\nimport { degreesToRadians, lerp, clamp } from '../math/functions';\nimport Vec from '../math/Vec';\nimport { OrthographicProjectionStrategy } from './Camera';\nimport Mat4 from '../math/Mat4';\n\n\nexport default class SmoothOrbitCameraController extends OrbitCameraController {\n constructor() {\n super(\"SmoothOrbitCameraController\");\n this._smoothFactor = 0.009;\n this._action = Action.NONE;\n }\n\n clone() {\n const result = new SmoothOrbitCameraController();\n result.asign(this);\n return result;\n }\n\n assign(other) {\n super.assign(other);\n }\n\n willUpdate(delta) {\n if (this.transform && this.enabled) {\n let orthoStrategy = this.camera && this.camera.projectionStrategy instanceof OrthographicProjectionStrategy ?\n this.camera.projectionStrategy : null;\n\n if (this._mouseButtonPressed) {\n let displacement = new Vec([0,0,0]);\n if (this._keys[SpecialKey.UP_ARROW]) {\n displacement = Vec.Add(displacement, this.transform.matrix.backwardVector);\n }\n if (this._keys[SpecialKey.DOWN_ARROW]) {\n displacement = Vec.Add(displacement, this.transform.matrix.forwardVector);\n }\n if (this._keys[SpecialKey.LEFT_ARROW]) {\n displacement = Vec.Add(displacement, this.transform.matrix.leftVector);\n }\n if (this._keys[SpecialKey.RIGHT_ARROW]) {\n displacement = Vec.Add(displacement, this.transform.matrix.rightVector);\n }\n displacement.scale(this._displacementSpeed);\n this._center = Vec.Add(this._center, displacement);\n }\n\n this._center0 = this._center0 ?? Mat4.GetPosition(this.transform.matrix);\n this._distance0 = this._distance0 ?? Vec.Distance(this._center0, this._center);\n this._center0 = Vec.Lerp(this._center0, this._center, delta * this._smoothFactor);\n this._distance0 = lerp(this._distance0, this._distance, delta * this._smoothFactor * 2);\n this._pitch0 = this._pitch0 ?? this._rotation.x;\n this._yaw0 = this._yaw0 ?? this._rotation.y;\n\n this._pitch0 = lerp(this._pitch0, this._rotation.x, delta * this._smoothFactor);\n this._yaw0 = lerp(this._yaw0, this._rotation.y, delta * this._smoothFactor);\n\n // Clamp values\n this._distance = clamp(this._distance, this.minDistance, this.maxDistance);\n this._distance0 = clamp(this._distance0, this.minDistance, this.maxDistance);\n this._pitch0 = clamp(this._pitch0, this.minPitch, this.maxPitch);\n this._rotation.x = clamp(this._rotation.x, this.minPitch, this.maxPitch);\n const minDisp = new Vec(this.minX, this.minY, this.minZ);\n const maxDisp = new Vec(this.maxX, this.maxY, this.maxZ);\n this._center0 = Vec.Clamp(this._center0, minDisp, maxDisp);\n this._center = Vec.Clamp(this._center, minDisp, maxDisp);\n\n this.transform.matrix.identity();\n if (orthoStrategy) {\n orthoStrategy.viewWidth = this._viewWidth;\n }\n else {\n this.transform.matrix.translate(0, 0, this._distance0);\n if (this.camera) {\n // Update the camera focus distance to optimize the shadow map rendering\n this.camera.focusDistance = this._distance0;\n }\n }\n this.transform.matrix.rotate(degreesToRadians(-this._pitch0), 1, 0, 0)\n .rotate(degreesToRadians(this._yaw0), 0, 1, 0)\n .translate(this._center0);\n \n }\n }\n}","import { jointUrl } from \"../tools/Resource\";\nimport Component from \"./Component\";\n\nexport default class EnvironmentComponent extends Component {\n constructor() {\n super(\"Environment\");\n\n this._equirectangularTexture = \"\";\n this._irradianceIntensity = 1;\n this._showSkybox = true;\n this._cubemapSize = 512;\n this._irradianceMapSize = 32;\n this._specularMapSize = 32;\n this._specularMapL2Size = 32;\n\n // Non-serializable attribute\n this._environment = null;\n }\n\n set equirectangularTexture(v) {\n this._equirectangularTexture = v;\n }\n\n get equirectangularTexture() {\n return this._equirectangularTexture;\n }\n\n set irradianceIntensity(v) {\n this._irradianceIntensity = v;\n }\n\n get irradianceIntensity() {\n return this._irradianceIntensity;\n }\n\n set showSkybox(v) {\n this._showSkybox = v;\n }\n\n get showSkybox() {\n return this._showSkybox;\n }\n\n set cubemapSize(v) {\n this._cubemapSize = v;\n }\n\n get cubemapSize() {\n return this._cubemapSize;\n }\n\n set irradianceMapSize(v) {\n this._irradianceMapSize = v;\n }\n\n get irradianceMapSize() {\n return this._irradianceMapSize;\n }\n\n set specularMapSize(v) {\n this._specularMapSize = v;\n }\n\n get specularMapSize() {\n return this._specularMapSize;\n }\n\n set specularMapL2Size(v) {\n this._specularMapL2Size = v;\n }\n\n get specularMapL2Size() {\n return this._specularMapL2Size;\n }\n\n get environment() {\n return this._environment;\n }\n\n clone() {\n const result = new EnvironmentComponent();\n result.assign(this);\n return result;\n }\n\n assign(other) {\n this.equirectangularTexture = other.equirectangularTexture;\n this.irradianceIntensity = other.irradianceIntensity;\n this.showSkybox = other.showSkybox;\n this.cubemapSize = other.cubemapSize;\n this.irradianceMapSize = other.irradianceMapSize;\n this.specularMapSize = other.specularMapSize;\n this.specularMapL2Size = other.specularMapL2Size;\n }\n\n async deserialize(sceneData,loader) {\n super.deserialize(sceneData,loader);\n if (loader.currentPath && sceneData.equirectangularTexture) {\n this.equirectangularTexture = jointUrl(loader.currentPath,sceneData.equirectangularTexture);\n }\n this.irradianceIntensity = sceneData.irradianceIntensity || this.irradianceIntensity;\n this.showSkybox = sceneData.showSkybox ?? this.showSkybox;\n this.cubemapSize = sceneData.cubemapSize || this.cubemapSize;\n this.irradianceMapSize = sceneData.irradianceMapSize || this.irradianceMapSize;\n this.specularMapSize = sceneData.specularMapSize || this.specularMapSize;\n this.specularMapL2Size = sceneData.specularMapL2Size || this.specularMapL2Size;\n }\n\n async serialize(sceneData,writer) {\n await super.serialize(sceneData,writer);\n throw Error(\"EnvironmentComponent.serialize(): not implemented\");\n }\n\n async init() {\n this._environment = this.renderer.factory.environment();\n await this._environment.load({\n textureUrl: this.equirectangularTexture,\n environmentMapSize: [ this.cubemapSize, this.cubemapSize ],\n specularMapSize: [ this.specularMapSize, this.specularMapSize ],\n irradianceMapSize: [ this.irradianceMapSize, this.irradianceMapSize ]\n });\n }\n}","\n\nimport DrawableComponent from \"./Drawable\";\nimport TransformComponent from \"./Transform\";\nimport ChainComponent from \"./Chain\";\nimport {\n InputChainJoint as InputChainJointComponent,\n OutputChainJoint as OutputChainJointComponent } from \"./ChainJoint\";\nimport LightComponent from \"./LightComponent\";\nimport CameraComponent, {\n OpticalProjectionStrategy,\n PerspectiveProjectionStrategy,\n ProjectionStrategy\n} from \"./Camera\";\nimport OrbitCameraControllerComponent from \"./OrbitCameraController\";\nimport SmoothOrbitCameraControllerComponent from \"./SmoothOrbitCameraController\";\nimport EnvironmentComponent from \"./EnvironmentComponent\";\nimport Component, { registerComponent } from \"./Component\";\nimport Node from \"./Node\";\nimport NodeVisitor from \"./NodeVisitor\";\nimport FindNodeVisitor from \"./FindNodeVisitor\";\n\nexport const registerComponents = () => {\n registerComponent(\"Drawable\", DrawableComponent);\n registerComponent(\"Transform\", TransformComponent);\n registerComponent(\"Light\", LightComponent);\n registerComponent(\"Chain\", ChainComponent);\n registerComponent(\"InputChainJoint\", InputChainJointComponent);\n registerComponent(\"OutputChainJoint\", OutputChainJointComponent);\n registerComponent(\"Camera\", CameraComponent);\n registerComponent(\"OrbitCameraController\", OrbitCameraControllerComponent);\n registerComponent(\"SmoothOrbitCameraController\", SmoothOrbitCameraControllerComponent);\n registerComponent(\"Environment\", EnvironmentComponent);\n // TODO: Register more components\n}\n\nexport default {\n Component,\n DrawableComponent,\n TransformComponent,\n ChainComponent,\n InputChainJointComponent,\n OutputChainJointComponent,\n LightComponent,\n CameraComponent,\n OpticalProjectionStrategy,\n PerspectiveProjectionStrategy,\n ProjectionStrategy,\n OrbitCameraControllerComponent,\n SmoothOrbitCameraControllerComponent,\n EnvironmentComponent,\n registerComponents,\n registerComponent,\n Node,\n NodeVisitor,\n FindNodeVisitor\n}","\nexport default class AppController {\n constructor() {\n this._mainLoop = null;\n }\n\n get mainLoop() { return this._mainLoop; }\n set mainLoop(ml) { this._mainLoop = ml; }\n\n get canvas() { return this._mainLoop?.canvas; }\n\n get renderer() { return this._mainLoop?.canvas?.renderer; }\n\n get viewport() { return this.canvas?.viewport || { width: 0, height: 0, aspectRatio: 0 }; }\n\n async init() {}\n reshape(width,height) {}\n async frame(delta) {}\n display() {}\n destroy() {}\n keyDown(evt) {}\n keyUp(evt) {}\n mouseUp(evt) {}\n mouseDown(evt) {}\n mouseMove(evt) {}\n mouseOut(evt) {}\n mouseDrag(evt) {}\n mouseWheel(evt) {}\n touchStart(evt) {}\n touchMove(evt) {}\n touchEnd(evt) {}\n}\n","import { getEventTouches } from \"./Canvas\";\nimport EventBase from \"./EventBase\";\n\nexport const createTouchEvent = (evt,mainLoop) => {\n const touches = getEventTouches(evt,mainLoop.canvas);\n return new TouchEvent(touches, evt);\n}\n\nexport default class TouchEvent extends EventBase {\n constructor(touches,event) {\n super();\n this.touches = touches;\n this.event = event;\n }\n}\n","\nimport { \n MouseButtonEventType, \n createMouseEvent, \n leftMouseButton,\n middleMouseButton,\n clearMouseButtons,\n setMouseButton\n} from \"./MouseEvent\";\nimport { createTouchEvent } from \"./TouchEvent\";\nimport { createKeyboardEvent } from \"./KeyboardEvent\";\n\nexport const FrameUpdate = {\n AUTO: 0,\n MANUAL: 1\n};\n\nconst g_animationLoop = {\n lastTime: 0,\n mainLoop: []\n};\n\nasync function animationLoop(totalTime) {\n totalTime = totalTime || 0;\n requestAnimationFrame(animationLoop);\n const elapsed = totalTime - g_animationLoop.lastTime;\n g_animationLoop.lastTime = totalTime;\n for (const ml of g_animationLoop.mainLoop) {\n await onUpdate(ml, elapsed);\n }\n}\n\nclass MouseStatus {\n constructor() {\n this.pos = {x: 0, y: 0};\n this.leftButton = false;\n this.middleButton = false;\n this.rightButton = false;\n }\n\n get anyButton() { return this.leftButton || this.middleButton || this.rightButton; }\n}\n\nexport default class MainLoop {\n constructor(canvas, appController) {\n this._canvas = canvas;\n this._canvas._mainLoop = this;\n this._appController = appController;\n this._appController._mainLoop = this;\n this._updateMode = FrameUpdate.AUTO;\n this._firstFrameRendered = false;\n this._redisplayFrames = 1;\n\n this._mouseStatus = new MouseStatus();\n }\n\n get canvas() { return this._canvas; }\n get appController() { return this._appController; }\n get renderer() { return this._canvas?.renderer; }\n\n get updateMode() { return this._updateMode; }\n set updateMode(um) { this._updateMode = um; }\n\n get mouseStatus() { return this._mouseStatus; }\n\n get redisplay() { return this._redisplayFrames>0; }\n\n async run() {\n await this.canvas.init();\n await this.appController.init();\n initEvents(this);\n g_animationLoop.mainLoop.push(this);\n animationLoop();\n }\n\n exit() {\n this.appController.destroy();\n const i = g_animationLoop.mainLoop.indexOf(this);\n if (i!==-1) {\n g_animationLoop.mainLoop.splice(i,1);\n }\n }\n\n postReshape() {\n onResize(this);\n }\n\n postRedisplay({ frames=10,timeout=10 } = {}) {\n if (timeout <= 0) {\n this._redisplayFrames = frames;\n }\n else {\n setTimeout(() => this._redisplayFrames = frames, timeout);\n }\n }\n}\n\n\nfunction initEvents(mainLoop) {\n onResize(mainLoop);\n\n const handlePropagation = (bgEvt,evt) => {\n if (bgEvt.isEventPropagationStopped) {\n evt.stopPropagation();\n evt.preventDefault();\n return false;\n }\n return true;\n }\n\n const c = mainLoop.canvas.domElement;\n c.__mainLoop = mainLoop;\n c.addEventListener(\"mousedown\", evt => {\n return handlePropagation(onMouseDown(evt, evt.target.__mainLoop), evt);\n });\n c.addEventListener(\"mousemove\", evt => {\n return handlePropagation(onMouseMove(evt, evt.target.__mainLoop), evt);\n });\n c.addEventListener(\"mouseout\", evt => {\n return handlePropagation(onMouseOut(evt, evt.target.__mainLoop), evt);\n });\n \n c.addEventListener(\"mouseover\", evt => {\n return handlePropagation(onMouseOver(evt, evt.target.__mainLoop), evt);\n });\n\n c.addEventListener(\"mouseup\", evt => {\n return handlePropagation(onMouseUp(evt, evt.target.__mainLoop), evt);\n });\n \n c.addEventListener(\"touchstart\", evt => {\n return handlePropagation(onTouchStart(evt, evt.target.__mainLoop), evt);\n });\n\n c.addEventListener(\"touchmove\", evt => {\n return handlePropagation(onTouchMove(evt, evt.target.__mainLoop), evt);\n });\n \n c.addEventListener(\"touchend\", evt => {\n return handlePropagation(onTouchEnd(evt, evt.target.__mainLoop), evt);\n });\n\n const mouseWheelEvt = (/Firefox/i.test(navigator.userAgent))? \"DOMMouseScroll\" : \"mousewheel\";\n c.addEventListener(mouseWheelEvt, evt => {\n return handlePropagation(onMouseWheel(evt, evt.target.__mainLoop), evt);\n });\n\n window.addEventListener(\"keydown\", evt => {\n g_animationLoop.mainLoop.forEach(ml => onKeyDown(evt, ml));\n });\n\n window.addEventListener(\"keyup\", evt => {\n g_animationLoop.mainLoop.forEach(ml => onKeyUp(evt, ml));\n });\n\n window.addEventListener(\"resize\", evt => {\n onResize(mainLoop);\n });\n\n c.oncontextmenu = evt => false;\n}\n\nfunction onResize(mainLoop) {\n const dpi = window.devicePixelRatio;\n mainLoop.appController.reshape(mainLoop.canvas.width * dpi, mainLoop.canvas.height * dpi);\n}\n\nasync function onUpdate(mainLoop, elapsed) {\n if (mainLoop.redisplay) {\n if (mainLoop.updateMode === FrameUpdate.AUTO) {\n mainLoop._redisplayFrames = 1;\n }\n else {\n mainLoop._redisplayFrames--;\n }\n if (mainLoop._redisplayFrames > 0 || !mainLoop._firstFrameRendered) {\n await mainLoop.appController.frame(elapsed);\n mainLoop.appController.display();\n mainLoop._firstFrameRendered = true;\n }\n }\n}\n\nfunction onMouseDown(evt,mainLoop) {\n const bg2Event = createMouseEvent(evt, mainLoop, MouseButtonEventType.DOWN);\n setMouseButton(bg2Event, true);\n mainLoop.appController.mouseDown(bg2Event);\n return bg2Event;\n}\n\nfunction onMouseMove(evt,mainLoop) {\n const bg2Event = createMouseEvent(evt, mainLoop, MouseButtonEventType.NONE);\n mainLoop.appController.mouseMove(bg2Event);\n if (mainLoop.mouseStatus.anyButton) {\n mainLoop.appController.mouseDrag(bg2Event);\n }\n return bg2Event;\n}\n\nfunction onMouseOut(evt,mainLoop) {\n const bg2Event = createMouseEvent(evt, mainLoop, MouseButtonEventType.NONE);\n clearMouseButtons();\n mainLoop.appController.mouseOut(bg2Event);\n return bg2Event;\n}\n\nfunction onMouseOver(evt,mainLoop) {\n return onMouseMove(evt,mainLoop)\n}\n\nfunction onMouseUp(evt,mainLoop) {\n const bg2Event = createMouseEvent(evt, mainLoop, MouseButtonEventType.UP);\n setMouseButton(bg2Event, false);\n mainLoop.appController.mouseUp(bg2Event);\n return bg2Event;\n}\n\nfunction onMouseWheel(evt,mainLoop) {\n const bg2Event = createMouseEvent(evt, mainLoop, MouseButtonEventType.NONE);\n bg2Event.delta = evt.wheelDelta ? evt.wheelDelta * -1 : evt.detail * 10;\n mainLoop.appController.mouseWheel(bg2Event);\n return bg2Event;\n}\n\nfunction onTouchStart(evt,mainLoop) {\n const bgEvent = createTouchEvent(evt,mainLoop);\n mainLoop.appController.touchStart(bgEvent);\n return bgEvent;\n}\n\nfunction onTouchMove(evt,mainLoop) {\n const bgEvent = createTouchEvent(evt,mainLoop);\n mainLoop.appController.touchMove(bgEvent);\n return bgEvent;\n}\n\nfunction onTouchEnd(evt,mainLoop) {\n const bgEvent = createTouchEvent(evt,mainLoop);\n mainLoop.appController.touchEnd(bgEvent);\n return bgEvent;\n}\n\nfunction onKeyDown(evt,mainLoop) {\n const bgEvent = createKeyboardEvent(evt);\n mainLoop.appController.keyDown(bgEvent);\n return bgEvent;\n}\n\nfunction onKeyUp(evt,mainLoop) {\n const bgEvent = createKeyboardEvent(evt);\n mainLoop.appController.keyUp(bgEvent);\n return bgEvent;\n}\n","import AppController from \"./AppController\";\nimport Canvas, {\n getMouseEventOffset,\n getEventTouches\n} from \"./Canvas\";\nimport EventBase from \"./EventBase\";\nimport KeyboardEvent from \"./KeyboardEvent\";\nimport MainLoop, {\n FrameUpdate\n} from \"./MainLoop\";\nimport MouseEvent from \"./MouseEvent\";\nimport TouchEvent from \"./TouchEvent\";\n\nexport default {\n AppController,\n FrameUpdate,\n Canvas,\n getMouseEventOffset,\n getEventTouches,\n EventBase,\n KeyboardEvent,\n MainLoop,\n MouseEvent,\n TouchEvent\n}","\nexport default class EnvironmentRenderer {\n constructor(renderer,environment) {\n if (environment._renderer) {\n throw new Error(\"Invalid environment renderer initialization: this environment is already controlled by a renderer.\");\n }\n\n this._renderer = renderer;\n this._environment = environment;\n this._environment._renderer = this;\n }\n}\n","\nexport default class FrameBuffer {\n constructor(renderer) {\n this._renderer = renderer;\n }\n\n get renderer() {\n return this._renderer;\n }\n\n clearColor() {\n this.clear({ color: true, depth: false, stencil: false });\n }\n\n clearDepth() {\n this.clear({ color: true, depth: true, stencil: false });\n }\n\n clearStencil() {\n this.clear({color: false, depth: false, stencil: true });\n }\n\n clear({ color = true, depth = true, stencil = false } = {}) {\n throw new Error(\"FrameBuffer: calling base implementation of clear()\");\n }\n}\n","import Texture from \"../base/Texture\";\n\nexport default class MaterialRenderer {\n constructor(renderer, material) {\n this._renderer = renderer;\n this._material = material;\n }\n\n get renderer() {\n return this._renderer;\n }\n\n get material() {\n return this._material;\n }\n\n getTextureRenderer(materialAttribute) {\n const element = this.material[materialAttribute];\n if (element instanceof Texture) {\n // The texture renderer factory will create a texture renderer, or\n // return the existing one\n return this.renderer.factory.texture(element);\n }\n return null;\n }\n\n}\n\n","\nexport const BlendEquation = {\n ADD: 1,\n SUBTRACT: 2,\n REVERSE_SUBTRACT: 3\n};\n\nexport const BlendFunction = {\n NULL: 0,\n ZERO: 1,\n ONE: 2,\n SRC_COLOR: 3,\n ONE_MINUS_SRC_COLOR: 4,\n DST_COLOR: 5,\n ONE_MINUS_DST_COLOR: 6,\n SRC_ALPHA: 7,\n ONE_MINUS_SRC_ALPHA: 8,\n DST_ALPHA: 9,\n ONE_MINUS_DST_ALPHA: 10\n}\n\nexport default class Pipeline {\n constructor(renderer) {\n this._renderer = renderer;\n\n // Initialize default blend state\n this.setBlendState({});\n\n this._depthTestEnabled = true;\n\n this._cullFace = true;\n }\n\n get renderer() {\n return this._renderer;\n }\n\n setBlendState({\n enabled = false,\n blendEquation = BlendEquation.ADD,\n blendFuncSrc = BlendFunction.SRC_ALPHA,\n blendFuncDst = BlendFunction.ONE_MINUS_SRC_ALPHA,\n blendFuncSrcAlpha = BlendFunction.SRC_ALPHA,\n blendFuncDstAlpha = BlendFunction.ONE_MINUS_SRC_ALPHA\n }) {\n this._blendState = {\n enabled,\n blendEquation,\n blendFuncSrc,\n blendFuncDst,\n blendFuncSrcAlpha,\n blendFuncDstAlpha\n }\n }\n\n get blendState() {\n return this._blendState;\n }\n\n get depthTest() {\n return this._depthTestEnabled;\n }\n\n set depthTest(dt) {\n this._depthTestEnabled = dt;\n }\n\n set cullFace(cf) {\n this._cullFace = cf;\n }\n\n get cullFace() {\n return this._cullFace;\n }\n \n create() {\n throw new Exception(\"Pipeline.create(): calling base class method.\");\n }\n\n activate() {\n throw new Exception(\"Pipeline.activate(): calling base class method.\");\n }\n}","\nexport default class PolyListRenderer {\n constructor(renderer,polyList) {\n if (polyList.renderer) {\n throw new Error(\"Invalid initialization of polyList renderer: the polyList is already controlled by another polyList renderer.\")\n }\n this._renderer = renderer;\n this._polyList = polyList;\n this._polyList._renderer = this;\n }\n\n get polyList() {\n return this._polyList;\n }\n\n get renderer() {\n return this._renderer;\n }\n\n init() {\n\n }\n\n // Updates the internal state of the renderer. It is necessary to call this\n // function if the polyList has been modified, so that the internal objects\n // of the specific rendering API are updated.\n refresh() {\n\n }\n\n bindBuffers() {\n\n }\n\n draw() {\n\n }\n\n destroy() {\n \n }\n}\n","import Texture, { TextureDataType, TextureTarget, TextureRenderTargetAttachmentNames } from \"../base/Texture\";\nimport Vec from \"../math/Vec\";\nimport Mat4 from \"../math/Mat4\";\n\nexport const RenderBufferType = {\n UNINITIALIZED: 0,\n TEXTURE: 1,\n CUBE_MAP: 2\n};\n\nexport const RenderBufferTypeName = {\n 0: 'UNINITIALIZED',\n 1: 'TEXTURE',\n 2: 'CUBE_MAP'\n};\n\nexport const CubeMapFace = {\n NONE: 0,\n POSITIVE_X: 1,\n NEGATIVE_X: 2,\n POSITIVE_Y: 3,\n NEGATIVE_Y: 4,\n POSITIVE_Z: 5,\n NEGATIVE_Z: 6\n}\n\nfunction getTargetType(texture) {\n if (texture.target === TextureTarget.TEXTURE_2D) {\n return RenderBufferType.TEXTURE;\n }\n else if (texture.target === TextureTarget.CUBE_MAP) {\n return RenderBufferType.CUBE_MAP;\n }\n}\n\nfunction getRenderBufferTypeName(type) {\n return RenderBufferTypeName[type];\n}\n\n\nexport default class RenderBuffer {\n constructor(renderer, size = new Vec([512,512])) {\n this._renderer = renderer;\n this._attachments = {};\n this._size = size;\n this._dirty = true;\n this._type = RenderBufferType.UNINITIALIZED;\n }\n\n get renderer() { return this._renderer; }\n\n get type() { return this._type; }\n\n get size() { return this._size; }\n\n set size(s) {\n this._size = new Vec(s); \n for (const att in this.attachments) {\n const textureRenderer = this.attachments[att];\n const texture = textureRenderer.texture;\n if (!Vec.Equals(texture.size, this.size)) {\n texture.size = this.size;\n }\n }\n this._dirty = true;\n }\n\n // This is an object of type { TextureRenderTargetAttachmentName: TextureRenderer }\n get attachments() { return this._attachments; }\n\n getTextureRenderer(attachment) {\n return this._attachments[attachment];\n }\n\n getTexture(attachment) {\n return this.getAttachment(attachment)?.texture;\n }\n\n get dirty() { return this._dirty; }\n\n setUpdated(updated = true) { this._dirty = !updated; }\n\n async attachTexture(texture) {\n if (this._attachments[texture.renderTargetAttachment]) {\n throw new Error(`RenderBuffer.attachTexture(): The attachment is occupied by another texture ${TextureRenderTargetAttachmentNames[texture.renderTargetAttachment]}`);\n }\n\n if (this.type !== RenderBufferType.UNINITIALIZED) {\n const type = getTargetType(texture);\n if (this.type !== type) {\n throw new Error(`Invalid texture attachment. RenderBuffer is ${ getRenderBufferTypeName(this.type) }, but the new attachment is ${ getRenderBufferTypeName(type) }`);\n }\n }\n else {\n this._type = getTargetType(texture);\n }\n\n texture.dataType = TextureDataType.RENDER_TARGET;\n texture.size = this.size;\n await texture.loadImageData();\n const textureRenderer = this.renderer.factory.texture(texture);\n this._attachments[texture.renderTargetAttachment] = textureRenderer;\n }\n\n detachTexture(texture) {\n const textureRenderer = this._attachments[texture.renderTargetAttachment];\n if (!textureRenderer) {\n throw new Error(`RenderBuffer.detachTexture(): no texture attached to ${TextureRenderTargetAttachmentNames[texture.renderTargetAttachment]}`);\n }\n\n if (textureRenderer.texture !== texture) {\n throw new Error(`RenderBuffer.detachTexture(): the texture is not attached to ${TextureRenderTargetAttachmentNames[texture.renderTargetAttachment]}`);\n }\n\n this._attachments[texture.renderTargetAttachment] = null;\n textureRenderer.deleteTexture();\n this._dirty = true;\n }\n\n beginUpdate(textureFace = CubeMapFace.NONE) {\n throw new Error(\"RenderBuffer.beginUpdate(): calling base implementation.\");\n }\n\n endUpdate(textureFace = CubeMapFace.NONE) {\n throw new Error(\"RenderBuffer.endUpdate(): calling base implementation.\");\n }\n\n destroy() {\n throw new Error(\"RenderBuffer.destory(): calling base implementation.\");\n }\n\n get frameBuffer() {\n throw new Error(\"RenderBuffer.frameBuffer: calling base implementation\");\n }\n\n // Save and restore buffer states must save the currently binded array buffer and restore it\n saveVertexBufferState() {\n throw new Error(\"RenderBuffer.saveVertexBufferState: callig base implementation\");\n }\n\n restoreVertexBufferState() {\n throw new Error(\"RenderBuffer.restoreVertexBufferState: calling base implementation\");\n }\n\n update(drawFunc) {\n this.saveVertexBufferState();\n if (this.type === RenderBufferType.TEXTURE) {\n this.beginUpdate();\n drawFunc();\n this.endUpdate();\n }\n else if (this.type === RenderBufferType.CUBE_MAP) {\n const viewMatrix = Mat4.MakeIdentity();\n const projectionMatrix = Mat4.MakePerspective(90, 1, 0.1, 100000);\n for (let i = 0; i<6; ++i) {\n const face = CubeMapFace.POSITIVE_X + i;\n switch (face) {\n case CubeMapFace.POSITIVE_X:\n viewMatrix.lookAt([-1, 0, 0], [0, 0, 0], [0,-1, 0]);\n break;\n case CubeMapFace.NEGATIVE_X:\n viewMatrix.lookAt([ 1, 0, 0], [0, 0, 0], [0,-1, 0]);\n break;\n case CubeMapFace.POSITIVE_Y:\n viewMatrix.lookAt([ 0,-1, 0], [0, 0, 0], [0, 0, 1]);\n break;\n case CubeMapFace.NEGATIVE_Y:\n viewMatrix.lookAt([ 0, 1, 0], [0, 0, 0], [0, 0,-1]);\n break;\n case CubeMapFace.POSITIVE_Z:\n viewMatrix.lookAt([ 0, 0,-1], [0, 0, 0], [0,-1, 0]);\n break;\n case CubeMapFace.NEGATIVE_Z:\n viewMatrix.lookAt([ 0, 0, 1], [0, 0, 0], [0,-1, 0]);\n break;\n }\n \n this.beginUpdate(face);\n drawFunc(face,viewMatrix,projectionMatrix);\n this.endUpdate(face);\n }\n }\n this.restoreVertexBufferState();\n }\n\n readPixels(x, y, width, height, format, type) {\n \n }\n }\n","\nimport { RenderLayer } from \"../base/PolyList\";\nimport Mat4 from \"../math/Mat4\";\n\nexport default class RenderState {\n constructor({\n shader = null,\n polyListRenderer = null,\n materialRenderer = null,\n modelMatrix = Mat4.MakeIdentity(),\n viewMatrix = Mat4.MakeIdentity(),\n projectionMatrix = Mat4.MakeIdentity(),\n pipeline = null\n }) {\n this._shader = shader;\n this._polyListRenderer = polyListRenderer;\n this._materialRenderer = materialRenderer;\n this._modelMatrix = modelMatrix;\n this._viewMatrix = viewMatrix;\n this._projectionMatrix = projectionMatrix;\n this._pipeline = pipeline;\n }\n\n get valid() {\n return this._shader && this._plistRenderer && this._materialRenderer;\n }\n\n get renderer() { return this._polyListRenderer?.renderer; }\n\n set shader(shader) { this._shader = shader; }\n get shader() { return this._shader; }\n set polyListRenderer(polyListRenderer) { this._polyListRenderer = polyListRenderer; }\n get polyListRenderer() { return this._polyListRenderer; }\n set materialRenderer(materialRenderer) { this._materialRenderer = materialRenderer; }\n get materialRenderer() { return this._materialRenderer; }\n set modelMatrix(model) { this._modelMatrix = model; }\n get modelMatrix() { return this._modelMatrix; }\n set viewMatrix(view) { this._viewMatrix = view; }\n get viewMatrix() { return this._viewMatrix; }\n set projectionMatrix(projection) { this._projectionMatrix = projection; }\n get projectionMatrix() { return this._projectionMatrix; }\n get pipeline() { return this._pipeline; }\n set pipeline(pl) { this._pipeline = pl; }\n\n isLayerEnabled(layer) {\n const { polyList } = this._polyListRenderer;\n const { material } = this._materialRenderer;\n const renderLayers = polyList.renderLayers === RenderLayer.AUTO ?\n (material.isTransparent ? RenderLayer.TRANSPARENT_DEFAULT : RenderLayer.OPAQUE_DEFAULT) :\n (polyList.renderLayers);\n \n return renderLayers & layer;\n }\n\n draw({ overrideShader = null, overrideViewMatrix = null, overrideProjectionMatrix = null} = {}) {\n if (!this.polyListRenderer.polyList.visible) {\n return;\n }\n if (this.renderer.debugMode) {\n console.log(`======= Begin render polyList \"${this.polyListRenderer.polyList.name}\" ==============`);\n }\n\n if (this.pipeline) {\n this.pipeline.activate();\n }\n this.polyListRenderer.bindBuffers();\n const shader = overrideShader || this.shader;\n const viewMatrix = overrideViewMatrix || this.viewMatrix;\n const projectionMatrix = overrideProjectionMatrix || this.projectionMatrix;\n shader.setup(\n this.polyListRenderer,\n this.materialRenderer,\n this.modelMatrix,\n viewMatrix,\n projectionMatrix\n );\n this.polyListRenderer.draw();\n if (this.renderer.debugMode) {\n console.log(`======= End render polyList \"${this.polyListRenderer.polyList.name}\" ==============`);\n }\n }\n}\n","\nimport { getLayers, RenderLayer } from \"../base/PolyList\";\nimport Mat4 from \"../math/Mat4\";\nimport { BlendFunction } from \"./Pipeline\";\nimport RenderState from \"./RenderState\";\n\nexport default class RenderQueue {\n constructor(renderer) {\n this._renderer = renderer;\n\n this._queues = [];\n\n this._viewMatrix = Mat4.MakeIdentity();\n this._projectionMatrix = Mat4.MakeIdentity();\n\n this._lights = [];\n }\n\n get renderer() {\n return this._renderer;\n }\n\n get queues() {\n return this._queues;\n }\n\n get viewMatrix() {\n return this._viewMatrix;\n }\n\n set viewMatrix(m) {\n this._viewMatrix.assign(m);\n }\n\n get projectionMatrix() {\n return this._projectionMatrix;\n }\n\n set projectionMatrix(m) {\n this._projectionMatrix.assign(m);\n }\n\n get lights() {\n return this._lights;\n }\n\n getQueue(layer) {\n return this._queues.find(l => l.layer === layer);\n }\n\n enableQueue(layer, shader, { beginOperation = null, endOperation = null, enabled = true } = {}) {\n // TODO: Create pipelines for different render states (cull face, front face etc.)\n const cullBackFace = this.renderer.factory.pipeline();\n const cullFaceDisabled = this.renderer.factory.pipeline();\n if (layer === RenderLayer.TRANSPARENT_DEFAULT) {\n const blendState = {\n enabled: true,\n blendFuncSrc: BlendFunction.SRC_ALPHA,\n blendFuncDst: BlendFunction.ONE_MINUS_SRC_ALPHA,\n blendFuncSrcAlpha: BlendFunction.ONE,\n blendFuncDstAlpha: BlendFunction.ONE_MINUS_SRC_ALPHA\n };\n cullBackFace.setBlendState(blendState);\n cullFaceDisabled.setBlendState(blendState);\n }\n cullBackFace.create();\n cullFaceDisabled.cullFace = false;\n cullFaceDisabled.create();\n\n \n \n\n const queue = this.getQueue(layer);\n if (!queue) {\n this._queues.push({\n layer,\n shader,\n beginOperation,\n endOperation,\n enabled,\n pipelines: {\n cullBackFace,\n cullFaceDisabled\n },\n queue: []\n });\n }\n else {\n queue.enabled = true;\n }\n }\n\n disableQueue(layer) {\n const queue = this.getQueue(layer);\n if (queue) {\n queue.enabled = true;\n }\n }\n\n isQueueEnabled(layer) {\n return this.getQueue(layer)?.enabled || false;\n }\n\n newFrame() {\n this._queues.forEach(q => q.queue = []);\n this._lights = [];\n }\n\n addPolyList(polyListRenderer, materialRenderer, modelMatrix) {\n const plistLayers = getLayers(polyListRenderer.polyList, materialRenderer.material);\n this._queues.forEach(({ layer, shader, queue, pipelines }) => {\n if (plistLayers & layer) {\n const { polyList } = polyListRenderer;\n let pipeline = null;\n // TODO: Select pipeline based on material and polyList properties\n if (polyList.enableCullFace) {\n pipeline = pipelines.cullBackFace;\n }\n else {\n pipeline = pipelines.cullFaceDisabled;\n }\n queue.push(new RenderState({\n shader,\n polyListRenderer,\n materialRenderer,\n modelMatrix,\n viewMatrix: this.viewMatrix,\n projectionMatrix: this.projectionMatrix,\n pipeline\n }))\n }\n });\n }\n\n addLight(light, transform) {\n // Clear the depth texture, because this parameter\n // is set each frame by the ShadowRenderer\n light.depthTexture = null;\n light.mvpMatrix = null;\n this._lights.push({ light, transform });\n }\n\n draw(layer) {\n const queue = this.getQueue(layer);\n if (queue) {\n if (typeof(queue.beginOperation) === \"function\") {\n queue.beginOperation(layer);\n }\n \n //queue.pipeline.activate();\n queue.queue.forEach(rs => {\n rs.draw();\n });\n if (typeof(queue.endOperation) === \"function\") {\n queue.endOperation(layer);\n }\n }\n else {\n console.warn(`No render queue found for layer ${layer}`);\n }\n }\n}","import { RenderLayer } from \"../base/PolyList\";\nimport { BlendFunction } from \"./Pipeline\";\nimport RenderQueue from \"./RenderQueue\";\nimport NodeVisitor from \"../scene/NodeVisitor\";\nimport Mat4 from \"../math/Mat4\";\nimport Vec from \"../math/Vec\";\nimport Camera from \"../scene/Camera\";\nimport FindNodeVisitor from \"../scene/FindNodeVisitor\";\nimport Transform from \"../scene/Transform\";\nimport { bindRenderer, init } from \"../scene/Node\";\nimport LightComponent from \"../scene/LightComponent\";\n\nexport class FrameVisitor extends NodeVisitor {\n constructor(renderQueue) {\n super();\n this._renderQueue = renderQueue;\n this._delta = 0;\n this._modelMatrix = Mat4.MakeIdentity();\n this._matrixStack = [];\n }\n\n get delta() { return this._delta; }\n set delta(d) { this._delta = d; }\n\n get modelMatrix() { return this._modelMatrix; }\n \n visit(node) {\n this._matrixStack.push(new Mat4(this._modelMatrix));\n node.frame(this._delta, this._modelMatrix, this._renderQueue);\n }\n\n didVisit(node) {\n this._modelMatrix = this._matrixStack[this._matrixStack.length - 1] || Mat4.MakeIdentity();\n this._matrixStack.pop();\n }\n}\n\nexport class BindRendererVisitor extends NodeVisitor {\n constructor(renderer) {\n super(renderer);\n this._renderer = renderer;\n }\n\n visit(node) {\n bindRenderer(node, this._renderer);\n }\n}\n\nexport class InitVisitor extends NodeVisitor {\n constructor() {\n super();\n }\n\n async asyncVisit(node) {\n await init(node);\n }\n}\n\nexport class EventCallbackVisitor extends NodeVisitor {\n constructor(callbackName) {\n super();\n this._callbackName = callbackName;\n this._event = null;\n }\n\n set event(evt) {\n this._event = evt;\n }\n\n get event() {\n return this._event;\n }\n\n visit(node) {\n node[this._callbackName](this._event);\n }\n}\n\nexport default class SceneRenderer {\n constructor(renderer) {\n this._renderer = renderer;\n this._keyDownVisitor = new EventCallbackVisitor('keyDown');\n this._keyUpVisitor = new EventCallbackVisitor('keyUp');\n this._mouseUpVisitor = new EventCallbackVisitor('mouseUp');\n this._mouseDownVisitor = new EventCallbackVisitor('mouseDown');\n this._mouseMoveVisitor = new EventCallbackVisitor('mouseMove');\n this._mouseOutVisitor = new EventCallbackVisitor('mouseOut');\n this._mouseDragVisitor = new EventCallbackVisitor('mouseDrag');\n this._mouseWheelVisitor = new EventCallbackVisitor('mouseWheel');\n this._touchStartVisitor = new EventCallbackVisitor('touchStart');\n this._touchMoveVisitor = new EventCallbackVisitor('touchMove');\n this._touchEndVisitor = new EventCallbackVisitor('touchEnd');\n\n // This will be the EnvironmentComponent component, if one is defined in the scene.\n this._sceneEnvironment = null;\n }\n\n // Implement in subclasses\n get brightness() { return 0; }\n set brightness(_value) { }\n get contrast() { return 0; }\n set contrast(value) { }\n\n get renderer() {\n return this._renderer;\n }\n\n get renderQueue() {\n return this._renderQueue;\n }\n\n async init({ shadowMapSize = new Vec(1024, 1024) } = {}) {\n if (typeof(shadowMapSize) === \"number\") {\n shadowMapSize = new Vec(shadowMapSize, shadowMapSize);\n }\n\n // TODO: Create function to resize shadow map\n this._shadowMapSize = shadowMapSize;\n\n this._mainDirectionalLight = null;\n\n this._opaquePipeline = this.renderer.factory.pipeline();\n this._opaquePipeline.setBlendState({ enabled: false });\n this._opaquePipeline.create();\n\n this._transparentPipeline = this.renderer.factory.pipeline();\n this._transparentPipeline.setBlendState({\n enabled: true,\n blendFuncSrc: BlendFunction.SRC_ALPHA,\n blendFuncDst: BlendFunction.ONE_MINUS_SRC_ALPHA,\n blendFuncSrcAlpha: BlendFunction.ONE,\n blendFuncDstAlpha: BlendFunction.ONE_MINUS_SRC_ALPHA\n });\n this._transparentPipeline.create();\n\n this._renderQueue = new RenderQueue(this.renderer);\n this._initVisitor = new InitVisitor();\n this._frameVisitor = new FrameVisitor(this._renderQueue);\n\n this._skyCube = this.renderer.factory.skyCube();\n\n this._shadowRenderer = this.renderer.factory.shadowRenderer();\n await this._shadowRenderer.create(this._shadowMapSize);\n }\n\n async setEnvironment(env) {\n this._environment = env;\n this._skyCube.load(this._environment.environmentMap);\n }\n\n get environment() {\n return this._environment;\n }\n\n get defaultViewMatrix() {\n return this._defaultViewMatrix || Mat4.MakeIdentity();\n }\n\n set defaultViewMatrix(mat) {\n this._defaultViewMatrix = mat;\n }\n\n get defaultProjectionMatrix() {\n return this._defaultProjectionMatrix || Mat4.MakePerspective(55,this.renderer.viewport.aspectRatio, 0.2, 100.0);\n }\n\n set defaultProjectionMatrix(mat) {\n this._defaultProjectionMatrix = mat;\n }\n \n async bindRenderer(sceneRoot) {\n const bindRendererVisitor = new BindRendererVisitor(this.renderer);\n sceneRoot.accept(bindRendererVisitor);\n\n await sceneRoot.asyncAccept(this._initVisitor); \n\n const findVisitor = new FindNodeVisitor();\n findVisitor.hasComponents(\"Environment\");\n sceneRoot.accept(findVisitor);\n if (findVisitor.result.length) {\n const comp = findVisitor.result[0].component(\"Environment\");\n this.setEnvironment(comp.environment);\n this._sceneEnvironment = comp;\n }\n }\n\n resize(sceneRoot, width,height) {\n this.renderer.viewport = new Vec([0, 0, width, height]);\n this.renderer.canvas.updateViewportSize();\n const mainCamera = Camera.GetMain(sceneRoot);\n if (mainCamera) {\n mainCamera.resize(width,height);\n }\n }\n\n async frame(sceneRoot,delta) {\n if (sceneRoot.sceneChanged) {\n await sceneRoot.asyncAccept(this._initVisitor);\n }\n this._sceneRoot = sceneRoot;\n\n this._renderQueue.newFrame();\n this._frameVisitor.delta = delta;\n this._frameVisitor.modelMatrix.identity();\n\n const mainCamera = Camera.GetMain(sceneRoot);\n\n let viewMatrix = this.defaultViewMatrix;\n let projectionMatrix = this.defaultProjectionMatrix;\n if (mainCamera) {\n projectionMatrix = mainCamera.projectionMatrix;\n viewMatrix = Mat4.GetInverted(Transform.GetWorldMatrix(mainCamera.node));\n }\n\n this._renderQueue.viewMatrix = viewMatrix;\n this._renderQueue.projectionMatrix = projectionMatrix;\n\n sceneRoot.accept(this._frameVisitor);\n\n this._skyCube.updateRenderState({\n viewMatrix: viewMatrix,\n projectionMatrix: projectionMatrix\n });\n }\n\n draw({ clearBuffers = true, drawSky = true } = {}) {\n const mainLight = LightComponent.GetMainDirectionalLight(this._sceneRoot);\n const camera = Camera.GetMain(this._sceneRoot);\n\n // Update the light projection based on the camera focus distance, to optimize\n // the shadow map size\n if (mainLight && camera) {\n const focus = camera.focusDistance;\n const lightProjection = Mat4.MakeOrtho(-focus,focus,-focus,focus,0.1,500.0);\n mainLight.light.projection = lightProjection;\n }\n if (mainLight) {\n this._shadowRenderer.update(camera, mainLight, this._renderQueue);\n }\n \n if (clearBuffers) {\n this.renderer.frameBuffer.clear();\n }\n\n if (this.environment && !this.environment.updated) {\n this.environment.updateMaps();\n }\n\n if (drawSky && (!this._sceneEnvironment || this._sceneEnvironment.showSkybox)) {\n this._skyCube.draw();\n }\n\n this._renderQueue.draw(RenderLayer.OPAQUE_DEFAULT);\n this._renderQueue.draw(RenderLayer.TRANSPARENT_DEFAULT);\n }\n\n destroy() {\n\n }\n\n keyDown(sceneRoot, evt) {\n this._keyDownVisitor.event = evt;\n sceneRoot.accept(this._keyDownVisitor);\n }\n\n keyUp(sceneRoot, evt) {\n this._keyUpVisitor.event = evt;\n sceneRoot.accept(this._keyUpVisitor);\n }\n\n mouseUp(sceneRoot, evt) {\n this._mouseUpVisitor.event = evt;\n sceneRoot.accept(this._mouseUpVisitor);\n }\n\n mouseDown(sceneRoot, evt) {\n this._mouseDownVisitor.event = evt;\n sceneRoot.accept(this._mouseDownVisitor);\n }\n\n mouseMove(sceneRoot, evt) {\n this._mouseMoveVisitor.event = evt;\n sceneRoot.accept(this._mouseMoveVisitor);\n }\n\n mouseOut(sceneRoot, evt) {\n this._mouseOutVisitor.event = evt;\n sceneRoot.accept(this._mouseOutVisitor);\n }\n\n mouseDrag(sceneRoot, evt) {\n this._mouseDragVisitor.event = evt;\n sceneRoot.accept(this._mouseDragVisitor);\n }\n\n mouseWheel(sceneRoot, evt) {\n this._mouseWheelVisitor.event = evt;\n sceneRoot.accept(this._mouseWheelVisitor);\n }\n\n touchStart(sceneRoot, evt) {\n this._touchStartVisitor.event = evt;\n sceneRoot.accept(this._touchStartVisitor);\n }\n\n touchMove(sceneRoot, evt) {\n this._touchMoveVisitor.event = evt;\n sceneRoot.accept(this._touchMoveVisitor);\n }\n\n touchEnd(sceneRoot, evt) {\n this._touchEndVisitor.event = evt;\n sceneRoot.accept(this._touchEndVisitor);\n }\n\n}","import Shader from \"../render/Shader\";\nimport ShaderProgram from \"../render/webgl/ShaderProgram\";\n\nconst g_code = {\n webgl: {\n vertex: `precision mediump float;\n \n attribute vec3 vertPosition;\n \n uniform mat4 mWorld;\n uniform mat4 mView;\n uniform mat4 mProj;\n \n void main() {\n gl_Position = mProj * mView * mWorld * vec4(vertPosition, 1.0);\n }`,\n\n fragment: `precision mediump float;\n \n uniform vec4 uPickColor;\n uniform bool uSelected;\n \n void main() {\n if (uSelected) {\n gl_FragColor = vec4(uPickColor);\n }\n else {\n discard;\n }\n }`\n }\n}\n\nexport default class PickSelectionShader extends Shader {\n constructor(renderer) {\n super(renderer);\n\n if (renderer.typeId !== \"WebGL\") {\n throw Error(\"PickSelectionShdaer is only compatible with WebGL renderer\");\n }\n }\n\n async load() {\n const { gl } = this.renderer;\n\n this._program = new ShaderProgram(gl, \"PickSelectionShader\");\n this._program.attachVertexSource(g_code.webgl.vertex);\n this._program.attachFragmentSource(g_code.webgl.fragment);\n this._program.link();\n\n this._forceDraw = true;\n }\n\n set forceDraw(d) {\n this._forceDraw = d;\n }\n\n get forceDraw() {\n return this._forceDraw;\n }\n\n setup(plistRenderer, materialRenderer, modelMatrix, viewMatrix, projectionMatrix) {\n this.renderer.state.shaderProgram = this._program;\n this._program.uniformMatrix4fv('mWorld', false, modelMatrix);\n this._program.uniformMatrix4fv('mView', false, viewMatrix);\n this._program.uniformMatrix4fv('mProj', false, projectionMatrix);\n this._program.uniform1i('uSelected', this._forceDraw || plistRenderer.polyList.isSelected);\n\n const { polyList } = plistRenderer;\n this._program.uniform4fv('uPickColor', polyList.colorCode);\n\n this._program.positionAttribPointer(plistRenderer.positionAttribParams(\"vertPosition\"));\n }\n}\n\n","const isRequired = (candidateFunction,includedFunctions) => {\n return !includedFunctions.find(includedFunc => includedFunc.name === candidateFunction.name);\n}\n\nconst getAllDependencies = (fn, result = []) => {\n fn.dependencies\n .filter(depFn => typeof depFn !== 'string')\n .forEach(depFn => {\n getAllDependencies(depFn, result);\n result.push(depFn);\n });\n result.push(fn);\n}\n\nconst getDependencies = (fn) => {\n const allFunctions = [];\n getAllDependencies(fn, allFunctions);\n const includedFunctions = [];\n return allFunctions.filter(candidateFn => {\n if (includedFunctions.indexOf(candidateFn.name) === -1) {\n includedFunctions.push(candidateFn.name);\n return true;\n }\n });\n}\n\nconst getDefinitions = (requiredFunctions) => {\n const includedDefinitions = [];\n requiredFunctions.flatMap(req => req.dependencies).forEach(req => {\n if (typeof req === 'string') {\n includedDefinitions.push(req);\n }\n });\n return Array.from(new Set(includedDefinitions)).join('\\n\\n');\n}\nexport default class ShaderFunction {\n constructor(returnType, name, params, body, deps = []) {\n this._returnType = returnType;\n this._name = name;\n this._params = params;\n this._body = body;\n this._deps = deps;\n }\n\n get returnType() {\n return this._returnType;\n }\n\n get name() {\n return this._name;\n }\n\n get params() {\n return this._params;\n }\n\n get body() {\n return this._body;\n }\n\n get dependencies() {\n return this._deps;\n }\n\n getFunctionText() {\n return `${this.returnType} ${this.name}(${this.params}) ${this.body}`;\n }\n\n static GetShaderCode(header, requiredFunctions) {\n let allFunctions = [];\n let rawCode = '';\n let definitions = getDefinitions(requiredFunctions);\n requiredFunctions.forEach(req => {\n if (typeof req === 'string') {\n // Add directly the string to the code\n rawCode += req + '\\n\\n';\n }\n else {\n allFunctions = [...allFunctions, ...getDependencies(req, allFunctions)];\n }\n });\n let code = header + '\\n\\n' + definitions + '\\n\\n' + rawCode + '\\n\\n';\n allFunctions.forEach(fn => {\n code += fn.getFunctionText() + \"\\n\\n\";\n });\n\n return code;\n }\n}\n\n// This utility function generate an array of ShaderFunction objects from a block of GLSL code\nexport function generateShaderLibrary(glslCode) {\n return [\n ...splitStructs(glslCode),\n ...splitFunctions(glslCode)\n .map(func => createShaderFunctionObject(func))\n ];\n}\n\n// Extracts #define constants from a block of GLSL code\nexport function extractConstants(glslCode) {\n const constants = [];\n const lines = glslCode.split('\\n');\n \n for (let line of lines) {\n const trimmedLine = line.trim();\n \n // Check if line is a #define directive\n if (trimmedLine.startsWith('#define')) {\n // Remove #define and split by whitespace\n const parts = trimmedLine.substring(7).trim().split(/\\s+/);\n \n if (parts.length >= 2) {\n const name = parts[0];\n // Join remaining parts as the value (in case value contains spaces)\n const value = parts.slice(1).join(' ');\n \n constants.push({\n name: name,\n value: value\n });\n }\n }\n }\n \n return constants;\n}\n\nexport function splitStructs(glslCode) {\n const structs = [];\n const lines = glslCode.split('\\n');\n let currentStruct = '';\n let braceCount = 0;\n let inStruct = false;\n \n for (let line of lines) {\n const trimmedLine = line.trim();\n \n // Skip empty lines, comments, and preprocessor directives\n if (!trimmedLine || \n trimmedLine.startsWith('//') || \n trimmedLine.startsWith('/*') || \n trimmedLine.startsWith('#')) {\n continue;\n }\n \n // Check if this line starts a struct definition\n if (!inStruct && trimmedLine.startsWith('struct')) {\n inStruct = true;\n currentStruct = line + '\\n';\n braceCount += (line.match(/\\{/g) || []).length;\n braceCount -= (line.match(/\\}/g) || []).length;\n \n // Check if struct ends on the same line (unlikely but possible)\n if (braceCount === 0 && trimmedLine.includes('{') && trimmedLine.includes('}')) {\n structs.push(currentStruct.trim());\n currentStruct = '';\n inStruct = false;\n }\n continue;\n }\n \n if (inStruct) {\n currentStruct += line + '\\n';\n braceCount += (line.match(/\\{/g) || []).length;\n braceCount -= (line.match(/\\}/g) || []).length;\n \n // Struct definition ends when we reach the closing brace and optional semicolon\n if (braceCount === 0) {\n structs.push(currentStruct.trim());\n currentStruct = '';\n inStruct = false;\n }\n }\n }\n \n return structs;\n}\n\n// Replace the constants in the GLSL code with their values\nexport function processConstants(glslCode, constants) {\n let processedCode = glslCode;\n \n // Sort constants by name length (descending) to avoid partial replacements\n // For example, if we have PI and PI_2, we want to replace PI_2 first\n const sortedConstants = [...constants].sort((a, b) => b.name.length - a.name.length);\n \n sortedConstants.forEach(constant => {\n // Create a regex that matches the constant name as a whole word\n // This prevents partial matches (e.g., PI matching inside PIRATE)\n const regex = new RegExp(`\\\\b${escapeRegExp(constant.name)}\\\\b`, 'g');\n processedCode = processedCode.replace(regex, constant.value);\n });\n \n return processedCode;\n}\n\n///// Private helper functions\n\n// Helper function to escape special regex characters\nfunction escapeRegExp(string) {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction splitFunctions(shaderCode) {\n const functions = [];\n const lines = shaderCode.split('\\n');\n let currentFunction = '';\n let braceCount = 0;\n let inFunction = false;\n \n for (let line of lines) {\n const trimmedLine = line.trim();\n \n // Skip empty lines, comments, preprocessor directives, and global variables\n if (!trimmedLine || \n trimmedLine.startsWith('//') || \n trimmedLine.startsWith('/*') || \n trimmedLine.startsWith('#') ||\n (trimmedLine.includes(';') && !inFunction && !trimmedLine.includes('{'))) {\n continue;\n }\n \n // Check if this line starts a function (contains parentheses and opening brace pattern)\n if (!inFunction && trimmedLine.includes('(') && trimmedLine.includes(')')) {\n // Look for function pattern: type name(params) or name(params)\n const functionPattern = /^\\s*\\w+\\s+\\w+\\s*\\([^)]*\\)\\s*\\{?|^\\s*\\w+\\s*\\([^)]*\\)\\s*\\{?/;\n if (functionPattern.test(trimmedLine)) {\n inFunction = true;\n currentFunction = line + '\\n';\n braceCount += (line.match(/\\{/g) || []).length;\n braceCount -= (line.match(/\\}/g) || []).length;\n \n if (braceCount === 0 && trimmedLine.includes('{') && trimmedLine.includes('}')) {\n // Single line function\n functions.push(currentFunction.trim());\n currentFunction = '';\n inFunction = false;\n }\n continue;\n }\n }\n \n if (inFunction) {\n currentFunction += line + '\\n';\n braceCount += (line.match(/\\{/g) || []).length;\n braceCount -= (line.match(/\\}/g) || []).length;\n \n if (braceCount === 0) {\n functions.push(currentFunction.trim());\n currentFunction = '';\n inFunction = false;\n }\n }\n }\n \n return functions;\n}\n\nfunction createShaderFunctionObject(functionCode) {\n const trimmedCode = functionCode.trim();\n \n // Find the opening brace to separate signature from body\n const openBraceIndex = trimmedCode.indexOf('{');\n if (openBraceIndex === -1) {\n throw new Error('Invalid function: no opening brace found');\n }\n \n // Extract function signature and body\n const signature = trimmedCode.substring(0, openBraceIndex).trim();\n const body = trimmedCode.substring(openBraceIndex + 1, trimmedCode.lastIndexOf('}')).trim();\n \n // Parse the signature to extract return type, name, and parameters\n const parenIndex = signature.indexOf('(');\n const closeParenIndex = signature.lastIndexOf(')');\n \n if (parenIndex === -1 || closeParenIndex === -1) {\n throw new Error('Invalid function signature: missing parentheses');\n }\n \n // Extract parameters\n const parameters = signature.substring(parenIndex + 1, closeParenIndex).trim();\n \n // Extract return type and function name from the part before parentheses\n const beforeParens = signature.substring(0, parenIndex).trim();\n const parts = beforeParens.split(/\\s+/);\n \n let returnType, functionName;\n if (parts.length >= 2) {\n // Format: \"returnType functionName\"\n returnType = parts.slice(0, -1).join(' ');\n functionName = parts[parts.length - 1];\n } else {\n // Format: \"functionName\" (assuming void return type)\n returnType = 'void';\n functionName = parts[0];\n }\n \n return new ShaderFunction(returnType, functionName, parameters, ` {\\n\\t${body}\\n}`);\n}\n\n","\nimport ShaderFunction from \"./ShaderFunction\";\n\nexport const fresnelSchlick = new ShaderFunction('vec3', 'fresnelSchlick', 'float cosTheta, vec3 F0', `{\n return F0 + (1.0 - F0) * pow(clamp(1.0 - cosTheta, 0.0, 1.0), 5.0);\n}`);\n\nexport const fresnelSchlickRoughness = new ShaderFunction('vec3', 'fresnelSchlickRoughness', 'float cosTheta, vec3 F0, float roughness', `{\n return F0 + (max(vec3(1.0 - roughness), F0) - F0) * pow(clamp(1.0 - cosTheta, 0.0, 1.0), 5.0);\n}`);\n\nexport const distributionGGX = new ShaderFunction('float', 'distributionGGX', 'vec3 N, vec3 H, float roughness', `{\n float a = roughness * roughness;\n float a2 = a * a;\n float NdotH = max(dot(N, H), 0.0);\n float NdotH2 = NdotH * NdotH;\n\n float num = a2;\n float denom = NdotH2 * (a2 - 1.0) + 1.0;\n denom = ${Math.PI} * denom * denom;\n\n return num / denom;\n}`);\n\nexport const geometrySchlickGGX = new ShaderFunction('float', 'geometrySchlickGGX', 'float NdotV, float roughness', `{\n float r = (roughness + 1.0);\n float k = (r * r) / 8.0;\n\n float num = NdotV;\n float denom = NdotV * (1.0 - k) + k;\n\n return num / denom;\n}`)\n\nexport const geometrySmith = new ShaderFunction('float', 'geometrySmith', 'vec3 N, vec3 V, vec3 L, float roughness', `{\n float NdotV = max(dot(N,V), 0.0);\n float NdotL = max(dot(N,L), 0.0);\n float ggx2 = geometrySchlickGGX(NdotV, roughness);\n float ggx1 = geometrySchlickGGX(NdotL, roughness);\n\n return ggx1 * ggx2;\n}`, [geometrySchlickGGX]);\n\nexport const pbrPointLight = new ShaderFunction('vec3', 'pbrPointLight',\n 'vec3 lightPos, vec3 lightColor, vec3 fragPos, vec3 fragNorm, vec3 viewPos, vec3 albedo, float roughness, float metallic, vec3 fresnel',\n `{\n vec3 F0 = vec3(0.04);\n F0 = mix(F0, albedo, metallic);\n\n vec3 L = normalize(lightPos - fragPos);\n vec3 H = normalize(viewPos + L);\n\n float distance = length(lightPos - fragPos);\n float attenuation = 1.0 / (distance * distance);\n vec3 radiance = lightColor * attenuation;\n\n vec3 F = fresnelSchlick(max(dot(H, viewPos), 0.0), F0) * fresnel;\n\n float NDF = distributionGGX(fragNorm, H, roughness);\n float G = geometrySmith(fragNorm, viewPos, L, roughness);\n\n vec3 numerator = NDF * G * F;\n float denom = 4.0 * max(dot(fragNorm,viewPos), 0.0) * max(dot(fragNorm,L), 0.0) + 0.0001;\n vec3 specular = numerator / denom;\n\n vec3 kS = F;\n vec3 kD = vec3(1.0) - kS;\n\n kD *= 1.0 - metallic;\n\n float NdotL = max(dot(fragNorm,L), 0.0);\n return (kD * albedo / ${Math.PI} + specular) * radiance * NdotL;\n}`, [fresnelSchlick, distributionGGX, geometrySmith]);\n\nexport const pbrDirectionalLight = new ShaderFunction('vec3', 'pbrDirectionalLight',\n 'vec3 lightDir, vec3 lightColor, vec3 fragPos, vec3 fragNorm, vec3 viewPos, vec3 albedo, float roughness, float metallic, vec3 fresnel, vec3 shadowColor',\n `{\n vec3 F0 = vec3(0.04);\n F0 = mix(F0, albedo, metallic);\n\n vec3 L = normalize(lightDir);\n vec3 H = normalize(viewPos + L);\n\n vec3 F = fresnelSchlickRoughness(max(dot(H, viewPos), 0.0), F0, roughness);\n\n float NDF = distributionGGX(fragNorm, H, roughness);\n float G = geometrySmith(fragNorm, viewPos, L, roughness);\n\n vec3 numerator = NDF * G * F;\n float denom = 4.0 * max(dot(fragNorm,viewPos), 0.4) * max(dot(fragNorm,L), 0.4);\n vec3 specular = numerator / max(denom, 0.0001);\n\n vec3 kS = F;\n vec3 kD = vec3(1.0) - kS;\n\n kD *= 1.0 - metallic;\n\n float NdotL = max(dot(fragNorm,L), 0.0);\n return (kD * albedo / ${Math.PI} + specular * fresnel * shadowColor) * lightColor * shadowColor * NdotL;\n}`, [fresnelSchlick, distributionGGX, geometrySmith, fresnelSchlickRoughness]);\n\nexport const getPrefilteredColor = new ShaderFunction('vec3', 'getPrefilteredColor', 'float roughness, vec3 refVec, samplerCube irrMap, samplerCube specMap, samplerCube envMap',\n `{\n vec3 specMap0 = textureCube(envMap, refVec).rgb;\n vec3 specMap1 = textureCube(specMap, refVec).rgb;\n vec3 specMap2 = textureCube(irrMap, refVec).rgb;\n\n if (roughness<0.7) {\n return mix(specMap0, specMap1, (log(roughness) + 5.0) / 5.0);\n }\n else {\n return mix(specMap1, specMap2, roughness);\n }\n}`);\n\nexport const pbrAmbientLight = new ShaderFunction('vec3', 'pbrAmbientLight', 'vec3 fragPos, vec3 N, vec3 V, vec3 albedo, float metallic, float roughness, samplerCube irradianceMap, samplerCube specularMap, samplerCube envMap, sampler2D brdfMap, vec3 fresnel, vec3 shadowColor',\n `{\n vec3 F0 = vec3(0.04);\n F0 = mix(F0, albedo, metallic);\n vec3 kS = fresnelSchlickRoughness(max(dot(N,V), 0.0), F0, roughness) * fresnel;\n vec3 kD = 1.0 - kS;\n vec3 irradiance = textureCube(irradianceMap, N).rgb;\n vec3 diffuse = irradiance * albedo;\n\n vec3 R = reflect(-V, N);\n vec3 prefilteredColor = getPrefilteredColor(roughness, R, irradianceMap, specularMap, envMap);\n float NdotV = min(max(dot(N,V), 0.0), 0.95);\n vec2 brdfUV = vec2(NdotV, clamp(roughness, 0.01, 0.94));\n vec2 envBRDF = texture2D(brdfMap, brdfUV).xy;\n vec3 indirectSpecular = prefilteredColor * (kS * envBRDF.x + envBRDF.y);\n\n return kD * diffuse + indirectSpecular;\n}`, [fresnelSchlickRoughness, getPrefilteredColor]);\n\nexport const applyConvolution = new ShaderFunction('vec4', 'applyConvolution', 'sampler2D texture, vec2 texCoord, vec2 texSize, float[9] convMatrix, float radius',\n `\n{\n vec2 onePixel = vec2(1.0,1.0) / texSize * radius;\n vec4 colorSum = \n texture2D(texture, texCoord + onePixel * vec2(-1, -1)) * convMatrix[0] +\n texture2D(texture, texCoord + onePixel * vec2( 0, -1)) * convMatrix[1] +\n texture2D(texture, texCoord + onePixel * vec2( 1, -1)) * convMatrix[2] +\n texture2D(texture, texCoord + onePixel * vec2(-1, 0)) * convMatrix[3] +\n texture2D(texture, texCoord + onePixel * vec2( 0, 0)) * convMatrix[4] +\n texture2D(texture, texCoord + onePixel * vec2( 1, 0)) * convMatrix[5] +\n texture2D(texture, texCoord + onePixel * vec2(-1, 1)) * convMatrix[6] +\n texture2D(texture, texCoord + onePixel * vec2( 0, 1)) * convMatrix[7] +\n texture2D(texture, texCoord + onePixel * vec2( 1, 1)) * convMatrix[8];\n float kernelWeight =\n convMatrix[0] +\n convMatrix[1] +\n convMatrix[2] +\n convMatrix[3] +\n convMatrix[4] +\n convMatrix[5] +\n convMatrix[6] +\n convMatrix[7] +\n convMatrix[8];\n if (kernelWeight <= 0.0) {\n kernelWeight = 1.0;\n }\n return vec4((colorSum / kernelWeight).rgb, 1.0);\n}\n`, []);\n\nexport const getShadowColor = new ShaderFunction('vec3', 'getShadowColor', 'vec4 positionFromLightPov, sampler2D shadowMap, float shadowBias, float shadowStrength',\n`\n{\n // The vertex location rendered from the light source is almost in\n // normalized device coordinates (NDC), but the perspective division\n // has not been performed yet. We need to divide by w to get the\n // vertex location in range [-1, +1]\n vec3 shadowCoord = positionFromLightPov.xyz / positionFromLightPov.w;\n\n // Convert from NDC to texture coordinates\n shadowCoord = shadowCoord * 0.5 + 0.5;\n \n if (shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 &&\n shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0)\n {\n float shadowDepth = texture2D(shadowMap, shadowCoord.xy).r;\n if (shadowCoord.z > shadowDepth + shadowBias) {\n return vec3(1.0 - shadowStrength);\n }\n }\n return vec3(1.0);\n}\n`, []);\n\nexport const lineal2SRGB = new ShaderFunction('vec4', 'lineal2SRGB', 'vec4 color, float gamma', `{\n color.rgb = color.rgb / (color.rgb + vec3(1.0));\n return pow(color, vec4(1.0 / gamma));\n}\n`, []);\n\nexport const SRGB2Lineal = new ShaderFunction('vec4', 'SRGB2Lineal', 'vec4 color, float gamma', `{\n return pow(color, vec4(gamma));\n}\n`, []);\n\nexport const brightnessContrast = new ShaderFunction('vec4', 'brightnessContrast', 'vec4 color, float brightness, float contrast', `{\n mat4 brightnessMat = mat4(1, 0, 0, 0,\n 0, 1, 0, 0,\n 0, 0, 1, 0,\n brightness, brightness, brightness, 1);\n float t = (1.0 - contrast) / 2.0;\n mat4 contrastMat = mat4(contrast, 0, 0, 0,\n 0, contrast, 0, 0,\n 0, 0, contrast, 0,\n t, t, t, 1);\n return contrastMat * brightnessMat * color;\n}`, []);\n","\nimport Texture, { TextureTargetName } from '../base/Texture';\nimport Shader from '../render/Shader';\nimport ShaderProgram from '../render/webgl/ShaderProgram';\nimport ShaderFunction from './ShaderFunction';\nimport { applyConvolution } from './webgl_shader_lib';\nimport Vec from '../math/Vec';\n\nconst g_code = {\n webgl: {\n vertex: `precision mediump float;\n\n attribute vec3 position;\n attribute vec2 texCoord;\n \n varying vec2 fragTexCoord;\n\n void main() {\n fragTexCoord = texCoord;\n gl_Position = vec4(position, 1.0);\n }`,\n\n fragment: ShaderFunction.GetShaderCode(`precision mediump float;\n varying vec2 fragTexCoord;\n \n uniform sampler2D uTexture;\n uniform float uConvMatrix[9];\n uniform vec4 uBorderColor;\n uniform float uBorderWidth;\n uniform vec2 uTexSize;\n `,\n [\n new ShaderFunction('void','main','',`{\n vec4 selectionColor = applyConvolution(uTexture, fragTexCoord, uTexSize, uConvMatrix, uBorderWidth);\n if (selectionColor.r!=0.0 && selectionColor.g!=0.0 && selectionColor.b!=0.0) {\n gl_FragColor = uBorderColor;\n }\n else {\n discard;\n }\n }`, [applyConvolution])\n ])\n }\n}\n\nexport default class SelectionHighlightShader extends Shader {\n constructor(renderer) {\n super(renderer);\n\n if (renderer.typeId !== \"WebGL\") {\n throw Error(\"SelectionHighlightShader is only compatible with WebGL renderer\");\n }\n }\n\n async load() {\n const { gl } = this.renderer;\n\n this._program = new ShaderProgram(gl, \"SelectionHighlightShader\");\n this._program.attachVertexSource(g_code.webgl.vertex);\n this._program.attachFragmentSource(g_code.webgl.fragment);\n this._program.link();\n\n this._borderWidth = 3;\n this._borderColor = new Vec([0.0, 0.7, 1, 1.0]);\n this._convMatrix = [\n 0, 1, 0,\n 1,-4, 1,\n 0, 1, 0\n ];\n }\n\n setup(plistRenderer, materialRenderer, modelMatrix, viewMatrix, projectionMatrix) {\n const { gl, viewport } = this.renderer;\n\n this.renderer.state.shaderProgram = this._program;\n\n gl.activeTexture(gl.TEXTURE0);\n this._program.uniform1i('uTexture', 0);\n this._program.uniform2f('uTexSize', viewport[2], viewport[3]);\n this._program.uniform1f('uBorderWidth', this._borderWidth);\n this._program.uniform4fv('uBorderColor', this._borderColor);\n this._program.uniform1fv('uConvMatrix', this._convMatrix, 4);\n\n const material = materialRenderer.material;\n if (material.diffuse instanceof Texture) {\n const webglTexture = materialRenderer.getTextureRenderer('diffuse').getApiObject();\n const target = TextureTargetName[material.diffuse.target];\n gl.bindTexture(gl[target], webglTexture);\n\n }\n else {\n throw new Error(\"PresentTextureShader: invalid material setup. The diffuse material attribute must to be a texture\");\n }\n\n this._program.positionAttribPointer(plistRenderer.positionAttribParams(\"position\"));\n this._program.texCoordAttribPointer(plistRenderer.texCoord0AttribParams(\"texCoord\"));\n }\n}\n","\nimport { RenderLayer } from \"../base/PolyList\";\nimport Texture, { TextureRenderTargetAttachment, TextureComponentFormat, TextureWrap } from \"../base/Texture\";\nimport Mat4 from \"../math/Mat4\";\nimport Vec from \"../math/Vec\";\nimport RenderQueue from \"../render/RenderQueue\";\nimport { FrameVisitor } from \"../render/SceneRenderer\";\nimport Transform from \"../scene/Transform\";\nimport PickSelectionShader from \"../shaders/PickSelectionShader\";\nimport SelectionHighlightShader from \"../shaders/SelectionHighlightShader\";\n\nexport default class SelectionHighlight {\n constructor(renderer) {\n this._renderer = renderer;\n }\n\n async init() {\n const renderer = this._renderer;\n this._targetTexture = new Texture();\n this._targetTexture.renderTargetAttachment = TextureRenderTargetAttachment.COLOR_ATTACHMENT_0;\n this._targetTexture.componentFormat = TextureComponentFormat.UNSIGNED_BYTE;\n this._targetTexture.wrapModeXY = TextureWrap.CLAMP;\n\n this._renderBuffer = renderer.factory.renderBuffer();\n await this._renderBuffer.attachTexture(this._targetTexture);\n\n this._shader = new PickSelectionShader(renderer);\n await this._shader.load();\n this._shader.forceDraw = false;\n\n this._renderQueue = new RenderQueue(renderer);\n this._renderQueue.enableQueue(RenderLayer.SELECTION_DEFAULT, this._shader);\n\n this._frameVisitor = new FrameVisitor(this._renderQueue);\n\n this._selectionDrawShader = new SelectionHighlightShader(renderer);\n await this._selectionDrawShader.load();\n }\n\n setViewportSize(width,height) {\n this._renderBuffer.size = new Vec(width,height);\n }\n\n draw(scene,camera) {\n const cameraView = Mat4.GetInverted(Transform.GetWorldMatrix(camera.node));\n this._renderQueue.viewMatrix = cameraView;\n this._renderQueue.projectionMatrix = camera.projectionMatrix;\n this._renderQueue.newFrame();\n this._frameVisitor.delta = 0;\n this._frameVisitor.modelMatrix.identity();\n scene.accept(this._frameVisitor);\n\n this._renderBuffer.update(() => {\n this._renderBuffer.frameBuffer.clear();\n this._renderQueue.draw(RenderLayer.SELECTION_DEFAULT);\n });\n\n // TODO: Draw target texture using a border detection shader\n const shader = this._selectionDrawShader;\n this._renderer.presentTexture(this._targetTexture, { clearBuffers: false, shader });\n }\n\n destroy() {\n this._renderBuffer.destroy();\n this._targetTexture.destroy();\n this._renderBuffer = null;\n this._targetTexture = null;\n }\n}\n","import { RenderLayer } from \"../base/PolyList\";\nimport Texture, { TextureComponentFormat, TextureRenderTargetAttachment, TextureWrap } from \"../base/Texture\";\nimport PickSelectionShader from \"../shaders/PickSelectionShader\";\nimport { FrameVisitor } from \"../render/SceneRenderer\";\nimport RenderQueue from \"../render/RenderQueue\";\nimport Vec from \"../math/Vec\";\nimport Mat4 from \"../math/Mat4\";\nimport Transform from \"../scene/Transform\";\n\nexport default class SelectionBuffer {\n constructor(renderer) {\n this._renderer = renderer;\n }\n \n async init() {\n const renderer = this._renderer;\n this._targetTexture = new Texture();\n this._targetTexture.renderTargetAttachment = TextureRenderTargetAttachment.COLOR_ATTACHMENT_0;\n this._targetTexture.componentFormat = TextureComponentFormat.UNSIGNED_BYTE;\n this._targetTexture.wrapModeXY = TextureWrap.CLAMP;\n\n this._renderBuffer = renderer.factory.renderBuffer();\n\n await this._renderBuffer.attachTexture(this._targetTexture);\n\n this._shader = new PickSelectionShader(renderer);\n await this._shader.load();\n\n this._renderQueue = new RenderQueue(renderer);\n this._renderQueue.enableQueue(RenderLayer.SELECTION_DEFAULT, this._shader);\n\n this._frameVisitor = new FrameVisitor(this._renderQueue);\n }\n\n reshape(width,height) {\n this._renderBuffer.size = new Vec(width,height);\n }\n\n draw(scene,camera,x,y,width = 1,height = 1) {\n const cameraView = Mat4.GetInverted(Transform.GetWorldMatrix(camera.node));\n this._renderQueue.viewMatrix = cameraView;\n this._renderQueue.projectionMatrix = camera.projectionMatrix;\n this._renderQueue.newFrame();\n this._frameVisitor.delta = 0;\n this._frameVisitor.modelMatrix.identity();\n scene.accept(this._frameVisitor);\n\n let result = null;\n this._renderBuffer.update(() => {\n this._renderBuffer.frameBuffer.clear();\n this._renderQueue.draw(RenderLayer.SELECTION_DEFAULT);\n result = this._renderBuffer.readPixels(x, y, width, height);\n });\n\n return result;\n }\n\n destroy() {\n this._renderBuffer.destroy();\n this._targetTexture.destroy();\n this._renderBuffer = null;\n this._targetTexture = null;\n }\n}\n\n","const SelectionMode = Object.freeze({\n OBJECT: 0,\n POLY_LIST: 1\n});\n\nexport default SelectionMode;\n","import NodeVisitor from \"../scene/NodeVisitor\";\nimport SelectionMode from \"./SelectionMode\";\nimport Color from \"../base/Color\";\n\nconst getColor = (comps) => \"\" + comps[0] + comps[1] + comps[2];\n\nexport default class SelectionAssignVisitor extends NodeVisitor {\n constructor() {\n super();\n\n this._selectionMode = SelectionMode.POLY_LIST;\n this._elements = {};\n }\n\n set selectionMode(mode) {\n this._selectionMode = mode;\n this.clear();\n }\n\n get selectionMode() {\n return this._selectionMode;\n }\n\n clear() {\n this._r = 0;\n this._g = 0;\n this._b = 0;\n this._elements = {};\n }\n\n getNextColor() {\n const getId = () => {\n return [ Math.round(Math.random()*255),\n Math.round(Math.random()*255),\n Math.round(Math.random()*255)];\n }\n \n let components = getId();\n let color = getColor(components);\n while (this._elements[color]) {\n components = getId();\n color = getColor(components);\n }\n\n this._r = components[0];\n this._g = components[1];\n this._b = components[2];\n\n return new Color([components[0]/255, components[1]/255, components[2]/255, 1]);\n }\n\n findElement(pickedColor) {\n const color = [\n pickedColor[0],\n pickedColor[1],\n pickedColor[2]\n ];\n return this._elements[getColor(color)];\n }\n\n visit(node) {\n const { drawable } = node;\n if (drawable) {\n let color = this.getNextColor();\n drawable.items.forEach(({polyList}, i, array) => {\n if (polyList.isSelectable) {\n polyList.colorCode = color;\n polyList.selected = false;\n const colorCode = getColor([\n Math.round(color[0] * 255),\n Math.round(color[1] * 255),\n Math.round(color[2] * 255)\n ]);\n this._elements[colorCode] = { polyList, drawable };\n }\n\n // Get new color code for the next polyList, only if this is not the\n // last item, and the selection mode is POLY_LIST, otherwise we'll\n // use the same color code for all polyList in the drawable\n if (i<array.length-1 && this._selectionMode == SelectionMode.POLY_LIST) {\n color = this.getNextColor();\n }\n });\n }\n }\n}","import Vec from \"../math/Vec\";\nimport SelectionBuffer from \"./SelectionBuffer\";\nimport Camera from \"../scene/Camera\";\nimport SelectionIdAssignVisitor from \"./SelectionIdAssignVisitor\";\nimport SelectionMode from \"./SelectionMode\";\n\nexport default class SelectionManager {\n constructor(renderer) {\n this._renderer = renderer;\n this._sceneRoot = null;\n this._camera = null;\n this._selectionMode = SelectionMode.POLY_LIST;\n this._multiSelect = false;\n\n this._selection = [];\n\n this._selectionChangedCallbacks = {}\n }\n\n async init() {\n this._selectionBuffer = new SelectionBuffer(this._renderer);\n await this._selectionBuffer.init();\n\n this._selectionIdVisitor = new SelectionIdAssignVisitor();\n }\n\n setViewportSize(w,h) {\n this._viewportSize = [w, h];\n }\n\n get selection() {\n return this._selection;\n }\n\n clearSelection() {\n this._selection = [];\n }\n\n set sceneRoot(root) {\n this._sceneRoot = root;\n this.clearSelection();\n }\n\n get sceneRoot() {\n return this._sceneRoot;\n }\n\n set camera(cam) {\n this._camera = cam;\n this.clearSelection();\n }\n\n get camera() {\n if (this._camera) {\n return this._camera;\n }\n\n this._camera = Camera.GetMain(this.sceneRoot);\n return this._camera;\n }\n\n set selectionMode(mode) {\n this._selectionMode = mode;\n this.clearSelection();\n }\n\n get selectionMode() {\n return this._selectionMode;\n }\n\n set multiSelectMode(mode) {\n this._multiSelect = mode;\n this.clearSelection();\n }\n\n get multiSelectMode() {\n return this._multiSelect;\n }\n\n onSelectionChanged(id, cb) {\n this._selectionChangedCallbacks[id] = cb;\n }\n\n triggerSelectionChanged() {\n for (const key in this._selectionChangedCallbacks) {\n this._selectionChangedCallbacks[key](this._selection);\n }\n }\n\n mouseUp(evt) {\n const upPosition = new Vec([evt.x, evt.y]);\n if (Vec.Distance(this._downPosition, upPosition) < 2) {\n this._selectionIdVisitor.selectionMode = this.selectionMode;\n this.sceneRoot.accept(this._selectionIdVisitor);\n const pixelRatio = window.devicePixelRatio || 1;\n this._selectionBuffer.reshape(this._viewportSize[0], this._viewportSize[1]);\n const pickedColor = this._selectionBuffer.draw(this.sceneRoot, this.camera, evt.x * pixelRatio, evt.y * pixelRatio);\n const item = this._selectionIdVisitor.findElement(pickedColor);\n const isSelected = () => this._selection.find(s => {\n return s.polyList === item.polyList && s.drawable === item.drawable\n });\n if (item && this._multiSelect && !isSelected()) {\n this._selection.push(item);\n this.triggerSelectionChanged();\n }\n else if (item && !isSelected()) {\n this._selection = [item];\n this.triggerSelectionChanged();\n }\n else if (!item && !this._multiSelect && this._selection.length > 0) {\n this._selection = [];\n this.triggerSelectionChanged();\n }\n\n this._selection.forEach(item => item.polyList.selected = true);\n }\n }\n\n mouseDown(evt) {\n this._downPosition = new Vec([evt.x, evt.y]);\n }\n\n touchStart(evt) {\n\n }\n\n touchEnd(evt) {\n\n }\n\n destroy() {\n this._selectionBuffer.destroy();\n }\n}\n","\nimport ObjParser from \"../db/ObjParser\";\n\nconst objData = (width,height,depth) => {\n const w = width / 2;\n const h = height / 2;\n const d = depth / 2;\n\n return `mtllib cube.mtl\no Cube\nv ${w} ${h} -${d} // 1\nv ${w} -${h} -${d} // 2\nv ${w} ${h} ${d} // 3\nv ${w} -${h} ${d} // 4\nv -${w} ${h} -${d} // 5\nv -${w} -${h} -${d} // 6\nv -${w} ${h} ${d} // 7\nv -${w} -${h} ${d} // 8\nvt 0.007582 0.995648\nvt 0.007582 0.005685\nvt 0.992623 0.005685\nvt 0.992623 0.995648\nvt 0.992623 0.995648\nvt 0.007582 0.995648\nvt 0.007582 0.005685\nvt 0.992623 0.005685\nvt 0.992623 0.995648\nvt 0.007582 0.995648\nvt 0.007582 0.005685\nvt 0.007582 0.995648\nvt 0.007582 0.005685\nvt 0.992623 0.005685\nvt 0.992623 0.995648\nvt 0.992623 0.995648\nvt 0.007582 0.005685\nvt 0.992623 0.005685\nvt 0.992623 0.995648\nvn 0.0000 1.0000 0.0000\nvn 0.0000 0.0000 1.0000\nvn -1.0000 0.0000 0.0000\nvn 0.0000 -1.0000 0.0000\nvn 1.0000 0.0000 0.0000\nvn 0.0000 0.0000 -1.0000\nusemtl Cube\ns off\nf 1/1/1 5/2/1 7/3/1 3/4/1\nf 4/5/2 3/6/2 7/7/2 8/8/2\nf 8/8/3 7/9/3 5/10/3 6/11/3\nf 6/12/4 2/13/4 4/14/4 8/15/4\nf 2/16/5 1/1/5 3/17/5 4/14/5\nf 6/18/6 5/19/6 1/1/6 2/13/6\n`\n}\n\nexport default function cube(w,h,d) {\n const objTextData = objData(w,h,d);\n const parser = new ObjParser(objTextData);\n return parser.polyListArray[0];\n};","import ObjParser from \"../db/ObjParser\";\n\nconst objData = radius => {\n return `mtllib sphere.mtl\no Sphere\nv ${radius * 0.000000} ${radius * 0.951057} ${radius * -0.309017}\nv ${radius * 0.000000} ${radius * 0.809017} ${radius * -0.587785}\nv ${radius * 0.000000} ${radius * 0.309017} ${radius * -0.951057}\nv ${radius * 0.000000} ${radius * -0.000000} ${radius * -1.000000}\nv ${radius * 0.000000} ${radius * -0.309017} ${radius * -0.951056}\nv ${radius * 0.000000} ${radius * -0.809017} ${radius * -0.587785}\nv ${radius * 0.000000} ${radius * -0.951056} ${radius * -0.309017}\nv ${radius * 0.095492} ${radius * 0.951057} ${radius * -0.293893}\nv ${radius * 0.181636} ${radius * 0.809017} ${radius * -0.559017}\nv ${radius * 0.250000} ${radius * 0.587785} ${radius * -0.769421}\nv ${radius * 0.293893} ${radius * 0.309017} ${radius * -0.904509}\nv ${radius * 0.309017} ${radius * -0.000000} ${radius * -0.951057}\nv ${radius * 0.293893} ${radius * -0.309017} ${radius * -0.904508}\nv ${radius * 0.250000} ${radius * -0.587785} ${radius * -0.769421}\nv ${radius * 0.181636} ${radius * -0.809017} ${radius * -0.559017}\nv ${radius * 0.095492} ${radius * -0.951056} ${radius * -0.293893}\nv ${radius * 0.181636} ${radius * 0.951057} ${radius * -0.250000}\nv ${radius * 0.345492} ${radius * 0.809017} ${radius * -0.475528}\nv ${radius * 0.475528} ${radius * 0.587785} ${radius * -0.654509}\nv ${radius * 0.559017} ${radius * 0.309017} ${radius * -0.769421}\nv ${radius * 0.587785} ${radius * -0.000000} ${radius * -0.809017}\nv ${radius * 0.559017} ${radius * -0.309017} ${radius * -0.769421}\nv ${radius * 0.475528} ${radius * -0.587785} ${radius * -0.654509}\nv ${radius * 0.345492} ${radius * -0.809017} ${radius * -0.475528}\nv ${radius * 0.181636} ${radius * -0.951056} ${radius * -0.250000}\nv ${radius * 0.250000} ${radius * 0.951057} ${radius * -0.181636}\nv ${radius * 0.475528} ${radius * 0.809017} ${radius * -0.345492}\nv ${radius * 0.654509} ${radius * 0.587785} ${radius * -0.475528}\nv ${radius * 0.769421} ${radius * 0.309017} ${radius * -0.559017}\nv ${radius * 0.809017} ${radius * -0.000000} ${radius * -0.587785}\nv ${radius * 0.769421} ${radius * -0.309017} ${radius * -0.559017}\nv ${radius * 0.654509} ${radius * -0.587785} ${radius * -0.475528}\nv ${radius * 0.475528} ${radius * -0.809017} ${radius * -0.345491}\nv ${radius * 0.250000} ${radius * -0.951056} ${radius * -0.181636}\nv ${radius * 0.293893} ${radius * 0.951057} ${radius * -0.095491}\nv ${radius * 0.559017} ${radius * 0.809017} ${radius * -0.181636}\nv ${radius * 0.769421} ${radius * 0.587785} ${radius * -0.250000}\nv ${radius * 0.904509} ${radius * 0.309017} ${radius * -0.293893}\nv ${radius * 0.951057} ${radius * -0.000000} ${radius * -0.309017}\nv ${radius * 0.904509} ${radius * -0.309017} ${radius * -0.293893}\nv ${radius * 0.769421} ${radius * -0.587785} ${radius * -0.250000}\nv ${radius * 0.559017} ${radius * -0.809017} ${radius * -0.181636}\nv ${radius * 0.293893} ${radius * -0.951056} ${radius * -0.095491}\nv ${radius * 0.309017} ${radius * 0.951057} ${radius * 0.000000}\nv ${radius * 0.587785} ${radius * 0.809017} ${radius * 0.000000}\nv ${radius * 0.809017} ${radius * 0.587785} ${radius * -0.000000}\nv ${radius * 0.951057} ${radius * 0.309017} ${radius * 0.000000}\nv ${radius * 1.000000} ${radius * -0.000000} ${radius * 0.000000}\nv ${radius * 0.951057} ${radius * -0.309017} ${radius * 0.000000}\nv ${radius * 0.809017} ${radius * -0.587785} ${radius * -0.000000}\nv ${radius * 0.587785} ${radius * -0.809017} ${radius * 0.000000}\nv ${radius * 0.309017} ${radius * -0.951056} ${radius * 0.000000}\nv ${radius * 0.293893} ${radius * 0.951057} ${radius * 0.095492}\nv ${radius * 0.559017} ${radius * 0.809017} ${radius * 0.181636}\nv ${radius * 0.769421} ${radius * 0.587785} ${radius * 0.250000}\nv ${radius * 0.904509} ${radius * 0.309017} ${radius * 0.293893}\nv ${radius * 0.951057} ${radius * -0.000000} ${radius * 0.309017}\nv ${radius * 0.904509} ${radius * -0.309017} ${radius * 0.293893}\nv ${radius * 0.769421} ${radius * -0.587785} ${radius * 0.250000}\nv ${radius * 0.559017} ${radius * -0.809017} ${radius * 0.181636}\nv ${radius * 0.293893} ${radius * -0.951056} ${radius * 0.095492}\nv ${radius * 0.250000} ${radius * 0.951057} ${radius * 0.181636}\nv ${radius * 0.475528} ${radius * 0.809017} ${radius * 0.345492}\nv ${radius * 0.654509} ${radius * 0.587785} ${radius * 0.475528}\nv ${radius * 0.769421} ${radius * 0.309017} ${radius * 0.559017}\nv ${radius * 0.809017} ${radius * -0.000000} ${radius * 0.587785}\nv ${radius * 0.769421} ${radius * -0.309017} ${radius * 0.559017}\nv ${radius * 0.654509} ${radius * -0.587785} ${radius * 0.475528}\nv ${radius * 0.475528} ${radius * -0.809017} ${radius * 0.345492}\nv ${radius * 0.250000} ${radius * -0.951056} ${radius * 0.181636}\nv ${radius * 0.181636} ${radius * 0.951057} ${radius * 0.250000}\nv ${radius * 0.345492} ${radius * 0.809017} ${radius * 0.475528}\nv ${radius * 0.475528} ${radius * 0.587785} ${radius * 0.654509}\nv ${radius * 0.559017} ${radius * 0.309017} ${radius * 0.769421}\nv ${radius * 0.587785} ${radius * -0.000000} ${radius * 0.809017}\nv ${radius * 0.559017} ${radius * -0.309017} ${radius * 0.769421}\nv ${radius * 0.475528} ${radius * -0.587785} ${radius * 0.654509}\nv ${radius * 0.345492} ${radius * -0.809017} ${radius * 0.475528}\nv ${radius * 0.181636} ${radius * -0.951056} ${radius * 0.250000}\nv ${radius * 0.095492} ${radius * 0.951057} ${radius * 0.293893}\nv ${radius * 0.181636} ${radius * 0.809017} ${radius * 0.559017}\nv ${radius * 0.250000} ${radius * 0.587785} ${radius * 0.769421}\nv ${radius * 0.293893} ${radius * 0.309017} ${radius * 0.904509}\nv ${radius * 0.309017} ${radius * -0.000000} ${radius * 0.951057}\nv ${radius * 0.293893} ${radius * -0.309017} ${radius * 0.904509}\nv ${radius * 0.250000} ${radius * -0.587785} ${radius * 0.769421}\nv ${radius * 0.181636} ${radius * -0.809017} ${radius * 0.559017}\nv ${radius * 0.095492} ${radius * -0.951056} ${radius * 0.293893}\nv ${radius * 0.000000} ${radius * 0.951057} ${radius * 0.309017}\nv ${radius * 0.000000} ${radius * 0.809017} ${radius * 0.587785}\nv ${radius * 0.000000} ${radius * 0.587785} ${radius * 0.809017}\nv ${radius * 0.000000} ${radius * 0.309017} ${radius * 0.951057}\nv ${radius * -0.000000} ${radius * -0.000000} ${radius * 1.000000}\nv ${radius * 0.000000} ${radius * -0.309017} ${radius * 0.951057}\nv ${radius * 0.000000} ${radius * -0.587785} ${radius * 0.809017}\nv ${radius * 0.000000} ${radius * -0.809017} ${radius * 0.587785}\nv ${radius * -0.000000} ${radius * -0.951056} ${radius * 0.309017}\nv ${radius * -0.095492} ${radius * 0.951057} ${radius * 0.293893}\nv ${radius * -0.181636} ${radius * 0.809017} ${radius * 0.559017}\nv ${radius * -0.250000} ${radius * 0.587785} ${radius * 0.769421}\nv ${radius * -0.293893} ${radius * 0.309017} ${radius * 0.904509}\nv ${radius * -0.309017} ${radius * -0.000000} ${radius * 0.951057}\nv ${radius * -0.293893} ${radius * -0.309017} ${radius * 0.904509}\nv ${radius * -0.250000} ${radius * -0.587785} ${radius * 0.769421}\nv ${radius * -0.181636} ${radius * -0.809017} ${radius * 0.559017}\nv ${radius * -0.095492} ${radius * -0.951056} ${radius * 0.293893}\nv ${radius * -0.181636} ${radius * 0.951057} ${radius * 0.250000}\nv ${radius * -0.345492} ${radius * 0.809017} ${radius * 0.475528}\nv ${radius * -0.475528} ${radius * 0.587785} ${radius * 0.654509}\nv ${radius * -0.559017} ${radius * 0.309017} ${radius * 0.769421}\nv ${radius * -0.587785} ${radius * -0.000000} ${radius * 0.809017}\nv ${radius * -0.559017} ${radius * -0.309017} ${radius * 0.769421}\nv ${radius * -0.475528} ${radius * -0.587785} ${radius * 0.654509}\nv ${radius * -0.345492} ${radius * -0.809017} ${radius * 0.475528}\nv ${radius * -0.181636} ${radius * -0.951056} ${radius * 0.250000}\nv ${radius * -0.000000} ${radius * 1.000000} ${radius * 0.000000}\nv ${radius * -0.250000} ${radius * 0.951057} ${radius * 0.181636}\nv ${radius * -0.475528} ${radius * 0.809017} ${radius * 0.345492}\nv ${radius * -0.654509} ${radius * 0.587785} ${radius * 0.475529}\nv ${radius * -0.769421} ${radius * 0.309017} ${radius * 0.559017}\nv ${radius * -0.809017} ${radius * -0.000000} ${radius * 0.587786}\nv ${radius * -0.769421} ${radius * -0.309017} ${radius * 0.559017}\nv ${radius * -0.654509} ${radius * -0.587785} ${radius * 0.475529}\nv ${radius * -0.475528} ${radius * -0.809017} ${radius * 0.345492}\nv ${radius * -0.250000} ${radius * -0.951056} ${radius * 0.181636}\nv ${radius * -0.293893} ${radius * 0.951057} ${radius * 0.095492}\nv ${radius * -0.559017} ${radius * 0.809017} ${radius * 0.181636}\nv ${radius * -0.769421} ${radius * 0.587785} ${radius * 0.250000}\nv ${radius * -0.904509} ${radius * 0.309017} ${radius * 0.293893}\nv ${radius * -0.951057} ${radius * -0.000000} ${radius * 0.309017}\nv ${radius * -0.904509} ${radius * -0.309017} ${radius * 0.293893}\nv ${radius * -0.769421} ${radius * -0.587785} ${radius * 0.250000}\nv ${radius * -0.559017} ${radius * -0.809017} ${radius * 0.181636}\nv ${radius * -0.293893} ${radius * -0.951056} ${radius * 0.095492}\nv ${radius * -0.309017} ${radius * 0.951057} ${radius * 0.000000}\nv ${radius * -0.587785} ${radius * 0.809017} ${radius * 0.000000}\nv ${radius * -0.809017} ${radius * 0.587785} ${radius * 0.000000}\nv ${radius * -0.951057} ${radius * 0.309017} ${radius * 0.000000}\nv ${radius * -1.000001} ${radius * -0.000000} ${radius * 0.000000}\nv ${radius * -0.951057} ${radius * -0.309017} ${radius * 0.000000}\nv ${radius * -0.809017} ${radius * -0.587785} ${radius * 0.000000}\nv ${radius * -0.587785} ${radius * -0.809017} ${radius * 0.000000}\nv ${radius * -0.309017} ${radius * -0.951056} ${radius * 0.000000}\nv ${radius * -0.293893} ${radius * 0.951057} ${radius * -0.095491}\nv ${radius * -0.559017} ${radius * 0.809017} ${radius * -0.181636}\nv ${radius * -0.769421} ${radius * 0.587785} ${radius * -0.250000}\nv ${radius * -0.904509} ${radius * 0.309017} ${radius * -0.293893}\nv ${radius * -0.951057} ${radius * -0.000000} ${radius * -0.309017}\nv ${radius * -0.904509} ${radius * -0.309017} ${radius * -0.293893}\nv ${radius * -0.769421} ${radius * -0.587785} ${radius * -0.250000}\nv ${radius * -0.559017} ${radius * -0.809017} ${radius * -0.181636}\nv ${radius * -0.293893} ${radius * -0.951056} ${radius * -0.095492}\nv ${radius * -0.250000} ${radius * 0.951057} ${radius * -0.181636}\nv ${radius * -0.475528} ${radius * 0.809017} ${radius * -0.345492}\nv ${radius * -0.654509} ${radius * 0.587785} ${radius * -0.475528}\nv ${radius * -0.769421} ${radius * 0.309017} ${radius * -0.559017}\nv ${radius * -0.809018} ${radius * -0.000000} ${radius * -0.587786}\nv ${radius * -0.769421} ${radius * -0.309017} ${radius * -0.559017}\nv ${radius * -0.654509} ${radius * -0.587785} ${radius * -0.475528}\nv ${radius * -0.475528} ${radius * -0.809017} ${radius * -0.345492}\nv ${radius * -0.250000} ${radius * -0.951056} ${radius * -0.181636}\nv ${radius * -0.181636} ${radius * 0.951057} ${radius * -0.250000}\nv ${radius * -0.345492} ${radius * 0.809017} ${radius * -0.475528}\nv ${radius * -0.475529} ${radius * 0.587785} ${radius * -0.654509}\nv ${radius * -0.559017} ${radius * 0.309017} ${radius * -0.769421}\nv ${radius * -0.587786} ${radius * -0.000000} ${radius * -0.809018}\nv ${radius * -0.559017} ${radius * -0.309017} ${radius * -0.769421}\nv ${radius * -0.475529} ${radius * -0.587785} ${radius * -0.654509}\nv ${radius * -0.345492} ${radius * -0.809017} ${radius * -0.475528}\nv ${radius * -0.181636} ${radius * -0.951056} ${radius * -0.250000}\nv ${radius * -0.095492} ${radius * 0.951057} ${radius * -0.293893}\nv ${radius * -0.181636} ${radius * 0.809017} ${radius * -0.559017}\nv ${radius * -0.250000} ${radius * 0.587785} ${radius * -0.769421}\nv ${radius * -0.293893} ${radius * 0.309017} ${radius * -0.904509}\nv ${radius * -0.309017} ${radius * -0.000000} ${radius * -0.951057}\nv ${radius * -0.293893} ${radius * -0.309017} ${radius * -0.904509}\nv ${radius * -0.250000} ${radius * -0.587785} ${radius * -0.769421}\nv ${radius * -0.181636} ${radius * -0.809017} ${radius * -0.559017}\nv ${radius * -0.095492} ${radius * -0.951056} ${radius * -0.293893}\nv ${radius * -0.000000} ${radius * 0.587785} ${radius * -0.809018}\nv ${radius * -0.000000} ${radius * -0.587785} ${radius * -0.809018}\nv ${radius * 0.000000} ${radius * -1.000000} ${radius * 0.000000}\nvn -0.0000 -0.0000 -1.0000\nvn -0.0000 0.3045 -0.9525\nvn 0.2943 0.3045 -0.9059\nvn 0.3090 -0.0000 -0.9511\nvn -0.0000 0.8016 -0.5978\nvn -0.0000 0.9464 -0.3230\nvn 0.0998 0.9464 -0.3072\nvn 0.1847 0.8016 -0.5686\nvn -0.0000 -0.9464 -0.3230\nvn -0.0000 -0.8016 -0.5978\nvn 0.1847 -0.8016 -0.5686\nvn 0.0998 -0.9464 -0.3072\nvn -0.0000 -0.3045 -0.9525\nvn 0.2943 -0.3045 -0.9059\nvn -0.0000 0.5805 -0.8143\nvn 0.2516 0.5805 -0.7744\nvn -0.0000 -1.0000 -0.0000\nvn -0.0000 -0.5805 -0.8143\nvn 0.2516 -0.5805 -0.7744\nvn -0.0000 1.0000 -0.0000\nvn 0.5599 0.3045 -0.7706\nvn 0.5878 -0.0000 -0.8090\nvn 0.1899 0.9464 -0.2613\nvn 0.3514 0.8016 -0.4837\nvn 0.3514 -0.8016 -0.4837\nvn 0.1899 -0.9464 -0.2613\nvn 0.5599 -0.3045 -0.7706\nvn 0.4786 0.5805 -0.6588\nvn 0.4786 -0.5805 -0.6588\nvn 0.2613 0.9464 -0.1899\nvn 0.6588 -0.5805 -0.4786\nvn 0.4837 -0.8016 -0.3514\nvn 0.7706 0.3045 -0.5599\nvn 0.8090 -0.0000 -0.5878\nvn 0.4837 0.8016 -0.3514\nvn 0.2613 -0.9464 -0.1899\nvn 0.7706 -0.3045 -0.5599\nvn 0.6588 0.5805 -0.4786\nvn 0.7744 0.5805 -0.2516\nvn 0.9059 0.3045 -0.2943\nvn 0.3072 0.9464 -0.0998\nvn 0.7744 -0.5805 -0.2516\nvn 0.5686 -0.8016 -0.1847\nvn 0.9511 -0.0000 -0.3090\nvn 0.5686 0.8016 -0.1847\nvn 0.3072 -0.9464 -0.0998\nvn 0.9059 -0.3045 -0.2943\nvn 0.3230 -0.9464 -0.0000\nvn 0.9525 -0.3045 -0.0000\nvn 0.8143 -0.5805 -0.0000\nvn 0.8143 0.5805 -0.0000\nvn 0.9525 0.3045 -0.0000\nvn 0.3230 0.9464 -0.0000\nvn 0.5978 -0.8016 -0.0000\nvn 1.0000 -0.0000 -0.0000\nvn 0.5978 0.8016 -0.0000\nvn 0.9511 -0.0000 0.3090\nvn 0.9059 -0.3045 0.2943\nvn 0.5686 0.8016 0.1847\nvn 0.7744 0.5805 0.2516\nvn 0.3072 -0.9464 0.0998\nvn 0.7744 -0.5805 0.2516\nvn 0.9059 0.3045 0.2943\nvn 0.3072 0.9464 0.0998\nvn 0.5686 -0.8016 0.1847\nvn 0.2613 0.9464 0.1899\nvn 0.4837 0.8016 0.3514\nvn 0.4837 -0.8016 0.3514\nvn 0.2613 -0.9464 0.1899\nvn 0.8090 -0.0000 0.5878\nvn 0.7706 -0.3045 0.5599\nvn 0.6588 0.5805 0.4786\nvn 0.6588 -0.5805 0.4786\nvn 0.7706 0.3045 0.5599\nvn 0.5599 0.3045 0.7706\nvn 0.5878 -0.0000 0.8090\nvn 0.1899 0.9464 0.2613\nvn 0.3514 0.8016 0.4837\nvn 0.3514 -0.8016 0.4837\nvn 0.1899 -0.9464 0.2613\nvn 0.5599 -0.3045 0.7706\nvn 0.4786 0.5805 0.6588\nvn 0.4786 -0.5805 0.6588\nvn 0.0998 0.9464 0.3072\nvn 0.2516 -0.5805 0.7744\nvn 0.1847 -0.8016 0.5686\nvn 0.2943 0.3045 0.9059\nvn 0.3090 -0.0000 0.9511\nvn 0.1847 0.8016 0.5686\nvn 0.0998 -0.9464 0.3072\nvn 0.2943 -0.3045 0.9059\nvn 0.2516 0.5805 0.7744\nvn -0.0000 -0.3045 0.9525\nvn -0.0000 -0.5805 0.8143\nvn -0.0000 0.5805 0.8143\nvn -0.0000 0.3045 0.9525\nvn -0.0000 0.9464 0.3230\nvn -0.0000 -0.8016 0.5978\nvn -0.0000 -0.0000 1.0000\nvn -0.0000 0.8016 0.5978\nvn -0.0000 -0.9464 0.3230\nvn -0.1847 0.8016 0.5686\nvn -0.2516 0.5805 0.7744\nvn -0.0998 -0.9464 0.3072\nvn -0.2943 -0.3045 0.9059\nvn -0.2516 -0.5805 0.7744\nvn -0.2943 0.3045 0.9059\nvn -0.0998 0.9464 0.3072\nvn -0.1847 -0.8016 0.5686\nvn -0.3090 -0.0000 0.9511\nvn -0.5878 -0.0000 0.8090\nvn -0.5599 -0.3045 0.7706\nvn -0.3514 0.8016 0.4837\nvn -0.4786 0.5805 0.6588\nvn -0.1899 -0.9464 0.2613\nvn -0.4786 -0.5805 0.6588\nvn -0.5599 0.3045 0.7706\nvn -0.1899 0.9464 0.2613\nvn -0.3514 -0.8016 0.4837\nvn -0.2613 0.9464 0.1899\nvn -0.4837 0.8016 0.3514\nvn -0.4837 -0.8016 0.3514\nvn -0.2613 -0.9464 0.1899\nvn -0.8090 -0.0000 0.5878\nvn -0.7706 -0.3045 0.5599\nvn -0.6588 0.5805 0.4786\nvn -0.6588 -0.5805 0.4786\nvn -0.7706 0.3045 0.5599\nvn -0.7744 -0.5805 0.2516\nvn -0.5686 -0.8016 0.1847\nvn -0.9059 0.3045 0.2943\nvn -0.9511 -0.0000 0.3090\nvn -0.3072 0.9464 0.0998\nvn -0.5686 0.8016 0.1847\nvn -0.3072 -0.9464 0.0998\nvn -0.9059 -0.3045 0.2943\nvn -0.7744 0.5805 0.2516\nvn -0.8143 0.5805 -0.0000\nvn -0.9525 0.3045 -0.0000\nvn -0.3230 0.9464 -0.0000\nvn -0.8143 -0.5805 -0.0000\nvn -0.5978 -0.8016 -0.0000\nvn -1.0000 -0.0000 -0.0000\nvn -0.5978 0.8016 -0.0000\nvn -0.3230 -0.9464 -0.0000\nvn -0.9525 -0.3045 -0.0000\nvn -0.9059 -0.3045 -0.2943\nvn -0.7744 -0.5805 -0.2516\nvn -0.7744 0.5805 -0.2516\nvn -0.9059 0.3045 -0.2943\nvn -0.3072 0.9464 -0.0998\nvn -0.5686 -0.8016 -0.1847\nvn -0.9511 -0.0000 -0.3090\nvn -0.5686 0.8016 -0.1847\nvn -0.3072 -0.9464 -0.0998\nvn -0.4837 0.8016 -0.3514\nvn -0.6588 0.5805 -0.4786\nvn -0.2613 -0.9464 -0.1899\nvn -0.7706 -0.3045 -0.5599\nvn -0.6588 -0.5805 -0.4786\nvn -0.7706 0.3045 -0.5599\nvn -0.2613 0.9464 -0.1899\nvn -0.4837 -0.8016 -0.3514\nvn -0.8090 -0.0000 -0.5878\nvn -0.3514 -0.8016 -0.4837\nvn -0.1899 -0.9464 -0.2613\nvn -0.5878 -0.0000 -0.8090\nvn -0.5599 -0.3045 -0.7706\nvn -0.3514 0.8016 -0.4837\nvn -0.4786 0.5805 -0.6588\nvn -0.4786 -0.5805 -0.6588\nvn -0.5599 0.3045 -0.7706\nvn -0.1899 0.9464 -0.2613\nvn -0.2943 0.3045 -0.9059\nvn -0.3090 -0.0000 -0.9511\nvn -0.0998 0.9464 -0.3072\nvn -0.1847 0.8016 -0.5686\nvn -0.1847 -0.8016 -0.5686\nvn -0.0998 -0.9464 -0.3072\nvn -0.2943 -0.3045 -0.9059\nvn -0.2516 0.5805 -0.7744\nvn -0.2516 -0.5805 -0.7744\nvt 0.750000 0.900000\nvt 0.750000 0.800000\nvt 0.750000 0.600000\nvt 0.750000 0.500000\nvt 0.750000 0.400000\nvt 0.750000 0.200000\nvt 0.750000 0.100000\nvt 0.700000 0.900000\nvt 0.700000 0.800000\nvt 0.700000 0.700000\nvt 0.700000 0.600000\nvt 0.700000 0.500000\nvt 0.700000 0.400000\nvt 0.700000 0.300000\nvt 0.700000 0.200000\nvt 0.700000 0.100000\nvt 0.650000 0.900000\nvt 0.650000 0.800000\nvt 0.650000 0.700000\nvt 0.650000 0.600000\nvt 0.650000 0.500000\nvt 0.650000 0.400000\nvt 0.650000 0.300000\nvt 0.650000 0.200000\nvt 0.650000 0.100000\nvt 0.600000 0.900000\nvt 0.600000 0.800000\nvt 0.600000 0.700000\nvt 0.600000 0.600000\nvt 0.600000 0.500000\nvt 0.600000 0.400000\nvt 0.600000 0.300000\nvt 0.600000 0.200000\nvt 0.600000 0.100000\nvt 0.550000 0.900000\nvt 0.550000 0.800000\nvt 0.550000 0.700000\nvt 0.550000 0.600000\nvt 0.550000 0.500000\nvt 0.550000 0.400000\nvt 0.550000 0.300000\nvt 0.550000 0.200000\nvt 0.550000 0.100000\nvt 0.500000 0.900000\nvt 0.500000 0.800000\nvt 0.500000 0.700000\nvt 0.500000 0.600000\nvt 0.500000 0.500000\nvt 0.500000 0.400000\nvt 0.500000 0.300000\nvt 0.500000 0.200000\nvt 0.500000 0.100000\nvt 0.450000 0.900000\nvt 0.450000 0.800000\nvt 0.450000 0.700000\nvt 0.450000 0.600000\nvt 0.450000 0.500000\nvt 0.450000 0.400000\nvt 0.450000 0.300000\nvt 0.450000 0.200000\nvt 0.450000 0.100000\nvt 0.400000 0.900000\nvt 0.400000 0.800000\nvt 0.400000 0.700000\nvt 0.400000 0.600000\nvt 0.400000 0.500000\nvt 0.400000 0.400000\nvt 0.400000 0.300000\nvt 0.400000 0.200000\nvt 0.400000 0.100000\nvt 0.350000 0.900000\nvt 0.350000 0.800000\nvt 0.350000 0.700000\nvt 0.350000 0.600000\nvt 0.350000 0.500000\nvt 0.350000 0.400000\nvt 0.350000 0.300000\nvt 0.350000 0.200000\nvt 0.350000 0.100000\nvt 0.300000 0.900000\nvt 0.300000 0.800000\nvt 0.300000 0.700000\nvt 0.300000 0.600000\nvt 0.300000 0.500000\nvt 0.300000 0.400000\nvt 0.300000 0.300000\nvt 0.300000 0.200000\nvt 0.300000 0.100000\nvt 0.250000 0.900000\nvt 0.250000 0.800000\nvt 0.250000 0.700000\nvt 0.250000 0.600000\nvt 0.250000 0.500000\nvt 0.250000 0.400000\nvt 0.250000 0.300000\nvt 0.250000 0.200000\nvt 0.250000 0.100000\nvt 0.200000 0.900000\nvt 0.200000 0.800000\nvt 0.200000 0.700000\nvt 0.200000 0.600000\nvt 0.200000 0.500000\nvt 0.200000 0.400000\nvt 0.200000 0.300000\nvt 0.200000 0.200000\nvt 0.200000 0.100000\nvt 0.150000 0.900000\nvt 0.150000 0.800000\nvt 0.150000 0.700000\nvt 0.150000 0.600000\nvt 0.150000 0.500000\nvt 0.150000 0.400000\nvt 0.150000 0.300000\nvt 0.150000 0.200000\nvt 0.150000 0.100000\nvt 0.725000 1.000000\nvt 0.675000 1.000000\nvt 0.625000 1.000000\nvt 0.575000 1.000000\nvt 0.525000 1.000000\nvt 0.475000 1.000000\nvt 0.425000 1.000000\nvt 0.375000 1.000000\nvt 0.325000 1.000000\nvt 0.275000 1.000000\nvt 0.225000 1.000000\nvt 0.175000 1.000000\nvt 0.125000 1.000000\nvt 0.075000 1.000000\nvt 0.025000 1.000000\nvt 0.975000 1.000000\nvt 0.925000 1.000000\nvt 0.875000 1.000000\nvt 0.825000 1.000000\nvt 0.775000 1.000000\nvt 0.100000 0.900000\nvt 0.100000 0.800000\nvt 0.100000 0.700000\nvt 0.100000 0.600000\nvt 0.100000 0.500000\nvt 0.100000 0.400000\nvt 0.100000 0.300000\nvt 0.100000 0.200000\nvt 0.100000 0.100000\nvt 0.050000 0.900000\nvt 0.050000 0.800000\nvt 0.050000 0.700000\nvt 0.050000 0.600000\nvt 0.050000 0.500000\nvt 0.050000 0.400000\nvt 0.050000 0.300000\nvt 0.050000 0.200000\nvt 0.050000 0.100000\nvt 0.000000 0.900000\nvt 1.000000 0.900000\nvt 0.000000 0.800000\nvt 1.000000 0.800000\nvt 0.000000 0.700000\nvt 1.000000 0.700000\nvt 0.000000 0.600000\nvt 1.000000 0.600000\nvt 0.000000 0.500000\nvt 1.000000 0.500000\nvt 0.000000 0.400000\nvt 1.000000 0.400000\nvt 0.000000 0.300000\nvt 1.000000 0.300000\nvt 0.000000 0.200000\nvt 1.000000 0.200000\nvt 0.000000 0.100000\nvt 1.000000 0.100000\nvt 0.950000 0.900000\nvt 0.950000 0.800000\nvt 0.950000 0.700000\nvt 0.950000 0.600000\nvt 0.950000 0.500000\nvt 0.950000 0.400000\nvt 0.950000 0.300000\nvt 0.950000 0.200000\nvt 0.950000 0.100000\nvt 0.900000 0.900000\nvt 0.900000 0.800000\nvt 0.900000 0.700000\nvt 0.900000 0.600000\nvt 0.900000 0.500000\nvt 0.900000 0.400000\nvt 0.900000 0.300000\nvt 0.900000 0.200000\nvt 0.900000 0.100000\nvt 0.850000 0.900000\nvt 0.850000 0.800000\nvt 0.850000 0.700000\nvt 0.850000 0.600000\nvt 0.850000 0.500000\nvt 0.850000 0.400000\nvt 0.850000 0.300000\nvt 0.850000 0.200000\nvt 0.850000 0.100000\nvt 0.800000 0.900000\nvt 0.800000 0.800000\nvt 0.800000 0.700000\nvt 0.800000 0.600000\nvt 0.800000 0.500000\nvt 0.800000 0.400000\nvt 0.800000 0.300000\nvt 0.800000 0.200000\nvt 0.800000 0.100000\nvt 0.750000 0.700000\nvt 0.750000 0.300000\nvt 0.725000 0.000000\nvt 0.675000 0.000000\nvt 0.625000 0.000000\nvt 0.575000 0.000000\nvt 0.525000 0.000000\nvt 0.475000 0.000000\nvt 0.425000 0.000000\nvt 0.375000 0.000000\nvt 0.325000 0.000000\nvt 0.275000 0.000000\nvt 0.225000 0.000000\nvt 0.175000 0.000000\nvt 0.125000 0.000000\nvt 0.075000 0.000000\nvt 0.025000 0.000000\nvt 0.975000 0.000000\nvt 0.925000 0.000000\nvt 0.875000 0.000000\nvt 0.825000 0.000000\nvt 0.775000 0.000000\nusemtl Sphere\ns 1\nf 4/4/1 3/3/2 11/11/3 12/12/4\nf 2/2/5 1/1/6 8/8/7 9/9/8\nf 7/7/9 6/6/10 15/15/11 16/16/12\nf 5/5/13 4/4/1 12/12/4 13/13/14\nf 180/208/15 2/2/5 9/9/8 10/10/16\nf 182/210/17 7/7/9 16/16/12\nf 181/209/18 5/5/13 13/13/14 14/14/19\nf 3/3/2 180/208/15 10/10/16 11/11/3\nf 1/1/6 116/116/20 8/8/7\nf 6/6/10 181/209/18 14/14/19 15/15/11\nf 12/12/4 11/11/3 20/20/21 21/21/22\nf 9/9/8 8/8/7 17/17/23 18/18/24\nf 16/16/12 15/15/11 24/24/25 25/25/26\nf 13/13/14 12/12/4 21/21/22 22/22/27\nf 10/10/16 9/9/8 18/18/24 19/19/28\nf 182/211/17 16/16/12 25/25/26\nf 14/14/19 13/13/14 22/22/27 23/23/29\nf 11/11/3 10/10/16 19/19/28 20/20/21\nf 8/8/7 116/117/20 17/17/23\nf 15/15/11 14/14/19 23/23/29 24/24/25\nf 17/17/23 116/118/20 26/26/30\nf 24/24/25 23/23/29 32/32/31 33/33/32\nf 21/21/22 20/20/21 29/29/33 30/30/34\nf 18/18/24 17/17/23 26/26/30 27/27/35\nf 25/25/26 24/24/25 33/33/32 34/34/36\nf 22/22/27 21/21/22 30/30/34 31/31/37\nf 19/19/28 18/18/24 27/27/35 28/28/38\nf 182/212/17 25/25/26 34/34/36\nf 23/23/29 22/22/27 31/31/37 32/32/31\nf 20/20/21 19/19/28 28/28/38 29/29/33\nf 29/29/33 28/28/38 37/37/39 38/38/40\nf 26/26/30 116/119/20 35/35/41\nf 33/33/32 32/32/31 41/41/42 42/42/43\nf 30/30/34 29/29/33 38/38/40 39/39/44\nf 27/27/35 26/26/30 35/35/41 36/36/45\nf 34/34/36 33/33/32 42/42/43 43/43/46\nf 31/31/37 30/30/34 39/39/44 40/40/47\nf 28/28/38 27/27/35 36/36/45 37/37/39\nf 182/213/17 34/34/36 43/43/46\nf 32/32/31 31/31/37 40/40/47 41/41/42\nf 182/214/17 43/43/46 52/52/48\nf 41/41/42 40/40/47 49/49/49 50/50/50\nf 38/38/40 37/37/39 46/46/51 47/47/52\nf 35/35/41 116/120/20 44/44/53\nf 42/42/43 41/41/42 50/50/50 51/51/54\nf 39/39/44 38/38/40 47/47/52 48/48/55\nf 36/36/45 35/35/41 44/44/53 45/45/56\nf 43/43/46 42/42/43 51/51/54 52/52/48\nf 40/40/47 39/39/44 48/48/55 49/49/49\nf 37/37/39 36/36/45 45/45/56 46/46/51\nf 49/49/49 48/48/55 57/57/57 58/58/58\nf 46/46/51 45/45/56 54/54/59 55/55/60\nf 182/215/17 52/52/48 61/61/61\nf 50/50/50 49/49/49 58/58/58 59/59/62\nf 47/47/52 46/46/51 55/55/60 56/56/63\nf 44/44/53 116/121/20 53/53/64\nf 51/51/54 50/50/50 59/59/62 60/60/65\nf 48/48/55 47/47/52 56/56/63 57/57/57\nf 45/45/56 44/44/53 53/53/64 54/54/59\nf 52/52/48 51/51/54 60/60/65 61/61/61\nf 54/54/59 53/53/64 62/62/66 63/63/67\nf 61/61/61 60/60/65 69/69/68 70/70/69\nf 58/58/58 57/57/57 66/66/70 67/67/71\nf 55/55/60 54/54/59 63/63/67 64/64/72\nf 182/216/17 61/61/61 70/70/69\nf 59/59/62 58/58/58 67/67/71 68/68/73\nf 56/56/63 55/55/60 64/64/72 65/65/74\nf 53/53/64 116/122/20 62/62/66\nf 60/60/65 59/59/62 68/68/73 69/69/68\nf 57/57/57 56/56/63 65/65/74 66/66/70\nf 66/66/70 65/65/74 74/74/75 75/75/76\nf 63/63/67 62/62/66 71/71/77 72/72/78\nf 70/70/69 69/69/68 78/78/79 79/79/80\nf 67/67/71 66/66/70 75/75/76 76/76/81\nf 64/64/72 63/63/67 72/72/78 73/73/82\nf 182/217/17 70/70/69 79/79/80\nf 68/68/73 67/67/71 76/76/81 77/77/83\nf 65/65/74 64/64/72 73/73/82 74/74/75\nf 62/62/66 116/123/20 71/71/77\nf 69/69/68 68/68/73 77/77/83 78/78/79\nf 71/71/77 116/124/20 80/80/84\nf 78/78/79 77/77/83 86/86/85 87/87/86\nf 75/75/76 74/74/75 83/83/87 84/84/88\nf 72/72/78 71/71/77 80/80/84 81/81/89\nf 79/79/80 78/78/79 87/87/86 88/88/90\nf 76/76/81 75/75/76 84/84/88 85/85/91\nf 73/73/82 72/72/78 81/81/89 82/82/92\nf 182/218/17 79/79/80 88/88/90\nf 77/77/83 76/76/81 85/85/91 86/86/85\nf 74/74/75 73/73/82 82/82/92 83/83/87\nf 86/86/85 85/85/91 94/94/93 95/95/94\nf 83/83/87 82/82/92 91/91/95 92/92/96\nf 80/80/84 116/125/20 89/89/97\nf 87/87/86 86/86/85 95/95/94 96/96/98\nf 84/84/88 83/83/87 92/92/96 93/93/99\nf 81/81/89 80/80/84 89/89/97 90/90/100\nf 88/88/90 87/87/86 96/96/98 97/97/101\nf 85/85/91 84/84/88 93/93/99 94/94/93\nf 82/82/92 81/81/89 90/90/100 91/91/95\nf 182/219/17 88/88/90 97/97/101\nf 91/91/95 90/90/100 99/99/102 100/100/103\nf 182/220/17 97/97/101 106/106/104\nf 95/95/94 94/94/93 103/103/105 104/104/106\nf 92/92/96 91/91/95 100/100/103 101/101/107\nf 89/89/97 116/126/20 98/98/108\nf 96/96/98 95/95/94 104/104/106 105/105/109\nf 93/93/99 92/92/96 101/101/107 102/102/110\nf 90/90/100 89/89/97 98/98/108 99/99/102\nf 97/97/101 96/96/98 105/105/109 106/106/104\nf 94/94/93 93/93/99 102/102/110 103/103/105\nf 103/103/105 102/102/110 111/111/111 112/112/112\nf 100/100/103 99/99/102 108/108/113 109/109/114\nf 182/221/17 106/106/104 115/115/115\nf 104/104/106 103/103/105 112/112/112 113/113/116\nf 101/101/107 100/100/103 109/109/114 110/110/117\nf 98/98/108 116/127/20 107/107/118\nf 105/105/109 104/104/106 113/113/116 114/114/119\nf 102/102/110 101/101/107 110/110/117 111/111/111\nf 99/99/102 98/98/108 107/107/118 108/108/113\nf 106/106/104 105/105/109 114/114/119 115/115/115\nf 108/108/113 107/107/118 117/136/120 118/137/121\nf 115/115/115 114/114/119 124/143/122 125/144/123\nf 112/112/112 111/111/111 121/140/124 122/141/125\nf 109/109/114 108/108/113 118/137/121 119/138/126\nf 182/222/17 115/115/115 125/144/123\nf 113/113/116 112/112/112 122/141/125 123/142/127\nf 110/110/117 109/109/114 119/138/126 120/139/128\nf 107/107/118 116/128/20 117/136/120\nf 114/114/119 113/113/116 123/142/127 124/143/122\nf 111/111/111 110/110/117 120/139/128 121/140/124\nf 124/143/122 123/142/127 132/151/129 133/152/130\nf 121/140/124 120/139/128 129/148/131 130/149/132\nf 118/137/121 117/136/120 126/145/133 127/146/134\nf 125/144/123 124/143/122 133/152/130 134/153/135\nf 122/141/125 121/140/124 130/149/132 131/150/136\nf 119/138/126 118/137/121 127/146/134 128/147/137\nf 182/223/17 125/144/123 134/153/135\nf 123/142/127 122/141/125 131/150/136 132/151/129\nf 120/139/128 119/138/126 128/147/137 129/148/131\nf 117/136/120 116/129/20 126/145/133\nf 129/148/131 128/147/137 137/158/138 138/160/139\nf 126/145/133 116/130/20 135/154/140\nf 133/152/130 132/151/129 141/166/141 142/168/142\nf 130/149/132 129/148/131 138/160/139 139/162/143\nf 127/146/134 126/145/133 135/154/140 136/156/144\nf 134/153/135 133/152/130 142/168/142 143/170/145\nf 131/150/136 130/149/132 139/162/143 140/164/146\nf 128/147/137 127/146/134 136/156/144 137/158/138\nf 182/224/17 134/153/135 143/170/145\nf 132/151/129 131/150/136 140/164/146 141/166/141\nf 141/167/141 140/165/146 149/177/147 150/178/148\nf 138/161/139 137/159/138 146/174/149 147/175/150\nf 135/155/140 116/131/20 144/172/151\nf 142/169/142 141/167/141 150/178/148 151/179/152\nf 139/163/143 138/161/139 147/175/150 148/176/153\nf 136/157/144 135/155/140 144/172/151 145/173/154\nf 143/171/145 142/169/142 151/179/152 152/180/155\nf 140/165/146 139/163/143 148/176/153 149/177/147\nf 137/159/138 136/157/144 145/173/154 146/174/149\nf 182/225/17 143/171/145 152/180/155\nf 146/174/149 145/173/154 154/182/156 155/183/157\nf 182/226/17 152/180/155 161/189/158\nf 150/178/148 149/177/147 158/186/159 159/187/160\nf 147/175/150 146/174/149 155/183/157 156/184/161\nf 144/172/151 116/132/20 153/181/162\nf 151/179/152 150/178/148 159/187/160 160/188/163\nf 148/176/153 147/175/150 156/184/161 157/185/164\nf 145/173/154 144/172/151 153/181/162 154/182/156\nf 152/180/155 151/179/152 160/188/163 161/189/158\nf 149/177/147 148/176/153 157/185/164 158/186/159\nf 161/189/158 160/188/163 169/197/165 170/198/166\nf 158/186/159 157/185/164 166/194/167 167/195/168\nf 155/183/157 154/182/156 163/191/169 164/192/170\nf 182/227/17 161/189/158 170/198/166\nf 159/187/160 158/186/159 167/195/168 168/196/171\nf 156/184/161 155/183/157 164/192/170 165/193/172\nf 153/181/162 116/133/20 162/190/173\nf 160/188/163 159/187/160 168/196/171 169/197/165\nf 157/185/164 156/184/161 165/193/172 166/194/167\nf 154/182/156 153/181/162 162/190/173 163/191/169\nf 166/194/167 165/193/172 174/202/174 175/203/175\nf 163/191/169 162/190/173 171/199/176 172/200/177\nf 170/198/166 169/197/165 178/206/178 179/207/179\nf 167/195/168 166/194/167 175/203/175 176/204/180\nf 164/192/170 163/191/169 172/200/177 173/201/181\nf 182/228/17 170/198/166 179/207/179\nf 168/196/171 167/195/168 176/204/180 177/205/182\nf 165/193/172 164/192/170 173/201/181 174/202/174\nf 162/190/173 116/134/20 171/199/176\nf 169/197/165 168/196/171 177/205/182 178/206/178\nf 171/199/176 116/135/20 1/1/6\nf 178/206/178 177/205/182 181/209/18 6/6/10\nf 175/203/175 174/202/174 3/3/2 4/4/1\nf 172/200/177 171/199/176 1/1/6 2/2/5\nf 179/207/179 178/206/178 6/6/10 7/7/9\nf 176/204/180 175/203/175 4/4/1 5/5/13\nf 173/201/181 172/200/177 2/2/5 180/208/15\nf 182/229/17 179/207/179 7/7/9\nf 177/205/182 176/204/180 5/5/13 181/209/18\nf 174/202/174 173/201/181 180/208/15 3/3/2\n`\n}\n\nexport default function sphere(r) {\n const objTextData = objData(r);\n const parser = new ObjParser(objTextData);\n return parser.polyListArray[0];\n}\n","import ObjParser from \"../db/ObjParser\";\n\nconst objData = (height,radius) => {\n return `mtllib cylinder.mtl\no Cylinder\nv ${radius * 0.000000} ${height * -0.500000} ${radius * -1.000000}\nv ${radius * 0.000000} ${height * 0.500000} ${radius * -1.000000}\nv ${radius * 0.309017} ${height * -0.500000} ${radius * -0.951057}\nv ${radius * 0.309017} ${height * 0.500000} ${radius * -0.951057}\nv ${radius * 0.587785} ${height * -0.500000} ${radius * -0.809017}\nv ${radius * 0.587785} ${height * 0.500000} ${radius * -0.809017}\nv ${radius * 0.809017} ${height * -0.500000} ${radius * -0.587785}\nv ${radius * 0.809017} ${height * 0.500000} ${radius * -0.587785}\nv ${radius * 0.951057} ${height * -0.500000} ${radius * -0.309017}\nv ${radius * 0.951057} ${height * 0.500000} ${radius * -0.309017}\nv ${radius * 1.000000} ${height * -0.500000} ${radius * 0.000000}\nv ${radius * 1.000000} ${height * 0.500000} ${radius * 0.000000}\nv ${radius * 0.951056} ${height * -0.500000} ${radius * 0.309017}\nv ${radius * 0.951056} ${height * 0.500000} ${radius * 0.309017}\nv ${radius * 0.809017} ${height * -0.500000} ${radius * 0.587785}\nv ${radius * 0.809017} ${height * 0.500000} ${radius * 0.587785}\nv ${radius * 0.587785} ${height * -0.500000} ${radius * 0.809017}\nv ${radius * 0.587785} ${height * 0.500000} ${radius * 0.809017}\nv ${radius * 0.309017} ${height * -0.500000} ${radius * 0.951056}\nv ${radius * 0.309017} ${height * 0.500000} ${radius * 0.951056}\nv ${radius * -0.000000} ${height * -0.500000} ${radius * 1.000000}\nv ${radius * -0.000000} ${height * 0.500000} ${radius * 1.000000}\nv ${radius * -0.309017} ${height * -0.500000} ${radius * 0.951057}\nv ${radius * -0.309017} ${height * 0.500000} ${radius * 0.951057}\nv ${radius * -0.587785} ${height * -0.500000} ${radius * 0.809017}\nv ${radius * -0.587785} ${height * 0.500000} ${radius * 0.809017}\nv ${radius * -0.809017} ${height * -0.500000} ${radius * 0.587785}\nv ${radius * -0.809017} ${height * 0.500000} ${radius * 0.587785}\nv ${radius * -0.951056} ${height * -0.500000} ${radius * 0.309017}\nv ${radius * -0.951056} ${height * 0.500000} ${radius * 0.309017}\nv ${radius * -1.000000} ${height * -0.500000} ${radius * -0.000000}\nv ${radius * -1.000000} ${height * 0.500000} ${radius * -0.000000}\nv ${radius * -0.951056} ${height * -0.500000} ${radius * -0.309017}\nv ${radius * -0.951056} ${height * 0.500000} ${radius * -0.309017}\nv ${radius * -0.809017} ${height * -0.500000} ${radius * -0.587785}\nv ${radius * -0.809017} ${height * 0.500000} ${radius * -0.587785}\nv ${radius * -0.587785} ${height * -0.500000} ${radius * -0.809017}\nv ${radius * -0.587785} ${height * 0.500000} ${radius * -0.809017}\nv ${radius * -0.309017} ${height * -0.500000} ${radius * -0.951057}\nv ${radius * -0.309017} ${height * 0.500000} ${radius * -0.951057}\nvn -0.0000 -0.0000 -1.0000\nvn 0.3090 -0.0000 -0.9511\nvn 0.5878 -0.0000 -0.8090\nvn 0.8090 -0.0000 -0.5878\nvn 0.9511 -0.0000 -0.3090\nvn 1.0000 -0.0000 -0.0000\nvn 0.9511 -0.0000 0.3090\nvn 0.8090 -0.0000 0.5878\nvn 0.5878 -0.0000 0.8090\nvn 0.3090 -0.0000 0.9511\nvn -0.0000 -0.0000 1.0000\nvn -0.3090 -0.0000 0.9511\nvn -0.5878 -0.0000 0.8090\nvn -0.8090 -0.0000 0.5878\nvn -0.9511 -0.0000 0.3090\nvn -1.0000 -0.0000 -0.0000\nvn -0.9511 -0.0000 -0.3090\nvn -0.8090 -0.0000 -0.5878\nvn -0.5878 -0.0000 -0.8090\nvn -0.0000 1.0000 -0.0000\nvn -0.3090 -0.0000 -0.9511\nvn -0.0000 -1.0000 -0.0000\nvt 1.000000 0.500000\nvt -0.000000 0.500000\nvt 0.750000 0.490000\nvt 1.000000 1.000000\nvt -0.000000 1.000000\nvt 0.250000 0.490000\nvt 0.950000 0.500000\nvt 0.824164 0.478254\nvt 0.950000 1.000000\nvt 0.324164 0.478254\nvt 0.900000 0.500000\nvt 0.891068 0.444164\nvt 0.900000 1.000000\nvt 0.391068 0.444164\nvt 0.850000 0.500000\nvt 0.944164 0.391068\nvt 0.850000 1.000000\nvt 0.444164 0.391068\nvt 0.800000 0.500000\nvt 0.978254 0.324164\nvt 0.800000 1.000000\nvt 0.478254 0.324164\nvt 0.750000 0.500000\nvt 0.990000 0.250000\nvt 0.750000 1.000000\nvt 0.490000 0.250000\nvt 0.700000 0.500000\nvt 0.978254 0.175836\nvt 0.700000 1.000000\nvt 0.478254 0.175836\nvt 0.650000 0.500000\nvt 0.944164 0.108932\nvt 0.650000 1.000000\nvt 0.444164 0.108932\nvt 0.600000 0.500000\nvt 0.891068 0.055836\nvt 0.600000 1.000000\nvt 0.391068 0.055836\nvt 0.550000 0.500000\nvt 0.824164 0.021746\nvt 0.550000 1.000000\nvt 0.324164 0.021746\nvt 0.500000 0.500000\nvt 0.750000 0.010000\nvt 0.500000 1.000000\nvt 0.250000 0.010000\nvt 0.450000 0.500000\nvt 0.675836 0.021746\nvt 0.450000 1.000000\nvt 0.175836 0.021746\nvt 0.400000 0.500000\nvt 0.608932 0.055836\nvt 0.400000 1.000000\nvt 0.108932 0.055836\nvt 0.350000 0.500000\nvt 0.555836 0.108932\nvt 0.350000 1.000000\nvt 0.055836 0.108932\nvt 0.300000 0.500000\nvt 0.521746 0.175836\nvt 0.300000 1.000000\nvt 0.021746 0.175836\nvt 0.250000 0.500000\nvt 0.510000 0.250000\nvt 0.250000 1.000000\nvt 0.010000 0.250000\nvt 0.200000 0.500000\nvt 0.521746 0.324164\nvt 0.200000 1.000000\nvt 0.021746 0.324164\nvt 0.150000 0.500000\nvt 0.555836 0.391068\nvt 0.150000 1.000000\nvt 0.055836 0.391068\nvt 0.100000 0.500000\nvt 0.608932 0.444164\nvt 0.100000 1.000000\nvt 0.108932 0.444164\nvt 0.050000 0.500000\nvt 0.675836 0.478254\nvt 0.050000 1.000000\nvt 0.175836 0.478254\ns 1\nusemtl Cylinder\nf 1/1/1 2/4/1 4/9/2 3/7/2\nf 3/7/2 4/9/2 6/13/3 5/11/3\nf 5/11/3 6/13/3 8/17/4 7/15/4\nf 7/15/4 8/17/4 10/21/5 9/19/5\nf 9/19/5 10/21/5 12/25/6 11/23/6\nf 11/23/6 12/25/6 14/29/7 13/27/7\nf 13/27/7 14/29/7 16/33/8 15/31/8\nf 15/31/8 16/33/8 18/37/9 17/35/9\nf 17/35/9 18/37/9 20/41/10 19/39/10\nf 19/39/10 20/41/10 22/45/11 21/43/11\nf 21/43/11 22/45/11 24/49/12 23/47/12\nf 23/47/12 24/49/12 26/53/13 25/51/13\nf 25/51/13 26/53/13 28/57/14 27/55/14\nf 27/55/14 28/57/14 30/61/15 29/59/15\nf 29/59/15 30/61/15 32/65/16 31/63/16\nf 31/63/16 32/65/16 34/69/17 33/67/17\nf 33/67/17 34/69/17 36/73/18 35/71/18\nf 35/71/18 36/73/18 38/77/19 37/75/19\nf 30/62/20 14/30/20 6/14/20\nf 37/75/19 38/77/19 40/81/21 39/79/21\nf 39/79/21 40/81/21 2/5/1 1/2/1\nf 7/16/22 15/32/22 31/64/22\nf 6/14/20 4/10/20 2/6/20\nf 2/6/20 40/82/20 38/78/20\nf 38/78/20 36/74/20 34/70/20\nf 34/70/20 32/66/20 30/62/20\nf 30/62/20 28/58/20 22/46/20\nf 28/58/20 26/54/20 22/46/20\nf 26/54/20 24/50/20 22/46/20\nf 22/46/20 20/42/20 14/30/20\nf 20/42/20 18/38/20 14/30/20\nf 18/38/20 16/34/20 14/30/20\nf 14/30/20 12/26/20 10/22/20\nf 10/22/20 8/18/20 14/30/20\nf 8/18/20 6/14/20 14/30/20\nf 6/14/20 2/6/20 38/78/20\nf 38/78/20 34/70/20 6/14/20\nf 34/70/20 30/62/20 6/14/20\nf 30/62/20 22/46/20 14/30/20\nf 39/80/22 1/3/22 3/8/22\nf 3/8/22 5/12/22 39/80/22\nf 5/12/22 7/16/22 39/80/22\nf 7/16/22 9/20/22 15/32/22\nf 9/20/22 11/24/22 15/32/22\nf 11/24/22 13/28/22 15/32/22\nf 15/32/22 17/36/22 23/48/22\nf 17/36/22 19/40/22 23/48/22\nf 19/40/22 21/44/22 23/48/22\nf 23/48/22 25/52/22 27/56/22\nf 27/56/22 29/60/22 31/64/22\nf 31/64/22 33/68/22 35/72/22\nf 35/72/22 37/76/22 31/64/22\nf 37/76/22 39/80/22 31/64/22\nf 23/48/22 27/56/22 15/32/22\nf 27/56/22 31/64/22 15/32/22\nf 39/80/22 7/16/22 31/64/22\n`;\n};\n\nexport default function cylinder(height,radius) {\n const objTextData = objData(height,radius);\n const parser = new ObjParser(objTextData);\n return parser.polyListArray[0];\n}\n","import ObjParser from \"../db/ObjParser\";\n\nconst objData = (height,radius) => {\n return `mtllib cone.mtl\no Cone\nv ${radius * 0.000000} ${height * -0.500000} ${radius * -1.000000}\nv ${radius * 0.309017} ${height * -0.500000} ${radius * -0.951057}\nv ${radius * 0.587785} ${height * -0.500000} ${radius * -0.809017}\nv ${radius * 0.809017} ${height * -0.500000} ${radius * -0.587785}\nv ${radius * 0.951057} ${height * -0.500000} ${radius * -0.309017}\nv ${radius * 1.000000} ${height * -0.500000} ${radius * 0.000000}\nv ${radius * 0.951056} ${height * -0.500000} ${radius * 0.309017}\nv ${radius * 0.809017} ${height * -0.500000} ${radius * 0.587785}\nv ${radius * 0.587785} ${height * -0.500000} ${radius * 0.809017}\nv ${radius * 0.309017} ${height * -0.500000} ${radius * 0.951056}\nv ${radius * -0.000000} ${height * -0.500000} ${radius * 1.000000}\nv ${radius * -0.309017} ${height * -0.500000} ${radius * 0.951057}\nv ${radius * -0.587785} ${height * -0.500000} ${radius * 0.809017}\nv ${radius * -0.809017} ${height * -0.500000} ${radius * 0.587785}\nv ${radius * -0.951056} ${height * -0.500000} ${radius * 0.309017}\nv ${radius * -1.000000} ${height * -0.500000} ${radius * -0.000000}\nv ${radius * -0.951056} ${height * -0.500000} ${radius * -0.309017}\nv ${radius * -0.809017} ${height * -0.500000} ${radius * -0.587785}\nv ${radius * -0.587785} ${height * -0.500000} ${radius * -0.809017}\nv ${radius * -0.309017} ${height * -0.500000} ${radius * -0.951057}\nv ${radius * 0.000000} ${height * 0.500000} ${radius * 0.000000}\nvn -0.0000 0.7071 -0.7071\nvn -0.0000 1.0000 -0.0000\nvn 0.2185 0.7071 -0.6725\nvn 0.4156 0.7071 -0.5721\nvn 0.5721 0.7071 -0.4156\nvn 0.6725 0.7071 -0.2185\nvn 0.7071 0.7071 -0.0000\nvn 0.6725 0.7071 0.2185\nvn 0.5721 0.7071 0.4156\nvn 0.4156 0.7071 0.5721\nvn 0.2185 0.7071 0.6725\nvn -0.0000 0.7071 0.7071\nvn -0.2185 0.7071 0.6725\nvn -0.4156 0.7071 0.5721\nvn -0.5721 0.7071 0.4156\nvn -0.6725 0.7071 0.2185\nvn -0.7071 0.7071 -0.0000\nvn -0.6725 0.7071 -0.2185\nvn -0.5721 0.7071 -0.4156\nvn -0.4156 0.7071 -0.5721\nvn -0.0000 -1.0000 -0.0000\nvn -0.2185 0.7071 -0.6725\nvt 0.250000 0.490000\nvt 0.750000 0.490000\nvt 0.324164 0.478254\nvt 0.824164 0.478254\nvt 0.391068 0.444164\nvt 0.891068 0.444164\nvt 0.444164 0.391068\nvt 0.944164 0.391068\nvt 0.478254 0.324164\nvt 0.978254 0.324164\nvt 0.490000 0.250000\nvt 0.990000 0.250000\nvt 0.478254 0.175836\nvt 0.978254 0.175836\nvt 0.444164 0.108932\nvt 0.944164 0.108932\nvt 0.391068 0.055836\nvt 0.891068 0.055836\nvt 0.324164 0.021746\nvt 0.824164 0.021746\nvt 0.250000 0.010000\nvt 0.750000 0.010000\nvt 0.175836 0.021746\nvt 0.675836 0.021746\nvt 0.108932 0.055836\nvt 0.608932 0.055836\nvt 0.055836 0.108932\nvt 0.555836 0.108932\nvt 0.021746 0.175836\nvt 0.521746 0.175836\nvt 0.010000 0.250000\nvt 0.510000 0.250000\nvt 0.021746 0.324164\nvt 0.521746 0.324164\nvt 0.055836 0.391068\nvt 0.555836 0.391068\nvt 0.108932 0.444164\nvt 0.608932 0.444164\nvt 0.175836 0.478254\nvt 0.675836 0.478254\nvt 0.250000 0.250000\ns 1\nusemtl Cone\nf 1/1/1 21/41/2 2/3/3\nf 2/3/3 21/41/2 3/5/4\nf 3/5/4 21/41/2 4/7/5\nf 4/7/5 21/41/2 5/9/6\nf 5/9/6 21/41/2 6/11/7\nf 6/11/7 21/41/2 7/13/8\nf 7/13/8 21/41/2 8/15/9\nf 8/15/9 21/41/2 9/17/10\nf 9/17/10 21/41/2 10/19/11\nf 10/19/11 21/41/2 11/21/12\nf 11/21/12 21/41/2 12/23/13\nf 12/23/13 21/41/2 13/25/14\nf 13/25/14 21/41/2 14/27/15\nf 14/27/15 21/41/2 15/29/16\nf 15/29/16 21/41/2 16/31/17\nf 16/31/17 21/41/2 17/33/18\nf 17/33/18 21/41/2 18/35/19\nf 18/35/19 21/41/2 19/37/20\nf 4/8/21 8/16/21 16/32/21\nf 19/37/20 21/41/2 20/39/22\nf 20/39/22 21/41/2 1/1/1\nf 20/40/21 1/2/21 2/4/21\nf 2/4/21 3/6/21 20/40/21\nf 3/6/21 4/8/21 20/40/21\nf 4/8/21 5/10/21 8/16/21\nf 5/10/21 6/12/21 8/16/21\nf 6/12/21 7/14/21 8/16/21\nf 8/16/21 9/18/21 12/24/21\nf 9/18/21 10/20/21 12/24/21\nf 10/20/21 11/22/21 12/24/21\nf 12/24/21 13/26/21 14/28/21\nf 14/28/21 15/30/21 16/32/21\nf 16/32/21 17/34/21 18/36/21\nf 18/36/21 19/38/21 16/32/21\nf 19/38/21 20/40/21 16/32/21\nf 12/24/21 14/28/21 8/16/21\nf 14/28/21 16/32/21 8/16/21\nf 20/40/21 4/8/21 16/32/21\n`;\n}\n\nexport default function cone(height, radius) {\n const objTextData = objData(height, radius);\n const parser = new ObjParser(objTextData);\n return parser.polyListArray[0];\n}\n","import PolyList, { DrawMode } from \"../base/PolyList\";\n\nexport default function plane(w,d) {\n const plist = new PolyList();\n const w2 = w / 2;\n const d2 = d / 2;\n plist.vertex = [\n -w2, 0, -d2,\n w2, 0, -d2,\n w2, 0, d2,\n -w2, 0, d2\n ];\n plist.normal = [\n 0, 1, 0,\n 0, 1, 0,\n 0, 1, 0,\n 0, 1, 0\n ];\n plist.texCoord0 = [\n 0, 1,\n 1, 1,\n 1, 0,\n 0, 0\n ];\n plist.index = [\n 0, 3, 2,\n 2, 1, 0\n ];\n plist.drawMode = DrawMode.TRIANGLES;\n return plist;\n}","import PolyList, { DrawMode } from \"../base/PolyList\";\nimport Mat4 from \"../math/Mat4\";\nimport Vec from \"../math/Vec\";\n\nexport default function arrow(length, arrowSize = 0.3, direction = new Vec(0, 0, 1), up = new Vec(0, 1, 0) ) {\n const polyList = new PolyList();\n direction.normalize();\n\n polyList.drawMode = DrawMode.LINES;\n\n const trx = Mat4.MakeRotationWithDirection(direction, up);\n\n const arrowVector = trx.multVector(new Vec(0, 0, -1));\n const arrowHeadDir1 = trx.multVector(new Vec( arrowSize, 0, -1 + arrowSize));\n const arrowHeadDir2 = trx.multVector(new Vec(-arrowSize, 0, -1 + arrowSize));\n\n\n polyList.vertex = [\n 0, 0, 0,\n arrowVector.x * length, arrowVector.y * length, arrowVector.z * length,\n\n arrowVector.x * length, arrowVector.y * length, arrowVector.z * length,\n arrowHeadDir1.x * length, arrowHeadDir1.y * length, arrowHeadDir1.z * length,\n\n arrowVector.x * length, arrowVector.y * length, arrowVector.z * length,\n arrowHeadDir2.x * length, arrowHeadDir2.y * length, arrowHeadDir2.z * length\n ];\n\n polyList.normal = [\n 0, 0, 1,\n 0, 0, 1,\n\n 0, 0, 1,\n 0, 0, 1,\n\n 0, 0, 1,\n 0, 0, 1\n ];\n\n polyList.texCoord0 = [\n 0, 0,\n 0, 1,\n\n 0, 0,\n 0, 1,\n\n 0, 0,\n 0, 1\n ];\n\n polyList.index = [\n 0, 1,\n 2, 3,\n 4, 5\n ];\n\n return polyList;\n}","import cube from './cube';\nimport sphere from './sphere';\nimport cylinder from './cylinder';\nimport cone from './cone';\nimport plane from './plane';\nimport arrow from './arrow';\n\nexport const createCube = cube;\nexport const createSphere = sphere;\nexport const createCylinder = cylinder;\nexport const createCone = cone;\nexport const createPlane = plane;\nexport const createArrow = arrow;\n","import Shader from \"../render/Shader\";\nimport ShaderProgram from \"../render/webgl/ShaderProgram\";\nimport Texture, { ProceduralTextureFunction, TextureTargetName } from \"../base/Texture\";\nimport Vec from \"../math/Vec\";\n\nconst g_code = {\n webgl: {\n vertex: `precision mediump float;\n\n attribute vec3 vertPosition;\n attribute vec2 t0Position;\n \n varying vec2 fragT0Pos;\n\n uniform mat4 mWorld;\n uniform mat4 mView;\n uniform mat4 mProj;\n\n void main() {\n fragT0Pos = t0Position;\n gl_Position = mProj * mView * mWorld * vec4(vertPosition, 1.0);\n }`,\n\n fragment: `\n precision mediump float;\n\n varying vec2 fragT0Pos;\n\n uniform vec3 uFixedColor;\n uniform sampler2D uTexture;\n\n void main() {\n vec4 texColor = texture2D(uTexture, fragT0Pos);\n gl_FragColor = vec4(texColor.rgb * uFixedColor, 1.0);\n }`\n }\n}\n\nexport default class BasicDiffuseColorShader extends Shader {\n constructor(renderer) {\n super(renderer);\n\n if (renderer.typeId !== \"WebGL\") {\n throw Error(\"PresentTextureShader is only compatible with WebGL renderer\");\n }\n }\n\n async load() {\n const { gl } = this.renderer;\n this._program = new ShaderProgram(gl, \"BasicDiffuseColorShader\");\n this._program.attachVertexSource(g_code.webgl.vertex);\n this._program.attachFragmentSource(g_code.webgl.fragment);\n this._program.link();\n\n this._whiteTexture = new Texture();\n this._whiteTexture.proceduralFunction = ProceduralTextureFunction.PLAIN_COLOR;\n this._whiteTexture.proceduralParameters = [1,1,1,1];\n this._whiteTexture.size = new Vec(4,4);\n await this._whiteTexture.loadImageData();\n this._whiteTextureRenderer = this.renderer.factory.texture(this._whiteTexture);\n }\n\n setup(plistRenderer, materialRenderer, modelMatrix, viewMatrix, projectionMatrix) {\n const { material } = materialRenderer;\n const { gl } = this.renderer;\n this.renderer.state.shaderProgram = this._program;\n\n this._program.uniformMatrix4fv('mWorld', false, modelMatrix);\n this._program.uniformMatrix4fv('mView', false, viewMatrix);\n this._program.uniformMatrix4fv('mProj', false, projectionMatrix);\n\n this._program.uniform1i('uTexture', 0);\n let texRenderer = this._whiteTextureRenderer;\n if (material.diffuse instanceof Vec) {\n this._program.uniform3fv('uFixedColor', material.diffuse.rgb);\n }\n else {\n texRenderer = materialRenderer.getTextureRenderer('diffuse');\n this._program.uniform3fv('uFixedColor', new Vec(1,1,1));\n }\n texRenderer.activeTexture(0);\n texRenderer.bindTexture();\n\n this._program.positionAttribPointer(plistRenderer.positionAttribParams(\"vertPosition\"));\n this._program.texCoordAttribPointer(plistRenderer.texCoord0AttribParams(\"t0Position\"));\n }\n\n destroy() {\n ShaderProgram.Delete(this._program);\n }\n}\n","import Vec from \"../math/Vec\";\nimport Shader from \"../render/Shader\";\nimport ShaderFunction from \"./ShaderFunction\";\nimport ShaderProgram from \"../render/webgl/ShaderProgram\";\n\nconst g_code = {\n webgl: {\n vertex: `precision mediump float;\n \n attribute vec3 position;\n attribute vec2 texCoord;\n\n uniform mat4 uModelMatrix;\n uniform mat4 uViewMatrix;\n uniform mat4 uProjMatrix;\n\n varying vec2 fragTexCoord;\n \n void main() {\n fragTexCoord = texCoord;\n gl_Position = uProjMatrix * uViewMatrix * uModelMatrix * vec4(position, 1.0);\n }`,\n\n fragment: ShaderFunction.GetShaderCode(\n `precision mediump float;\n\n varying vec2 fragTexCoord;\n uniform vec4 uColor;\n uniform sampler2D uTexture;\n `,\n [\n new ShaderFunction('void','main','',`{\n vec4 color = texture2D(uTexture, fragTexCoord);\n gl_FragColor = uColor;\n }`)\n ])\n }\n}\n\nexport default class DebugRenderShader extends Shader {\n constructor(renderer) {\n super(renderer);\n\n if (renderer.typeId !== \"WebGL\") {\n throw Error(\"DebugRenderShader is only compatible with WebGL renderer\");\n }\n }\n\n async load() {\n const { gl } = this.renderer;\n\n this._program = new ShaderProgram(gl, \"DebugRenderShader\");\n this._program.attachVertexSource(g_code.webgl.vertex);\n this._program.attachFragmentSource(g_code.webgl.fragment);\n this._program.link();\n }\n\n setup(plistRenderer, materialRenderer, modelMatrix, viewMatrix, projMatrix) {\n const { gl } = this.renderer;\n const { material } = materialRenderer;\n\n this.renderer.state.shaderProgram = this._program;\n this._program.uniform1i(\"uTexture\", 0);\n this._program.bindMatrix(\"uModelMatrix\", modelMatrix);\n this._program.bindMatrix(\"uViewMatrix\", viewMatrix);\n this._program.bindMatrix(\"uProjMatrix\", projMatrix);\n\n if (material.diffuse instanceof Vec) {\n this._program.bindVector(\"uColor\", material.diffuse);\n }\n else {\n console.warning(\"DebugRenderShader: material.diffuse is a Texture. This shader only supports as diffuse color.\");\n }\n\n this._program.positionAttribPointer(plistRenderer.positionAttribParams(\"position\"));\n this._program.texCoordAttribPointer(plistRenderer.texCoord0AttribParams(\"texCoord\"));\n \n }\n}","\nimport Texture, { TextureTargetName } from '../base/Texture';\nimport Shader from '../render/Shader';\nimport ShaderProgram from '../render/webgl/ShaderProgram';\nimport ShaderFunction from './ShaderFunction';\nimport { applyConvolution } from './webgl_shader_lib';\nimport Vec from '../math/Vec';\n\nconst g_code = {\n webgl: {\n vertex: `precision mediump float;\n\n attribute vec3 position;\n attribute vec2 texCoord;\n \n varying vec2 fragTexCoord;\n\n void main() {\n fragTexCoord = texCoord;\n gl_Position = vec4(position, 1.0);\n }`,\n\n fragment: ShaderFunction.GetShaderCode(`precision mediump float;\n varying vec2 fragTexCoord;\n \n uniform sampler2D uTexture;\n `,\n [\n new ShaderFunction('void','main','',`{\n vec3 color = texture2D(uTexture, fragTexCoord).rgb;\n if (color.r!=0.0 || color.g!=0.0 || color.b!=0.0) {\n gl_FragColor = vec4(color, 1.0);\n }\n else {\n discard;\n }\n }`)\n ])\n }\n}\n\nexport default class PresentDebugFramebufferShader extends Shader {\n constructor(renderer) {\n super(renderer);\n\n if (renderer.typeId !== \"WebGL\") {\n throw Error(\"PresentDebugFramebufferShader is only compatible with WebGL renderer\");\n }\n }\n\n async load() {\n const { gl } = this.renderer;\n\n this._program = new ShaderProgram(gl, \"PresentDebugFramebufferShader\");\n this._program.attachVertexSource(g_code.webgl.vertex);\n this._program.attachFragmentSource(g_code.webgl.fragment);\n this._program.link();\n\n this._borderWidth = 3;\n this._borderColor = new Vec([0.0, 0.7, 1, 1.0]);\n this._convMatrix = [\n 0, 1, 0,\n 1,-4, 1,\n 0, 1, 0\n ];\n }\n\n setup(plistRenderer, materialRenderer, modelMatrix, viewMatrix, projectionMatrix) {\n const { gl, viewport } = this.renderer;\n\n this.renderer.state.shaderProgram = this._program;\n\n gl.activeTexture(gl.TEXTURE0);\n this._program.uniform1i('uTexture', 0);\n\n const material = materialRenderer.material;\n if (material.diffuse instanceof Texture) {\n const webglTexture = materialRenderer.getTextureRenderer('diffuse').getApiObject();\n const target = TextureTargetName[material.diffuse.target];\n gl.bindTexture(gl[target], webglTexture);\n\n }\n else {\n throw new Error(\"PresentDebugFramebufferShader: invalid material setup. The diffuse material attribute must to be a texture\");\n }\n\n this._program.positionAttribPointer(plistRenderer.positionAttribParams(\"position\"));\n this._program.texCoordAttribPointer(plistRenderer.texCoord0AttribParams(\"texCoord\"));\n }\n}\n","import Color from \"../base/Color\";\nimport Material from \"../base/Material\";\nimport Mat4 from \"../math/Mat4\";\nimport Vec from \"../math/Vec\";\nimport { createArrow, createSphere } from \"../primitives\";\nimport BasicDiffuseColorShader from \"../shaders/BasicDiffuseColorShader\";\nimport Transform from \"../scene/Transform\";\nimport Texture, { \n TextureRenderTargetAttachment, \n TextureComponentFormat, \n TextureWrap\n} from \"../base/Texture\";\nimport DebugRenderShader from \"../shaders/DebugRenderShader\";\nimport PresentDebugFramebufferShader from \"../shaders/PresentDebugFramebufferShader\";\n\nconst g_renderers = {};\n\nconst getMatrix = (transformMatrix, position) => {\n if (!transformMatrix && position) {\n transformMatrix = Mat4.MakeTranslation(position);\n }\n else if (!transformMatrix) {\n transformMatrix = Mat4.MakeIdentity();\n }\n return transformMatrix;\n}\n\nexport default class DebugRenderer {\n\n static Get(renderer) {\n if (!g_renderers[renderer.uniqueId]) {\n g_renderers[renderer.uniqueId] = new DebugRenderer(renderer);\n }\n return g_renderers[renderer.uniqueId];\n }\n\n constructor(renderer) {\n this._renderer = renderer;\n\n this._objects = [];\n\n this._sphere = createSphere(1);\n this._sphereRenderer = this.renderer.factory.polyList(this._sphere);\n\n this._arrow = createArrow(1, 0.3);\n this._arrow.lineWidth = 3;\n this._arrowRenderer = this.renderer.factory.polyList(this._arrow);\n\n this._baseMaterial = new Material();\n this._materialRenderer = this.renderer.factory.material(this._baseMaterial);\n }\n\n get renderer() { return this._renderer; }\n\n async init() {\n const renderer = this._renderer;\n \n this._shader = new DebugRenderShader(renderer);\n await this._shader.load();\n\n this._presentShader = new PresentDebugFramebufferShader(renderer);\n await this._presentShader.load();\n\n this._targetTexture = new Texture();\n this._targetTexture.name = `DebugRendererTargetTexture`;\n this._targetTexture.renderTargetAttachment = TextureRenderTargetAttachment.COLOR_ATTACHMENT_0;\n this._targetTexture.componentFormat = TextureComponentFormat.UNSIGNED_BYTE;\n this._targetTexture.wrapModeXY = TextureWrap.CLAMP;\n\n this._renderBuffer = renderer.factory.renderBuffer();\n await this._renderBuffer.attachTexture(this._targetTexture);\n }\n\n beginFrame() {\n this._objects = [];\n }\n\n drawSphere({ radius = 1, color = Color.White(), transformMatrix = null, position = null } = {}) {\n transformMatrix = getMatrix(transformMatrix, position);\n\n this._objects.push({\n renderer: this._sphereRenderer,\n scale: radius,\n color,\n transformMatrix\n });\n }\n\n drawArrow({ length = 1, color = Color.White(), transformMatrix = null, position = null } = {}) {\n transformMatrix = getMatrix(transformMatrix, position);\n\n this._objects.push({\n renderer: this._arrowRenderer,\n scale: length,\n color,\n transformMatrix\n });\n }\n\n setViewportSize(width, height) {\n this._renderBuffer.size = new Vec(width, height);\n }\n\n draw(camera) {\n const cameraView = Mat4.GetInverted(Transform.GetWorldMatrix(camera.node));\n const viewMatrix = cameraView;\n const projectionMatrix = camera.projectionMatrix;\n this._renderBuffer.update(() => {\n this._renderBuffer.frameBuffer.clear();\n\n this._objects.forEach(object => {\n const scale = Mat4.MakeScale(object.scale, object.scale, object.scale);\n const matrix = scale.mult(object.transformMatrix);\n this._materialRenderer.material.diffuse = object.color;\n \n object.renderer.bindBuffers();\n this._shader.setup(\n object.renderer,\n this._materialRenderer,\n matrix,\n viewMatrix,\n projectionMatrix\n );\n object.renderer.draw();\n })\n });\n\n const shader = this._presentShader;\n this._renderer.presentTexture(this._targetTexture, { clearBuffers: false, shader });\n }\n\n destoy() {\n this._renderBuffer.destroy();\n this._targetTexture.destroy();\n this._renderBuffer = null;\n this._targetTexture = null;\n }\n}\n","import AppController from \"../app/AppController\";\nimport SelectionHighlight from \"../manipulation/SelectionHighlight\";\nimport SelectionManager from \"../manipulation/SelectionManager\";\nimport { registerComponents } from \"../scene\";\nimport Camera from \"../scene/Camera\";\nimport DebugRenderer from \"../debug/DebugRenderer\";\nimport Vec from \"../math/Vec\";\n\nexport default class SceneAppController extends AppController {\n get sceneRoot() {\n return this._sceneRoot;\n }\n\n get sceneRenderer() {\n return this._sceneRenderer;\n }\n\n get environment() {\n return this._environment;\n }\n\n get selectionManager() {\n return this._selectionManager;\n }\n\n get selectionHighlight() {\n return this._selectionHighlight;\n }\n\n get selectionManagerEnabled() {\n return true;\n }\n\n get selectionHighlightEnabled() {\n return true;\n }\n\n get updateOnInputEvents() {\n return this._updateOnInputEvents ?? true;\n }\n\n set updateOnInputEvents(update) {\n this._updateOnInputEvents = update;\n }\n\n async loadScene() {\n return new Node(\"Scene Root\");\n }\n\n async loadEnvironment() {\n return null;\n }\n\n async registerLoaders() {\n\n }\n\n async loadDone() {\n\n }\n\n async init() {\n registerComponents();\n\n await this.registerLoaders();\n\n this._sceneRoot = await this.loadScene();\n\n this._environment = await this.loadEnvironment();\n\n if (!this._environment) {\n this._environment = this.renderer.factory.environment();\n await this._environment.load(); // Load black environment\n }\n\n this._sceneRenderer = this.renderer.factory.scene();\n await this.sceneRenderer.init({ shadowMapSize: new Vec(4096, 4096) });\n if (this.environment) {\n await this.sceneRenderer.setEnvironment(this.environment);\n }\n\n await this.sceneRenderer.bindRenderer(this.sceneRoot);\n\n if (this.selectionManagerEnabled) {\n this._selectionManager = new SelectionManager(this.renderer);\n await this._selectionManager.init();\n this._selectionManager.sceneRoot = this.sceneRoot;\n }\n\n if (this.selectionHighlightEnabled) {\n this._selectionHighlight = new SelectionHighlight(this.renderer);\n await this._selectionHighlight.init();\n }\n\n this._debugRenderer = DebugRenderer.Get(this.renderer);\n await this._debugRenderer.init();\n\n await this.loadDone();\n }\n\n reshape(width,height) {\n this.sceneRenderer.resize(this.sceneRoot,width,height);\n this.selectionManager?.setViewportSize(width,height);\n this.selectionHighlight?.setViewportSize(width,height);\n this._debugRenderer.setViewportSize(width,height);\n }\n\n async frame(delta) {\n this._debugRenderer.beginFrame();\n\n await this.sceneRenderer.frame(this.sceneRoot, delta);\n }\n\n display() {\n this.sceneRenderer.draw();\n const camera = Camera.GetMain(this.sceneRoot);\n this.selectionHighlight && this.selectionHighlight.draw(this.sceneRoot, camera);\n this._debugRenderer.draw(camera);\n }\n\n destroy() {\n this.sceneRenderer.destroy();\n if (this.selectionManagerEnabled) {\n this.selectionManager.destroy();\n }\n }\n\n keyDown(evt) {\n this.sceneRenderer.keyDown(this.sceneRoot,evt);\n if (this.updateOnInputEvents) {\n this.mainLoop.postRedisplay();\n }\n }\n\n keyUp(evt) {\n this.sceneRenderer.keyUp(this.sceneRoot,evt);\n if (this.updateOnInputEvents) {\n this.mainLoop.postRedisplay();\n }\n }\n\n mouseUp(evt) {\n this.sceneRenderer.mouseUp(this.sceneRoot,evt);\n this.selectionManager?.mouseUp(evt);\n if (this.updateOnInputEvents) {\n this.mainLoop.postRedisplay();\n }\n }\n\n mouseDown(evt) {\n this.sceneRenderer.mouseDown(this.sceneRoot,evt);\n this.selectionManager?.mouseDown(evt);\n if (this.updateOnInputEvents) {\n this.mainLoop.postRedisplay();\n }\n }\n\n mouseMove(evt) {\n this.sceneRenderer.mouseMove(this.sceneRoot,evt);\n if (this.updateOnInputEvents) {\n this.mainLoop.postRedisplay();\n }\n }\n\n mouseOut(evt) {\n this.sceneRenderer.mouseOut(this.sceneRoot,evt);\n if (this.updateOnInputEvents) {\n this.mainLoop.postRedisplay();\n }\n }\n\n mouseDrag(evt) {\n this.sceneRenderer.mouseDrag(this.sceneRoot,evt);\n if (this.updateOnInputEvents) {\n this.mainLoop.postRedisplay();\n }\n }\n\n mouseWheel(evt) {\n this.sceneRenderer.mouseWheel(this.sceneRoot,evt);\n if (this.updateOnInputEvents) {\n this.mainLoop.postRedisplay();\n }\n }\n\n touchStart(evt) {\n this.sceneRenderer.touchStart(this.sceneRoot,evt);\n this.selectionManager?.touchStart(evt);\n if (this.updateOnInputEvents) {\n this.mainLoop.postRedisplay();\n }\n }\n\n touchMove(evt) {\n this.sceneRenderer.touchMove(this.sceneRoot,evt);\n if (this.updateOnInputEvents) {\n this.mainLoop.postRedisplay();\n }\n }\n\n touchEnd(evt) {\n this.sceneRenderer.touchEnd(this.sceneRoot,evt);\n this.selectionManager?.touchEnd(evt);\n if (this.updateOnInputEvents) {\n this.mainLoop.postRedisplay();\n }\n } \n}\n","import Shader from \"../render/Shader\";\nimport ShaderFunction from \"./ShaderFunction\";\nimport ShaderProgram from \"../render/webgl/ShaderProgram\";\n\nconst g_code = {\n webgl: {\n vertex: `precision mediump float;\n attribute vec3 position;\n attribute vec2 texCoord;\n\n uniform mat4 uModelMatrix;\n uniform mat4 uViewMatrix;\n uniform mat4 uProjMatrix;\n\n varying vec2 fragTexCoord;\n \n void main() {\n fragTexCoord = texCoord;\n gl_Position = uProjMatrix * uViewMatrix * uModelMatrix * vec4(position, 1.0);\n }`,\n\n fragment: ShaderFunction.GetShaderCode(\n `precision mediump float;\n \n varying vec2 fragTexCoord;\n `,\n [\n new ShaderFunction('void','main','',`{\n float d = gl_FragCoord.z / gl_FragCoord.w;\n gl_FragColor = vec4(d, d, d, 1.0);\n }`)\n ])\n }\n}\n\nexport default class DepthRenderShader extends Shader {\n constructor(renderer) {\n super(renderer);\n\n if (renderer.typeId !== \"WebGL\") {\n throw Error(\"DepthRenderShader is only compatible with WebGL renderer\");\n }\n }\n\n async load() {\n const { gl } = this.renderer;\n\n this._program = new ShaderProgram(gl, \"DepthRenderShader\");\n this._program.attachVertexSource(g_code.webgl.vertex);\n this._program.attachFragmentSource(g_code.webgl.fragment);\n this._program.link();\n }\n\n setup(plistRenderer, materialRenderer, modelMatrix, viewMatrix, projMatrix) {\n const { gl } = this.renderer;\n const { material } = materialRenderer;\n\n this.renderer.state.shaderProgram = this._program;\n\n this._program.bindMatrix(\"uModelMatrix\", modelMatrix);\n this._program.bindMatrix(\"uViewMatrix\", viewMatrix);\n this._program.bindMatrix(\"uProjMatrix\", projMatrix);\n\n this._program.positionAttribPointer(plistRenderer.positionAttribParams(\"position\"));\n this._program.texCoordAttribPointer(plistRenderer.texCoord0AttribParams(\"texCoord\"));\n }\n}\n\n\n","import { RenderLayer } from \"../base/PolyList\";\nimport Texture, {\n TextureComponentFormat,\n TextureRenderTargetAttachment,\n TextureWrap\n} from \"../base/Texture\";\nimport Mat4 from \"../math/Mat4\";\nimport Vec from \"../math/Vec\";\nimport Color from \"../base/Color\";\nimport Camera from \"../scene/Camera\";\nimport LightComponent from \"../scene/LightComponent\";\nimport Transform from \"../scene/Transform\";\nimport DebugRenderer from \"../debug/DebugRenderer\";\nimport DepthRenderShader from \"../shaders/DepthRenderShader\";\n\n\nexport default class ShadowRenderer {\n constructor(renderer) {\n this._renderer = renderer;\n this._shadowMapRenderDistance = 100;\n this._debug = false;\n }\n\n get renderer() { return this._renderer; }\n\n get size() {\n return this._size;\n }\n\n get shadowMapRenderDistance() {\n return this._shadowMapRenderDistance;\n }\n\n get debug() {\n return this._debug;\n }\n\n set debug(d) {\n this._debug = d;\n }\n\n set shadowMapRenderDistance(d) {\n this._shadowMapRenderDistance = d;\n }\n\n // TODO: set size. Update the shadow map size\n\n get depthTexture() {\n return this._depthTexture;\n }\n\n async create(size = new Vec(1024, 1024)) {\n this._size = size;\n\n this._texture = new Texture();\n this._texture.name = `ShadowMap_${ size.width }x${ size.height }`;\n this._texture.renderTargetAttachment = TextureRenderTargetAttachment.COLOR_ATTACHMENT_0;\n this._texture.componentFormat = TextureComponentFormat.UNSIGNED_BYTE;\n this._texture.wrapModeXY = TextureWrap.CLAMP;\n\n this._renderBuffer = this.renderer.factory.renderBuffer();\n\n await this._renderBuffer.attachTexture(this._texture);\n\n this._depthTexture = new Texture();\n this._depthTexture.name = `ShadowMapDepth_${ size.width }x${ size.height }`;\n this._depthTexture.renderTargetAttachment = TextureRenderTargetAttachment.DEPTH_ATTACHMENT;\n this._depthTexture.componentFormat = TextureComponentFormat.UNSIGNED_BYTE;\n this._depthTexture.wrapModeXY = TextureWrap.CLAMP;\n await this._renderBuffer.attachTexture(this._depthTexture);\n\n this._renderBuffer.size = this._size;\n\n this._shader = new DepthRenderShader(this.renderer);\n await this._shader.load();\n }\n\n getLightTransform(camera, light) {\n let cameraNode = null;\n if (camera instanceof Camera) {\n cameraNode = camera.node;\n }\n else if (camera instanceof Node) {\n cameraNode = camera;\n camera = cameraNode.camera;\n }\n\n if (!cameraNode || !camera) {\n throw Error(`ShadowRenderer.getLightPosition(): invalid camera parameter. Camera must be a Node or a Camera component, and the camera must be added to the scene.`);\n }\n\n let lightNode = null;\n if (light instanceof LightComponent) {\n lightNode = light.node;\n }\n else if (light instanceof Node) {\n lightNode = light;\n light = light.lightComponent;\n }\n\n if (!lightNode || !light) {\n throw Error(`ShadowRenderer.getLightPosition(): invalid light. Light must be a Node or a LightComponent`);\n }\n\n // Get the camera focus point\n const focus = camera.focusDistance;\n const cameraTransform = Transform.GetWorldMatrix(cameraNode);\n const cameraPos = Vec.Add(Mat4.GetPosition(cameraTransform), Vec.Mult(cameraTransform.forwardVector, -focus)); \n\n // Get the light rotation vector and scale it to the light shadow map render distance\n const lightTransform = Transform.GetWorldMatrix(lightNode);\n const lightVector = Mat4.GetRotation(lightTransform).forwardVector;\n lightVector.scale(this._shadowMapRenderDistance);\n\n // Get the light render position, adding the camera focus point to the light vector\n const lightPos = Vec.Add(cameraPos, lightVector);\n\n // Set the light render position to the light transform matrix\n lightTransform.setPosition(lightPos);\n\n if (this._debug) {\n DebugRenderer.Get(this._renderer).drawSphere({ radius: 0.1, color: Color.Red(), position: cameraPos });\n DebugRenderer.Get(this.renderer).drawSphere({ radius: 0.1, color: Color.Blue(), position: lightPos });\n DebugRenderer.Get(this.renderer).drawArrow({ length: 0.8, color: Color.Green(), transformMatrix: lightTransform });\n }\n\n return lightTransform;\n }\n\n update(camera, lightComponent, renderQueue) { \n const viewMatrix = Mat4.GetInverted(this.getLightTransform(camera, lightComponent));\n \n this._renderBuffer.update(() => {\n this._renderBuffer.renderer.state.clear();\n const layer = RenderLayer.OPAQUE_DEFAULT;\n const queue = renderQueue.getQueue(layer);\n if (queue) {\n\n if (typeof(queue.beginOperation) === \"function\") {\n queue.beginOperation(layer);\n }\n queue.queue.forEach(rs => {\n rs.draw({\n overrideShader: this._shader,\n overrideViewMatrix: viewMatrix,\n overrideProjectionMatrix: lightComponent.light.projection\n });\n });\n if (typeof(queue.endOperation) === \"function\") {\n queue.endOperation(layer);\n }\n }\n });\n\n // Set the depthTexture to the light component. If the shader needs the depth texture, it will use it\n lightComponent.depthTexture = this._depthTexture;\n lightComponent.viewMatrix = viewMatrix;\n }\n}\n","import Mat4 from \"../math/Mat4\";\nimport Vec from \"../math/Vec\";\nimport Shader from \"../render/Shader\";\nimport ShaderProgram from \"../render/webgl/ShaderProgram\";\n\nconst g_code = {\n webgl: {\n vertex: `precision mediump float;\n\n attribute vec3 vertPosition;\n\n uniform mat4 uMVP;\n\n varying vec3 fragNormal;\n\n void main() {\n gl_Position = uMVP * vec4(vertPosition,1.0);\n\n // The normal can be extracted from the position\n // since this shader is designed to be used with\n // a cube centered in 0,0,0\n fragNormal = normalize(vertPosition);\n }\n `,\n\n fragment: `precision mediump float;\n varying vec3 fragNormal;\n \n uniform samplerCube uCubemap;\n \n void main() {\n gl_FragColor = textureCube(uCubemap, normalize(fragNormal));\n }`\n }\n};\n\nexport default class SkyCubeShader extends Shader {\n constructor(renderer) {\n super(renderer);\n\n if (renderer.typeId !== \"WebGL\") {\n throw Error(\"PresentTextureShader is only compatible with WebGL renderer\");\n }\n }\n\n async load() {\n const { gl } = this.renderer;\n\n this._program = new ShaderProgram(gl, \"SkyCubeShader\");\n this._program.attachVertexSource(g_code.webgl.vertex);\n this._program.attachFragmentSource(g_code.webgl.fragment);\n this._program.link();\n }\n\n setup(plistRenderer,materialRenderer,modelMatrix,viewMatrix,projectionMatrix) {\n const { material } = materialRenderer;\n const { gl } = this.renderer;\n this.renderer.state.shaderProgram = this._program;\n\n const mvp = Mat4.Mult(projectionMatrix, viewMatrix);\n this._program.uniformMatrix4fv('uMVP', false, mvp);\n\n gl.activeTexture(gl.TEXTURE0);\n this._program.uniform1i('uCubemap', 0);\n if (material.diffuse instanceof Vec) {\n throw new Error(\"Invalid material configuration in SkySphereShader: diffuse component must be a cube map texture\");\n }\n const webglTexture = materialRenderer.getTextureRenderer('diffuse').getApiObject();\n gl.bindTexture(gl.TEXTURE_CUBE_MAP, webglTexture);\n\n this._program.positionAttribPointer(plistRenderer.positionAttribParams(\"vertPosition\"));\n }\n\n destroy() {\n ShaderProgram.Delete(this._program);\n this._program = null;\n }\n}","import Material from \"../base/Material\";\nimport { createCube } from \"../primitives\";\nimport RenderState from \"./RenderState\";\nimport SkyCubeShader from \"../shaders/SkyCubeShader\";\nimport Mat4 from \"../math/Mat4\";\nimport { PolyListCullFace } from \"../base/PolyList\";\n\nexport default class SkyCube {\n constructor(renderer) {\n this._renderer = renderer;\n }\n\n get renderer() { return this._renderer; }\n\n set texture(texture) {\n if (!this._texture) {\n throw new Error(\"SkyCube: setting texture to an uninitialized sky cube. The texture setter is used to change the skyCube texture once created. Use the load() method instead.\");\n }\n this._texture = texture;\n this._material.diffuse = this._texture;\n }\n\n async load(cubemapTexture, Shader = null, shaderParams = []) {\n this._texture = cubemapTexture;\n\n this._material = new Material();\n this._material.diffuse = this._texture;\n\n this._shader = Shader ? new Shader(this.renderer) : new SkyCubeShader(this.renderer);\n await this._shader.load.apply(this._shader,shaderParams);\n }\n\n updateRenderState({ viewMatrix, projectionMatrix = null }) {\n const rotationMatrix = Mat4.GetRotation(viewMatrix);\n if (!this._renderState) {\n this._renderState = new RenderState({\n shader: this._shader,\n polyListRenderer: this.polyListRenderer,\n materialRenderer: this.renderer.factory.material(this._material),\n viewMatrix: rotationMatrix,\n projectionMatrix\n });\n }\n else {\n this._renderState.viewMatrix = rotationMatrix;\n if (projectionMatrix) {\n this._renderState.projectionMatrix = projectionMatrix;\n }\n }\n return this._renderState;\n }\n\n draw() {\n throw new Error(\"SkyCube.draw(): Calling base implementation of SkyCube\");\n }\n\n get polyListRenderer() {\n if (!this._plistRenderer) {\n const cube = createCube(1,1,1);\n cube.cullFace = PolyListCullFace.FRONT; // Draw back face\n this._plistRenderer = this.renderer.factory.polyList(cube);\n }\n return this._plistRenderer;\n }\n\n destroy() {\n this._shader.destroy();\n this._texture.destroy();\n this._plistRenderer.destroy();\n this._material.destroy();\n this._shader = null;\n this._texture = null;\n this._material = null;\n this._plistRenderer = null;\n this._renderState = null;\n }\n}","import Shader from \"../render/Shader\";\nimport ShaderProgram from \"../render/webgl/ShaderProgram\";\nimport { TextureTargetName } from \"../base/Texture\";\nimport Vec from \"../math/Vec\";\n\nconst g_code = {\n webgl: {\n vertex: `precision mediump float;\n \n attribute vec3 vertPosition;\n attribute vec2 t0Position;\n \n varying vec2 fragT0Pos;\n \n uniform mat4 mView;\n uniform mat4 mProj;\n \n void main() {\n fragT0Pos = t0Position;\n gl_Position = mProj * mView * vec4(vertPosition, 1.0);\n }`,\n\n fragment: `precision mediump float;\n \n varying vec2 fragT0Pos;\n \n uniform sampler2D uTexture;\n \n void main() {\n vec4 texColor = texture2D(uTexture, fragT0Pos);\n gl_FragColor = vec4(texColor.rgb, 1.0);\n }`\n }\n};\n\nexport default class SkySphereShader extends Shader {\n constructor(renderer) {\n super(renderer);\n\n if (renderer.typeId !== \"WebGL\") {\n throw Error(\"PresentTextureShader is only compatible with WebGL renderer\");\n }\n }\n\n async load() {\n const { gl } = this.renderer;\n this._program = new ShaderProgram(gl, \"SkySphereShader\");\n this._program.attachVertexSource(g_code.webgl.vertex);\n this._program.attachFragmentSource(g_code.webgl.fragment);\n this._program.link();\n }\n\n setup(plistRenderer, materialRenderer, modelMatrix, viewMatrix, projectionMatrix) {\n const { material } = materialRenderer;\n const { gl } = this.renderer;\n this.renderer.state.shaderProgram = this._program;\n\n this._program.uniformMatrix4fv('mView', false, viewMatrix);\n this._program.uniformMatrix4fv('mProj', false, projectionMatrix);\n\n gl.activeTexture(gl.TEXTURE0);\n this._program.uniform1i('uTexture', 0);\n if (material.diffuse instanceof Vec) {\n throw new Error(\"Invalid material configuration in SkySphereShader: diffuse component must be a texture\");\n }\n const webglTexture = materialRenderer.getTextureRenderer('diffuse').getApiObject();\n const target = TextureTargetName[material.diffuse.target];\n gl.bindTexture(gl[target], webglTexture);\n \n this._program.positionAttribPointer(plistRenderer.positionAttribParams(\"vertPosition\"));\n this._program.texCoordAttribPointer(plistRenderer.texCoord0AttribParams(\"t0Position\"));\n }\n\n destroy() {\n ShaderProgram.Delete(this._program);\n }\n}\n","import { createSphere } from \"../primitives\";\nimport SkySphereShader from \"../shaders/SkySphereShader\";\nimport RenderState from \"./RenderState\";\nimport Material from \"../base/Material\";\nimport Texture, { ProceduralTextureFunction, TextureFilter, TextureWrap } from \"../base/Texture\";\nimport Mat4 from \"../math/Mat4\";\nimport { PolyListCullFace, PolyListFrontFace } from \"../base/PolyList\";\nimport Color from \"../base/Color\";\n\nexport default class SkySphere {\n constructor(renderer) {\n this._renderer = renderer;\n }\n\n get renderer() { return this._renderer; }\n\n async load(equirectangularTextureUrl, Shader = null) {\n this._texture = new Texture();\n if (equirectangularTextureUrl) {\n this._texture.fileName = equirectangularTextureUrl;\n }\n else {\n // Load black texture\n this._texture.magFilter = TextureFilter.NEAREST;\n this._texture.minFilter = TextureFilter.NEAREST;\n this._texture.wrapModeXY = TextureWrap.REPEAT;\n this._texture.proceduralFunction = ProceduralTextureFunction.PLAIN_COLOR;\n this._texture.proceduralParameters = Color.Black();\n this._texture.size = [2, 2];\n }\n await this._texture.loadImageData();\n\n this._material = new Material();\n this._material.diffuse = this._texture;\n\n this._shader = Shader ? new Shader(this.renderer) : new SkySphereShader(this.renderer);\n await this._shader.load();\n }\n\n async setTexture(equirectangularTextureUrl) {\n if (this._texture) {\n this._texture.destroy();\n }\n this._texture.fileName = equirectangularTextureUrl;\n await this._texture.loadImageData();\n\n this._material.diffuse = this._texture;\n }\n\n updateRenderState({ viewMatrix, projectionMatrix = null }) {\n const rotationMatrix = Mat4.GetRotation(viewMatrix);\n if (!this._renderState) {\n this._renderState = new RenderState({\n shader: this._shader,\n polyListRenderer: this.polyListRenderer,\n materialRenderer: this.renderer.factory.material(this._material),\n viewMatrix: rotationMatrix,\n projectionMatrix\n });\n }\n else {\n this._renderState.viewMatrix = rotationMatrix;\n if (projectionMatrix) {\n this._renderState.projectionMatrix = projectionMatrix;\n }\n }\n return this._renderState;\n }\n\n draw() {\n throw new Error(\"SkySphere.draw(): Calling base implementation of SkySphere\");\n }\n\n get polyListRenderer() {\n if (!this._plistRenderer) {\n const sphere = createSphere(3.5);\n sphere.cullFace = PolyListCullFace.FRONT; // Draw back face\n this._plistRenderer = this.renderer.factory.polyList(sphere);\n }\n return this._plistRenderer;\n }\n\n destroy() {\n this._shader.destroy();\n this._texture.destroy();\n this._plistRenderer.destroy();\n this._shader = null;\n this._texture = null;\n this._material.destroy();\n this._material = null;\n this._plistRenderer = null;\n this._renderState = null;\n }\n}","import { TextureTarget } from \"../base/Texture\";\nexport default class TextureRenderer {\n constructor(renderer, texture) {\n if (texture.renderer) {\n throw new Error(\"Invalid initialization of texture renderer: The texture object is already controlled by another texture renderer.\");\n }\n\n this._renderer = renderer;\n this._texture = texture;\n this._texture._renderer = this;\n }\n\n get renderer() {\n return this._renderer;\n }\n\n get texture() {\n return this._texture;\n }\n\n getApiObject(texture) {\n // Return the specific texture identifier for renderer type\n throw new Error(\"TextureRenderer: getApiObject() invalid usage of generic implementation of TextureRenderer\");\n }\n\n destroy() {\n throw new Error(\"TextureRenderer: destroy() invalid usage of generic implementation of TextureRenderer\");\n }\n}","\nimport FrameBuffer from \"../FrameBuffer\";\n\nexport default class WebGLFrameBuffer extends FrameBuffer {\n clear({ color = true, depth = true, stencil = false } = {}) {\n const { state } = this.renderer;\n state.clear({ color, depth, stencil });\n }\n}","\nconst BRDFIntegrationMap = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIAEAIAAAArip/uAAAEtWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgdGlmZjpJbWFnZUxlbmd0aD0iNTEyIgogICB0aWZmOkltYWdlV2lkdGg9IjUxMiIKICAgdGlmZjpSZXNvbHV0aW9uVW5pdD0iMiIKICAgdGlmZjpYUmVzb2x1dGlvbj0iNzIvMSIKICAgdGlmZjpZUmVzb2x1dGlvbj0iNzIvMSIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjUxMiIKICAgZXhpZjpQaXhlbFlEaW1lbnNpb249IjUxMiIKICAgZXhpZjpDb2xvclNwYWNlPSIxIgogICBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIgogICBwaG90b3Nob3A6SUNDUHJvZmlsZT0ic1JHQiBJRUM2MTk2Ni0yLjEiCiAgIHhtcDpNb2RpZnlEYXRlPSIyMDI1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\";\n\nexport default BRDFIntegrationMap;\n","import Color from \"../base/Color\"\nimport Texture, { ProceduralTextureFunction, TextureFilter, TextureTarget, TextureWrap } from \"../base/Texture\"\nimport BRDFIntegrationMap from \"../render/BRDFIntegrationMap\";\n\nconst g_textureDatabase = {\n whiteTexture: {},\n blackTexture: {},\n normalTexture: {},\n brdfIntegrationTexture: {}\n}\n\nconst createColorTexture = async (color, name = \"\") => {\n const result = new Texture();\n result.magFilter = TextureFilter.NEAREST;\n result.minFilter = TextureFilter.NEAREST;\n result.wrapModeXY = TextureWrap.REPEAT;\n result.proceduralFunction = ProceduralTextureFunction.PLAIN_COLOR;\n result.proceduralParameters = color;\n result.size = [2, 2];\n name = name || `ColorTexture_${color.r}_${color.g}_${color.b}_${color.a}`;\n result.name = `${ name }_${result.size.width}_${result.size.height}`;\n await result.loadImageData();\n return result;\n}\n\nexport const createWhiteTexture = async (renderer) => {\n if (!g_textureDatabase.whiteTexture[renderer.uniqueId]) {\n g_textureDatabase.whiteTexture[renderer.uniqueId] = await createColorTexture(Color.White(), \"WhiteTexture\");\n }\n return g_textureDatabase.whiteTexture[renderer.uniqueId];\n}\nexport const whiteTexture = (renderer) => {\n if (!g_textureDatabase.whiteTexture[renderer.uniqueId]) {\n throw new Error(`TextureResourceDatabase: whiteTexture is not initialize. Call 'createWhiteTexture' before use 'whiteTexture' function`);\n }\n return g_textureDatabase.whiteTexture[renderer.uniqueId];\n}\n\nexport const createBlackTexture = async (renderer) => {\n if (!g_textureDatabase.blackTexture[renderer.uniqueId]) {\n g_textureDatabase.blackTexture[renderer.uniqueId] = await createColorTexture(Color.Black(), \"BlackTexture\");\n }\n return g_textureDatabase.blackTexture[renderer.uniqueId];\n}\n\nexport const blackTexture = (renderer) => {\n if (!g_textureDatabase.blackTexture[renderer.uniqueId]) {\n throw new Error(`TextureResourceDatabase: blackTexture is not initialize. Call 'createBlackTexture' before use 'blackTexture' function`);\n }\n return g_textureDatabase.blackTexture[renderer.uniqueId];\n}\n\nexport const createNormalTexture = async (renderer) => {\n if (!g_textureDatabase.normalTexture[renderer.uniqueId]) {\n g_textureDatabase.normalTexture[renderer.uniqueId] = await createColorTexture(new Color([0.5, 0.5, 1, 1]), \"NormalMapTexture\");\n }\n return g_textureDatabase.normalTexture[renderer.uniqueId];\n}\n\nexport const normalTexture = (renderer) => {\n if (!g_textureDatabase.normalTexture[renderer.uniqueId]) {\n throw new Error(`TextureResourceDatabase: normalTexture is not initialized. Call 'createNormalTexture' before use 'normalTexture' function`);\n }\n return g_textureDatabase.normalTexture[renderer.uniqueId];\n}\n\nexport const createBRDFIntegrationTexture = async (renderer) => {\n if (!g_textureDatabase.brdfIntegrationTexture[renderer.uniqueId]) {\n const tex = new Texture();\n tex.name = \"BRDFIntegrationMapTexture\";\n tex.target = TextureTarget.TEXTURE_2D;\n tex.proceduralFunction = ProceduralTextureFunction.FROM_BASE64;\n tex.proceduralParameters = {\n imageData: BRDFIntegrationMap\n };\n await tex.loadImageData();\n g_textureDatabase.brdfIntegrationTexture[renderer.uniqueId] = tex;\n }\n return g_textureDatabase.brdfIntegrationTexture[renderer.uniqueId];\n}\n\nexport const BRDFIntegrationTexture = (renderer) => {\n if (!g_textureDatabase.brdfIntegrationTexture[renderer.uniqueId]) {\n throw new Error(`TextureResourceDatabase: BRDFIntegrationTexture is not initialized. Call 'createBRDFIntegrationTexture' before use 'BRDFIntegrationTexture' function`);\n }\n return g_textureDatabase.brdfIntegrationTexture[renderer.uniqueId];\n}\n","import Texture, { TextureChannel, TextureTargetName } from \"../../base/Texture\";\nimport MaterialRenderer from \"../MaterialRenderer\";\nimport { whiteTexture, createWhiteTexture, blackTexture, createBlackTexture } from \"../../tools/TextureResourceDatabase\";\n\nexport default class WebGLMaterialRenderer extends MaterialRenderer {\n static async InitResources(renderer) {\n await createWhiteTexture(renderer);\n await createBlackTexture(renderer);\n }\n\n constructor(renderer, material) {\n super(renderer, material);\n if (material.renderer) {\n throw new Error(\"Duplicate material renderer set to material. Please, use the Renderer factory to get material renderer instance.\");\n }\n material._renderer = this;\n\n this._whiteTexture = renderer.factory.texture(whiteTexture(renderer));\n this._blackTexture = renderer.factory.texture(blackTexture(renderer));\n this._textureMerger = renderer.factory.textureMerger();\n }\n\n mergeTextures() {\n if (this.material.dirty) {\n const getTexture = (att, fallbackTexture = this._whiteTexture) => {\n if (this.material[att] instanceof Texture) {\n return this.material[att];\n }\n else {\n return fallbackTexture.texture;\n }\n }\n\n this._textureMerger.setTexture(getTexture('metallic'), TextureChannel.R, TextureChannel.R + this.material.metallicChannel);\n this._textureMerger.setTexture(getTexture('roughness'), TextureChannel.G, TextureChannel.R + this.material.roughnessChannel);\n this._textureMerger.setTexture(getTexture('lightEmission', this._blackTexture), TextureChannel.B, TextureChannel.R + this.material.lightEmissionChannel);\n this._textureMerger.setTexture(getTexture('ambientOcclussion'), TextureChannel.A, TextureChannel.R + this.material.ambientOcclussionChannel);\n this._textureMerger.update();\n this.material.dirty = false;\n }\n }\n\n get metallicRoughnessHeightAOTexture() {\n return this._textureMerger.mergedTexture;\n }\n\n destroy() {\n console.log(\"Destroy material renderer\");\n if (this.material) {\n this.material._renderer = null;\n }\n }\n\n // Bind the metallic, roughness, height and ambient occlussion combined texture\n bindMetallicRoughnessHeightAOTexture(shaderProgram, uniformName, textureUnit) {\n shaderProgram.bindTexture(uniformName, this.renderer.factory.texture(this.metallicRoughnessHeightAOTexture), textureUnit);\n return true;\n }\n\n // Binds the property to the uniformName uniform of the shader program, if the\n // material property ies a texture. If not, it binds the fallbackTexture. If the fallbackTexture\n // value is null, it binds a 2x2 px white texture\n bindTexture(shaderProgram, property, uniformName, textureUnit, fallbackTexture = null) {\n if (this.material[property] instanceof Texture) {\n shaderProgram.bindTexture(uniformName, this.getTextureRenderer(property), textureUnit);\n return true;\n }\n else if (fallbackTexture instanceof Texture) {\n shaderProgram.bindTexture(uniformName, this.renderer.factory.texture(fallbackTexture), textureUnit);\n return false;\n }\n else {\n shaderProgram.bindTexture(uniformName, this._whiteTexture, textureUnit);\n return false;\n }\n }\n\n // Bind the property to the uniformName uniform of the shader program, if the\n // material property is a color. If not, it binds the fallbackColor vector\n bindColor(shaderProgram, property, uniformName, fallbackColor = [1, 1, 1, 1]) {\n if (this.material[property].length>=4) {\n shaderProgram.uniform4fv(uniformName, this.material[property]);\n }\n else {\n shaderProgram.uniform4fv(uniformName, fallbackColor);\n }\n }\n\n // Bind the property to the uniformName uniform of the shader program, if the\n // material property is a number. If not, it binds the fallbackValue value\n bindValue(shaderProgram, property, uniformName, fallbackValue = 1) {\n if (typeof(this.material[property]) === \"number\") {\n shaderProgram.uniform1f(uniformName, this.material[property]);\n }\n else {\n shaderProgram.uniform1f(uniformName, fallbackValue);\n }\n }\n}","\nimport Pipeline, { BlendEquation, BlendFunction } from \"../Pipeline\";\n\nconst getBlendEquation = (gl, blendEquation) => {\n switch (blendEquation) {\n case BlendEquation.ADD:\n return gl.FUNC_ADD; \n case BlendEquation.FUNC_SUBTRACT:\n return gl.SUBTRACT; \n case BlendEquation.REVERSE_SUBTRACT:\n return gl.FUNC_REVERSE_SUBTRACT; \n }\n throw new Error(`Invalid blend equation specified in WebGLPipeline: ${ blendEquation }`);\n}\n\nconst getBlendFunc = (gl, blendFunc) => {\n switch (blendFunc) {\n case BlendFunction.NULL:\n return null;\n case BlendFunction.ZERO:\n return gl.ZERO;\n case BlendFunction.ONE:\n return gl.ONE;\n case BlendFunction.SRC_COLOR:\n return gl.SRC_COLOR;\n case BlendFunction.ONE_MINUS_SRC_COLOR:\n return gl.ONE_MINUS_SRC_COLOR;\n case BlendFunction.DST_COLOR:\n return gl.DST_COLOR;\n case BlendFunction.ONE_MINUS_DST_COLOR:\n return gl.ONE_MINUS_DST_COLOR;\n case BlendFunction.SRC_ALPHA:\n return gl.SRC_ALPHA;\n case BlendFunction.ONE_MINUS_SRC_ALPHA:\n return gl.ONE_MINUS_SRC_ALPHA;\n case BlendFunction.DST_ALPHA:\n return gl.DST_ALPHA;\n case BlendFunction.ONE_MINUS_DST_ALPHA:\n return gl.ONE_MINUS_DST_ALPHA;\n }\n throw new Error(`Invalid blend function specified in WebGLPipeline: ${ blendFunc }`);\n}\n\nexport default class WebGLPipeline extends Pipeline {\n create() {\n const { gl } = this.renderer;\n\n // Set the webgl equivalent values\n this._blendEquation = getBlendEquation(gl, this.blendState.blendEquation);\n this._blendFuncSrcColor = getBlendFunc(gl, this.blendState.blendFuncSrc);\n this._blendFuncSrcAlpha = getBlendFunc(gl, this.blendState.blendFuncSrcAlpha);\n this._blendFuncDstColor = getBlendFunc(gl, this.blendState.blendFuncDst);\n this._blendFuncDstAlpha = getBlendFunc(gl, this.blendState.blendFuncDstAlpha);\n if ((this._blendFuncDstAlpha === null && this._blendFuncSrcAlpha !== null) ||\n (this._blendFuncDstAlpha !== null && this._blendFuncSrcAlpha === null))\n {\n throw new Error(\"WebGLPipeline.create(): Invalid values of blendFuncDstAlpha and blendFuncSrcAlpha\");\n }\n this._blendFunc = this._blendFuncDstAlpha !== null ? (a,b) => gl.blendFunc(a,b) : (a,b,c,d) => gl.blendFuncSeparate(a,b,c,d);\n }\n\n activate() {\n const { gl, state } = this.renderer;\n this.blendState.enabled ? gl.enable(gl.BLEND) : gl.disable(gl.BLEND);\n gl.blendEquation(this._blendEquation);\n this._blendFunc(\n this._blendFuncSrcColor,\n this._blendFuncDstColor,\n this._blendFuncSrcAlpha,\n this._blendFuncDstAlpha\n );\n\n state.depthTestEnabled = this.depthTest;\n\n if (this.cullFace) {\n gl.enable(gl.CULL_FACE);\n }\n else {\n gl.disable(gl.CULL_FACE);\n }\n }\n}","\nexport const BufferTarget = {\n ARRAY_BUFFER: 0,\n ELEMENT_ARRAY_BUFFER: 1,\n\n // WebGL 2:\n COPY_READ_BUFFER: 2,\n COPY_WRITE_BUFFER: 3,\n TRANSFORM_FEEDBACK_BUFFER: 4,\n UNIFORM_BUFFER: 5,\n PIXEL_PACK_BUFFER: 6,\n PIXEL_UNPACK_BUFFER: 7\n};\n\nexport const BufferUsage = {\n STATIC_DRAW: 0,\n DYNAMIC_DRAW: 1,\n STREAM_DRAW: 2,\n\n // WebGL 2:\n STATIC_READ: 3,\n DYNAMIC_READ: 4,\n STREAM_READ: 5,\n STATIC_COPY: 6,\n DYNAMIC_COPY: 7,\n STREAM_COPY: 8\n};\n\nconst g_bufferTargetConversion = [];\nconst g_bufferUsageConversion = [];\n\nconst g_createdBuffers = {};\n\n// DEBUG: assign an unique identifier to each buffer\nlet g_bg2e_id__ = 0;\n\nexport default class VertexBuffer {\n\n static Delete(buffer) {\n const gls = Symbol.for(buffer._gl);\n const buffer_s = Symbol.for(buffer._buffer);\n g_createdBuffers[gls] = g_createdBuffers[gls] || {};\n if (g_createdBuffers[gls][buffer_s]) {\n delete g_createdBuffers[gls][buffer_s];\n }\n buffer._gl.deleteBuffer(buffer._buffer);\n buffer._buffer = null;\n }\n\n static CreateArrayBuffer(gl,data,usage = BufferUsage.STATIC_DRAW) {\n const buffer = new VertexBuffer(gl);\n buffer.bind(BufferTarget.ARRAY_BUFFER);\n buffer.bufferData(BufferTarget.ARRAY_BUFFER, data, usage);\n return buffer;\n }\n\n static CreateElementArrayBuffer(gl,data,usage = BufferUsage.STATIC_DRAW) {\n const buffer = new VertexBuffer(gl);\n buffer.bind(BufferTarget.ELEMENT_ARRAY_BUFFER);\n buffer.bufferData(BufferTarget.ELEMENT_ARRAY_BUFFER, data, usage);\n return buffer;\n }\n \n static CurrentBuffer(gl, target) {\n if (target === BufferTarget.ARRAY_BUFFER) {\n target = gl.ARRAY_BUFFER_BINDING;\n }\n else if (target === BufferTarget.ELEMENT_ARRAY_BUFFER) {\n target = gl.ELEMENT_ARRAY_BUFFER_BINDING;\n }\n const gls = gl._bg2_id;\n g_createdBuffers[gls] = g_createdBuffers[gls] || {}\n const gl_buffer = gl.getParameter(target);\n const buffer = g_createdBuffers[gls][gl_buffer._bg2e_id_];\n return buffer;\n }\n\n get id() {\n return this._buffer?._bg2e_id_;\n }\n\n constructor(gl) {\n this._gl = gl;\n this._buffer = gl.createBuffer();\n gl._bg2_id_ = gl._bg2_id_ ?? ++g_bg2e_id__;\n this._buffer._bg2e_id_ = ++g_bg2e_id__;\n const gls = gl._bg2_id;\n g_createdBuffers[gls] = g_createdBuffers[gls] || {}\n g_createdBuffers[gls][this._buffer._bg2e_id_] = this;\n\n if (g_bufferTargetConversion.length === 0) {\n g_bufferTargetConversion.push(gl.ARRAY_BUFFER);\n g_bufferTargetConversion.push(gl.ELEMENT_ARRAY_BUFFER);\n g_bufferTargetConversion.push(gl.COPY_READ_BUFFER);\n g_bufferTargetConversion.push(gl.COPY_WRITE_BUFFER);\n g_bufferTargetConversion.push(gl.TRANSFORM_FEEDBACK_BUFFER);\n g_bufferTargetConversion.push(gl.UNIFORM_BUFFER);\n g_bufferTargetConversion.push(gl.PIXEL_PACK_BUFFER);\n g_bufferTargetConversion.push(gl.PIXEL_UNPACK_BUFFER);\n }\n\n if (g_bufferUsageConversion.length === 0) {\n g_bufferUsageConversion.push(gl.STATIC_DRAW);\n g_bufferUsageConversion.push(gl.DYNAMIC_DRAW);\n g_bufferUsageConversion.push(gl.STREAM_DRAW);\n g_bufferUsageConversion.push(gl.STATIC_READ);\n g_bufferUsageConversion.push(gl.DYNAMIC_READ);\n g_bufferUsageConversion.push(gl.STREAM_READ);\n g_bufferUsageConversion.push(gl.STATIC_COPY);\n g_bufferUsageConversion.push(gl.DYNAMIC_COPY);\n g_bufferUsageConversion.push(gl.STREAM_COPY);\n }\n }\n\n get buffer() {\n return this._buffer;\n }\n\n bind(target) {\n this._gl.bindBuffer(g_bufferTargetConversion[target], this._buffer);\n }\n\n bufferData(target, data, usage, srcOffset = null, length = null) {\n this._gl.bufferData(\n g_bufferTargetConversion[target], data, \n g_bufferUsageConversion[usage], srcOffset, length);\n }\n}\n","\nimport { DrawMode, PolyListCullFace, PolyListFrontFace } from \"../../base/PolyList\";\nimport PolyListRenderer from \"../PolyListRenderer\";\nimport VertexBuffer, { BufferTarget } from \"./VertexBuffer\";\n\nexport default class WebGLPolyListRenderer extends PolyListRenderer {\n constructor(renderer,polyList) {\n super(renderer,polyList);\n }\n\n init() {\n this._vertexBuffer = null;\n this._indexBuffer = null;\n this._indexArrayFormat = null;\n }\n\n get valid() {\n return this._vertexBuffer !== null && this._indexArrayFormat !== null && this._indexBuffer !== null;\n }\n\n refresh() {\n const getVector = (items, current, stride) => items.length && (stride === 3 ?\n [items[current * stride], items[current * stride + 1], items[current * stride + 2]] :\n stride === 2 ? [items[current * stride], items[current * stride + 1]] || null :\n [items[current * stride], items[current * stride + 1], items[current * stride + 2], items[current * stride + 3]])\n\n const numElements = this.polyList.vertex.length / 3;\n const result = [];\n for (let i = 0; i < numElements; ++i) {\n const v = getVector(this.polyList.vertex, i, 3);\n const n = getVector(this.polyList.normal, i, 3);\n const t0 = getVector(this.polyList.texCoord0, i, 2);\n const t1 = getVector(this.polyList.texCoord1, i, 2);\n const t2 = getVector(this.polyList.texCoord2, i, 2);\n const c = getVector(this.polyList.color, i, 4);\n const t = getVector(this.polyList.tangent, i, 3);\n\n result.push(...v);\n if (n) {\n result.push(...n);\n }\n if (t0) {\n result.push(...t0);\n }\n if (t1) {\n result.push(...t1);\n }\n if (t2) {\n result.push(...t2);\n }\n if (c) {\n result.push(...c);\n }\n if (t) {\n result.push(...t);\n }\n }\n\n this._stride = 3;\n const vertex = 0;\n const normal = 3;\n let texCoord0 = 3;\n let texCoord1 = 3;\n let texCoord2 = 3;\n let color = 3;\n let tangent = 3;\n if (this.hasNormal) {\n this._stride += 3;\n texCoord0 += 3;\n texCoord1 += 3;\n texCoord2 += 3;\n color += 3;\n tangent += 3;\n }\n if (this.hasTexCoord0) {\n this._stride += 2;\n texCoord1 += 2;\n texCoord2 += 2;\n color += 2;\n tangent += 2;\n }\n if (this.hasTexCoord1) {\n this._stride += 2;\n texCoord2 += 2;\n color += 2;\n tangent += 2;\n }\n if (this.hasTexCoord2) {\n this._stride += 2;\n color += 2;\n tangent += 2;\n }\n if (this.hasColor) {\n this._stride += 4;\n tangent += 4;\n }\n if (this.hasTangent) {\n this._stride += 3;\n }\n\n this._offsets = { vertex, normal, texCoord0, texCoord1, texCoord2, color, tangent };\n this._vertexBuffer = VertexBuffer.CreateArrayBuffer(this.renderer.gl, new Float32Array(result));\n const indexArray = this.polyList.index.length < 65535 ? new Uint16Array(this.polyList.index) : new Uint32Array(this.polyList.index);\n this._indexBuffer = VertexBuffer.CreateElementArrayBuffer(this.renderer.gl, indexArray);\n this._indexArrayFormat = indexArray instanceof Uint16Array ? this.renderer.gl.UNSIGNED_SHORT : this.renderer.gl.UNSIGNED_INT;\n }\n\n get hasNormal() {\n return this._polyList.normal.length > 0;\n }\n\n get hasTexCoord0() {\n return this._polyList.texCoord0.length > 0;\n }\n\n get hasTexCoord1() {\n return this._polyList.texCoord1.length > 0;\n }\n\n get hasTexCoord2() {\n return this._polyList.texCoord2.length > 0;\n }\n\n get hasColor() {\n return this._polyList.color.length > 0;\n }\n\n get hasTangent() {\n return this._polyList.tangent.length > 0;\n }\n\n positionAttribParams(name) {\n return { name, stride: this._stride, size: 3, offset: 0, enable: true }\n }\n\n normalAttribParams(name) {\n return { name, stride: this._stride, size: 3, offset: this._offsets.normal, enable: true }\n }\n\n texCoord0AttribParams(name) {\n return { name, stride: this._stride, size: 2, offset: this._offsets.texCoord0, enable: true }\n }\n\n texCoord1AttribParams(name) {\n return { name, stride: this._stride, size: 2, offset: this._offsets.texCoord1, enable: true }\n }\n\n texCoord2AttribParams(name) {\n return { name, stride: this._stride, size: 2, offset: this._offsets.texCoord2, enable: true }\n }\n \n colorAttribParams(name) {\n return { name, stride: this._stride, size: 4, offset: this._offsets.color, enable: true }\n }\n\n tangentAttribParams(name) {\n return { name, stride: this._stride, size: 3, offset: this._offsets.tangent, enable: true }\n }\n\n bindBuffers() {\n this._vertexBuffer.bind(BufferTarget.ARRAY_BUFFER);\n this._indexBuffer.bind(BufferTarget.ELEMENT_ARRAY_BUFFER); \n }\n \n draw() {\n const { gl, state } = this.renderer;\n\n state.cullFaceEnabled = this.polyList.enableCullFace;\n \n switch (this.polyList.frontFace) {\n case PolyListFrontFace.CCW:\n state.frontFace = state.CCW;\n break;\n case PolyListFrontFace.CW:\n state.frontFace = state.CW;\n break;\n }\n\n switch (this.polyList.cullFace) {\n case PolyListCullFace.BACK:\n state.cullFace = state.BACK;\n break;\n case PolyListCullFace.FRONT:\n state.cullFace = state.FRONT;\n break;\n case PolyListCullFace.FRONT_AND_BACK:\n state.cullFace = state.FRONT_AND_BACK;\n break;\n }\n\n\n \n let mode = 0;\n switch (this._polyList.drawMode) {\n case DrawMode.POINTS:\n mode = gl.POINTS;\n break;\n case DrawMode.TRIANGLES:\n mode = gl.TRIANGLES;\n break;\n case DrawMode.TRIANGLE_FAN:\n mode = gl.TRIANGLE_FAN\n break;\n case DrawMode.TRIANGLE_STRIP:\n mode = gl.TRIANGLE_STRIP;\n break;\n case DrawMode.LINES:\n mode = gl.LINES;\n break;\n case DrawMode.LINE_STRIP:\n mode = gl.LINE_STRIP;\n break;\n }\n\n gl.lineWidth(this.polyList.lineWidth);\n\n gl.drawElements(mode, this.polyList.index.length, this._indexArrayFormat, 0);\n }\n\n destroy() {\n VertexBuffer.Delete(this._vertexBuffer);\n VertexBuffer.Delete(this._indexBuffer);\n }\n}\n","\nimport { TextureRenderTargetAttachment, TextureTargetName } from \"../../base/Texture\";\nimport Vec from \"../../math/Vec\";\nimport RenderBuffer, { RenderBufferType, CubeMapFace } from \"../RenderBuffer\";\n\nfunction glEnumToString(gl, value) {\n for(var key in gl) {\n if (gl[key] === value) {\n return key;\n }\n }\n return \"0x\" + value.toString(16);\n }\n\nfunction getAttachmentPoint(gl,att) {\n switch (Number(att)) {\n case TextureRenderTargetAttachment.COLOR_ATTACHMENT_0:\n return gl.COLOR_ATTACHMENT0;\n case TextureRenderTargetAttachment.COLOR_ATTACHMENT_1:\n return gl.COLOR_ATTACHMENT1;\n case TextureRenderTargetAttachment.COLOR_ATTACHMENT_2:\n return gl.COLOR_ATTACHMENT2;\n case TextureRenderTargetAttachment.COLOR_ATTACHMENT_3:\n return gl.COLOR_ATTACHMENT3;\n case TextureRenderTargetAttachment.COLOR_ATTACHMENT_4:\n return gl.COLOR_ATTACHMENT4;\n case TextureRenderTargetAttachment.COLOR_ATTACHMENT_5:\n return gl.COLOR_ATTACHMENT5;\n case TextureRenderTargetAttachment.COLOR_ATTACHMENT_6:\n return gl.COLOR_ATTACHMENT6;\n case TextureRenderTargetAttachment.COLOR_ATTACHMENT_7:\n return gl.COLOR_ATTACHMENT7;\n case TextureRenderTargetAttachment.COLOR_ATTACHMENT_8:\n return gl.COLOR_ATTACHMENT8;\n case TextureRenderTargetAttachment.COLOR_ATTACHMENT_9:\n return gl.COLOR_ATTACHMENT9;\n case TextureRenderTargetAttachment.COLOR_ATTACHMENT_10:\n return gl.COLOR_ATTACHMENT10;\n case TextureRenderTargetAttachment.COLOR_ATTACHMENT_11:\n return gl.COLOR_ATTACHMENT11;\n case TextureRenderTargetAttachment.COLOR_ATTACHMENT_12:\n return gl.COLOR_ATTACHMENT12;\n case TextureRenderTargetAttachment.COLOR_ATTACHMENT_13:\n return gl.COLOR_ATTACHMENT13;\n case TextureRenderTargetAttachment.COLOR_ATTACHMENT_14:\n return gl.COLOR_ATTACHMENT14;\n case TextureRenderTargetAttachment.COLOR_ATTACHMENT_15:\n return gl.COLOR_ATTACHMENT15;\n case TextureRenderTargetAttachment.DEPTH_ATTACHMENT:\n return gl.DEPTH_ATTACHMENT;\n case TextureRenderTargetAttachment.STENCIL_ATTACHMENT:\n return gl.STENCIL_ATTACHMET;\n default:\n throw new Error(`RenderBuffer.beginUpdate() Error creating render buffer. Invalid attachment ${att}`);\n }\n}\n\nfunction getTextureTarget(gl,texture) {\n return gl[TextureTargetName[texture.target]];\n}\n\nfunction beginUpdateTexture() {\n const { gl } = this.renderer;\n\n if (this.dirty) {\n if (this._framebuffer) {\n gl.deleteFramebuffer(this._framebuffer);\n }\n this._framebuffer = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._framebuffer);\n\n let depthBufferPresent = false;\n for (const attachment in this.attachments) {\n const textureRenderer = this.attachments[attachment];\n const textureApi = textureRenderer.getApiObject();\n const attachmentPoint = getAttachmentPoint(gl,attachment);\n const textureTarget = getTextureTarget(gl,textureRenderer.texture);\n const level = 0;\n gl.framebufferTexture2D(gl.FRAMEBUFFER, attachmentPoint, textureTarget, textureApi, level);\n depthBufferPresent = depthBufferPresent || Number(attachment) === TextureRenderTargetAttachment.DEPTH_ATTACHMENT;\n }\n\n if (!depthBufferPresent) {\n this._depthBuffer = gl.createRenderbuffer();\n gl.bindRenderbuffer(gl.RENDERBUFFER, this._depthBuffer);\n\n gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, this.size.width, this.size.height);\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, this._depthBuffer);\n }\n\n this.setUpdated(true);\n\n if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) !== gl.FRAMEBUFFER_COMPLETE) {\n throw new Error(\"Error initializing render buffer: the framebuffer is not complete\");\n }\n }\n\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._framebuffer);\n\n this._screenViewport = this.renderer.state.viewport;\n this.renderer.state.viewport = this.size;\n}\n\nfunction endUpdateTexture() {\n const { gl } = this.renderer;\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n this.renderer.state.viewport = this._screenViewport;\n}\n\nfunction beginUpdateCubemap(face) {\n const { gl } = this.renderer;\n const textureRenderer = this.attachments[0];\n const textureApi = textureRenderer?.getApiObject();\n const texture = textureRenderer?.texture;\n\n if (this.dirty) {\n // Cubemap render only supports ONE texture target\n // to COLOR_ATTACHMENT_0, check this and throw an exception\n // if there are more attachments\n if (Object.keys(this.attachments).length !== 1) {\n throw new Error(`Unexpected number of texture attachments rendering cube map. The cube map renderer supports only one color attachment.`);\n }\n\n this.destroy();\n this._framebuffers = [];\n this._depthBuffers = [];\n\n \n const { width, height } = texture.size;\n for (let i = 0; i < 6; ++i) {\n const fb = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, fb);\n this._framebuffers.push(fb);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, textureApi, 0);\n\n const rb = gl.createRenderbuffer();\n this._depthBuffers.push(rb);\n gl.bindRenderbuffer(gl.RENDERBUFFER, rb);\n gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, width, height);\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, rb); \n }\n\n if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) != gl.FRAMEBUFFER_COMPLETE) {\n const statusCode = gl.checkFramebufferStatus(gl.FRAMEBUFFER);\n throw new Error(`Cubemap frame buffer not complete in cube side #${i}: ${glEnumToString(gl, statusCode)}`);\n }\n\n this.setUpdated(true);\n }\n\n // bind face\n // CubeMapFace.POSITIVE_X === 1, see CubeMapFace definition at render/RenderBuffer.js\n const faceIndex = face - 1;\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._framebuffers[faceIndex]);\n\n this._screenViewport = this.renderer.state.viewport;\n this.renderer.state.viewport = texture.size;\n}\n\nfunction endUpdateCubemap() {\n const { gl } = this.renderer;\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n this.renderer.state.viewport = this._screenViewport;\n}\nexport default class WebGLRenderBuffer extends RenderBuffer {\n constructor(renderer) {\n super(renderer);\n }\n\n get frameBuffer() {\n return this.renderer.frameBuffer;\n }\n\n saveVertexBufferState() {\n const { gl } = this.renderer;\n this._prevArrayBufferBinding = gl.getParameter(gl.ARRAY_BUFFER_BINDING);\n this._prevElementBufferBinding = gl.getParameter(gl.ELEMENT_ARRAY_BUFFER_BINDING);\n }\n\n restoreVertexBufferState() {\n const { gl } = this.renderer;\n gl.bindBuffer(gl.ARRAY_BUFFER, this._prevArrayBufferBinding);\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._prevElementBufferBinding);\n }\n\n beginUpdate(textureFace = CubeMapFace.NONE) {\n if (this.type === RenderBufferType.TEXTURE) {\n beginUpdateTexture.apply(this);\n }\n else if (this.type === RenderBufferType.CUBE_MAP) {\n beginUpdateCubemap.apply(this, [textureFace]);\n }\n else {\n throw new Error(\"The render buffer is not initialized\");\n }\n }\n\n endUpdate(textureFace = CubeMapFace.NONE) {\n if (this.type === RenderBufferType.TEXTURE) {\n endUpdateTexture.apply(this);\n }\n else if (this.type === RenderBufferType.CUBE_MAP) {\n endUpdateCubemap.apply(this, [textureFace]);\n }\n else {\n throw new Error(\"The render buffer is not initialized\");\n }\n }\n\n destroy() {\n const { gl } = this.renderer;\n if (this.type === RenderBufferType.TEXTURE) {\n if (this._framebuffer) {\n gl.deleteFramebuffer(this._framebuffer);\n this._framebuffer = null;\n }\n if (this._depthBuffer) {\n gl.deleteRenderbuffer(this._depthBuffer);\n this._depthBuffer = null;\n }\n }\n else if (this.type === RenderBufferType.CUBE_MAP) {\n if (this._framebuffers?.length) {\n this._framebuffers.forEach(fb => gl.deleteFramebuffer(fb));\n }\n if (this._depthBuffers?.length) {\n this._depthBuffers.forEach(db => gl.deleteRenderbuffer(db));\n }\n this._framebuffers = null;\n this._depthBuffers = null;\n }\n }\n\n readPixels(x, y, width, height) {\n const textureRenderer = this.attachments[0];\n const texture = textureRenderer?.texture;\n if (texture) {\n const { gl } = this.renderer;\n const data = new Uint8Array(width * height * 4);\n gl.readPixels(x, texture.size.height - y, width, height, gl.RGBA, gl.UNSIGNED_BYTE, data);\n return data;\n }\n }\n}","export default \"#ifndef COLOR_CORRECTION_GLSL\\n#define COLOR_CORRECTION_GLSL\\n\\n// Convert lineal color to SRGB for shader output\\nvec4 lineal2SRGB(vec4 color, float gamma)\\n{\\n color = color / (color + vec4(1.0));\\n return vec4(pow(color.rgb, vec3(1.0 / gamma)), color.a);\\n}\\n\\nvec3 lineal2SRGB(vec3 color, float gamma)\\n{\\n color = color / (color + vec3(1.0));\\n return pow(color.rgb, vec3(1.0 / gamma));\\n}\\n\\n// Convert SRGB textures to lineal color\\nvec4 SRGB2Lineal(vec4 color, float gamma)\\n{\\n return vec4(pow(color.rgb, vec3(gamma)), color.a);\\n}\\n\\nvec3 SRGB2lLineal(vec3 color, float gamma)\\n{\\n return pow(color, vec3(gamma));\\n}\\n\\nvec4 brightnessContrast(vec4 color, float brightness, float contrast)\\n{\\n mat4 brightnessMat = mat4(\\n 1.0, 0.0, 0.0, 0.0,\\n 0.0, 1.0, 0.0, 0.0,\\n 0.0, 0.0, 1.0, 0.0,\\n brightness, brightness, brightness, 1.0\\n );\\n float t = (1.0 - contrast) / 2.0;\\n mat4 contrastMat = mat4(\\n contrast, 0.0, 0.0, 0.0,\\n 0.0, contrast, 0.0, 0.0,\\n 0.0, 0.0, contrast, 0.0,\\n t, t, t, 1.0\\n );\\n return contrastMat * brightnessMat * color;\\n}\\n\\n#endif // COLOR_CORRECTION_GLSL\\n\\n\"","export default \"\\n#define PI 3.14159265359\\n#define LIGHT_TYPE_POINT 5\\n#define LIGHT_TYPE_DIRECTIONAL 4\\n#define LIGHT_TYPE_SPOT 1\\n#define LIGHT_TYPE_DISABLED 10\\n\"","export default \"\\nmat3 TBNMatrix(mat4 model, vec3 normal, vec3 tangent)\\n{\\n vec3 T = normalize(vec3(model * vec4(tangent, 0.0)));\\n vec3 B = normalize(vec3(model * vec4(cross(tangent, normal), 0.0)));\\n vec3 N = normalize(vec3(model * vec4(normal, 0.0)));\\n return mat3(T, B, N);\\n}\\n\\n\"","export default \"\\n#include \\\"lib/constants.glsl\\\"\\n\\nvec3 fresnelSchlick(float cosTheta, vec3 F0)\\n{\\n return F0 + (1.0 - F0) * pow(clamp(1.0 - cosTheta, 0.0, 1.0), 5.0);\\n}\\n\\nvec3 fresnelSchlickRoughness(float cosTheta, vec3 F0, float roughness)\\n{\\n // Use the Schlick approximation for fresnel with roughness\\n return F0 + (max(vec3(1.0 - roughness), F0) - F0) * pow(clamp(1.0 - cosTheta, 0.0, 1.0), 5.0);\\n}\\n\\nfloat distributionGGX(vec3 normal, vec3 halfVector, float roughness)\\n{\\n float a = roughness * roughness;\\n float a2 = a * a;\\n\\n float NdotH = max(dot(normal, halfVector), 0.0);\\n float NdotH2 = NdotH * NdotH;\\n\\n float denom = NdotH2 * (a2 - 1.0) + 1.0;\\n\\n return a2 / (PI * denom * denom);\\n}\\n\\nfloat geometrySchlickGGX(float NdotV, float roughness)\\n{\\n float r = (roughness + 1.0);\\n float k = (r * r) / 8.0;\\n\\n float num = NdotV;\\n float denom = NdotV * (1.0 - k) + k;\\n\\n return num / denom;\\n}\\n\\nfloat geometrySmith(vec3 normal, vec3 viewDir, vec3 lightDir, float roughness)\\n{\\n float NdotV = max(dot(normal, viewDir), 0.0);\\n float NdotL = max(dot(normal, lightDir), 0.0);\\n float ggx2 = geometrySchlickGGX(NdotV, roughness);\\n float ggx1 = geometrySchlickGGX(NdotL, roughness);\\n return ggx1 * ggx2;\\n}\\n\\nfloat calcAttenuation(vec3 lightPosition, vec3 fragPosition)\\n{\\n float distance = length(lightPosition - fragPosition);\\n return 1.0 / (distance * distance);\\n}\\n\\nvec3 calcRadiancePoint( Light light, vec3 viewDir, vec3 fragPos, float metallic, float roughness, vec3 F0, vec3 normal, vec3 albedo) {\\n // calculate per-light radiance\\n vec3 L = normalize(light.position - fragPos);\\n vec3 H = normalize(viewDir + L);\\n float attenuation = calcAttenuation(light.position, fragPos);\\n vec3 radiance = light.color.rgb * light.intensity * attenuation;\\n \\n // cook-torrance brdf\\n float NDF = distributionGGX(normal, H, roughness);\\n float G = geometrySmith(normal, viewDir, L, roughness);\\n vec3 F = fresnelSchlick(max(dot(H, viewDir), 0.0), F0);\\n \\n vec3 kS = F;\\n vec3 kD = vec3(1.0) - kS;\\n kD *= 1.0 - metallic;\\n \\n vec3 numerator = NDF * G * F;\\n float denominator = 4.0 * max(dot(normal, viewDir), 0.0) * max(dot(normal, L), 0.0) + 0.0001;\\n vec3 specular = numerator / denominator;\\n \\n // add to outgoing radiance Lo\\n float NdotL = max(dot(normal, L), 0.0);\\n return (kD * albedo / PI + specular) * radiance * NdotL;\\n}\\n\\nvec3 calcRadianceDirectional(Light light, vec3 viewDir, vec3 fragPos, float metallic, float roughness, vec3 F0, vec3 normal, vec3 albedo)\\n{\\n vec3 L = normalize(-light.direction);\\n vec3 H = normalize(viewDir + L);\\n vec3 radiance = light.color.rgb * light.intensity;\\n \\n // cook-torrance brdf\\n float NDF = distributionGGX(normal, H, roughness);\\n float G = geometrySmith(normal, viewDir, L, roughness);\\n vec3 F = fresnelSchlick(max(dot(H, viewDir), 0.0), F0);\\n \\n vec3 kS = F;\\n vec3 kD = vec3(1.0) - kS;\\n kD *= 1.0 - metallic;\\n \\n vec3 numerator = NDF * G * F;\\n float denominator = 4.0 * max(dot(normal, viewDir), 0.0) * max(dot(normal, L), 0.0) + 0.0001;\\n vec3 specular = numerator / denominator;\\n \\n // add to outgoing radiance Lo\\n float NdotL = max(dot(normal, L), 0.0);\\n return (kD * albedo / PI + specular) * radiance * NdotL;\\n}\\n\\nvec3 calcRadiance( Light light, vec3 viewDir, vec3 fragPos, float metallic, float roughness, vec3 F0, vec3 normal, vec3 albedo) {\\n if (light.type == LIGHT_TYPE_POINT)\\n {\\n return calcRadiancePoint(light, viewDir, fragPos, metallic, roughness, F0, normal, albedo);\\n }\\n else if (light.type == LIGHT_TYPE_DIRECTIONAL)\\n {\\n return calcRadianceDirectional(light, viewDir, fragPos, metallic, roughness, F0, normal, albedo);\\n }\\n return vec3(0.0);\\n}\\n\\nvec3 getPrefilteredColor(float roughness,vec3 refVec,samplerCube irrMap,samplerCube specMap,samplerCube envMap) {\\n vec3 specMap0 = textureCube(envMap, refVec).rgb;\\n vec3 specMap1 = textureCube(specMap, refVec).rgb;\\n vec3 specMap2 = textureCube(irrMap, refVec).rgb;\\n\\n if (roughness < 0.4) {\\n return mix(specMap0, specMap1, roughness / 0.4);\\n }\\n return mix(specMap1, specMap2, (roughness - 0.4) / 0.6);\\n}\\n\\nvec3 calcAmbientLight( vec3 viewDir, vec3 normal, vec3 F0, vec3 albedo, float metallic, float roughness, samplerCube irradianceMap, samplerCube prefilteredEnvMap, samplerCube envMap, sampler2D brdfLUT, float ambientOcclussion) {\\n vec3 R = reflect(-viewDir, normal);\\n\\n vec3 F = fresnelSchlickRoughness(max(dot(normal, viewDir), 0.0), F0, roughness);\\n \\n vec3 Ks = F;\\n vec3 Kd = 1.0 - Ks;\\n Kd *= 1.0 - metallic;\\n\\n vec3 irradiance = textureCube(irradianceMap, normal).rgb;\\n vec3 diffuse = irradiance * albedo;\\n\\n vec3 prefilteredColor = getPrefilteredColor(roughness, R, irradianceMap, prefilteredEnvMap, envMap);\\n\\n vec2 brdfUV = vec2(clamp(max(dot(normal, viewDir), 0.0), 0.01, 0.99), roughness);\\n vec2 envBRDF = texture2D(brdfLUT, brdfUV).rg;\\n vec3 specular = prefilteredColor * (F * envBRDF.x + envBRDF.y);\\n\\n return (Kd * diffuse + specular) * ambientOcclussion;\\n}\\n\\n// TODO: Extract this function to a shadow map shader function\\nvec3 getShadowColor(vec4 positionFromLightPov, sampler2D shadowMap, float shadowBias, float shadowStrength) {\\n // The vertex location rendered from the light source is almost in\\n // normalized device coordinates (NDC), but the perspective division\\n // has not been performed yet. We need to divide by w to get the\\n // vertex location in range [-1, +1]\\n vec3 shadowCoord = positionFromLightPov.xyz / positionFromLightPov.w;\\n\\n // Convert from NDC to texture coordinates\\n shadowCoord = shadowCoord * 0.5 + 0.5;\\n \\n if (shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 &&\\n shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0)\\n {\\n float shadowDepth = texture2D(shadowMap, shadowCoord.xy).r;\\n if (shadowCoord.z > shadowDepth + shadowBias) {\\n return vec3(1.0 - shadowStrength);\\n }\\n }\\n return vec3(1.0);\\n}\"","export default \"\\nstruct PBRMaterialData\\n{\\n vec4 albedo;\\n\\n vec2 albedoScale;\\n vec2 normalScale;\\n vec2 metalnessScale;\\n vec2 roughnessScale;\\n vec2 lightEmissionScale;\\n\\n float metalness;\\n float roughness;\\n float lightEmission;\\n\\n int albedoUVSet;\\n int normalUVSet;\\n int metalnessUVSet;\\n int roughnessUVSet;\\n int lightEmissionUVSet;\\n int aoUVSet;\\n};\\n\\nstruct Light\\n{\\n vec3 position;\\n float intensity;\\n vec4 color;\\n vec3 direction;\\n int type;\\n};\\n\\nvec4 sampleAlbedo(sampler2D tex, vec2 uv0, vec2 uv1, PBRMaterialData mat, float gamma)\\n{\\n vec2 uv = mat.albedoUVSet == 0 ? uv0 : uv1;\\n vec4 texColor = texture2D(tex, uv * mat.albedoScale);\\n return vec4(SRGB2Lineal(texColor, gamma).rgb * mat.albedo.rgb, texColor.a * mat.albedo.a);\\n}\\n\\nfloat sampleMetallic(sampler2D tex, vec2 uv0, vec2 uv1, PBRMaterialData mat)\\n{\\n vec2 uv = mat.metalnessUVSet == 0 ? uv0 : uv1;\\n return texture2D(tex, uv * mat.metalnessScale).r * mat.metalness;\\n}\\n\\nfloat sampleRoughness(sampler2D tex, vec2 uv0, vec2 uv1, PBRMaterialData mat)\\n{\\n const float minRoughness = 0.05; // Minimum roughness value: even a mirror have some roughness\\n const float maxRoughness = 0.98; // Maximum roughness value: avoid completely diffuse surfaces\\n vec2 uv = mat.roughnessUVSet == 0 ? uv0 : uv1;\\n return min(max(texture2D(tex, uv * mat.roughnessScale).g * mat.roughness, minRoughness), maxRoughness);\\n}\\n\\n\\nfloat sampleLightEmission(sampler2D tex, vec2 uv0, vec2 uv1, PBRMaterialData mat)\\n{\\n vec2 uv = mat.lightEmissionUVSet == 0 ? uv0 : uv1;\\n return texture2D(tex, uv * mat.lightEmissionScale).b * mat.lightEmission;\\n}\\n\\nvec3 sampleNormal(sampler2D tex, vec2 uv0, vec2 uv1, PBRMaterialData mat, mat3 TBN)\\n{\\n vec2 uv = mat.normalUVSet == 0 ? uv0 : uv1;\\n vec3 normal = texture2D(tex, uv).xyz * 2.0 - 1.0;\\n return normalize(TBN * normal);\\n}\\n\\nfloat sampleAmbientOcclussion(sampler2D tex, vec2 uv0, vec2 uv1, PBRMaterialData mat)\\n{\\n vec2 uv = mat.aoUVSet == 0 ? uv0 : uv1;\\n return texture2D(tex, uv).a;\\n}\\n\\nvec3 calcF0(vec3 albedo, PBRMaterialData mat)\\n{\\n return mix(vec3(0.04), albedo, mat.metalness);\\n}\\n\"","import colorCorrection from \"./color_correction.glsl?raw\";\nimport constants from \"./constants.glsl?raw\";\nimport normalMap from \"./normal_map.glsl?raw\";\nimport pbr from \"./pbr.glsl?raw\";\nimport uniforms from \"./uniforms.glsl?raw\";\n\nimport {\n generateShaderLibrary,\n extractConstants,\n processConstants\n} from \"../ShaderFunction\";\n\nlet g_constants = null;\nexport function getConstants() {\n if (!g_constants) {\n // Extract constants all the GLSL files\n g_constants = [\n ...extractConstants(constants),\n ...extractConstants(colorCorrection),\n ...extractConstants(normalMap),\n ...extractConstants(pbr),\n ...extractConstants(uniforms)\n ];\n }\n return g_constants;\n}\n\nlet g_colorCorrectionFunctions = null;\nexport function getColorCorrectionFunctions() {\n if (!g_colorCorrectionFunctions) {\n g_colorCorrectionFunctions = generateShaderLibrary(colorCorrection);\n }\n\n return g_colorCorrectionFunctions;\n}\n\nlet g_normalMapFunctions = null;\nexport function getNormalMapFunctions() {\n if (!g_normalMapFunctions) {\n g_normalMapFunctions = generateShaderLibrary(normalMap);\n }\n\n return g_normalMapFunctions;\n}\n\nlet g_pbrFunctions = null;\nexport function getPBRFunctions() {\n if (!g_pbrFunctions) {\n g_pbrFunctions = generateShaderLibrary(pbr);\n }\n\n return g_pbrFunctions;\n}\n\nlet g_uniformsFunctions = null;\nexport function getUniformsFunctions() {\n if (!g_uniformsFunctions) {\n g_uniformsFunctions = generateShaderLibrary(uniforms);\n }\n\n return g_uniformsFunctions;\n}\n\nexport function replaceConstants(shaderCode) {\n const constants = getConstants();\n return processConstants(shaderCode, constants);\n}\n","import Shader from \"../render/Shader\";\nimport {\n pbrPointLight,\n pbrDirectionalLight,\n pbrAmbientLight,\n getShadowColor,\n lineal2SRGB,\n brightnessContrast\n} from './webgl_shader_lib';\nimport ShaderFunction from \"./ShaderFunction\";\nimport ShaderProgram from \"../render/webgl/ShaderProgram\";\nimport Mat4 from \"../math/Mat4\";\nimport Vec from \"../math/Vec\";\nimport { LightType } from \"../base/Light\";\nimport { createNormalTexture, normalTexture, createBRDFIntegrationTexture } from \"../tools/TextureResourceDatabase\";\n\nimport {\n getColorCorrectionFunctions,\n getNormalMapFunctions,\n getPBRFunctions,\n getUniformsFunctions,\n replaceConstants\n} from \"./webgl\";\n\nfunction getShaderProgramForLights(renderer, numLights) {\n if (this._programs[numLights]) {\n return this._programs[numLights];\n }\n\n const vshader = ShaderFunction.GetShaderCode(`precision mediump float;\n attribute vec3 inPosition;\n attribute vec3 inNormal;\n attribute vec2 inTexCoord;\n attribute vec2 inTexCoord2;\n attribute vec3 inTangent;\n\n uniform mat4 uWorld;\n uniform mat4 uView;\n uniform mat4 uViewInverse;\n uniform mat4 uProj;\n uniform mat3 uNormMatrix;\n\n varying vec3 fragPos;\n varying vec3 fragViewPos;\n varying vec3 fragNorm;\n varying vec2 fragTexCoord;\n varying vec2 fragTexCoord2;\n varying vec3 fragLightPositions[${numLights}];\n \n varying mat3 fragTBN;\n\n uniform vec3 uLightPositions[${numLights}];\n uniform mat4 uLightTransforms[${numLights}];\n\n // Used to calculate shadow from depth texture\n uniform mat4 uLightPovMvp;\n varying vec4 fragPositionFromLightPov;\n\n `,\n [\n new ShaderFunction('void','main','',`{\n \n\n for (int i = 0; i < ${numLights}; ++i)\n {\n fragLightPositions[i] = (uLightTransforms[i] * vec4(uLightPositions[i], 1.0)).xyz;\n }\n\n fragPos = (uWorld * vec4(inPosition, 1.0)).xyz;\n\n fragPositionFromLightPov = uLightPovMvp * vec4(fragPos, 1.0);\n\n fragViewPos = (uViewInverse * vec4(0.0,0.0,0.0,1.0)).xyz;\n fragTexCoord = inTexCoord;\n fragTexCoord2 = inTexCoord2;\n fragNorm = normalize(uNormMatrix * inNormal);\n gl_Position = uProj * uView * uWorld * vec4(inPosition,1.0);\n fragTBN = TBNMatrix(uWorld, inNormal, inTangent);\n }`, [\n ...getNormalMapFunctions()\n ])\n ]);\n\n const deps = [\n ...getColorCorrectionFunctions(),\n ...getNormalMapFunctions(),\n ...getUniformsFunctions(),\n ...getPBRFunctions()\n ];\n\n const fshader = replaceConstants(ShaderFunction.GetShaderCode(`precision mediump float;\n varying vec3 fragPos;\n varying vec3 fragNorm;\n varying vec2 fragTexCoord;\n varying vec2 fragTexCoord2;\n varying vec3 fragViewPos;\n varying vec3 fragLightPositions[${numLights}];\n\n uniform vec3 uCameraPos;\n\n uniform sampler2D uAlbedoTexture;\n uniform sampler2D uNormalTexture;\n uniform sampler2D uMetallicRoughnessHeightAOTexture;\n\n uniform vec4 uAlbedo;\n uniform float uMetallic;\n uniform float uRoughness;\n uniform float uLightEmission;\n\n uniform vec4 uFresnel;\n\n uniform vec2 uAlbedoScale;\n uniform vec2 uNormalScale;\n uniform vec2 uMetallicScale;\n uniform vec2 uRoughnessScale;\n uniform vec2 uLightEmissionScale;\n\n uniform float uAlphaTresshold;\n \n uniform int uLightTypes[${numLights}];\n uniform vec3 uLightDirections[${numLights}];\n uniform vec3 uLightColors[${numLights}];\n uniform float uLightIntensities[${numLights}];\n \n\n uniform samplerCube uEnvMap;\n uniform samplerCube uSpecularMap;\n uniform samplerCube uIrradianceMap;\n uniform sampler2D uBRDFIntegrationMap;\n uniform float uAmbientIntensity;\n\n uniform sampler2D uShadowMap;\n uniform float uShadowBias;\n varying vec4 fragPositionFromLightPov;\n uniform float uShadowStrength;\n\n uniform int uAlbedoMap;\n uniform int uNormalMap;\n uniform int uAOMap;\n uniform int uMetallicMap;\n uniform int uRoughnessMap;\n uniform int uLightemissionMap;\n\n varying mat3 fragTBN;\n \n uniform float uBrightness;\n uniform float uContrast;\n `,\n [\n new ShaderFunction('void','main','',`{\n float gamma = 1.8;\n\n PBRMaterialData mat;\n mat.albedo = uAlbedo;\n mat.albedoScale = uAlbedoScale;\n mat.normalScale = uNormalScale;\n mat.metalnessScale = uMetallicScale;\n mat.roughnessScale = uRoughnessScale;\n mat.lightEmissionScale = uLightEmissionScale;\n mat.metalness = uMetallic;\n mat.roughness = uRoughness;\n mat.lightEmission = uLightEmission;\n mat.albedoUVSet = uAlbedoMap;\n mat.normalUVSet = uNormalMap;\n mat.metalnessUVSet = uMetallicMap;\n mat.roughnessUVSet = uRoughnessMap;\n mat.lightEmissionUVSet = uLightemissionMap;\n mat.aoUVSet = uAOMap;\n\n vec4 albedo = sampleAlbedo(uAlbedoTexture, fragTexCoord, fragTexCoord2, mat, gamma);\n float metallic = sampleMetallic(uMetallicRoughnessHeightAOTexture, fragTexCoord, fragTexCoord2, mat);\n float roughness = sampleRoughness(uMetallicRoughnessHeightAOTexture, fragTexCoord, fragTexCoord2, mat);\n\n // TODO: Light emission\n float ambientOcclussion = sampleAmbientOcclussion(uMetallicRoughnessHeightAOTexture, fragTexCoord, fragTexCoord2, mat);\n\n vec3 normal = sampleNormal(uNormalTexture, fragTexCoord, fragTexCoord2, mat, fragTBN);\n if (!gl_FrontFacing) {\n normal = -normal;\n }\n \n vec3 viewDir = normalize(fragViewPos - fragPos);\n vec3 F0 = calcF0(albedo.rgb, mat);\n\n if (albedo.a < uAlphaTresshold) {\n discard;\n }\n else {\n vec3 Lo = vec3(0.0);\n for (int i = 0; i < ${numLights}; ++i) {\n Light light;\n light.type = uLightTypes[i];\n light.color = vec4(uLightColors[i], 1.0);\n light.intensity = uLightIntensities[i];\n light.direction = uLightDirections[i];\n light.position = fragLightPositions[i];\n\n Lo += calcRadiance(light, viewDir, fragPos, metallic, roughness, F0, normal, albedo.rgb);\n \n }\n\n vec3 shadowColor = getShadowColor(fragPositionFromLightPov, uShadowMap, uShadowBias, uShadowStrength);\n \n Lo = Lo * shadowColor;\n\n vec3 ambient = calcAmbientLight(\n viewDir, normal, F0,\n albedo.rgb, metallic, roughness,\n uIrradianceMap, uSpecularMap, uEnvMap,\n uBRDFIntegrationMap, ambientOcclussion\n );\n\n vec3 color = ambient + Lo;\n\n color = color / (color + vec3(1.0));\n gl_FragColor = lineal2SRGB(vec4(color, 1.0), gamma);\n gl_FragColor = brightnessContrast(vec4(color, albedo.a), uBrightness, uContrast);\n }\n }`, deps)\n ]));\n\n this._programs[numLights] = ShaderProgram.Create(renderer.gl,\"PBRLightIBL\",vshader,fshader);\n return this._programs[numLights];\n}\nexport default class PBRLightIBLShader extends Shader {\n constructor(renderer) {\n super(renderer);\n\n this._lights = [];\n this._lightTransforms = [];\n\n this._brightness = 0.34;\n this._contrast = 1.4;\n\n if (renderer.typeId !== \"WebGL\") {\n throw Error(\"PresentTextureShader is only compatible with WebGL renderer\");\n }\n\n this._programs = {};\n }\n\n async load() {\n await createNormalTexture(this.renderer);\n\n this._brdfIntegrationTexture = await createBRDFIntegrationTexture(this.renderer);\n }\n\n get brightness() {\n return this._brightness;\n }\n \n get contrast() {\n return this._contrast;\n }\n\n set brightness(b) {\n this._brightness = b;\n }\n \n set contrast(c) {\n this._contrast = c;\n }\n\n set cameraPosition(p) {\n this._cameraPosition = p;\n }\n\n set environment(env) {\n this._environment = env;\n }\n\n get environmentMap() {\n return this._environment.environmentMap;\n }\n\n get specularMap() {\n return this._environment.specularMap;\n }\n\n get irradianceMap() {\n return this._environment.irradianceMap;\n }\n\n set lights(l) {\n if (!l.length) {\n throw new Error(\"BasicPBRLightShader: Invalid light array set.\");\n }\n this._lights = l;\n this._lightTypes = [];\n this._lightPositions = [];\n this._lightDirections = [];\n this._lightColors = [];\n this._lightIntensities = [];\n this._lights.forEach((light,i) => {\n this._lightTypes.push(light.type);\n const trx = this._lightTransforms[i];\n const rot = trx && Mat4.GetRotation(trx);\n const position = new Vec(light.position);\n const direction = new Vec(light.direction);\n this._lightPositions.push(trx ? trx.multVector(position).xyz : position);\n this._lightDirections.push(rot ? rot.multVector(direction).xyz.normalize() : direction);\n this._lightColors.push(new Vec(light.color));\n this._lightIntensities.push(light.intensity);\n });\n this._program = getShaderProgramForLights.apply(this, [this.renderer, this._lights.length]);\n }\n\n get lights() {\n return this._lights;\n }\n\n set lightTransforms(lt) {\n this._lightTransforms = lt;\n }\n\n get lightTransforms() {\n return this._lightTransforms;\n }\n\n updateLight(light,index) {\n if (light >= this._lights.length) {\n throw new Error(\"BasicPBRLightShader: Invalid light index updating light data\");\n }\n this._lightTypes[index] = light.type;\n this._lightPositions[index] = new Vec(light.position);\n this._lightDirections[index] = new Vec(light.direction);\n this._lightColors[index] = new Vec(light.color);\n this._lightIntensities[index] = light.intensity;\n }\n\n updateLights(lights) {\n if (this._lights.length !== lights.length) {\n this.lights = lights;\n }\n else {\n lights.forEach((l,i) => this.updateLight(l,i));\n }\n }\n\n setup(plistRenderer,materialRenderer,modelMatrix,viewMatrix,projectionMatrix) {\n if (!this._program) {\n throw new Error(\"BasicPBRLightShader: lights array not specified\");\n }\n\n const material = materialRenderer.material;\n materialRenderer.mergeTextures();\n this.renderer.state.shaderProgram = this._program;\n \n const normMatrix = Mat4.GetNormalMatrix(modelMatrix);\n this._program.bindMatrix('uNormMatrix', normMatrix);\n this._program.bindMatrix('uWorld', modelMatrix);\n this._program.bindMatrix('uView', viewMatrix);\n this._program.bindMatrix('uViewInverse', Mat4.GetInverted(viewMatrix));\n this._program.bindMatrix('uProj', projectionMatrix);\n\n if (!this._cameraPosition) {\n console.warn(\"Serious performance warning: camera position not set in BasicPBRLightShader. Extracting the camera position from the view matrix involves inverting the matrix.\");\n this._program.bindVector('uCameraPos',Mat4.GetPosition(Mat4.GetInverted(viewMatrix)));\n }\n else {\n this._program.bindVector('uCameraPos',this._cameraPosition);\n }\n\n materialRenderer.bindTexture(this._program, 'diffuse', 'uAlbedoTexture', 0);\n materialRenderer.bindTexture(this._program, 'normal', 'uNormalTexture', 1, normalTexture(this.renderer));\n materialRenderer.bindMetallicRoughnessHeightAOTexture(this._program, 'uMetallicRoughnessHeightAOTexture', 2);\n this._program.uniform1f('uAlphaTresshold', material.alphaCutoff);\n\n materialRenderer.bindColor(this._program, 'diffuse', 'uAlbedo');\n materialRenderer.bindValue(this._program, 'metallic', 'uMetallic');\n materialRenderer.bindValue(this._program, 'roughness', 'uRoughness');\n materialRenderer.bindValue(this._program, 'lightEmission', 'uLightEmission', 0);\n \n this._program.uniform1i('uAlbedoMap', material.diffuseUV);\n this._program.uniform1i('uNormalMap', material.normalUV);\n this._program.uniform1i('uAOMap', material.ambientOcclussionUV);\n this._program.uniform1i('uMetallicMap', material.metallicChannel);\n this._program.uniform1i('uRoughnessMap', material.roughnessChannel);\n this._program.uniform1i('uLightemissionMap', material.lightEmissionChannel);\n \n this._program.bindVector(\"uAlbedoScale\", material.diffuseScale);\n this._program.bindVector(\"uNormalScale\", material.normalScale);\n this._program.bindVector(\"uMetallicScale\", material.metallicScale);\n this._program.bindVector(\"uRoughnessScale\", material.roughnessScale);\n this._program.bindVector(\"uLightEmissionScale\", material.lightEmissionScale);\n this._program.bindVector(\"uFresnel\", material.fresnel);\n\n this._program.bindTexture(\"uIrradianceMap\", this.renderer.factory.texture(this.irradianceMap), 3);\n this._program.bindTexture(\"uSpecularMap\", this.renderer.factory.texture(this.specularMap), 4);\n this._program.bindTexture(\"uEnvMap\", this.renderer.factory.texture(this.environmentMap), 5);\n this._program.bindTexture(\"uBRDFIntegrationMap\", this.renderer.factory.texture(this._brdfIntegrationTexture), 6);\n\n this._program.uniform1f(\"uBrightness\", this._brightness);\n this._program.uniform1f(\"uContrast\", this._contrast);\n\n // TODO: Get the ambient intensity from environment\n this._program.uniform1f(\"uAmbientIntensity\", 1.0);\n\n let shadowLight = null;\n this._lights.forEach((light,i) => {\n if (light._depthTexture) {\n shadowLight = light;\n }\n this._program.uniform1i(`uLightTypes[${i}]`, this._lightTypes[i]);\n this._program.bindVector(`uLightPositions[${i}]`, this._lightPositions[i]);\n this._program.bindVector(`uLightDirections[${i}]`, this._lightDirections[i]);\n this._program.bindVector(`uLightColors[${i}]`, this._lightColors[i].rgb);\n this._program.uniform1f(`uLightIntensities[${i}]`, this._lightIntensities[i]);\n this._program.bindMatrix(`uLightTransforms[${i}]`, this._lightTransforms[i]);\n });\n\n if (shadowLight) {\n this._program.bindTexture(\"uShadowMap\", this.renderer.factory.texture(shadowLight.depthTexture), 7);\n const projectionViewMatrix = Mat4.Mult(shadowLight.projection, shadowLight.viewMatrix);\n this._program.bindMatrix(\"uLightPovMvp\", projectionViewMatrix);\n this._program.uniform1f(\"uShadowBias\", shadowLight.shadowBias * 30);\n this._program.uniform1f(\"uShadowStrength\", shadowLight.shadowStrength);\n }\n \n this._program.bindAttribs(plistRenderer, {\n position: \"inPosition\",\n normal: \"inNormal\",\n tex0: \"inTexCoord\",\n tex1: \"inTexCoord2\",\n tangent: \"inTangent\"\n });\n }\n\n destroy() {\n ShaderProgram.Delete(this._program);\n }\n}","import PBRLightIBLShader from \"../../shaders/PBRLightIBLShader\";\nimport SceneRenderer from \"../SceneRenderer\";\nimport { RenderLayer } from \"../../base/PolyList\";\nimport Mat4 from \"../../math/Mat4\";\nimport Camera from \"../../scene/Camera\";\nimport Transform from \"../../scene/Transform\";\n\nexport default class WebGLSceneRenderer extends SceneRenderer {\n constructor(renderer) {\n super(renderer);\n this._shader = new PBRLightIBLShader(this.renderer);\n }\n\n get shader() {\n return this._shader;\n }\n\n set brightness(value) {\n this._shader._brightness = value;\n }\n\n get brightness() {\n return this._shader._brightness;\n }\n\n set contrast(value) {\n this._shader._contrast = value;\n }\n\n get contrast() {\n return this._shader._contrast;\n }\n\n async setEnvironment(env) {\n await super.setEnvironment(env);\n this._shader.environment = env;\n }\n\n async init(params) {\n await super.init(params);\n\n await this.shader.load();\n\n this.renderQueue.enableQueue(RenderLayer.OPAQUE_DEFAULT, this._shader);\n this.renderQueue.enableQueue(RenderLayer.TRANSPARENT_DEFAULT, this._shader);\n }\n\n frame(sceneRoot,delta) {\n super.frame(sceneRoot,delta);\n\n const mainCamera = Camera.GetMain(sceneRoot);\n\n this.shader.lights = this.renderQueue.lights.map(({light}) => light);\n this.shader.lightTransforms = this.renderQueue.lights.map(({transform}) => transform);\n const cameraMatrix = Transform.GetWorldMatrix(mainCamera.node);\n const pos = Mat4.GetPosition(cameraMatrix);\n this.shader.cameraPosition = pos;\n }\n}","import ShadowRenderer from \"../ShadowRenderer\";\n\n\nexport default class WebGLShadowRenderer extends ShadowRenderer {\n\n}\n","import SkyCube from \"../SkyCube\";\n\nexport default class WebGLSkyCube extends SkyCube {\n draw() {\n const { state } = this.renderer;\n if (!this._renderState) {\n throw new Error(\"SkyCube.draw(): the render state is not updated\");\n }\n\n const dm = state.depthMask;\n state.depthMask = false;\n this._renderState.draw();\n state.depthMask = dm;\n }\n}","import SkySphere from \"../SkySphere\";\n\nexport default class WebGLSkySphere extends SkySphere {\n draw() {\n if (!this._renderState) {\n throw new Error(\"SkySphere.draw(): the render state is not updated\");\n }\n \n const dm = this.renderer.state.depthMask;\n this.renderer.state.depthMask = false;\n this._renderState.draw();\n this.renderer.state.depthMask = dm;\n }\n}","\nimport Vec from \"../../math/Vec\";\nimport ShaderProgram from \"./ShaderProgram\";\n\nexport default class State {\n\n get CW() { return this.gl.CW; }\n get CCW() { return this.gl.CCW; }\n get FRONT() { return this.gl.FRONT; }\n get BACK() { return this.gl.BACK; }\n get FRONT_AND_BACK() { return this.gl.FRONT_AND_BACK; }\n\n constructor(renderer) {\n this._renderer = renderer;\n\n this.cullFaceEnabled = true;\n }\n\n get renderer() {\n return this._renderer;\n }\n\n get gl() {\n return this._renderer.gl;\n }\n\n get viewport() {\n return new Vec(this.gl.getParameter(this.gl.VIEWPORT));\n }\n\n get maxViewportDims() {\n return new Vec(this.gl.getParameter(this.gl.MAX_VIEWPORT_DIMS));\n }\n\n set viewport(vp) {\n if (vp.length === 2) {\n this.gl.viewport(0, 0, vp[0], vp[1]);\n }\n else if (vp.length >=4) {\n this.gl.viewport(vp[0], vp[1], vp[2], vp[3]);\n }\n else {\n throw new Error(\"Invalid parameter setting viewport\");\n }\n }\n\n set clearColor(c) {\n if (c.length<4) {\n throw new Error(\"Invalid parameter setting clear color\");\n }\n\n this.gl.clearColor(c[0],c[1],c[2],c[3]);\n }\n\n get clearColor() {\n return new Vec(this.gl.getParameter(this.gl.COLOR_CLEAR_VALUE));\n }\n\n set clearDepth(d) {\n this.gl.clearDepth(d);\n }\n\n get clearDepth() {\n return gl.getParameter(gl.DEPTH_CLEAR_VALUE);\n }\n\n set clearStencil(s) {\n this.gl.clearStencil(s);\n }\n\n get clearStencil() {\n return this.gl.getParameter(this.gl.STENCIL_CLEAR_VALUE);\n }\n\n get depthMask() {\n return this.gl.getParameter(this.gl.DEPTH_WRITEMASK);\n }\n\n set depthMask(m) {\n this.gl.depthMask(m);\n }\n\n set frontFace(ff) {\n this.gl.frontFace(ff);\n }\n\n get frontFace() {\n return this.gl.getParameter(this.gl.FRONT_FACE);\n }\n\n set cullFace(cf) {\n this.gl.cullFace(cf);\n }\n\n get cullFace() {\n return this.gl.getParameter(this.gl.CULL_FACE_MODE);\n }\n\n set depthTestEnabled(e) {\n e ? this.gl.enable(this.gl.DEPTH_TEST) :\n this.gl.disable(this.gl.DEPTH_TEST);\n }\n\n get depthTestEnabled() {\n return this.gl.getParameter(this.gl.DEPTH_TEST);\n }\n\n set cullFaceEnabled(e) {\n e ? this.gl.enable(this.gl.CULL_FACE) :\n this.gl.disable(this.gl.CULL_FACE);\n }\n\n get blendEnabled() {\n return this.gl.getParameter(this.gl.BLEND);\n }\n\n set blendEnabled(b) {\n b ? this.gl.enable(this.gl.BLEND) :\n this.gl.disable(this.gl.BLEND);\n }\n\n get cullFaceEnabled() {\n return this.gl.getParameter(this.gl.CULL_FACE);\n }\n\n set shaderProgram(program) {\n program.useProgram();\n }\n\n get shaderProgram() {\n const glProgram = this.gl.getParameter(this.gl.CURRENT_PROGRAM);\n if (glProgram) {\n return ShaderProgram.GetShaderProgram(glProgram);\n }\n else {\n return null;\n }\n }\n\n clear({ color = true, depth = true, stencil = false} = {}) {\n const clearValues = (color ? this.gl.COLOR_BUFFER_BIT : 0) |\n (depth ? this.gl.DEPTH_BUFFER_BIT : 0) |\n (stencil ? this.gl.STENCIL_BUFFER_BIT : 0);\n this.gl.clear(clearValues);\n }\n\n\n \n}\n","\n\nimport TextureRenderer from '../TextureRenderer';\nimport Texture, { \n TextureWrapName, \n TextureFilterName, \n TextureTargetName,\n TextureDataType,\n TextureComponentFormat,\n TextureRenderTargetAttachment,\n TextureTarget\n} from '../../base/Texture';\nimport Vec from '../../math/Vec';\nimport { generateUUID } from '../../tools/crypto';\nimport Renderer from '../Renderer';\n\nconst getTarget = (gl, tex) => {\n switch (tex.target) {\n case TextureTarget.TEXTURE_2D:\n return gl.TEXTURE_2D;\n case TextureTarget.CUBE_MAP:\n return gl.TEXTURE_CUBE_MAP;\n default:\n throw new Error(\"Error creating WebGL Texture: invalid target\");\n }\n}\n\nconst getClampMode = (gl, mode) => {\n if (mode === 1) {\n return gl.CLAMP_TO_EDGE;\n }\n else {\n const name = TextureWrapName[mode];\n return gl[name];\n }\n}\n\nconst getTextureFilter = (gl, filter) => {\n const name = TextureFilterName[filter];\n return gl[name];\n}\n\nconst getDataFormat = (gl,texture) => {\n const componentFormat = texture.componentFormat;\n switch (componentFormat) {\n case TextureComponentFormat.UNSIGNED_BYTE:\n return gl.UNSIGNED_BYTE;\n case TextureComponentFormat.FLOAT32:\n return gl.FLOAT;\n default:\n throw new Error(\"Error creating webgl texture: invalid component data format\");\n }\n}\n\nconst bg2eCreateTexture = (gl, textureObject) => {\n textureObject._apiObject = gl.createTexture();\n textureObject._apiObject._bg2_uuid = generateUUID();\n gl._bg2_textures = gl._bg2_textures || {};\n let id = textureObject.name || textureObject._apiObject._bg2_uuid;\n if (gl._bg2_textures[id] && gl._bg2_textures[id] !== textureObject) {\n id = textureObject.name + \"_\" + textureObject._apiObject._bg2_uuid;\n }\n gl._bg2_textures[id] = textureObject;\n}\n\nconst bg2eDeleteTexture = (gl, textureObject) => {\n if (textureObject._apiObject) {\n gl.deleteTexture(textureObject._apiObject);\n delete gl._bg2_textures[textureObject._apiObject._bg2_uuid];\n textureObject._apiObject = null;\n textureObject.setUpdated(false);\n }\n}\n\nconst getWebGLTexture = (gl, textureObject) => {\n if (!textureObject.imageData) {\n throw new Error(\"Error loading WebGL texture: image data not loaded\");\n }\n\n bg2eDeleteTexture(gl, textureObject);\n bg2eCreateTexture(gl, textureObject);\n\n const target = getTarget(gl, textureObject);\n const dataFormat = getDataFormat(gl, textureObject);\n gl.bindTexture(target, textureObject._apiObject);\n\n if (textureObject.dataType ===TextureDataType.RENDER_TARGET) {\n const { width, height } = textureObject.size;\n\n const isDepthTexture = textureObject.renderTargetAttachment === TextureRenderTargetAttachment.DEPTH_ATTACHMENT;\n const internalFormat = isDepthTexture ? gl.DEPTH_COMPONENT : gl.RGBA;\n let format = isDepthTexture ? gl.DEPTH_COMPONENT : gl.RGBA;\n const type = isDepthTexture ? gl.UNSIGNED_SHORT : dataFormat;\n\n gl.texParameteri(target, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(target, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(target, gl.TEXTURE_WRAP_S, getClampMode(gl,textureObject.wrapModeX));\n gl.texParameteri(target, gl.TEXTURE_WRAP_T, getClampMode(gl,textureObject.wrapModeY));\n \n if (target === gl.TEXTURE_CUBE_MAP) {\n for (let i = 0; i<6; ++i) {\n gl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, internalFormat, width, height, 0, format, type, null);\n }\n }\n else {\n gl.texImage2D(target, 0, internalFormat, width, height, 0, format, type, null);\n }\n\n textureObject.imageData.currentSize = new Vec(textureObject.size);\n }\n else {\n \n gl.texImage2D(target, 0, gl.RGBA, gl.RGBA, dataFormat, textureObject._imageData);\n \n gl.texParameteri(target, gl.TEXTURE_WRAP_S, getClampMode(gl,textureObject.wrapModeX));\n gl.texParameteri(target, gl.TEXTURE_WRAP_T, getClampMode(gl,textureObject.wrapModeY));\n \n gl.texParameteri(target, gl.TEXTURE_MAG_FILTER, getTextureFilter(gl, textureObject.magFilter));\n gl.texParameteri(target, gl.TEXTURE_MIN_FILTER, getTextureFilter(gl, textureObject.minFilter));\n \n if (textureObject.mipmapRequired) {\n gl.generateMipmap(target);\n }\n }\n}\n\nexport default class WebGLTextureRenderer extends TextureRenderer {\n static ListTextures(glOrRenderer) {\n if (glOrRenderer instanceof Renderer) {\n glOrRenderer = glOrRenderer.gl;\n }\n return glOrRenderer._bg2_textures || {};\n }\n\n getApiObject() {\n if (this.texture.dirty) {\n try {\n getWebGLTexture(this.renderer.gl, this.texture);\n this.texture.setUpdated();\n }\n catch (err) {\n console.warn(err.message);\n }\n }\n return this.texture._apiObject;\n }\n \n destroy() {\n const { gl } = this.renderer;\n bg2eDeleteTexture(gl, this.texture);\n }\n\n ///// webgl specific functions\n // Returns the webgl target (TEXTURE_2D, TEXTURE_3D...)\n get target() {\n return this.renderer.gl[TextureTargetName[this.texture.target]];\n }\n\n activeTexture(index = 0) {\n const { gl } = this.renderer;\n gl.activeTexture(gl.TEXTURE0 + index);\n }\n\n bindTexture() {\n this.renderer.gl.bindTexture(this.target, this.getApiObject());\n }\n}\n","import FrameBuffer from './FrameBuffer.js';\nimport MaterialRenderer from './MaterialRenderer.js';\nimport Pipeline from './Pipeline.js';\nimport PolyListRenderer from './PolyListRenderer.js';\nimport RenderBuffer from './RenderBuffer.js';\nimport SceneRenderer from './SceneRenderer.js';\nimport ShaderProgram, { ShaderType } from './ShaderProgram.js';\nimport ShadowRenderer from './ShadowRenderer.js';\nimport SkyCube from './SkyCube.js';\nimport SkySphere from './SkySphere.js';\nimport State from './State.js';\nimport TextureRenderer from './TextureRenderer.js';\nimport VertexBuffer, {\n BufferTarget,\n BufferUsage\n} from './VertexBuffer.js';\n\nexport const webgl = {\n FrameBuffer,\n MaterialRenderer,\n Pipeline,\n PolyListRenderer,\n RenderBuffer,\n SceneRenderer,\n ShaderProgram,\n ShaderType,\n ShadowRenderer,\n SkyCube,\n SkySphere,\n State,\n TextureRenderer,\n VertexBuffer,\n BufferTarget,\n BufferUsage\n};\n","import Renderer, { EngineFeatures } from \"../Renderer\";\nimport MaterialRenderer from \"./MaterialRenderer\";\nimport State from \"./State\";\nimport PolyListRenderer from \"./PolyListRenderer\";\nimport TextureRenderer from \"./TextureRenderer\";\nimport RenderBuffer from \"./RenderBuffer\";\nimport SkySphere from \"./SkySphere\";\nimport SkyCube from \"./SkyCube\";\nimport FrameBuffer from \"./FrameBuffer\";\nimport Pipeline from \"./Pipeline\";\nimport WebGLSceneRenderer from \"./SceneRenderer\";\nimport Vec from \"../../math/Vec\";\nimport VertexBuffer, { BufferTarget } from \"./VertexBuffer\";\nimport ShadowRenderer from \"./ShadowRenderer\";\n\nfunction enableExtensions(gl) {\n // Enable all available extensions\n gl.getSupportedExtensions().forEach(ext => {\n gl.getExtension(ext);\n });\n}\n\nlet g_uuidLast = 0;\nexport default class WebGLRenderer extends Renderer {\n constructor() {\n super(\"webgl\");\n this._uuid = g_uuidLast++;\n }\n\n get uniqueId() {\n return this._uuid;\n }\n\n get typeId() {\n return \"WebGL\";\n }\n\n get frameBuffer() {\n if (!this._frameBuffer) {\n this._frameBuffer = new FrameBuffer(this);\n }\n return this._frameBuffer;\n }\n\n set viewport(vp) {\n this.state.viewport = vp;\n }\n\n get viewport() {\n return new Vec(this.gl.getParameter(this.gl.VIEWPORT));\n }\n\n get debugMode() {\n return this._debugMode || false;\n }\n\n async init(canvas) {\n await super.init(canvas);\n this._canvas = canvas;\n\n this._gl = canvas.domElement.getContext(\"webgl\", { preserveDrawingBuffer: true });\n this._gl._bg2e_object = this;\n const requestDebug = new URLSearchParams(location.search).get(\"debug\") == \"true\";\n this._debugMode = requestDebug;\n if (window.WebGLDebugUtils && requestDebug) {\n const gl = this._gl;\n console.warn(\"Using WebGLDebugUtils: this must cause an impact in performance\");\n function throwOnError(err, funcName, args) {\n throw WebGLDebugUtils.glEnumToString(err) + \" was caused by call to: \" + funcName;\n }\n\n const printBufferSize = (id, arrayBufferType) => {\n const size = gl.getBufferParameter(gl[arrayBufferType], gl.BUFFER_SIZE);\n console.log(` ${arrayBufferType} id: ${id}, size: ${size}`);\n }\n\n function logGLCall(functionName, args) {\n console.log(\"gl.\" + functionName + \"(\" + \n WebGLDebugUtils.glFunctionArgsToString(functionName, args) + \")\");\n if (/drawElements/.test(functionName)) {\n const elementBuffer = VertexBuffer.CurrentBuffer(gl, BufferTarget.ELEMENT_ARRAY_BUFFER);\n const arrayBuffer = VertexBuffer.CurrentBuffer(gl, BufferTarget.ARRAY_BUFFER);\n printBufferSize(elementBuffer?.id, \"ELEMENT_ARRAY_BUFFER\");\n printBufferSize(arrayBuffer?.id, \"ARRAY_BUFFER\");\n }\n else if (/bindBuffer/.test(functionName) && args[0] === gl.ELEMENT_ARRAY_BUFFER) {\n console.log(` BufferID: ${args[1]._bg2e_id_}`);\n }\n else if (/bindBuffer/.test(functionName) && args[0] === gl.ARRAY_BUFFER) {\n console.log(` BufferID: ${args[1]._bg2e_id_}`);\n }\n\n } \n\n this._gl = WebGLDebugUtils.makeDebugContext(this._gl, throwOnError, logGLCall);\n }\n\n this._state = new State(this);\n\n enableExtensions.apply(this, [this.gl]);\n\n await this.initPresentTextureShader();\n\n await MaterialRenderer.InitResources(this);\n }\n\n get gl() { return this._gl; }\n\n get canvas() { return this._canvas; }\n\n get state() {\n return this._state;\n }\n\n postReshape(width, height) {\n\n }\n\n postRedisplay() {\n \n }\n\n polyListFactory(plist) {\n if (plist.renderer) {\n return plist.renderer;\n }\n else{\n const plistRenderer = new PolyListRenderer(this, plist);\n plistRenderer.init();\n plistRenderer.refresh();\n return plistRenderer;\n }\n }\n\n materialFactory(material) {\n if (material.renderer) {\n return material.renderer;\n }\n else {\n return new MaterialRenderer(this, material);\n }\n }\n\n textureFactory(texture) {\n if (texture.renderer) {\n return texture.renderer;\n }\n else {\n return new TextureRenderer(this, texture);\n }\n }\n\n renderBufferFactory() {\n return new RenderBuffer(this);\n }\n\n skySphereFactory() {\n return new SkySphere(this);\n }\n\n skyCubeFactory() {\n return new SkyCube(this);\n }\n\n pipelineFactory() {\n return new Pipeline(this);\n }\n\n sceneRendererFactory() {\n return new WebGLSceneRenderer(this);\n }\n\n shadowRendererFactory() {\n return new ShadowRenderer(this);\n }\n\n get clearColor() {\n return this.state.clearColor;\n }\n\n set clearColor(c) {\n this.state.clearColor = c;\n }\n \n presentTexture(texture, { clearBuffers = true, shader = null, viewport = null } = {}) {\n if (clearBuffers) {\n this.state.clear();\n }\n\n if (!shader) {\n shader = this.presentTextureShader;\n }\n\n const prevViewport = this.state.viewport;\n if (viewport) {\n this.state.viewport = viewport;\n }\n\n this.presentTextureMaterialRenderer.material.diffuse = texture;\n this.presentTextureSurfaceRenderer.bindBuffers();\n shader.setup(this.presentTextureSurfaceRenderer,this.presentTextureMaterialRenderer);\n this.presentTextureSurfaceRenderer.draw();\n\n this.state.viewport = prevViewport;\n }\n\n // Compatibility function\n supportsFeatures(features) {\n if (features & EngineFeatures.RENDER_TARGET_TEXTURES) {\n if (!this.gl.getExtension(\"WEBGL_draw_buffers\")) {\n return false;\n }\n }\n\n if (features & EngineFeatures.RENDER_TARGET_FLOAT) {\n if (!this.gl.getExtension(\"WEBGL_color_buffer_float\")) {\n return false;\n }\n }\n\n if (features & EngineFeatures.RENDER_TARGET_DEPTH) {\n if (!this.gl.getExtension(\"WEBGL_depth_texture\") || !this.gl.getExtension(\"WEBGL_draw_buffers\")) {\n return false;\n }\n }\n\n return true;\n }\n\n getMaximumRenderTargets() {\n const ext = this.gl.getExtension(\"WEBGL_draw_buffers\");\n if (ext) {\n return this.gl.getParameter(ext.MAX_DRAW_BUFFERS_WEBGL);\n }\n else {\n return 1;\n }\n }\n}\n","import Environment from \"./Environment\";\nimport EnvironmentRenderer from \"./EnvironmentRenderer\";\nimport FrameBuffer from \"./FrameBuffer\";\nimport MaterialRenderer from \"./MaterialRenderer\";\nimport Pipeline, {\n BlendEquation,\n BlendFunction\n} from \"./Pipeline\";\nimport PolyListRenderer from \"./PolyListRenderer\";\nimport RenderBuffer, {\n RenderBufferType,\n RenderBufferTypeName,\n CubeMapFace\n} from \"./RenderBuffer\";\nimport Renderer, {\n EngineFeatures\n} from \"./Renderer\";\nimport RenderQueue from \"./RenderQueue\";\nimport RenderState from \"./RenderState\";\nimport SceneAppController from \"./SceneAppController\";\nimport SceneRenderer, {\n FrameVisitor,\n BindRendererVisitor,\n InitVisitor,\n EventCallbackVisitor\n} from \"./SceneRenderer\";\nimport Shader from \"./Shader\";\nimport ShadowRenderer from \"./ShadowRenderer\";\nimport SkyCube from \"./SkyCube\";\nimport SkySphere from \"./SkySphere\";\nimport TextureMergerRenderer from \"./TextureMergerRenderer\";\nimport TextureRenderer from \"./TextureRenderer\";\n\nimport { webgl } from \"./webgl/index.js\";\nimport WebGLRenderer from \"../render/webgl/Renderer\";\n\nexport default {\n Environment,\n EnvironmentRenderer,\n FrameBuffer,\n MaterialRenderer,\n Pipeline,\n BlendEquation,\n BlendFunction,\n PolyListRenderer,\n RenderBuffer,\n RenderBufferType,\n RenderBufferTypeName,\n CubeMapFace,\n Renderer,\n EngineFeatures,\n RenderQueue,\n RenderState,\n SceneAppController,\n SceneRenderer,\n FrameVisitor,\n BindRendererVisitor,\n InitVisitor,\n EventCallbackVisitor,\n Shader,\n ShadowRenderer,\n SkyCube,\n SkySphere,\n TextureMergerRenderer,\n TextureRenderer,\n\n webgl,\n WebGLRenderer\n}\n","import Shader from \"../render/Shader\";\nimport { pbrPointLight, pbrDirectionalLight } from './webgl_shader_lib';\nimport ShaderFunction from \"./ShaderFunction\";\nimport ShaderProgram from \"../render/webgl/ShaderProgram\";\nimport Mat4 from \"../math/Mat4\";\nimport Vec from \"../math/Vec\";\nimport { LightType } from \"../base/Light\";\nimport { createNormalTexture, normalTexture } from \"../tools/TextureResourceDatabase\";\n\nfunction getShaderProgramForLights(renderer, numLights) {\n if (this._programs[numLights]) {\n return this._programs[numLights];\n }\n\n const vshader = ShaderFunction.GetShaderCode(`precision mediump float;\n attribute vec3 inPosition;\n attribute vec3 inNormal;\n attribute vec2 inTexCoord;\n attribute vec3 inTangent;\n\n uniform mat4 uWorld;\n uniform mat4 uView;\n uniform mat4 uProj;\n uniform mat3 uNormMatrix;\n\n varying vec3 fragPos;\n varying vec3 fragNorm;\n varying vec2 fragTexCoord;\n varying vec3 fragTangent;\n varying vec3 fragBitangent;\n `,\n [\n new ShaderFunction('void','main','',`{\n fragPos = (uWorld * vec4(inPosition, 1.0)).xyz;\n fragNorm = normalize(uNormMatrix * inNormal);\n fragTangent = normalize(uNormMatrix * inTangent);\n fragBitangent = normalize(fragNorm * fragTangent);\n fragTexCoord = inTexCoord;\n gl_Position = uProj * uView * uWorld * vec4(inPosition,1.0);\n }`)\n ]);\n\n const fshader = ShaderFunction.GetShaderCode(`precision mediump float;\n varying vec3 fragPos;\n varying vec3 fragNorm;\n varying vec2 fragTexCoord;\n varying vec3 fragTangent;\n varying vec3 fragBitangent;\n\n uniform vec3 uCameraPos;\n\n uniform sampler2D uAlbedoTexture;\n uniform sampler2D uNormalTexture;\n uniform sampler2D uMetallicTexture;\n uniform sampler2D uRoughnessTexture;\n\n uniform vec4 uAlbedo;\n uniform float uMetallic;\n uniform float uRoughness;\n\n uniform vec2 uAlbedoScale;\n uniform vec2 uNormalScale;\n uniform vec2 uMetallicScale;\n uniform vec2 uRoughnessScale;\n \n uniform int uLightTypes[${numLights}];\n uniform vec3 uLightPositions[${numLights}];\n uniform vec3 uLightDirections[${numLights}];\n uniform vec3 uLightColors[${numLights}];\n uniform float uLightIntensities[${numLights}];\n `,\n [\n new ShaderFunction('void','main','',`{\n vec3 N = normalize(fragNorm);\n if (!gl_FrontFacing) {\n N = -N;\n }\n vec3 T = normalize(fragTangent);\n vec3 B = normalize(fragBitangent);\n mat3 TBN = mat3(T,B,N);\n\n vec3 albedo = texture2D(uAlbedoTexture, fragTexCoord * uAlbedoScale).rgb * uAlbedo.rgb;\n vec3 normal = texture2D(uNormalTexture, fragTexCoord * uNormalScale).rgb * 2.0 - 1.0;\n float metallic = texture2D(uMetallicTexture, fragTexCoord * uMetallicScale).r * uMetallic;\n float roughness = max(texture2D(uRoughnessTexture, fragTexCoord * uRoughnessScale).r * uRoughness, 0.05);\n\n N = normalize(TBN * normal);\n vec3 V = normalize(uCameraPos - fragPos);\n\n vec3 Lo = vec3(0.0);\n for (int i = 0; i < ${numLights}; ++i)\n {\n if (uLightTypes[i] == ${ LightType.POINT }) {\n Lo += pbrPointLight(\n uLightPositions[i], uLightColors[i] * uLightIntensities[i], fragPos, N, V,\n albedo, roughness, metallic, vec3(1.0));\n }\n else if (uLightTypes[i] == ${ LightType.DIRECTIONAL }) {\n Lo += pbrDirectionalLight(\n uLightDirections[i], uLightColors[i] * uLightIntensities[i], fragPos, N, V,\n albedo, roughness, metallic, vec3(1.0), vec3(1.0));\n }\n }\n\n vec3 ambient = vec3(0.03) * albedo;\n vec3 color = ambient + Lo;\n color = color / (color + vec3(1.0));\n color = pow(color, vec3(1.0/2.2));\n\n gl_FragColor = vec4(color,1.0);\n }`, [pbrPointLight, pbrDirectionalLight])\n ]);\n\n this._programs[numLights] = ShaderProgram.Create(renderer.gl,\"PBRBasicLight\",vshader,fshader);\n return this._programs[numLights];\n}\nexport default class BasicPBRLightShader extends Shader {\n constructor(renderer) {\n super(renderer);\n\n this._lights = [];\n\n if (renderer.typeId !== \"WebGL\") {\n throw Error(\"PresentTextureShader is only compatible with WebGL renderer\");\n }\n\n this._programs = {};\n }\n\n async load() {\n await createNormalTexture(this.renderer);\n }\n\n set cameraPosition(p) {\n this._cameraPosition = p;\n }\n\n set lights(l) {\n if (!l.length) {\n throw new Error(\"BasicPBRLightShader: Invalid light array set.\");\n }\n this._lights = l;\n this._lightTypes = [];\n this._lightPositions = [];\n this._lightDirections = [];\n this._lightColors = [];\n this._lightIntensities = [];\n this._lights.forEach(light => {\n this._lightTypes.push(light.type);\n this._lightPositions.push(new Vec(light.position));\n this._lightDirections.push(new Vec(light.direction));\n this._lightColors.push(new Vec(light.color));\n this._lightIntensities.push(light.intensity);\n });\n this._program = getShaderProgramForLights.apply(this, [this.renderer, this._lights.length]);\n }\n\n get lights() {\n return this._lights;\n }\n\n updateLight(light,index) {\n if (light >= this._lights.length) {\n throw new Error(\"BasicPBRLightShader: Invalid light index updating light data\");\n }\n this._lightTypes[index] = light.type;\n this._lightPositions[index] = new Vec(light.position);\n this._lightDirections[index] = new Vec(light.direction);\n this._lightColors[index] = new Vec(light.color);\n this._lightIntensities[index] = light.intensity;\n }\n\n updateLights(lights) {\n if (this._lights.length !== lights.length) {\n this.lights = lights;\n }\n else {\n lights.forEach((l,i) => this.updateLight(l,i));\n }\n }\n\n setup(plistRenderer,materialRenderer,modelMatrix,viewMatrix,projectionMatrix) {\n if (!this._program) {\n throw new Error(\"BasicPBRLightShader: lights array not specified\");\n }\n\n const material = materialRenderer.material;\n this.renderer.state.shaderProgram = this._program;\n \n const normMatrix = Mat4.GetNormalMatrix(modelMatrix);\n this._program.bindMatrix('uNormMatrix', normMatrix);\n this._program.bindMatrix('uWorld', modelMatrix);\n this._program.bindMatrix('uView', viewMatrix);\n this._program.bindMatrix('uProj', projectionMatrix);\n\n if (!this._cameraPosition) {\n console.warn(\"Serious performance warning: camera position not set in BasicPBRLightShader. Extracting the camera position from the view matrix involves inverting the matrix.\");\n this._program.bindVector('uCameraPos',Mat4.GetPosition(Mat4.GetInverted(viewMatrix)));\n }\n else {\n this._program.bindVector('uCameraPos',this._cameraPosition);\n }\n\n materialRenderer.bindTexture(this._program, 'diffuse', 'uAlbedoTexture', 0);\n materialRenderer.bindTexture(this._program, 'normal', 'uNormalTexture', 1, normalTexture(this.renderer));\n materialRenderer.bindTexture(this._program, 'metallic', 'uMetallicTexture', 2);\n materialRenderer.bindTexture(this._program, 'roughness', 'uRoughnessTexture', 3);\n\n materialRenderer.bindColor(this._program, 'diffuse', 'uAlbedo');\n materialRenderer.bindValue(this._program, 'metallic', 'uMetallic');\n materialRenderer.bindValue(this._program, 'roughness', 'uRoughness');\n \n \n this._program.bindVector(\"uAlbedoScale\", material.diffuseScale);\n this._program.bindVector(\"uNormalScale\", material.normalScale);\n this._program.bindVector(\"uMetallicScale\", material.metallicScale);\n this._program.bindVector(\"uRoughnessScale\", material.roughnessScale);\n\n this._lights.forEach((light,i) => {\n this._program.uniform1i(`uLightTypes[${i}]`, this._lightTypes[i]);\n this._program.bindVector(`uLightPositions[${i}]`, this._lightPositions[i]);\n this._program.bindVector(`uLightDirections[${i}]`, this._lightDirections[i]);\n this._program.bindVector(`uLightColors[${i}]`, this._lightColors[i].rgb);\n this._program.uniform1f(`uLightIntensities[${i}]`, this._lightIntensities[i]);\n });\n\n this._program.bindAttribs(plistRenderer, {\n position: \"inPosition\",\n normal: \"inNormal\",\n tex0: \"inTexCoord\",\n tangent: \"inTangent\"\n });\n }\n\n destroy() {\n ShaderProgram.Delete(this._program);\n }\n}","import BasicDiffuseColorShader from \"./BasicDiffuseColorShader\";\nimport BasicPBRLightShader from \"./BasicPBRLightShader\";\nimport DebugRenderShader from \"./DebugRenderShader\";\nimport DepthRenderShader from \"./DepthRenderShader\";\nimport IrradianceMapCubeShader from \"./IrradianceMapCubeShader\";\nimport PBRLightIBLShader from \"./PBRLightIBLShader\";\nimport PickSelectionShader from \"./PickSelectionShader\";\nimport PresentDebugFramebufferShader from \"./PresentDebugFramebufferShader\";\nimport PresentTextureShader from \"./PresentTextureShader\";\nimport SelectionHighlightShader from \"./SelectionHighlightShader\";\nimport ShaderFunction from \"./ShaderFunction\";\nimport SkyCubeShader from \"./SkyCubeShader\";\nimport SkySphereShader from \"./SkySphereShader\";\nimport SpecularMapCubeShader from \"./SpecularMapCubeShader\";\nimport TextureMergerShader from \"./TextureMergerShader\";\nimport * as webgl_shader_lib from \"./webgl_shader_lib\";\n\nexport default {\n BasicDiffuseColorShader,\n BasicPBRLightShader,\n DebugRenderShader,\n DepthRenderShader,\n IrradianceMapCubeShader,\n PBRLightIBLShader,\n PickSelectionShader,\n PresentDebugFramebufferShader,\n PresentTextureShader,\n SelectionHighlightShader,\n ShaderFunction,\n SkyCubeShader,\n SkySphereShader,\n SpecularMapCubeShader,\n TextureMergerShader,\n shaderLib: {\n webgl: webgl_shader_lib\n }\n}","\nimport WebGLRenderer from '../render/webgl/Renderer';\n\nexport default class WebGLTextureViewer {\n\n constructor(renderer) {\n if (!renderer instanceof WebGLRenderer) {\n throw new Error(\"WebGLTextureViewer works only with WebGL Renderer\");\n }\n\n this._renderer = renderer;\n\n this._size = [512,512];\n\n this._canvas = document.createElement('canvas');\n this._canvas.width = this._size[0];\n this._canvas.height = this._size[1];\n this._context = this._canvas.getContext('2d');\n }\n\n get canvas() { return this._canvas; }\n get context() { return this._context; }\n\n attachToElement(element) {\n element.appendChild(this._canvas);\n }\n\n drawTexture(texture) {\n const { gl } = this._renderer;\n\n if (!texture._apiObject) {\n throw new Error(\"Error drawing WebGL texture: WebGL texture not initialized\");\n }\n\n this._canvas.width = texture.size.width;\n this._canvas.height = texture.size.height;\n\n // Save current state\n const currentTexture = gl.getParameter(gl.TEXTURE_BINDING_2D);\n const currentFramebuffer = gl.getParameter(gl.FRAMEBUFFER_BINDING);\n\n // Draw texture to canvas\n gl.bindTexture(gl.TEXTURE_2D, texture._apiObject);\n \n // Create a framebuffer to read the texture data\n const framebuffer = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture._apiObject, 0);\n \n // Read texture data\n let data = new Uint8Array(texture.size.width * texture.size.height * 4);\n gl.readPixels(0, 0, texture.size[0], texture.size[1], gl.RGBA, gl.UNSIGNED_BYTE, data);\n\n // Draw texture data to canvas\n const imageData = new ImageData(new Uint8ClampedArray(data), texture.size.width, texture.size.height);\n const w = imageData.width, h = imageData.height;\n const flipped = imageData.data;\n Array.from({length: h}, (val, i) => data.slice(i * w * 4, (i + 1) * w * 4))\n .forEach((val, i) => flipped.set(val, (h - i - 1) * w * 4));\n const ctx = this._context;\n ctx.putImageData(imageData, 0, 0);\n\n // Restore previous state\n gl.bindTexture(gl.TEXTURE_2D, currentTexture);\n gl.bindFramebuffer(gl.FRAMEBUFFER, currentFramebuffer);\n }\n}\n","import DebugRenderer from \"./DebugRenderer.js\";\nimport WebGLTextureViewer from \"./WebGLTextureViewer.js\";\n\nexport default {\n DebugRenderer,\n WebGLTextureViewer\n};","import bg2math from './math/index';\nimport Mat3 from './math/Mat3';\nimport Mat4 from './math/Mat4';\nimport Vec from './math/Vec';\nimport Quat from './math/Quat';\nimport MatrixStrategy from './math/MatrixStrategy';\nimport bg2tools from './tools/index';\nimport bgdb from './db/index';\nimport bgbase from './base/index';\nimport bgscene from './scene/index';\nimport bgapp from './app/index';\nimport bgrender from './render/index';\nimport * as bgprimitives from './primitives/index';\nimport bgshaders from './shaders/index';\nimport bgdebug from './debug/index';\n\nexport const app = bgapp;\nexport const base = bgbase;\nexport const db = bgdb;\nexport const debug = bgdebug;\nexport const math = {\n ...bg2math,\n Mat3,\n Mat4,\n Vec,\n Quat,\n MatrixStrategy\n};\nexport const render = bgrender;\nexport const scene = bgscene;\nexport const tools = bg2tools;\nexport const primitives = bgprimitives;\nexport const shaders = bgshaders;\n"],"names":["Axis","axis","PI","DEG_TO_RAD","RAD_TO_DEG","PI_2","PI_4","PI_8","TWO_PI","EPSILON","NumericArray","NumericArrayHighP","FLOAT_MAX","checkArray","array","length","s_bg_math_seed","checkPowerOfTwo","n","checkZero","v","isZero","equals","a","b","degreesToRadians","d","radiansToDegrees","sin","val","cos","tan","cotan","atan","atan2","i","j","random","seededRandom","max","min","abs","sqrt","lerp","from","to","square","clamp","value","bg2math","checkEqualLength","v1","v2","Vec","m","src","x","y","z","w","s","h","r","g","hex","color","c","u","Mat3","rx","ry","rz","m3","m7","m6","r0","r1","r2","c0","c1","c2","q","direction","up","A","B","Mat4","inMatrix","fovy","aspect","nearPlane","farPlane","fovy2","fovy2aspect","left","right","bottom","top","C","l","k","p_eye","p_center","p_up","alpha","pos","rotationMatrix","r3","c3","vec","a00","a01","a02","a03","a10","a11","a12","a13","a20","a21","a22","a23","a30","a31","a32","a33","b00","b01","b02","b03","b04","b05","b06","b07","b08","b09","b10","b11","det","cosAlpha","acosAlpha","sinAlpha","trx","origin","target","depth","mvMat","pMat","viewport","mvp","vin","result","scale","inverted","M","dir","Quat","w4","MatrixStrategy","t","o","e","f","generateMD5","data","generateUUID","isBigEndian","arr32","isLittleEndian","UserAgent","userAgentString","re","matches","version","versionString","major","minor","ProcessType","ProcessTypeName","getProcessType","isBrowserOrElectronRenderer","type","isBrowser","isNode","base64ToArrayBuffer","base64","__viteBrowserExternal","DataFormat","ResourceProvider","ws","url","format","bytes","endLoadImage","img","loadImage","preventCache","resolve","reject","evt","ImageResourceProvider","endLoadVideo","video","loadVideo","VideoResourceProvider","BinaryResourceProvider","response","TextResourceProvider","textData","ResourceType","getExtension","reResult","getFileName","removeExtension","removeFileName","isAbsolute","jointUrl","base","append","isFormat","formats","fmt","addFormats","fmts","dst","g_validImageFormats","isValidImage","addImageFormats","getValidImageFormats","g_validVideoFormats","isValidVideo","addVideoFormats","getValidVideoFormats","g_validBinaryFormats","isValidBinary","addBinaryFormats","getValidBinaryFormats","Resource","imageProvider","videoProvider","binaryProvider","textProvider","writeStrategy","bg2tools","LoaderPlugin","path","loader","checkLength","Color","rgb","BufferType","DrawMode","RenderLayer","getLayers","polyList","material","PolyListFrontFace","PolyListCullFace","buildTangents","plist","createVertex","index","i1","i2","i3","v0","pos1","pos2","pos3","uv1","uv2","uv3","edge1","edge2","deltaUV1","deltaUV2","numberOfAttempts","tangent","PolyList","other","layers","layer","transform","rotation","vertex","normal","imageToBase64","image","canvas","ctx","generateImageHash","getMouseEventOffset","offset","getEventTouches","touch","g_firstCanvas","Canvas","domElement","renderer","sizeInPx","width","height","canvasStyle","prevSize","TextureDataType","TextureWrap","TextureFilter","TextureTarget","ProceduralTextureFunction","TextureRenderTargetAttachment","TextureComponentFormat","TextureChannel","TextureDataTypeName","TextureWrapName","TextureFilterName","TextureTargetName","ProceduralTextureFunctionName","TextureRenderTargetAttachmentNames","TextureComponentFormatNames","TextureChannelNames","g_loadedImages","g_resource","g_loadPromises","loadImageFromFile","fileUrl","flipImage","loadBase64Image","base64Img","Texture","copy","updated","pot","xy","att","sceneData","refresh","loadPromise","imageData","g_canvasCache","TextureCache","texture","texturePath","MaterialType","MaterialAttributeNames","ColorTextureAttributes","ValueTextureAttributes","VectorAttribures","ColorAttributes","PrimitiveTypeAttributes","assertColorTexture","name","assertColor","assertScale","assertValueTexture","cloneObject","obj","serializeColorTexture","deserializeColorTexture","relativePath","textureCache","tex","deserializeVector","serializeValueTexture","deserializeValueTexture","serializeAttribute","mat","deserializeAttribute","Material","P","decReferences","attrib","Shader","plistRenderer","materialRenderer","modelMatrix","viewMatrix","projectionMatrix","ShaderType","destroy","ShaderProgram","gl","vertexCode","fragmentCode","shaderCode","glProgram","shaderProgram","shader","debugCode","line","status","size","normalize","stride","location","enable","bytesPerElement","transpose","v3","polyListRenderer","position","tex0","tex1","tex2","uniformName","matrix","textureRenderer","textureUnit","webglTexture","g_code","PresentTextureShader","sampleDelta","IrradianceMapCubeShader","sampleCount","roughness","SpecularMapCubeShader","createTextureResources","renderBuffer","destroyTextureResources","resources","updateMap","mapResources","state","skyShape","face","Environment$1","textureUrl","environmentMapSize","specularMapSize","irradianceMapSize","imageUrl","g_renderers","TextureMergerShader","channel","dstChannel","TextureMergerRenderer","EngineFeatures","Renderer","identifier","vp","Environment","clearBuffers","feature","g_componentClasses","registerComponent","typeId","componentClass","createComponent","ComponentClass","err","deserializeComponent","componentInstance","Component","node","writer","syncArray","ComponentMap","comp","existingComp","compOrType","cb","parentNode","compClone","bindRenderer","init","Node$1","Node","cloneChildren","newNode","component","ch","isNodeAncient","ancient","nodeVisitor","delta","renderQueue","willUpdateComponents","updateComponents","drawComponents","deserializeNode","nodeData","componentData","childData","child","DrawableFormat","g_prefDrawableFormat","VitscnjLoaderPlugin","bg2ioPath","preferedDrawableFormat","resourceType","prevPath","resource","root","scene","Bg2LoaderPlugin","Drawable","item","pl","selectable","tryload","drawablePath","drw","Bg2ioWrapper","instance","debug","arrayBuffer","buffer","cPtr","bg2File","header","components","materials","joints","polyLists","jsonData","bufferPtr","dataPtr","file","headerPtr","charData","numberOfPlist","materialStringPtr","materialString","componentStringPtr","componentStringRef","jointStringPtr","jointStringRef","plistPtr","structData","namePtr","matNamePtr","groupNamePtr","visible","vertexCount","vertexPtr","normalCount","normalPtr","texCoord0Count","texCoord0Ptr","texCoord1Count","texCoord1Ptr","texCoord2Count","texCoord2Ptr","indexCount","indexPtr","ptr","count","structPtr","strSize","strPtr","strData","str","bufferArray","destBuffer","jsTypedArray","jsToCPtr","indexArray","g_bg2ioModuleLoadingPromise","loadBg2ioModule","script","loaded","Bg2ioBrowser","wasmPath","g_bg2Wrapper","bg2ioFactory","createPolyList","plData","materialData","createDrawable","filePath","drawable","createNode","compData","bg2io","PluginOperationType","createPluginDatabase","operationType","registerPluginInDatabase","pluginInstance","pluginDatabase","getPluginFromDatabase","ext","extCheck","errMsg","plugins","plugin","g_loadPluginDatabase","registerLoaderPlugin","dep","getLoaderPlugin","getClearedCache","Loader","p","MtlParser","mtlText","parseM","res","parseG","parseU","parseS","addPoint","pointData","isValid","point","addPolygon","polygonData","currentVertex","sides","i0","p0","p1","p2","parseF","params","vtnRE","polygon","iV","iN","iT","parseO","checkAddPlist","loadObjData","lines","multiLine","ObjParser","objText","buildDrawable","polyListArray","mtlData","ObjLoaderPlugin","parser","WriterPlugin","ObjWriterPlugin","g_writePluginDatabase","registerWriterPlugin","getWriterPlugin","Writer","bgdb","LightType","Light","newLight","defaultIntensity","lightTypes","bgbase","NodeVisitor","TransformVisitor","Transform","visitor","Chain","frame","matrixState","inJoint","outJoint","Joint","linkData","LinkJoint","LinkTransformOrder","ChainJoint","InputChainJoint","OutputChainJoint","FindNodeVisitor","add","compId","LightComponent","sceneRoot","findLights","light","vm","enabled","lightType","spotCutoff","spotExponent","shadowStrength","castShadows","shadowBias","intensity","projection","ProjectionStrategy","PerspectiveProjectionStrategy","OpticalProjectionStrategy","OrthographicProjectionStrategy","fov","SetMainCameraVisitor","mainCamera","Camera","cam","GetMainCameraVisitor","camera","ps","fd","projMethod","EventBase","SpecialKey","createKeyboardEvent","code","KeyboardEvent","event","key","MouseButton","MouseButtonEventType","createMouseEvent","mainLoop","buttonType","buttonStatus","MouseEvent","g_mouseButtons","leftMouseButton","middleMouseButton","rightMouseButton","clearMouseButtons","setMouseButton","button","Action","getOrbitAction","cameraCtrl","middle","OrbitCameraController","id","rs","orthoStrategy","forward","pitch","displacement","mult","wMult","last","l0","l1","t0","t1","dist0","dist1","SmoothOrbitCameraController","minDisp","maxDisp","EnvironmentComponent","registerComponents","DrawableComponent","TransformComponent","ChainComponent","InputChainJointComponent","OutputChainJointComponent","CameraComponent","OrbitCameraControllerComponent","SmoothOrbitCameraControllerComponent","bgscene","AppController","ml","createTouchEvent","touches","TouchEvent","FrameUpdate","g_animationLoop","animationLoop","totalTime","elapsed","onUpdate","MouseStatus","MainLoop","appController","um","initEvents","onResize","frames","timeout","handlePropagation","bgEvt","onMouseDown","onMouseMove","onMouseOut","onMouseOver","onMouseUp","onTouchStart","onTouchMove","onTouchEnd","mouseWheelEvt","onMouseWheel","onKeyDown","onKeyUp","dpi","bg2Event","bgEvent","bgapp","EnvironmentRenderer","environment","FrameBuffer","stencil","MaterialRenderer","materialAttribute","element","BlendEquation","BlendFunction","Pipeline","blendEquation","blendFuncSrc","blendFuncDst","blendFuncSrcAlpha","blendFuncDstAlpha","dt","cf","PolyListRenderer","RenderBufferType","RenderBufferTypeName","CubeMapFace","getTargetType","getRenderBufferTypeName","RenderBuffer","attachment","textureFace","drawFunc","RenderState","pipeline","model","view","overrideShader","overrideViewMatrix","overrideProjectionMatrix","RenderQueue","beginOperation","endOperation","cullBackFace","cullFaceDisabled","blendState","queue","plistLayers","pipelines","FrameVisitor","BindRendererVisitor","InitVisitor","EventCallbackVisitor","callbackName","SceneRenderer","_value","shadowMapSize","env","bindRendererVisitor","findVisitor","drawSky","mainLight","focus","lightProjection","PickSelectionShader","getAllDependencies","fn","depFn","getDependencies","allFunctions","includedFunctions","candidateFn","getDefinitions","requiredFunctions","includedDefinitions","req","ShaderFunction","returnType","body","deps","rawCode","definitions","generateShaderLibrary","glslCode","splitStructs","splitFunctions","func","createShaderFunctionObject","extractConstants","constants","trimmedLine","parts","structs","currentStruct","braceCount","inStruct","processConstants","processedCode","constant","regex","escapeRegExp","string","functions","currentFunction","inFunction","functionCode","trimmedCode","openBraceIndex","signature","parenIndex","closeParenIndex","parameters","functionName","fresnelSchlick","fresnelSchlickRoughness","distributionGGX","geometrySchlickGGX","geometrySmith","pbrPointLight","pbrDirectionalLight","getPrefilteredColor","pbrAmbientLight","applyConvolution","getShadowColor","lineal2SRGB","SRGB2Lineal","brightnessContrast","SelectionHighlightShader","SelectionHighlight","cameraView","SelectionBuffer","SelectionMode","getColor","comps","SelectionAssignVisitor","mode","getId","pickedColor","colorCode","SelectionManager","SelectionIdAssignVisitor","upPosition","pixelRatio","isSelected","objData","cube","objTextData","radius","sphere","cylinder","cone","plane","w2","d2","arrow","arrowSize","arrowVector","arrowHeadDir1","arrowHeadDir2","createCube","createSphere","createCylinder","createCone","createPlane","createArrow","BasicDiffuseColorShader","texRenderer","DebugRenderShader","projMatrix","PresentDebugFramebufferShader","getMatrix","transformMatrix","DebugRenderer","object","SceneAppController","update","DepthRenderShader","ShadowRenderer","cameraNode","lightNode","cameraTransform","cameraPos","lightTransform","lightVector","lightPos","lightComponent","SkyCubeShader","SkyCube$1","cubemapTexture","shaderParams","SkySphereShader","SkySphere","equirectangularTextureUrl","TextureRenderer","WebGLFrameBuffer","BRDFIntegrationMap","g_textureDatabase","createColorTexture","createWhiteTexture","whiteTexture","createBlackTexture","blackTexture","createNormalTexture","normalTexture","createBRDFIntegrationTexture","WebGLMaterialRenderer","getTexture","fallbackTexture","property","fallbackColor","fallbackValue","getBlendEquation","getBlendFunc","blendFunc","WebGLPipeline","BufferTarget","BufferUsage","g_bufferTargetConversion","g_bufferUsageConversion","g_createdBuffers","g_bg2e_id__","VertexBuffer","gls","buffer_s","usage","gl_buffer","srcOffset","WebGLPolyListRenderer","getVector","items","current","numElements","t2","texCoord0","texCoord1","texCoord2","glEnumToString","getAttachmentPoint","getTextureTarget","beginUpdateTexture","depthBufferPresent","textureApi","attachmentPoint","textureTarget","endUpdateTexture","beginUpdateCubemap","fb","rb","statusCode","faceIndex","endUpdateCubemap","WebGLRenderBuffer","db","colorCorrection","normalMap","pbr","uniforms","g_constants","getConstants","g_colorCorrectionFunctions","getColorCorrectionFunctions","g_normalMapFunctions","getNormalMapFunctions","g_pbrFunctions","getPBRFunctions","g_uniformsFunctions","getUniformsFunctions","replaceConstants","getShaderProgramForLights","numLights","vshader","fshader","PBRLightIBLShader","rot","lt","lights","normMatrix","shadowLight","projectionViewMatrix","WebGLSceneRenderer","cameraMatrix","WebGLShadowRenderer","WebGLSkyCube","SkyCube","dm","WebGLSkySphere","State","ff","program","clearValues","getTarget","getClampMode","getTextureFilter","filter","getDataFormat","bg2eCreateTexture","textureObject","bg2eDeleteTexture","getWebGLTexture","dataFormat","isDepthTexture","internalFormat","WebGLTextureRenderer","glOrRenderer","webgl","enableExtensions","g_uuidLast","WebGLRenderer","requestDebug","throwOnError","funcName","args","logGLCall","elementBuffer","printBufferSize","arrayBufferType","prevViewport","features","bgrender","BasicPBRLightShader","bgshaders","webgl_shader_lib","WebGLTextureViewer","currentTexture","currentFramebuffer","framebuffer","flipped","bgdebug","app","math","render","tools","primitives","bgprimitives","shaders"],"mappings":"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9DA,IAAS,SAAS,IAAIA,IAAS,SAAS,IAAIA,IAAS,SAAS;AAAA,IAC9DA,IAAS,KAAS,IAAIA,IAAS,SAAS,IAAIA,IAAS,SAAS;AAAA,IAC9DA,IAAS,SAAS,IAAIA,IAAS,QAAQ,IAAIA,IAAS,KAAS;AAAA,IAC7DA,IAAS,SAAS,IAAIA,IAAS,QAAQ,IAAIA,IAAS,SAAS;AAAA,IAC7DA,IAAS,SAAS,IAAIA,IAAS,QAAQ,IAAIA,IAAS,SAAS;AAAA,IAC7DA,IAAS,SAAS,IAAIA,IAAS,QAAQ,IAAIA,IAAS,SAAS;AAAA,IAC7DA,IAAS,SAAS,IAAIA,IAAS,EAAS,IAAIA,IAAS,SAAS;AAAA,IAC9DA,IAAS,SAAS,IAAIA,IAAS,SAAS,IAAIA,IAAS,SAAS;AAAA,IAC9DA,IAAS,SAAS,IAAIA,IAAS,SAAS,IAAIA,IAAS,SAAS;AAAA,IAC9DA,IAAS,SAAS,IAAIA,IAAS,SAAS,IAAIA,IAAS,SAAS;AAAA,IAC9DA,IAAS,SAAS,IAAIA,IAAS,SAAS,IAAIA,IAAS,KAAS;AAAA,IAC9DA,IAAS,SAAS,IAAIA,IAAS,QAAQ,IAAIA,IAAS,SAAS;AAAA,IAC7DA,IAAS,SAAS,IAAIA,IAAS,QAAQ,IAAIA,IAAS,SAAS;AAAA,IAC7DA,IAAS,KAAS,IAAIA,IAAS,QAAQ,IAAIA,IAAS,SAAS;AAAA,IAC7DA,IAAS,SAAS,IAAIA,IAAS,QAAQ,IAAIA,IAAS,SAAS;AAAA,IAC7DA,IAAS,SAAS,IAAIA,IAAS,EAAS,IAAIA,IAAS,SAAS;AAAA,IAC9DA,IAAS,SAAS,IAAIA,IAAS,SAAS,IAAIA,IAAS,SAAS;AAAA,IAC9DA,IAAS,KAAS,IAAIA,IAAS,SAAS,IAAIA,IAAS,SAAS;AAAA,IAC9DA,IAAS,SAAS,IAAIA,IAAS,SAAS,IAAIA,IAAS,SAAS;AAAA,IAC9DA,IAAS,SAAS,IAAIA,IAAS,SAAS,IAAIA,IAAS,SAAS;AAAA,IAC9DA,IAAS,EAAS,IAAIA,IAAS,QAAQ,IAAIA,IAAS,SAAS;AAAA,IAC7DA,IAAS,EAAS,IAAIA,IAAS,SAAS,IAAIA,IAAS,SAAS;AAAA,IAC9DA,IAAS,CAAQ,IAAIA,IAAS,EAAS,IAAIA,IAAS,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GCAfpK,KAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GCAfqK,KAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GCAfC,KAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,ICAfC,KAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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","x_google_ignoreList":[42]}
|