ohzi-core 6.2.2 → 6.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/index.module.js +1 -1
- package/build/index.module.js.map +1 -1
- package/package.json +2 -1
- package/src/CustomBezierCurve.js +2 -2
- package/src/Debug.js +28 -28
- package/src/EventManager.js +1 -1
- package/src/Graphics.js +12 -12
- package/src/KeyboardInput.js +1 -1
- package/src/OS.js +5 -5
- package/src/UI.js +1 -1
- package/src/action_sequencer/ActionSequencer.js +17 -12
- package/src/action_sequencer/VectorInterpolator.js +1 -1
- package/src/canvas_drawer/CanvasDrawer.js +8 -8
- package/src/canvas_drawer/MultiLineTextDrawer.js +3 -3
- package/src/canvas_drawer/SimpleTextDrawer.js +1 -1
- package/src/components/EdgeMesh.js +17 -17
- package/src/components/GeometryEdgeVisualizer.js +1 -1
- package/src/components/Grid.js +3 -3
- package/src/components/Line.js +16 -16
- package/src/components/MultiLinePath.js +1 -1
- package/src/components/MultiLineText2D.js +1 -1
- package/src/components/ObjectAxis.js +3 -3
- package/src/components/ObjectOrientedBoundingBox.js +19 -19
- package/src/components/Shape2D.js +7 -7
- package/src/components/Shape3D.js +5 -5
- package/src/components/Text2D.js +3 -3
- package/src/components/UIElement.js +2 -2
- package/src/components/UpdatableMaterialMesh.js +1 -1
- package/src/components/WorldImage.js +4 -4
- package/src/components/mouse_interactors/ObjectRotator.js +2 -2
- package/src/components/sdf_text/SDFText.js +10 -10
- package/src/components/sdf_text/SDFTextBatch.js +24 -24
- package/src/components/sdf_text/TextGlyph.js +2 -2
- package/src/data_textures/RGBADataTexture.js +1 -1
- package/src/data_textures/RGBAFloatDataTexture.js +1 -1
- package/src/data_textures/RGBDataTexture.js +1 -1
- package/src/data_textures/RGBFloatDataTexture.js +1 -1
- package/src/editor/ManipulatorHandle.js +4 -4
- package/src/editor/ObjectEditor.js +2 -2
- package/src/editor/ObjectManipulator.js +3 -3
- package/src/gpu_particles/GPUParticleSystem.js +4 -4
- package/src/gpu_particles/ParticleAttribute.js +4 -4
- package/src/gpu_particles/ParticlePositionAttribute.js +2 -2
- package/src/materials/MedianFilterMaterial.js +1 -1
- package/src/materials/SSAOMaterial.js +5 -5
- package/src/materials/ScreenSpaceTextureMaterial.js +2 -2
- package/src/materials/UnrealBloomComposeMaterial.js +1 -1
- package/src/materials/UnrealBlurMaterial.js +1 -1
- package/src/materials/UnrealComposeMaterial.js +1 -1
- package/src/object_pool/Pool.js +3 -3
- package/src/primitives/Arrow.js +6 -6
- package/src/primitives/Cube.js +2 -2
- package/src/primitives/HorizontalPlane.js +1 -1
- package/src/primitives/Sphere.js +2 -2
- package/src/primitives/VerticalPlane.js +1 -1
- package/src/render_mode/DeferredRender.js +10 -10
- package/src/render_mode/PlanarReflectionsRender.js +3 -3
- package/src/render_mode/TransparencyMixRender.js +1 -1
- package/src/render_utilities/Blitter.js +7 -7
- package/src/render_utilities/GaussianBlurrer.js +3 -3
- package/src/render_utilities/MedianFilter.js +1 -1
- package/src/resource_loader/AbstractLoader.js +1 -1
- package/src/resource_loader/BasisLoader.js +1 -1
- package/src/resource_loader/CubemapLoader.js +1 -1
- package/src/resource_loader/DAELoader.js +1 -1
- package/src/resource_loader/DDSLoader.js +1 -1
- package/src/resource_loader/FileLoader.js +1 -1
- package/src/resource_loader/FontLoader.js +1 -1
- package/src/resource_loader/GLTFDRACOLoader.js +1 -1
- package/src/resource_loader/GLTFLoader.js +1 -1
- package/src/resource_loader/HDRCubeTextureLoader.js +1 -1
- package/src/resource_loader/JSONLoader.js +1 -1
- package/src/resource_loader/OBJLoader.js +1 -1
- package/src/resource_loader/PointArrayLoader.js +6 -6
- package/src/resource_loader/RGBETextureLoader.js +1 -1
- package/src/resource_loader/SVGLoader.js +1 -1
- package/src/resource_loader/TextLoader.js +1 -1
- package/src/static_batcher/GeometryBatch.js +20 -20
- package/src/static_batcher/GeometryBatcher.js +7 -7
- package/src/static_batcher/MeshBatcher.js +8 -8
- package/src/utilities/ArrayUtilities.js +4 -4
- package/src/utilities/CameraUtilities.js +24 -24
- package/src/utilities/EasingFunctions.js +19 -8
- package/src/utilities/FrustumPointFitter.js +55 -55
- package/src/utilities/GeometryUtilities.js +7 -7
- package/src/utilities/ImageUtilities.js +4 -4
- package/src/utilities/MeshSampler.js +33 -33
- package/src/utilities/ModelUtilities.js +2 -2
- package/src/utilities/OMath.js +4 -4
- package/src/utilities/ObjectUtilities.js +4 -4
- package/src/utilities/OrthographicFrustumPointFitter.js +10 -10
- package/src/utilities/PerspectiveFrustumPointFitter.js +55 -55
- package/src/view_components/ApplicationView.js +2 -2
- package/src/view_components/ViewComponent.js +26 -2
- package/src/view_components/ViewComponentManager.js +11 -1
- package/src/view_components/ViewManager.js +2 -2
- package/src/view_components/transition/ActionSequencerBuilder.js +18 -18
- package/src/view_components/transition/DrawIOAnimationSheet.js +20 -20
- package/src/view_components/transition/TransitionTable.js +1 -1
- package/src/view_components/transition/ViewStateTransitionHandler.js +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.module.js","sources":["../src/Browser.js","../src/utilities/Validation.js","../src/resource_loader/AbstractLoader.js","../src/action_sequencer/ActionSequencer.js","../src/utilities/EasingFunctions.js","../src/action_sequencer/ActionInterpolator.js","../src/action_sequencer/NumberInterpolator.js","../src/view_components/ViewContext.js","../src/action_sequencer/ActionEvent.js","../src/view_components/transition/DrawIOAnimationSheet.js","../src/view_components/transition/ActionSequencerBuilder.js","../src/EventManager.js","../src/ResourceContainer.js","../src/view_components/transition/TransitionTable.js","../src/Time.js","../src/view_components/ViewState.js","../src/view_components/transition/ViewStateTransitionHandler.js","../src/view_components/ViewManager.js","../src/view_components/ApplicationView.js","../src/BaseApplication.js","../src/render_mode/BaseRender.js","../src/materials/BaseShaderMaterial.js","../src/materials/BlitMaterial.js","../src/CameraManager.js","../src/Capabilities.js","../src/canvas_drawer/CanvasDrawer.js","../src/Configuration.js","../src/html_utilities/css_animator_states/Idle.js","../src/html_utilities/css_animator_states/Animating.js","../src/html_utilities/CSSAnimator.js","../src/components/AxisHelper.js","../src/SceneManager.js","../src/primitives/Cube.js","../src/primitives/Sphere.js","../src/primitives/Arrow.js","../src/Screen.js","../src/materials/ScreenSpaceTextureMaterial.js","../src/PerspectiveCamera.js","../src/Debug.js","../src/materials/ClearDepthNormalMaterial.js","../src/materials/DepthNormalMaterial.js","../src/render_utilities/DepthAndNormalsRenderer.js","../src/render_utilities/Blitter.js","../src/Graphics.js","../src/materials/NormalMaterial.js","../src/render_mode/DebugNormalsRender.js","../src/Input.js","../src/OS.js","../src/ReflectionPlaneContext.js","../src/static_batcher/GeometryBatch.js","../src/static_batcher/GeometryBatcher.js","../src/UI.js","../src/utilities/OMath.js","../src/utilities/CameraUtilities.js","../src/Initializer.js","../src/materials/SSAOMaterial.js","../src/materials/SSAOComposeMaterial.js","../src/materials/DisplayNormalTextureMaterial.js","../src/materials/BoxBlurMaterial.js","../src/render_utilities/Blurrer.js","../src/render_mode/NormalAORender.js","../src/render_mode/NormalRender.js","../src/materials/UnrealBloomComposeMaterial.js","../src/materials/AddMaterial.js","../src/materials/GaussianBlurMaterial.js","../src/materials/LuminosityHighPassMaterial.js","../src/render_utilities/GaussianBlurrer.js","../src/render_mode/UnrealBloomRender.js","../src/OrthographicCamera.js","../src/view_components/ViewComponentManager.js","../src/RenderLoop.js","../src/canvas_drawer/SimpleTextDrawer.js","../src/view_components/ViewComponent.js","../src/primitives/HorizontalPlane.js","../src/primitives/VerticalPlane.js","../src/utilities/ArrayUtilities.js","../src/utilities/FrustumPointFitter.js","../src/utilities/GeometryUtilities.js","../src/utilities/ImageUtilities.js","../src/utilities/MeshSampler.js","../src/utilities/ModelUtilities.js","../src/utilities/ObjectUtilities.js","../src/utilities/StringUtilities.js","../src/utilities/TimeUtilities.js","../src/utilities/PerspectiveFrustumPointFitter.js","../src/utilities/OrthographicFrustumPointFitter.js","../src/components/Grid.js","../src/components/Line.js","../src/components/WorldImage.js","../src/components/Text2D.js","../src/materials/UIElementMaterial.js","../src/ui/ui_element_position/ScreenSpacePosition.js","../src/ui/ui_element_position/WorldSpacePosition.js","../src/ui/ui_element_state/UIElementState.js","../src/ui/ui_element_state/OnIdle.js","../src/ui/ui_element_state/OnMouseEnter.js","../src/ui/ui_element_state/OnMouseExit.js","../src/ui/ui_element_state/OnMouseHover.js","../src/components/UIElement.js","../src/components/UpdatableMaterialMesh.js","../src/components/sdf_text/TextGlyph.js","../src/components/sdf_text/SDFText.js","../src/materials/SDFTextMaterial.js","../src/components/sdf_text/SDFTextBatch.js","../src/action_sequencer/VectorInterpolator.js","../src/materials/MedianFilterMaterial.js","../src/render_utilities/MedianFilter.js","../src/materials/DualFilteringBlurMaterial.js","../src/materials/AlphaFilterMaterial.js","../src/render_utilities/DualFilteringBlurrer.js","../src/gpu_particles/GPUParticleSystem.js","../src/data_textures/CustomDataTexture.js","../src/data_textures/RGBDataTexture.js","../src/data_textures/RGBADataTexture.js","../src/data_textures/RGBFloatDataTexture.js","../src/data_textures/RGBAFloatDataTexture.js","../src/static_batcher/BatchedMesh.js","../src/static_batcher/MeshBatcher.js","../src/components/AudioClip.js","../src/resource_loader/AudioLoader.js","../src/resource_loader/BasisLoader.js","../src/resource_loader/CubemapLoader.js","../src/resource_loader/DAELoader.js","../src/resource_loader/FileLoader.js","../src/resource_loader/FontLoader.js","../src/resource_loader/GLTFLoader.js","../src/resource_loader/GLTFDRACOLoader.js","../src/resource_loader/HDRCubeTextureLoader.js","../src/resource_loader/JSONLoader.js","../src/resource_loader/OBJLoader.js","../src/resource_loader/PointArrayLoader.js","../src/resource_loader/RGBETextureLoader.js","../src/resource_loader/TextLoader.js","../src/resource_loader/TextureLoader.js","../src/resource_loader/VideoLoader.js","../src/resource_loader/ResourceBatch.js"],"sourcesContent":["\nclass Browser\n{\n init()\n {\n this.browser_name = '';\n this.agent = window.navigator.userAgent.toLowerCase();\n\n switch (true)\n {\n case this.agent.indexOf('edge') > -1:\n this.browser_name = 'edge_ie';\n break;\n case this.agent.indexOf('edg') > -1:\n this.browser_name = 'edge_chromium';\n break;\n case this.agent.indexOf('opr') > -1 && !!window.opr:\n this.browser_name = 'opera';\n break;\n case this.agent.indexOf('chrome') > -1 && !!window.chrome:\n this.browser_name = 'chrome';\n break;\n case this.agent.indexOf('trident') > -1:\n this.browser_name = 'iexplorer';\n break;\n case this.agent.indexOf('firefox') > -1:\n this.browser_name = 'firefox';\n break;\n case this.agent.indexOf('safari') > -1:\n this.browser_name = 'safari';\n break;\n default:\n this.browser_name = 'other';\n break;\n }\n }\n\n get name()\n {\n return this.browser_name;\n }\n\n get is_safari()\n {\n return this.browser_name === 'safari';\n }\n\n get is_chrome()\n {\n return this.browser_name === 'chrome';\n }\n\n get is_edge()\n {\n return this.browser_name === 'edge_ie';\n }\n\n get is_edge_chromium()\n {\n return this.browser_name === 'edge_chromium';\n }\n\n get has_webm()\n {\n return this.is_chrome || this.is_firefox || this.is_edge_chromium;\n }\n\n get has_hvec()\n {\n return this.is_safari;\n }\n\n get preferred_video_extension()\n {\n return this.has_webm ? 'webm' : this.has_hvec ? 'hvec.mp4' : 'mp4';\n }\n}\n\nexport default new Browser();\n","export default class Validation\n{\n constructor()\n {}\n\n static is_int(n)\n {\n return Number(n) === n && n % 1 === 0;\n }\n\n static is_float(n)\n {\n return Number(n) === n && n % 1 !== 0;\n }\n\n static is_number(n)\n {\n return this.is_int(n) || this.is_float(n);\n }\n\n static is_json(str)\n {\n try\n {\n JSON.parse(str);\n }\n catch (e)\n {\n return false;\n }\n\n return true;\n }\n}\n","import Browser from '../Browser';\r\nimport Validation from '../utilities/Validation';\r\n\r\nexport default class AbstractLoader\r\n{\r\n constructor(resource_id, url, size = 1)\r\n {\r\n this.resource_id = resource_id;\r\n this.url = url;\r\n this.loaded_bytes = 0;\r\n this.total_bytes = size;\r\n\r\n this.has_finished = false;\r\n this.has_error = false;\r\n this.error_message = 'none';\r\n }\r\n\r\n __update_downloaded_bytes(loaded, total)\r\n {\r\n loaded = Validation.is_number(loaded) ? loaded : 1;\r\n total = Validation.is_number(total) ? total : 1;\r\n\r\n this.loaded_bytes = loaded;\r\n\r\n if (total > 0)\r\n {\r\n this.total_bytes = total;\r\n }\r\n\r\n if (this.loaded_bytes > this.total_bytes)\r\n {\r\n console.warn('Total bytes is smaller than loaded ones. Please set total bytes by hand to:', this.url);\r\n }\r\n }\r\n\r\n __loading_ended()\r\n {\r\n this.has_finished = true;\r\n }\r\n\r\n __set_error(message)\r\n {\r\n this.has_error = true;\r\n this.error_message = message;\r\n }\r\n\r\n print_error()\r\n {\r\n console.error('Error while loading ' + this.resource_id + '\\n\\t path: ' + this.url + '\\n\\t\\t' + this.error_message);\r\n }\r\n\r\n load(resource_container)\r\n {\r\n const cache = Browser.is_safari ? 'no-cache' : 'default';\r\n\r\n fetch(this.url, {\r\n method: 'GET', // *GET, POST, PUT, DELETE, etc.\r\n mode: 'cors', // no-cors, *cors, same-origin\r\n cache: cache, // *default, no-cache, reload, force-cache, only-if-cached\r\n credentials: 'same-origin', // include, *same-origin, omit\r\n redirect: 'follow' // manual, *follow, error\r\n })\r\n .then(this.on_progress.bind(this, resource_container))\r\n .catch(this.__on_error.bind(this));\r\n }\r\n\r\n async on_progress(resource_container, response)\r\n {\r\n const response_clone = response.clone();\r\n const reader = response.body.getReader();\r\n\r\n // Step 2: get total length\r\n let contentLength = +response.headers.get('Content-Length');\r\n\r\n // Step 3: read the data\r\n let receivedLength = 0; // received that many bytes at the moment\r\n\r\n while (true)\r\n {\r\n const { done, value } = await reader.read();\r\n\r\n if (done)\r\n {\r\n break;\r\n }\r\n\r\n receivedLength += value.length;\r\n\r\n this.__update_downloaded_bytes(receivedLength, contentLength);\r\n // console.log(`Received ${receivedLength} of ${contentLength}`);\r\n }\r\n\r\n this.on_preloaded_finished(resource_container, response_clone);\r\n }\r\n\r\n on_preloaded_finished(resource_container, response)\r\n {\r\n }\r\n\r\n __on_error(data)\r\n {\r\n console.error(data);\r\n }\r\n}\r\n","\nimport { Math as TMath } from 'three';\n\nexport default class ActionSequencer\n{\n constructor(context)\n {\n this.elapsed_time = -0.00001;\n this.playback_speed = 1;\n this.playing = false;\n\n this.action_events = [];\n this.context = context;\n\n this.initial_context = JSON.parse(JSON.stringify(context));\n\n this.tmp_t = 0;\n\n this.channels = {};\n\n let channel_names = Object.keys(context);\n for (let i = 0; i < channel_names.length; i++)\n {\n this.channels[channel_names[i]] = [];\n }\n\n this.duration = 0;\n }\n\n play()\n {\n this.playing = true;\n }\n\n stop()\n {\n this.playing = false;\n }\n\n reset()\n {\n this.elapsed_time = -0.00001;\n }\n\n skip()\n {\n let duration = this.get_duration();\n this.__play_clips(this.elapsed_time, duration + 0.0001);\n this.elapsed_time = duration;\n }\n\n update(delta_time)\n {\n if (this.playing)\n {\n this.__play_clips(this.elapsed_time, this.elapsed_time + delta_time * this.playback_speed);\n this.elapsed_time = this.elapsed_time + delta_time * this.playback_speed;\n }\n }\n\n set_progress(time)\n {\n this.elapsed_time = TMath.clamp(time, 0, this.duration);\n this.__play_clips(this.elapsed_time, this.elapsed_time);\n }\n\n set_normalized_progress(t)\n {\n this.elapsed_time = TMath.clamp(t, 0, 1) * this.duration;\n this.__play_clips(this.elapsed_time, this.elapsed_time);\n }\n\n get_progress()\n {\n return TMath.clamp(this.elapsed_time / this.get_duration(), 0, 1);\n }\n\n is_finished()\n {\n return this.elapsed_time > this.get_duration();\n }\n\n add_action_event(trigger_time, action)\n {\n this.action_events.push({\n trigger_time: trigger_time,\n action: action\n });\n\n this.duration = Math.max(this.duration, trigger_time);\n }\n\n add_action_interpolator(from, to, interpolator, use_dynamic_from_value = false)\n {\n if (use_dynamic_from_value)\n {\n let keyframes = this.channels[interpolator.attribute_name];\n\n if (keyframes === undefined)\n {\n console.error(`${interpolator.attribute_name} missing in initial state data.`);\n }\n\n if (keyframes.length === 0)\n {\n interpolator.from = this.initial_context[interpolator.attribute_name];\n }\n else\n {\n interpolator.from = keyframes[keyframes.length - 1].interpolator.to;\n }\n }\n\n let keyframe = {\n from: from,\n to: to,\n interpolator: interpolator\n };\n\n this.duration = Math.max(this.duration, to);\n this.channels[interpolator.attribute_name].push(keyframe);\n }\n\n get_property_target_value(name)\n {\n let keyframe = this.__get_nearest_keyframe(name, this.elapsed_time);\n\n if (this.elapsed_time < keyframe.from)\n {\n return keyframe.interpolator.evaluate(0);\n }\n\n return keyframe.interpolator.evaluate(1);\n }\n\n get_duration()\n {\n return this.duration;\n }\n\n __play_clips(from, to)\n {\n for (let i = 0; i < this.action_events.length; i++)\n {\n if (this.action_events[i].trigger_time > from - Number.EPSILON &&\n this.action_events[i].trigger_time < to + Number.EPSILON)\n {\n // console.log(\"Play event: \" + this.action_events[i].action.constructor.name + \" at \"+ this.action_events[i].trigger_time);\n this.action_events[i].action.trigger();\n }\n }\n let channel_names = Object.keys(this.initial_context);\n\n for (let i = 0; i < channel_names.length; i++)\n {\n let name = channel_names[i];\n let keyframe = this.__get_nearest_keyframe(name, from);\n this.context[name] = this.evaluate_keyframe(keyframe, from);\n }\n }\n\n evaluate_keyframe(keyframe, time)\n {\n this.tmp_t = this.__linear_map_01(time, keyframe.from, keyframe.to);\n return keyframe.interpolator.evaluate(TMath.clamp(this.tmp_t, 0, 1));\n }\n\n __linear_map_01(value,\n from_range_start_value,\n from_range_end_value)\n {\n return ((value - from_range_start_value) / (from_range_end_value - from_range_start_value)) * (1 - 0) + 0;\n }\n\n __get_nearest_keyframe(channel_name, time)\n {\n let closest = undefined;\n let min_time = 9999999;\n let keyframes = this.channels[channel_name];\n for (let i = 0; i < keyframes.length; i++)\n {\n let keyframe = keyframes[i];\n let middle_time = (keyframe.to - keyframe.from) / 2 + keyframe.from;\n let distance_to_middle_time = Math.abs(time - middle_time);\n\n if (distance_to_middle_time < min_time)\n {\n min_time = distance_to_middle_time;\n closest = keyframe;\n }\n }\n return closest;\n }\n}\n","class EasingFunctions\n{\n constructor()\n { }\n\n linear(x)\n {\n return x;\n }\n\n triangular(x)\n {\n return 1 - Math.abs((x * 2) % (1 * 2) - 1);\n }\n\n ease_in_sine(x)\n {\n return 1 - Math.cos(x * 3.1415926 / 2);\n }\n\n ease_out_sine(x)\n {\n return Math.sin(x * 3.1415926 / 2);\n }\n\n ease_in_out_sine(x)\n {\n return -(Math.cos(3.1415926 * x) - 1) / 2;\n }\n\n ease_in_cubic(x)\n {\n return x * x * x;\n }\n\n ease_out_cubic(x)\n {\n return 1 - Math.pow(1 - x, 3);\n }\n\n ease_in_out_cubic(x)\n {\n return x < 0.5\n ? 4 * x * x * x\n : 1 - Math.pow(-2 * x + 2, 3) / 2;\n }\n\n ease_in_quad(x)\n {\n return x * x;\n }\n\n ease_out_quad(x)\n {\n return 1 - (1 - x) * (1 - x);\n }\n\n ease_in_out_quad(x)\n {\n return x < 0.5\n ? 2 * x * x\n : 1 - Math.pow(-2 * x + 2, 2) / 2;\n }\n\n ease_in_quart(x)\n {\n return x * x * x * x;\n }\n\n ease_out_quart(x)\n {\n return 1 - Math.pow(1 - x, 4);\n }\n\n ease_in_out_quart(x)\n {\n return x < 0.5\n ? 8 * x * x * x * x\n : 1 - Math.pow(-2 * x + 2, 4) / 2;\n }\n\n ease_in_quint(x)\n {\n return x * x * x * x * x;\n }\n\n ease_out_quint(x)\n {\n return 1 - Math.pow(1 - x, 5);\n }\n\n ease_in_out_quint(x)\n {\n return x < 0.5\n ? 16 * x * x * x * x * x\n : 1 - Math.pow(-2 * x + 2, 5) / 2;\n }\n\n ease_in_expo(x)\n {\n return x === 0 ? 0 : Math.pow(2, 10 * x - 10);\n }\n\n ease_out_expo(x)\n {\n return x === 1 ? 1 : 1 - Math.pow(2, -10 * x);\n }\n\n ease_in_out_expo(x)\n {\n return x === 0 ? 0 : x === 1 ? 1 : x < 0.5\n ? Math.pow(2, 20 * x - 10) / 2\n : (2 - Math.pow(2, -20 * x + 10)) / 2;\n }\n\n ease_in_circ(x)\n {\n return 1 - Math.sqrt(1 - Math.pow(x, 2));\n }\n\n ease_out_circ(x)\n {\n return Math.sqrt(1 - Math.pow(x - 1, 2));\n }\n\n ease_in_out_circ(x)\n {\n return x < 0.5\n ? (1 - Math.sqrt(1 - Math.pow(2 * x, 2))) / 2\n : (Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2;\n }\n\n ease_in_back(x)\n {\n return 2.7015 * x * x * x - 1.7015 * x * x;\n }\n\n ease_out_back(x)\n {\n return 1 + 2.7015 * Math.pow(x - 1, 3) + 1.7015 * Math.pow(x - 1, 2);\n }\n\n ease_in_out_back(x)\n {\n return x < 0.5\n ? (Math.pow(2 * x, 2) * ((2.5949095 + 1) * 2 * x - 2.5949095)) / 2\n : (Math.pow(2 * x - 2, 2) * ((2.5949095 + 1) * (x * 2 - 2) + 2.5949095) + 2) / 2;\n }\n\n ease_in_elastic(x)\n {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : -Math.pow(2, 10 * x - 10) * Math.sin((x * 10 - 10.75) * c4);\n }\n\n ease_out_elastic(x)\n {\n return x === 0 ? 0 : x === 1 ? 1\n : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * 2.0943950) + 1;\n }\n\n ease_in_out_elastic(x)\n {\n return x === 0 ? 0 : x === 1 ? 1 : x < 0.5\n ? -(Math.pow(2, 20 * x - 10) * Math.sin((20 * x - 11.125) * 1.3962633)) / 2\n : Math.pow(2, -20 * x + 10) * Math.sin((20 * x - 11.125) * 1.3962633) / 2 + 1;\n }\n\n ease_in_bounce(x)\n {\n return 1 - this.ease_out_bounce(1 - x);\n }\n\n ease_out_bounce(x)\n {\n const n1 = 7.5625;\n const d1 = 2.75;\n\n if (x < 1 / d1)\n {\n return n1 * x * x;\n }\n else if (x < 2 / d1)\n {\n return n1 * (x -= 1.5 / d1) * x + 0.75;\n }\n else if (x < 2.5 / d1)\n {\n return n1 * (x -= 2.25 / d1) * x + 0.9375;\n }\n else\n {\n return n1 * (x -= 2.625 / d1) * x + 0.984375;\n }\n }\n\n ease_in_out_bounce(x)\n {\n return x < 0.5\n ? (1 - this.ease_out_bounce(1 - 2 * x)) / 2\n : (1 + this.ease_out_bounce(2 * x - 1)) / 2;\n }\n\n heartbeat(t)\n {\n return 1.0 - Math.pow(Math.abs(Math.sin(t + 1.0)), 63.0) * Math.sign(Math.sin(t)) * Math.sin(t + 1.5 + 1.0) * 0.8;\n }\n}\n\nexport default new EasingFunctions();\n","import EasingFunctions from '../utilities/EasingFunctions';\n\nexport default class ActionInterpolator\n{\n constructor(easing_function = 'linear')\n {\n this.easing_function = undefined;\n\n if (typeof easing_function === 'string')\n {\n this.easing_function = EasingFunctions[easing_function];\n }\n else\n {\n this.easing_function = easing_function;\n }\n }\n\n update(context, t)\n {\n\n }\n}\n","import ActionInterpolator from './ActionInterpolator';\nimport { Math as TMath } from 'three';\n\nexport default class NumberInterpolator extends ActionInterpolator\n{\n constructor(attribute_name, from = 0, to = 1, easing_function = 'linear')\n {\n super(easing_function);\n\n this.attribute_name = attribute_name;\n this.from = from;\n this.to = to;\n }\n\n update(context, t)\n {\n context[this.attribute_name] = TMath.lerp(this.from, this.to, this.easing_function(t));\n }\n\n evaluate(t)\n {\n return TMath.lerp(this.from, this.to, this.easing_function(t));\n }\n}\n","class ViewContext\n{\n constructor()\n {\n this.app = undefined;\n }\n\n set_app(app)\n {\n this.app = app;\n }\n}\n\nexport default new ViewContext();\n","import ViewContext from '../view_components/ViewContext';\n\nexport default class ActionEvent\n{\n constructor(name, method)\n {\n this.name = name;\n this.method = method;\n }\n\n trigger()\n {\n ViewContext.app[this.name][this.method]();\n }\n}\n","export default class DrawIOAnimationSheet\n{\n constructor()\n {\n\n }\n\n parse(xml_document)\n {\n let doc = new DOMParser().parseFromString(xml_document, 'text/xml');\n\n let animation_nodes = doc.querySelectorAll('mxGeometry');\n\n let animation_tracks = [];\n let triggers = [];\n\n for (let i = 0; i < animation_nodes.length; i++)\n {\n let node = animation_nodes[i];\n let parent_node = node.parentElement;\n let data = parent_node.getAttribute('value');\n\n let x_pos = this.get_node_x_position(node);\n\n let from = x_pos / 100;\n let duration = parseFloat(node.getAttribute('width')) / 100;\n\n // is trigger\n if (parent_node.getAttribute('style').includes('rhombus;'))\n {\n let split_data = data.split('.');\n let trigger_name = split_data[0];\n let trigger_method = split_data[1];\n\n triggers.push({\n name: trigger_name,\n method: trigger_method,\n at_time: from + duration * 0.5\n });\n }\n\n let valid_element = parent_node.getAttribute('style').includes('rounded=0;') &&\n !parent_node.getAttribute('style').includes('text;');\n\n if (valid_element && data !== '' && !data.includes(' '))\n {\n let split_data = data.split('=');\n\n let attribute_name = split_data[0];\n\n let value_data = split_data[1].split('--');\n let to_value = parseFloat(value_data[0]);\n let easing_function = value_data[1];\n\n if (split_data.length !== 2)\n {\n console.error('DrawIO data is malformed:', data);\n }\n\n if (value_data.length !== 2)\n {\n console.error('DrawIO data is malformed:', data);\n }\n\n animation_tracks.push({\n attribute_name: attribute_name,\n from_time: from,\n to_time: from + duration,\n to_value: to_value,\n easing_function: easing_function\n });\n }\n }\n\n animation_tracks.sort((a, b) =>\n {\n return a.from_time - b.from_time;\n });\n return {\n animation_tracks: animation_tracks,\n triggers: triggers\n };\n }\n\n get_node_x_position(node)\n {\n let x_pos = node.getAttribute('x');\n return x_pos === null ? 0 : parseFloat(x_pos);\n }\n}\n","import ActionSequencer from '../../action_sequencer/ActionSequencer';\nimport NumberInterpolator from '../../action_sequencer/NumberInterpolator';\nimport ActionEvent from '../../action_sequencer/ActionEvent';\nimport DrawIOAnimationSheet from './DrawIOAnimationSheet';\n\nexport default class ActionSequencerBuilder\n{\n constructor(initial_state_data)\n {\n this.initial_state_data = initial_state_data;\n }\n\n from_animation_sheet(animation_data, current_context, initial_context)\n {\n initial_context = initial_context || this.initial_state_data;\n let tracks = animation_data.animation_tracks;\n let triggers = animation_data.triggers;\n\n let initial_tracks = this.state_to_tracks(this.initial_state_data);\n\n for (let i = 0; i < initial_tracks.length; i++)\n {\n if (tracks.find(element => element.attribute_name === initial_tracks[i].attribute_name) === undefined)\n {\n tracks.push(initial_tracks[i]);\n }\n }\n\n let sequencer = new ActionSequencer(current_context);\n\n for (let i = 0; i < tracks.length; i++)\n {\n let t = tracks[i];\n let interpolator = new NumberInterpolator(t.attribute_name, current_context[t.attribute_name], t.to_value, t.easing_function);\n sequencer.add_action_interpolator(t.from_time, t.to_time, interpolator, true);\n }\n\n for (let i = 0; i < triggers.length; i++)\n {\n let t = triggers[i];\n let action_event = new ActionEvent(t.name, t.method);\n sequencer.add_action_event(t.at_time, action_event);\n }\n\n return sequencer;\n }\n\n state_to_tracks(state)\n {\n let tracks = [];\n\n let keys = Object.keys(state);\n\n for (let i = 0; i < keys.length; i++)\n {\n tracks.push({\n attribute_name: keys[i],\n from_time: 0,\n to_time: 1,\n to_value: state[keys[i]],\n easing_function: 'ease_in_out_cubic'\n });\n }\n\n return tracks;\n }\n\n from_draw_io(xml, context)\n {\n let transition_data = (new DrawIOAnimationSheet()).parse(xml);\n let tracks = transition_data.animation_tracks;\n let triggers = transition_data.triggers;\n let sequencer = new ActionSequencer(context);\n\n for (let i = 0; i < tracks.length; i++)\n {\n let t = tracks[i];\n let interpolator = new NumberInterpolator(t.attribute_name, context[t.attribute_name], t.to_value, t.easing_function);\n sequencer.add_action_interpolator(t.from_time, t.to_time, interpolator, true);\n }\n\n for (let i = 0; i < triggers.length; i++)\n {\n let t = triggers[i];\n let action_event = new ActionEvent(t.name, t.method);\n sequencer.add_action_event(t.at_time, action_event);\n }\n\n return sequencer;\n }\n}\n","class EventManager\n{\n init()\n {\n this.queue = {};\n\n this.zoom_changed_evt = 'zoom_changed';\n this.store_clickd_evt = 'store_clicked';\n this.point_selected_evt = 'point_selected';\n this.config_changed = 'config_changed';\n\n this.path_substep_completed = 'path_substep_completed';\n this.path_completed = 'path_completed';\n this.go_to_store_requested_evt = 'go_to_store_requested';\n\n this.resource_loaded_evt = 'resource_loaded';\n this.service_clicked_evt = 'service_clicked';\n this.unit_pos_updated_evt = 'unit_position_updated';\n\n this.floor_changed_evt = 'floor_changed';\n\n this.on_enter_floor_navigation = 'on_enter_floor_navigation';\n this.on_exit_floor_navigation = 'on_exit_floor_navigation';\n\n this.on_enter_floor_selection = 'on_enter_floor_selection';\n this.on_exit_floor_selection = 'on_exit_floor_selection';\n\n this.on_enter_outside_navigation = 'on_enter_outside_navigation';\n this.on_exit_outside_navigation = 'on_exit_outside_navigation';\n\n this.step_selected_evt = 'step_selected';\n }\n\n fire(event, payload)\n {\n let queue = this.queue[event];\n\n if (queue === undefined)\n {\n return;\n }\n let i = queue.length;\n while (i--)\n {\n queue[i](payload);\n }\n }\n\n on(event, callback)\n {\n if (typeof this.queue[event] === 'undefined')\n {\n this.queue[event] = [];\n }\n\n this.queue[event].push(callback);\n }\n\n fire_zoom_changed(zoom)\n {\n this.fire(this.zoom_changed_evt, zoom);\n }\n\n fire_store_selected(store_id)\n {\n this.fire(this.store_clickd_evt, store_id);\n }\n\n fire_point_selected(hit_data)\n {\n this.fire(this.point_selected_evt, hit_data);\n }\n\n fire_config_changed()\n {\n this.fire(this.config_changed);\n }\n\n fire_path_substep_completed(step_number)\n {\n this.fire(this.path_substep_completed, step_number);\n }\n\n fire_path_completed()\n {\n this.fire(this.path_completed);\n }\n\n fire_step_selected(step_index)\n {\n this.fire(this.step_selected_evt, step_index);\n }\n\n fire_go_to_store_requested(store_id)\n {\n this.fire(this.go_to_store_requested_evt, store_id);\n }\n\n fire_resource_loaded(resource)\n {\n this.fire(this.resource_loaded_evt, resource);\n }\n\n fire_service_clicked(service)\n {\n this.fire(this.service_clicked_evt, service);\n }\n\n fire_unit_position_updated(unit_data)\n {\n this.fire(this.unit_pos_updated_evt, unit_data);\n }\n\n fire_floor_switched(floor_id)\n {\n this.fire(this.floor_changed_evt, floor_id);\n }\n\n fire_on_enter_floor_navigation(state)\n {\n this.fire(this.on_enter_floor_navigation, state);\n }\n\n fire_on_exit_floor_navigation(state)\n {\n this.fire(this.on_exit_floor_navigation, state);\n }\n\n fire_on_enter_floor_selection(state)\n {\n this.fire(this.on_enter_floor_selection, state);\n }\n\n fire_on_exit_floor_selection(state)\n {\n this.fire(this.on_exit_floor_selection, state);\n }\n\n fire_on_enter_outside_navigation(state)\n {\n this.fire(this.on_enter_outside_navigation, state);\n }\n\n fire_on_exit_outside_navigation(state)\n {\n this.fire(this.on_exit_outside_navigation, state);\n }\n}\n\nexport default new EventManager();\n","import EventManager from './EventManager';\n\nclass ResourceContainer\n{\n init()\n {\n this.resources = {};\n this.resources_by_url = {};\n }\n\n set_resource(name, url, resource)\n {\n const urls = Object.keys(this.resources_by_url);\n\n if (urls.includes(url))\n {\n this.resources[name] = this.resources_by_url[url];\n }\n else\n {\n this.resources[name] = resource;\n this.resources_by_url[url] = resource;\n }\n\n EventManager.fire_resource_loaded({ name: name, value: resource });\n }\n\n get_resource(name)\n {\n return this.resources[name];\n }\n\n get(name)\n {\n return this.resources[name];\n }\n}\n\nexport default new ResourceContainer();\n","import ActionSequencerBuilder from './ActionSequencerBuilder';\n\nexport default class TransitionTable\n{\n constructor()\n {\n this.transitions = [];\n this.initial_state_data = {};\n }\n\n get(to_state, current_context)\n {\n for (let i = 0; i < this.transitions.length; i++)\n {\n if (this.transitions[i].to === to_state)\n {\n let action_sequencer = new ActionSequencerBuilder(this.initial_state_data).from_animation_sheet(this.transitions[i].data, current_context);\n\n return action_sequencer;\n }\n }\n\n console.error('TransitionTable.get no data found for: ', to_state);\n return undefined;\n }\n\n add_transitions(transitions)\n {\n for (let i = 0; i < transitions.length; i++)\n {\n this.transitions.push(transitions[i]);\n }\n }\n\n set_transitions(transitions)\n {\n this.transitions = transitions;\n }\n\n set_initial_state_data(initial_state_data)\n {\n this.initial_state_data = initial_state_data;\n }\n}\n","import { Vector2 } from 'three';\nimport { Clock } from 'three';\n\nclass Time\n{\n init()\n {\n this.___time = new Clock();\n this.__delta_time = 0;\n this.__elapsed_time = 0;\n this.__allocated_time = new Vector2(0, 0);\n }\n\n get delta_time()\n {\n return this.__delta_time < 0.4 ? this.__delta_time : 0.016;\n }\n\n get elapsed_time()\n {\n return this.__elapsed_time;\n }\n\n get shader_time()\n {\n this.__allocated_time.x = this.delta_time;\n this.__allocated_time.y = this.elapsed_time;\n return this.__allocated_time;\n }\n\n __update()\n {\n this.__delta_time = this.___time.getDelta();\n this.__elapsed_time = this.___time.getElapsedTime();\n }\n}\n\nexport default new Time();\n","export default class ViewState\n{\n constructor(name)\n {\n this.name = name;\n }\n\n start()\n {\n }\n\n show()\n {\n }\n\n hide()\n {\n }\n\n before_enter()\n {\n }\n\n on_enter()\n {\n }\n\n update()\n {\n }\n\n update_enter_transition(global_view_data, transition_progress, action_sequencer)\n {\n // Backward compatibility. It will be removed in future releases.\n this.update_transition(global_view_data, transition_progress, action_sequencer);\n }\n\n update_exit_transition(global_view_data, transition_progress, action_sequencer)\n {\n }\n\n // Deprecated\n update_transition(global_view_data, transition_progress, action_sequencer)\n {\n }\n\n before_exit()\n {\n }\n\n on_exit()\n {\n }\n}\n","import Time from '../../Time';\nimport ViewState from '../ViewState';\n\nexport default class ViewStateTransitionHandler\n{\n constructor(transition_table)\n {\n this.last_state = new ViewState();\n this.current_state = new ViewState();\n\n this.initial_state_data = {};\n this.current_state_data = {};\n\n this.transition_table = transition_table;\n\n this.transitioning = false;\n }\n\n go_to_state(state, skip = false)\n {\n if (this.transitioning)\n {\n this.__exit_last_state();\n }\n\n this.last_state = this.current_state;\n this.current_state = state;\n\n this.last_state.before_exit();\n this.current_state.show();\n this.current_state.before_enter();\n\n this.action_sequencer = this.transition_table.get(this.current_state.name, this.current_state_data);\n this.action_sequencer.play();\n\n this.transitioning = true;\n\n if (skip)\n {\n this.action_sequencer.skip();\n this.update();\n }\n }\n\n update()\n {\n if (this.transitioning)\n {\n this.__update_transitions();\n\n if (this.action_sequencer.is_finished())\n {\n this.transitioning = false;\n\n this.__update_transitions();\n\n this.__exit_last_state();\n\n this.current_state.on_enter();\n }\n }\n else\n {\n this.current_state.update();\n }\n }\n\n set_state(state)\n {\n this.current_state = state;\n }\n\n set_initial_state_data(initial_state_data)\n {\n Object.assign(this.initial_state_data, initial_state_data);\n Object.assign(this.current_state_data, initial_state_data);\n }\n\n __update_transitions()\n {\n this.action_sequencer.update(Time.delta_time);\n this.last_state.update_exit_transition(this.current_state_data, this.action_sequencer.get_progress(), this.action_sequencer);\n this.current_state.update_enter_transition(this.current_state_data, this.action_sequencer.get_progress(), this.action_sequencer);\n }\n\n __exit_last_state()\n {\n if (this.last_state.name !== this.current_state.name)\n {\n this.last_state.hide();\n }\n\n this.last_state.on_exit();\n }\n}\n","import TransitionTable from './transition/TransitionTable';\nimport ViewStateTransitionHandler from './transition/ViewStateTransitionHandler';\n\nclass ViewManager\n{\n constructor()\n {\n this.views = [];\n\n this.transition_table = new TransitionTable();\n this.transition_handler = new ViewStateTransitionHandler(this.transition_table);\n }\n\n update()\n {\n this.transition_handler.update();\n\n this.__set_views_opacities();\n }\n\n go_to_view(view_name, change_url = true, skip = false)\n {\n let v = this.get(view_name);\n this.transition_handler.go_to_state(v, skip);\n\n if (change_url)\n {\n this.__change_browser_url(v.url);\n }\n }\n\n register_view(view)\n {\n this.views.push(view);\n }\n\n has_view(view_name)\n {\n for (let i = 0; i < this.views.length; i++)\n {\n if (this.views[i].name === view_name)\n {\n return true;\n }\n }\n return false;\n }\n\n add_transitions(transitions)\n {\n this.transition_table.add_transitions(transitions);\n }\n\n set_transitions(transitions)\n {\n this.transition_table.set_transitions(transitions);\n }\n\n set_view(view_name)\n {\n let view = this.get(view_name);\n\n this.transition_handler.set_state(view);\n }\n\n get_current_view()\n {\n return this.transition_handler.current_state;\n }\n\n get_view_by_name(view_name)\n {\n console.warn('DEPRECATED. Use ViewManager.get instead');\n this.get(view_name);\n }\n\n get(view_name)\n {\n for (let i = 0; i < this.views.length; i++)\n {\n if (this.views[i].name === view_name)\n {\n return this.views[i];\n }\n }\n console.error('[ViewManager.get] no view found for: ', view_name);\n return undefined;\n }\n\n get_view_by_url(url)\n {\n console.warn('DEPRECATED. Use ViewManager.get_by_url instead');\n this.get_by_url(url);\n }\n\n get_by_url(url)\n {\n for (let i = 0; i < this.views.length; i++)\n {\n if (this.views[i].url === url)\n {\n return this.views[i];\n }\n }\n console.error('[ViewManager.get_by_url] no view found for: ', url);\n return undefined;\n }\n\n set_initial_state_data(initial_state_data)\n {\n this.transition_table.set_initial_state_data(initial_state_data);\n this.transition_handler.set_initial_state_data(initial_state_data);\n }\n\n __change_browser_url(url)\n {\n window.history.pushState('', '', url);\n }\n\n __set_views_opacities()\n {\n for (let i = 0; i < this.views.length; i++)\n {\n this.views[i].set_opacity(this.transition_handler.current_state_data);\n }\n }\n}\n\nexport default new ViewManager();\n","import ResourceContainer from '../ResourceContainer';\nimport DrawIOAnimationSheet from './transition/DrawIOAnimationSheet';\nimport ViewManager from './ViewManager';\nimport ViewState from './ViewState';\n\nexport default class ApplicationView extends ViewState\n{\n constructor({ name, url, container })\n {\n super(name);\n\n this.container = container;\n this.url = url;\n\n let transition_data = new DrawIOAnimationSheet().parse(ResourceContainer.get(`${name}_data`));\n\n let transitions = [\n {\n to: name,\n data: transition_data\n }\n ];\n\n ViewManager.register_view(this);\n ViewManager.add_transitions(transitions);\n }\n\n show()\n {\n this.container.classList.add('before_enter');\n this.container.classList.remove('before_exit');\n this.container.classList.remove('hidden');\n }\n\n on_enter()\n {\n this.container.classList.remove('before_enter');\n this.container.classList.remove('before_exit');\n this.container.classList.remove('hidden');\n }\n\n before_exit()\n {\n this.container.classList.add('before_exit');\n this.container.classList.remove('before_enter');\n this.container.classList.remove('hidden');\n }\n\n hide()\n {\n this.container.classList.add('hidden');\n this.container.classList.remove('before_enter');\n this.container.classList.remove('before_exit');\n }\n\n set_opacity(current_state_data)\n {\n this.container.style.opacity = current_state_data[`${this.name}_opacity`];\n }\n}\n","export default class BaseApplication\n{\n on_post_start()\n {}\n\n on_enter()\n {}\n\n on_exit()\n {}\n\n update()\n {}\n\n on_post_render()\n {}\n\n on_pre_render()\n {}\n\n on_frame_end()\n {}\n}\n","export default class BaseRender\n{\n constructor()\n {\n\n }\n\n render()\n {\n\n }\n\n on_enter(context, renderer)\n {\n\n }\n\n on_exit(context, renderer)\n {\n\n }\n\n resize()\n {\n\n }\n\n dispose()\n {\n\n }\n}\n","import basic_vert from '../shaders/basic_color/basic_color.vert';\nimport basic_frag from '../shaders/basic_color/basic_color.frag';\n\nimport { ShaderMaterial } from 'three';\nimport { Color } from 'three';\n\nexport default class BaseShaderMaterial extends ShaderMaterial\n{\n constructor(vert, frag, uniforms)\n {\n super({\n vertexShader: vert || basic_vert,\n fragmentShader: frag || basic_frag,\n uniforms: uniforms || {\n _Color: { value: new Color('#FF0000') }\n }\n });\n }\n}\n","import vert from '../shaders/copy/copy.vert';\nimport frag from '../shaders/copy/copy.frag';\n\nimport { ShaderMaterial } from 'three';\nimport { Vector2 } from 'three';\nimport { NoBlending } from 'three';\nimport { AlwaysDepth } from 'three';\n\nexport default class BlitMaterial extends ShaderMaterial\n{\n constructor(frag_shader, vert_shader, defines)\n {\n super({\n uniforms: {\n _MainTex: { value: null },\n _Resolution: { value: new Vector2(0, 0) },\n _TargetResolution: { value: new Vector2(0, 0) }\n },\n defines: defines || {},\n vertexShader: vert_shader || vert,\n fragmentShader: frag_shader || frag,\n depthWrite: false,\n blending: NoBlending,\n depthTest: false,\n depthFunc: AlwaysDepth\n });\n }\n}\n","class CameraManager\n{\n init()\n {\n this._current = undefined;\n }\n\n set current(camera)\n {\n this._current = camera;\n }\n\n get current()\n {\n return this._current;\n }\n}\n\nexport default new CameraManager();\n","class Capabilities\n{\n init()\n {\n this.max_anisotropy = 0;\n this.vertex_texture_sampler_available = false;\n this.fp_textures_available = false;\n }\n}\n\nexport default new Capabilities();\n","import { CanvasTexture } from 'three';\nimport { Vector2 } from 'three';\nimport { UVMapping } from 'three';\nimport { ClampToEdgeWrapping } from 'three';\nimport { NearestFilter } from 'three';\n\nexport default class CanvasDrawer\n{\n constructor(uses_dynamic_font)\n {\n this.uses_dynamic_font = uses_dynamic_font;\n this.__textHeight = null;\n\n this.canvas = document.createElement('canvas');\n this.ctx = this.canvas.getContext('2d');\n }\n\n getFontHeight(fontStyle = 'Arial')\n {\n if (this.__textHeight == null || this.uses_dynamic_font)\n {\n let body = document.getElementsByTagName('body')[0];\n let dummy = document.createElement('div');\n let dummyText = document.createTextNode('MÉqgOLAKTAL');\n dummy.appendChild(dummyText);\n dummy.setAttribute('style', `font:${fontStyle};position:absolute;top:0;left:0`);\n body.appendChild(dummy);\n this.__textHeight = dummy.offsetHeight;\n body.removeChild(dummy);\n }\n return this.__textHeight;\n }\n\n get_text_size(text, font = '24px Arial')\n {\n let size = new Vector2();\n this.ctx.font = font;\n size.x = Math.ceil(this.ctx.measureText(text).width);\n size.y = Math.ceil(this.getFontHeight(font));\n return size;\n }\n\n draw_canvas(text, ctxOptions = {})\n {\n ctxOptions.font = ctxOptions.font || '24px Arial';\n ctxOptions.font_color = ctxOptions.font_color || '#000000';\n\n this.__draw(text, ctxOptions, this.canvas, this.ctx);\n return this.canvas;\n }\n\n draw_on_texture(text, ctxOptions)\n {\n let canvas = this.draw_canvas(text, ctxOptions);\n let canvas_texture = new CanvasTexture(canvas, UVMapping,\n ClampToEdgeWrapping,\n ClampToEdgeWrapping,\n NearestFilter,\n NearestFilter);\n canvas_texture.generateMipMaps = false;\n canvas_texture.needsUpdate = true;\n\n return canvas_texture;\n }\n\n __draw(text, ctxOptions)\n {}\n\n roundRect(ctx, x, y, width, height, radius, fill, stroke)\n {\n if (typeof stroke === 'undefined')\n {\n stroke = true;\n }\n if (typeof radius === 'undefined')\n {\n radius = 5;\n }\n if (typeof radius === 'number')\n {\n radius = { tl: radius, tr: radius, br: radius, bl: radius };\n }\n else\n {\n let defaultRadius = { tl: 0, tr: 0, br: 0, bl: 0 };\n for (let side in defaultRadius)\n {\n radius[side] = radius[side] || defaultRadius[side];\n }\n }\n ctx.beginPath();\n ctx.moveTo(x + radius.tl, y);\n ctx.lineTo(x + width - radius.tr, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + radius.tr);\n ctx.lineTo(x + width, y + height - radius.br);\n ctx.quadraticCurveTo(x + width, y + height, x + width - radius.br, y + height);\n ctx.lineTo(x + radius.bl, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - radius.bl);\n ctx.lineTo(x, y + radius.tl);\n ctx.quadraticCurveTo(x, y, x + radius.tl, y);\n ctx.closePath();\n if (fill)\n {\n ctx.fill();\n }\n if (stroke)\n {\n ctx.stroke();\n }\n }\n}\n","/*\n\n A configuration class used as a singleton\n\n*/\n\nclass Configuration\n{\n init(parameters = {})\n {\n this.dpr = 1;\n\n this.app = {}; // for arbitrary use in end application\n }\n\n from_json(json)\n {\n\n }\n}\n\nexport default new Configuration();\n","export default class Idle\n{\n constructor()\n {\n }\n\n get is_animating()\n {\n return false;\n }\n\n on_enter(view)\n {\n\n }\n\n update(view)\n {\n }\n\n on_exit(view)\n {\n\n }\n}\n","import Time from '../../Time';\nimport Idle from './Idle';\n\nimport { Math as TMath } from 'three';\n\nexport default class Animating\n{\n constructor()\n {\n this.t = 0;\n this.easing_function_t = 0;\n }\n\n get is_animating()\n {\n return true;\n }\n\n on_enter(animator)\n {\n }\n\n update(animator)\n {\n this.t += Time.delta_time / animator.duration;\n\n this.easing_function_t = animator.easing_function(this.t);\n this.easing_function_t = TMath.clamp(this.easing_function_t, 0, 1);\n\n animator.set_property_value(TMath.lerp(animator.from, animator.to, this.easing_function_t));\n\n if (this.easing_function_t >= 0.9999)\n {\n animator.set_property_value(animator.to);\n\n animator.set_current_state(new Idle());\n animator.finished_callback(animator);\n }\n }\n\n on_exit(view)\n {\n\n }\n}\n","import Animating from './css_animator_states/Animating';\nimport Idle from './css_animator_states/Idle';\nimport EasingFunctions from '../utilities/EasingFunctions';\n\nexport default class CSSAnimator\n{\n constructor({\n element,\n css_property,\n from = 0,\n to = 1,\n duration = 1,\n value_prefix = '',\n value_suffix = '',\n easing_function = EasingFunctions.ease_in_out_cubic,\n finished_callback = () =>\n {}\n })\n {\n this.element = element;\n this.css_property = css_property;\n this.from = from;\n this.to = to;\n this.value_prefix = value_prefix;\n this.value_suffix = value_suffix;\n this.duration = duration;\n this.easing_function = easing_function;\n this.finished_callback = finished_callback;\n\n this.current_state = new Idle();\n }\n\n animate()\n {\n this.set_current_state(new Animating());\n }\n\n stop()\n {\n this.set_current_state(new Idle());\n }\n\n set_property_value(value)\n {\n this.element.style[this.css_property] = `${this.value_prefix}${value}${this.value_suffix}`;\n }\n\n update()\n {\n this.current_state.update(this);\n }\n\n get is_animating()\n {\n return this.current_state.is_animating;\n }\n\n set_current_state(state)\n {\n this.current_state.on_exit(this);\n this.current_state = state;\n this.current_state.on_enter(this);\n }\n}\n","\nimport { Object3D } from 'three';\nimport { LineBasicMaterial } from 'three';\nimport { AlwaysDepth } from 'three';\nimport { BufferGeometry } from 'three';\nimport { Vector3 } from 'three';\nimport { Line } from 'three';\n\nexport default class AxisHelper extends Object3D\n{\n constructor(scale = 1.0)\n {\n super();\n\n const blue_points = [];\n blue_points.push(new Vector3(0, 0, 0));\n blue_points.push(new Vector3(0, 0, 1000));\n\n const blue_axis_mat = new LineBasicMaterial({ color: 0x4444ff, depthFunc: AlwaysDepth });\n const blue_axis_geo = new BufferGeometry().setFromPoints(blue_points);\n const blue_axis_line = new Line(blue_axis_geo, blue_axis_mat);\n blue_axis_line.renderOrder = 50000;\n\n const green_points = [];\n green_points.push(new Vector3(0, 0, 0));\n green_points.push(new Vector3(0, 1000, 0));\n\n const green_axis_mat = new LineBasicMaterial({ color: 0x44ff44, depthFunc: AlwaysDepth });\n const green_axis_geo = new BufferGeometry().setFromPoints(green_points);\n const green_axis_line = new Line(green_axis_geo, green_axis_mat);\n green_axis_line.renderOrder = 50000;\n\n const red_points = [];\n red_points.push(new Vector3(0, 0, 0));\n red_points.push(new Vector3(1000, 0, 0));\n\n const red_axis_mat = new LineBasicMaterial({ color: 0xff4444, depthFunc: AlwaysDepth });\n const red_axis_geo = new BufferGeometry().setFromPoints(red_points);\n const red_axis_line = new Line(red_axis_geo, red_axis_mat);\n red_axis_line.renderOrder = 50000;\n\n this.renderOrder = 100000;\n\n this.add(blue_axis_line);\n this.add(green_axis_line);\n this.add(red_axis_line);\n\n this.scale.set(scale, scale, scale);\n }\n\n update()\n {\n }\n\n dispose()\n {\n }\n}\n","import { Scene } from 'three';\n\nclass SceneManager\n{\n init()\n {\n this._current = new Scene();\n this._current.name = 'default_scene';\n }\n\n add_scene(name)\n {\n\n }\n\n get current()\n {\n return this._current;\n }\n\n set current(scene)\n {\n this._current = scene;\n }\n\n dispose()\n {\n this.current.traverse(child =>\n {\n if (child.geometry)\n {\n child.geometry.dispose();\n child.material.dispose();\n }\n });\n\n while (this.current.children.length > 0)\n {\n this.current.remove(this.current.children[0]);\n }\n }\n}\n\nexport default new SceneManager();\n","\nimport { Vector3, Mesh } from 'three';\nimport { BoxGeometry } from 'three';\nimport { MeshBasicMaterial } from 'three';\n\nexport default class Cube extends Mesh\n{\n constructor(size, segments, color)\n {\n size = size || new Vector3(1, 1, 1);\n segments = segments || new Vector3(1, 1, 1);\n color = color || 0xff0000;\n let geometry = new BoxGeometry(size.x, size.y, size.z, segments.x, segments.y, segments.z);\n let material = new MeshBasicMaterial({ color: color });\n super(geometry, material);\n }\n}\n","import { Mesh } from 'three';\nimport { SphereBufferGeometry } from 'three';\nimport { MeshBasicMaterial } from 'three';\n\nexport default class Sphere extends Mesh\n{\n constructor(radius, color)\n {\n color = color || '#FF0000';\n radius = radius || 1;\n let geometry = new SphereBufferGeometry(radius, 64, 64);\n let material = new MeshBasicMaterial({ color: color });\n super(geometry, material);\n }\n}\n","import { CylinderBufferGeometry } from 'three';\nimport { ConeBufferGeometry } from 'three';\nimport { MeshBasicMaterial } from 'three';\nimport { Vector3, Mesh } from 'three';\n\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\n\nexport default class Arrow extends Mesh\n{\n constructor(color, length, dir)\n {\n color = color || '#FF0000';\n length = length || 1;\n\n let cone_height = 0.4;\n let cylinder_height = length - cone_height;\n let cylinder_geo = new CylinderBufferGeometry(0.01, 0.01, cylinder_height, 32);\n cylinder_geo.translate(0, cylinder_height / 2, 0);\n\n let cone_geometry = new ConeBufferGeometry(0.1, cone_height, 32);\n cone_geometry.translate(0, cylinder_height + cone_height / 2, 0);\n\n let buffer_geometry = BufferGeometryUtils.mergeBufferGeometries([cylinder_geo, cone_geometry]);\n buffer_geometry.rotateX(3.14 / 2);\n\n let material = new MeshBasicMaterial({ color: color });\n super(buffer_geometry, material);\n\n if (dir)\n {\n this.quaternion.setFromUnitVectors(new Vector3(0, 0, 1), dir);\n }\n\n this._dir = dir;\n }\n\n set dir(dir)\n {\n this.quaternion.setFromUnitVectors(new Vector3(0, 0, 1), dir);\n this._dir = dir;\n }\n\n get dir()\n {\n return this._dir;\n }\n\n set length(value)\n {\n this.scale.z = value;\n }\n\n get length()\n {\n return this.scale.z;\n }\n}\n","import { Vector2 } from 'three';\n\nclass Screen\n{\n init()\n {\n this.width = 1;\n this.height = 1;\n\n this.position = new Vector2();\n\n this.render_width = 1;\n this.render_height = 1;\n this.width_height = new Vector2(this.width, this.height);\n\n this.dpr = 1;\n this.pixel_size = new Vector2(1 / this.width, 1 / this.height);\n }\n\n update_position(x, y)\n {\n this.position.set(x, y);\n }\n\n update()\n {\n this.size_changed = false;\n }\n\n update_size(width, height)\n {\n this.width = width;\n this.height = height;\n\n this.pixel_size = new Vector2(1 / this.width, 1 / this.height);\n\n this.width_height.x = width;\n this.width_height.y = height;\n\n this.render_width = width * this.dpr;\n this.render_height = height * this.dpr;\n\n this.size_changed = true;\n }\n\n apply_pixel_density_v2(vector2)\n {\n vector2.multiplyScalar(1 / this.dpr);\n\n return vector2;\n }\n\n apply_pixel_density(value)\n {\n return value * (1 / this.dpr);\n }\n\n get_pixel_size()\n {\n return this.pixel_size;\n }\n\n get aspect_ratio()\n {\n return this.width / this.height;\n }\n}\n\nexport default new Screen();\n","import BaseShaderMaterial from './BaseShaderMaterial';\nimport { Vector2 } from 'three';\nexport default class ScreenSpaceTextureMaterial extends BaseShaderMaterial\n{\n constructor(x, y, w, h)\n {\n let vert = `\n uniform vec2 _ScreenSpacePosition;\n uniform vec2 _ScreenSize;\n uniform vec2 _TextureSize;\n varying vec2 vUv;\n void main()\n {\n vec2 pos = uv * vec2(_TextureSize.x / _ScreenSize.x, _TextureSize.y / _ScreenSize.y);\n pos += vec2(_ScreenSpacePosition.x / _ScreenSize.x, _ScreenSpacePosition.y / _ScreenSize.y);\n\n pos.x = pos.x * 2.0 - 1.0;\n pos.y = pos.y * 2.0 - 1.0;\n\n gl_Position = vec4(pos, 0.0, 1.0);\n vUv = uv;\n }\n `;\n let frag = `\n uniform sampler2D _MainTex;\n varying vec2 vUv;\n\n void main()\n {\n gl_FragColor = texture2D(_MainTex, vUv);\n }\n `;\n super(vert, frag, {\n _MainTex: { value: undefined },\n _ScreenSpacePosition: { value: new Vector2() },\n _ScreenSize: { value: new Vector2() },\n _TextureSize: { value: new Vector2() }\n });\n }\n\n set_position(x, y)\n {\n this.uniforms._ScreenSpacePosition.value.set(x, y);\n }\n\n set_texture(tex, w, h)\n {\n this.uniforms._MainTex.value = tex;\n this.uniforms._TextureSize.value.set(tex.image.width, tex.image.height);\n\n if (w !== undefined)\n {\n this.uniforms._TextureSize.value.x = w;\n }\n if (h !== undefined)\n {\n this.uniforms._TextureSize.value.y = h;\n }\n }\n\n set_screen_size(w, h)\n {\n this.uniforms._ScreenSize.value.set(w, h);\n }\n}\n","import { Color } from 'three';\nimport { PerspectiveCamera as THREEPerspectiveCamera } from 'three';\n\nexport default class PerspectiveCamera extends THREEPerspectiveCamera\n{\n constructor(fov, aspect, near, far)\n {\n super(fov, aspect, near, far);\n\n this.clear_color = new Color('#000000');\n this.clear_alpha = 1;\n }\n}\n","import AxisHelper from './components/AxisHelper';\nimport basic_color_vert from './shaders/basic_color/basic_color.vert';\nimport basic_color_frag from './shaders/basic_color/basic_color.frag';\nimport SceneManager from './SceneManager';\nimport Cube from './primitives/Cube';\nimport Sphere from './primitives/Sphere';\nimport Arrow from './primitives/Arrow';\nimport Screen from './Screen';\nimport ScreenSpaceTextureMaterial from './materials/ScreenSpaceTextureMaterial';\nimport { Vector3 } from 'three';\nimport { LineBasicMaterial } from 'three';\nimport { BufferGeometry } from 'three';\nimport { Line } from 'three';\nimport { PlaneBufferGeometry } from 'three';\nimport { ShaderMaterial } from 'three';\nimport { Vector4 } from 'three';\nimport { Mesh } from 'three';\nimport { Box3 } from 'three';\nimport { Box3Helper } from 'three';\nimport { Scene } from 'three';\nimport { CatmullRomCurve3 } from 'three';\nimport { SphereGeometry } from 'three';\nimport { MeshBasicMaterial } from 'three';\nimport PerspectiveCamera from './PerspectiveCamera';\n\nclass Debug\n{\n init()\n {\n this.Vector3_one = new Vector3(1, 1, 1);\n this.Vector3_zero = new Vector3(0, 0, 0);\n this.canvas_renderer = undefined;\n\n this.display_texture_meshes = [];\n\n this.ctx = undefined;\n this.scene = new Scene();\n this.camera = new PerspectiveCamera();\n // this.camera.clear_alpha = 0;\n }\n\n draw_arrow(origin, dir, color = 0xff0000)\n {\n let arrow = new Arrow(color, dir.length(), dir.clone().normalize());\n arrow.position.copy(origin);\n SceneManager.current.add(arrow);\n return arrow;\n }\n\n draw_axis()\n {\n let axis = new AxisHelper();\n SceneManager.current.add(axis);\n return axis;\n }\n\n set_debug_RT(RT)\n {\n this.rt_debug = RT;\n }\n\n draw_rectangle(position_2d, width, height, color)\n {\n width = width || 100;\n height = height || 100;\n this.ctx.fillStyle = color || 'rgba(255, 0, 0, 1)';\n this.ctx.fillRect(position_2d.x - width / 2,\n (this.ctx.canvas.height - position_2d.y) - height / 2, width, height);\n }\n\n clear()\n {\n if (this.ctx)\n {\n this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);\n }\n }\n\n draw_line_2D(from, to, color)\n {\n this.ctx.strokeStyle = color || 'rgba(255, 0, 0, 1)';\n this.ctx.beginPath();\n this.ctx.moveTo(from.x, from.y);\n this.ctx.lineTo(to.x, to.y);\n this.ctx.closePath();\n this.ctx.stroke();\n }\n\n draw_line(points, color = 0xff0000)\n {\n let material = new LineBasicMaterial({\n color: color\n });\n\n let geometry = new BufferGeometry().setFromPoints(points);\n\n let line = new Line(geometry, material);\n line.frustumCulled = false;\n SceneManager.current.add(line);\n return line;\n }\n\n draw_cube(pos, size, color)\n {\n size = size || 1;\n color = color || 0xff0000;\n pos = pos || new Vector3();\n\n let cube = new Cube(new Vector3(size, size, size), undefined, color);\n cube.position.copy(pos);\n SceneManager.current.add(cube);\n return cube;\n }\n\n draw_oriented_cube(from, to, height = 1, color = '#FF0000', depth = 0.1)\n {\n let size = from.distanceTo(to);\n let cube = new Cube(new Vector3(depth, height, size), undefined, color);\n\n let center = to.clone().sub(from).multiplyScalar(0.5);\n let forward_dir = center.clone().normalize();\n center.add(from);\n\n cube.position.copy(center);\n\n // let up = new Vector3(0, 1, 0);\n // let forward = forward_dir.clone();\n // let right = forward.clone().cross(up);\n\n // cube.quaternion.setFromRotationMatrix(new Matrix4().makeBasis(right,up,forward));\n cube.quaternion.setFromUnitVectors(new Vector3(0, 0, -1), forward_dir);\n\n SceneManager.current.add(cube);\n return cube;\n }\n\n draw_plane(width, height, color)\n {\n let geometry = new PlaneBufferGeometry(width, height);\n let material = new ShaderMaterial({\n uniforms: {\n _Color: { value: new Vector4(0, 1, 0, 0.2) }\n },\n vertexShader: basic_color_vert,\n fragmentShader: basic_color_frag,\n transparent: true,\n depthWrite: false\n });\n\n let plane = new Mesh(geometry, material);\n plane.renderOrder = -10000;\n SceneManager.current.add(plane);\n return plane;\n }\n\n draw_empty_cube(pos, size, color)\n {\n size = size || 1;\n color = color || 0xff0000;\n\n let box = new Box3().setFromCenterAndSize(new Vector3(), new Vector3(size, size, size));\n let helper = new Box3Helper(box, color);\n helper.position.copy(pos || new Vector3());\n return helper;\n }\n\n draw_sphere(pos, size, color)\n {\n size = size || 1;\n color = color || 0xff0000;\n pos = pos || new Vector3();\n\n let sphere = new Sphere(size, color);\n sphere.position.copy(pos);\n SceneManager.current.add(sphere);\n return sphere;\n }\n\n draw_point_array(input_points, open = false, color = 0xff0000)\n {\n let catmull = new CatmullRomCurve3(input_points, open);\n catmull.updateArcLengths();\n let points = catmull.getSpacedPoints(200);\n let line_helper = this.draw_line(points, 0x00ff00);\n // line_helper.position.y = 1.5;\n return line_helper;\n }\n\n draw_sphere_helper(sphere, color)\n {\n color = color || 0xff0000;\n let geometry = new SphereGeometry(sphere.radius, 32, 32);\n let material = new MeshBasicMaterial({ color: color });\n let sphere_mesh = new Mesh(geometry, material);\n sphere_mesh.position.copy(sphere.center);\n SceneManager.current.add(sphere_mesh);\n return sphere_mesh;\n }\n\n draw_math_sphere(sphere)\n {\n let geometry = new SphereGeometry(sphere.radius, 32, 32);\n let material = new ShaderMaterial({\n uniforms: {\n _Color: { value: new Vector4(1, 0, 0, 0.2) }\n },\n vertexShader: basic_color_vert,\n fragmentShader: basic_color_frag,\n transparent: true\n });\n // var material = new MeshBasicMaterial( {color: 0xff0000, transparent = true} );\n let sphere1 = new Mesh(geometry, material);\n sphere1.position.copy(sphere.center);\n SceneManager.current.add(sphere1);\n }\n\n draw_bounding_box(bb)\n {\n let helper = new Box3Helper(bb, 0xffff00);\n SceneManager.current.add(helper);\n }\n\n draw_curve(curve, options)\n {\n let offset = new Vector3(0, 0, 0);\n if (options)\n {\n offset.y = options.offset || 0;\n }\n\n for (let i = 0; i < curve.length - 1; i++)\n {\n this.draw_line(curve[i].clone().add(offset), curve[i + 1].clone().add(offset));\n }\n }\n\n draw_texture(tex, w, h)\n {\n let mesh = new Mesh(new PlaneBufferGeometry(1, 1), new ScreenSpaceTextureMaterial());\n this.display_texture_meshes.push(mesh);\n this.scene.add(mesh);\n\n mesh.material.set_texture(tex, w, h);\n return mesh;\n }\n\n render(graphics)\n {\n for (let i = 0; i < this.display_texture_meshes.length; i++)\n {\n this.display_texture_meshes[i].material.set_screen_size(Screen.width, Screen.height);\n }\n if (this.scene.children.length > 0)\n {\n graphics.render(this.scene, this.camera);\n }\n }\n}\n\nexport default new Debug();\n","import BlitMaterial from '../materials/BlitMaterial';\nimport frag from '../shaders/clear/clear_depth_normal.frag';\n\nimport { Vector4 } from 'three';\n\nexport default class ClearDepthNormalMaterial extends BlitMaterial\n{\n constructor(clear_depth, clear_normal)\n {\n super(frag);\n this.uniforms._DepthNormal = { value: new Vector4(clear_depth, clear_normal.x, clear_normal.y, clear_normal.z) };\n }\n}\n","import vert from '../shaders/depth_normals/depth_normals.vert';\nimport frag from '../shaders/depth_normals/depth_normals.frag';\n\nimport { ShaderMaterial } from 'three';\n\nexport default class DepthNormalMaterial extends ShaderMaterial\n{\n constructor()\n {\n super({\n uniforms: {\n _FarPlane: { value: 1 }\n },\n vertexShader: vert,\n fragmentShader: frag\n });\n }\n\n set far_plane(value)\n {\n this.uniforms._FarPlane.value = value;\n }\n\n get far_plane()\n {\n return this.uniforms._FarPlane.value;\n }\n}\n","import CameraManager from '../CameraManager';\nimport Screen from '../Screen';\n\nimport ClearDepthNormalMaterial from '../materials/ClearDepthNormalMaterial';\nimport DepthNormalMaterial from '../materials/DepthNormalMaterial';\n\nimport { WebGLRenderTarget } from 'three';\nimport { Vector3 } from 'three';\n\nexport default class DepthAndNormalsRenderer\n{\n constructor()\n {\n this.RT = new WebGLRenderTarget(Screen.width, Screen.height);\n\n this.clear_depth_normal_mat = new ClearDepthNormalMaterial(1, new Vector3(0, 0, 1));\n this.depth_normal_material = new DepthNormalMaterial();\n }\n\n render(graphics)\n {\n this.__resize_RT_if_necessary();\n\n graphics.clear(this.RT, undefined, true, true);\n\n graphics.blit_clear_with_material(this.RT, this.clear_depth_normal_mat);\n\n this.depth_normal_material.far_plane = CameraManager.current.far;\n\n graphics.render(undefined, undefined, this.RT, this.depth_normal_material);\n }\n\n __resize_RT_if_necessary()\n {\n if (this.RT.width !== Screen.width || this.RT.height !== Screen.height)\n {\n this.RT.setSize(Screen.width, Screen.height);\n }\n }\n\n get render_target()\n {\n return this.RT;\n }\n}\n","import BlitMaterial from '../materials/BlitMaterial';\n\nimport { Scene } from 'three';\nimport { Mesh } from 'three';\nimport { PlaneBufferGeometry } from 'three';\nimport { OrthographicCamera } from 'three';\n\nexport default class Blitter\n{\n constructor(renderer)\n {\n this.renderer = renderer;\n this._blit_scene = new Scene();\n this._blit_material = new BlitMaterial();\n this._blit_quad = new Mesh(\n new PlaneBufferGeometry(1, 1), this._blit_material);\n this._blit_scene.add(this._blit_quad);\n this._blit_camera = new OrthographicCamera(-1, 1, 1, -1, -10000, 10000);\n }\n\n blit(src, dst)\n {\n this._blit_quad.material = this._blit_material;\n\n let src_texture = src.isWebGLRenderTarget === true ? src.texture : src;\n let src_width = src.isWebGLRenderTarget === true ? src.width : src.image.width;\n let src_height = src.isWebGLRenderTarget === true ? src.height : src.image.height;\n\n this._blit_quad.material.uniforms._MainTex.value = src_texture;\n this._blit_quad.material.uniforms._Resolution.value.set(src_width, src_height);\n\n if (dst)\n {\n this._blit_quad.material.uniforms._TargetResolution.value.set(dst.width, dst.height);\n }\n else\n {\n this.renderer.getSize(this._blit_quad.material.uniforms._TargetResolution.value);\n }\n\n this.__render(dst);\n }\n\n material_pass(mat, dst)\n {\n this._blit_quad.material = mat;\n // this._blit_quad.material.uniforms._MainTex.value = undefined;\n // this._blit_quad.material.uniforms._Resolution.value.set(1, 1);\n\n this.__render(dst);\n }\n\n blit_with_material(src, dst, mat)\n {\n let src_texture = src.isWebGLRenderTarget === true ? src.texture : src;\n let src_width = src.isWebGLRenderTarget === true ? src.width : src.image.width;\n let src_height = src.isWebGLRenderTarget === true ? src.height : src.image.height;\n\n this._blit_quad.material = mat;\n this._blit_quad.material.uniforms._MainTex.value = src_texture;\n this._blit_quad.material.uniforms._Resolution.value.set(src_width, src_height);\n\n if (dst)\n {\n this._blit_quad.material.uniforms._TargetResolution.value.set(dst.width, dst.height);\n }\n else\n {\n this.renderer.getSize(this._blit_quad.material.uniforms._TargetResolution.value);\n }\n\n this.__render(dst);\n }\n\n blit_clear_with_material(dst_RT, mat)\n {\n this._blit_quad.material = mat;\n\n this.__render(dst_RT);\n }\n\n dispose()\n {\n this._blit_quad.geometry.dispose();\n this._blit_quad.material.dispose();\n }\n\n __render(RT)\n {\n RT = RT === undefined ? null : RT;\n\n let current_rt = this.renderer.getRenderTarget();\n\n this.renderer.setRenderTarget(RT === undefined ? null : RT);\n this.renderer.render(this._blit_scene, this._blit_camera);\n\n this.renderer.setRenderTarget(current_rt);\n }\n}\n","import Configuration from './Configuration';\nimport BaseRender from './render_mode/BaseRender';\nimport Screen from './Screen';\nimport CameraManager from './CameraManager';\nimport SceneManager from './SceneManager';\nimport Capabilities from './Capabilities';\nimport DepthAndNormalsRenderer from './render_utilities/DepthAndNormalsRenderer';\nimport Blitter from './render_utilities/Blitter';\n\nimport { WebGLRenderer } from 'three';\n\nclass Graphics\n{\n init(canvas, context_attributes)\n {\n this._renderer = undefined;\n this.blitter = undefined;\n this.canvas = undefined;\n this.no_render = undefined;\n this.current_render_mode = undefined;\n this.generateDepthNormalTexture = false;\n this.depth_and_normals_renderer = undefined;\n\n this.is_webgl2 = false;\n this.canvas_context = undefined;\n this.context_attributes = undefined;\n\n this.context_attributes = context_attributes || {\n alpha: true,\n depth: true,\n desynchronized: false,\n stencil: false,\n antialias: false,\n premultipliedAlpha: true,\n preserveDrawingBuffer: false,\n powerPreference: 'high-performance',\n logarithmicDepthBuffer: false\n };\n\n if (context_attributes.force_webgl2)\n {\n this.canvas_context = canvas.getContext('webgl2', this.context_attributes) ||\n canvas.getContext('webgl', this.context_attributes) ||\n canvas.getContext('experimental-webgl', this.context_attributes);\n }\n else\n {\n this.canvas_context = canvas.getContext('webgl', this.context_attributes) ||\n canvas.getContext('experimental-webgl', this.context_attributes);\n }\n\n this.is_webgl2 = this.canvas_context.constructor.name === 'WebGL2RenderingContext';\n\n // console.log(`Using WebGL ${this.is_webgl2 ? 2 : 1}`);\n\n this._renderer = new WebGLRenderer({\n canvas: canvas,\n context: this.canvas_context\n });\n this._renderer.autoClear = false;\n\n this._renderer.setPixelRatio(1);\n\n Screen.dpr = Configuration.dpr;\n\n if (!this.is_webgl2)\n {\n this._renderer.extensions.get('ANGLE_instanced_arrays');\n }\n\n this.blitter = new Blitter(this._renderer);\n\n this.canvas = this._renderer.domElement;\n\n this.no_render = new BaseRender();\n\n this.current_render_mode = this.no_render;\n Capabilities.max_anisotropy = this._renderer.capabilities.getMaxAnisotropy();\n Capabilities.vertex_texture_sampler_available = this._renderer.capabilities.maxVertexTextures > 0;\n Capabilities.fp_textures_available = this._renderer.capabilities.floatVertexTextures;\n\n this.generateDepthNormalTexture = false;\n\n this.depth_and_normals_renderer = new DepthAndNormalsRenderer();\n\n this.resize_observer = new ResizeObserver(this.on_resize.bind(this));\n this.resize_observer.observe(this.canvas);\n }\n\n get dom_element()\n {\n return this._renderer.domElement;\n }\n\n get depth_normals_RT()\n {\n return this.depth_and_normals_renderer.render_target;\n }\n\n set_state(new_state)\n {\n // console.log('VIEWAPI - map render mode switch to: ' + new_state.constructor.name);\n\n this.current_render_mode.on_exit(this, this._renderer);\n this.current_render_mode = new_state;\n this.current_render_mode.on_enter(this, this._renderer);\n }\n\n update()\n {\n if (this.generateDepthNormalTexture)\n {\n this.depth_and_normals_renderer.render(this);\n }\n\n this.__update_current_camera();\n\n if (CameraManager.current)\n {\n this.current_render_mode.render();\n }\n\n Screen.update();\n }\n\n __update_current_camera()\n {\n if (CameraManager.current)\n {\n CameraManager.current.aspect = Screen.aspect_ratio;\n CameraManager.current.updateProjectionMatrix();\n CameraManager.current.updateMatrix();\n CameraManager.current.updateMatrixWorld(true);\n }\n }\n\n render(scene, camera, RT, override_mat)\n {\n this.__apply_override_material(scene, override_mat);\n\n this._renderer.setRenderTarget(RT === undefined ? null : RT);\n this._renderer.render(scene || SceneManager.current,\n camera || CameraManager.current);\n\n this.__apply_override_material(scene, undefined);\n }\n\n render_scene(scene)\n {\n if (scene.on_pre_render)\n {\n scene.on_pre_render();\n }\n\n if (scene.render)\n {\n scene.render();\n }\n else\n {\n this.render(scene, undefined);\n }\n\n if (scene.on_post_render)\n {\n scene.on_post_render();\n }\n }\n\n __apply_override_material(scene, mat)\n {\n mat = mat === undefined ? null : mat;\n if (scene)\n {\n scene.overrideMaterial = mat;\n }\n else\n {\n SceneManager.current.overrideMaterial = mat;\n }\n }\n\n readback_RT(RT, buffer)\n {\n this._renderer.readRenderTargetPixels(RT, 0, 0, RT.width, RT.height, buffer);\n }\n\n clear(RT, camera, clear_depth, clear_stencil)\n {\n this._renderer.setRenderTarget(RT === undefined ? null : RT);\n\n if (camera)\n {\n this._renderer.setClearColor(camera.clear_color, camera.clear_alpha);\n }\n\n this._renderer.clear(!!camera, // clear color\n !!clear_depth,\n !!clear_stencil);\n }\n\n on_resize(entries)\n {\n for (let entry of entries)\n {\n Screen.dpr = Configuration.dpr;\n Screen.update_position(entry.contentRect.x, entry.contentRect.y);\n Screen.update_size(entry.contentRect.width, entry.contentRect.height);\n\n this.canvas.width = Screen.render_width;\n this.canvas.height = Screen.render_height;\n\n this._renderer.setViewport(0, 0, Screen.render_width, Screen.render_height);\n\n this.__update_current_camera();\n }\n }\n\n material_pass(mat, dst)\n {\n this.blitter.material_pass(mat, dst);\n }\n\n blit(src_RT, dst_RT, mat)\n {\n if (mat)\n {\n this.blitter.blit_with_material(src_RT, dst_RT, mat);\n }\n else\n {\n this.blitter.blit(src_RT, dst_RT);\n }\n }\n\n blit_clear_with_material(dst_RT, mat)\n {\n this.blitter.blit_clear_with_material(dst_RT, mat);\n }\n\n take_screenshot(blob_callback, width = Screen.width, height = Screen.height)\n {\n // const ctx = this;\n\n let old_width = Screen.width;\n let old_height = Screen.height;\n\n let new_width = width;\n let new_height = height;\n\n let tile_width = 1024;\n let tile_height = 1024;\n\n let divisions_x = parseInt(Math.ceil(new_width / tile_width));\n let divisions_y = parseInt(Math.ceil(new_height / tile_height));\n\n Screen.update_size(tile_width, tile_height);\n\n this._renderer.setPixelRatio(1);\n\n this._renderer.setSize(tile_width, tile_height, false);\n\n let canvas_2d = document.createElement('canvas');\n let ctx_2D = canvas_2d.getContext('2d');\n\n ctx_2D.canvas.width = new_width;\n ctx_2D.canvas.height = new_height;\n\n CameraManager.current.aspect = Screen.aspect_ratio;\n CameraManager.current.updateMatrix();\n CameraManager.current.updateMatrixWorld(true);\n\n for (let x = 0; x < divisions_x; x++)\n {\n for (let y = 0; y < divisions_y; y++)\n {\n CameraManager.current.setViewOffset(new_width, new_height,\n Screen.width * x, Screen.height * y,\n Screen.width, Screen.height);\n this.current_render_mode.render();\n\n ctx_2D.drawImage(this._renderer.domElement, Screen.width * x, Screen.height * y);\n }\n }\n\n // transform the result canvas into a blob\n // from them the callback turns into a ULR and download it\n ctx_2D.canvas.toBlob(blob_callback, 'image/png;base64;');\n\n CameraManager.current.clearViewOffset();\n\n Screen.update_size(old_width, old_height);\n this._renderer.setPixelRatio(Configuration.dpr);\n this._renderer.setSize(old_width, old_height, false);\n\n CameraManager.current.aspect = Screen.aspect_ratio;\n CameraManager.current.updateMatrix();\n CameraManager.current.updateMatrixWorld(true);\n }\n\n download_screenshot(blob)\n {\n let link = document.createElement('a');\n link.download = 'Snapshot.png';\n\n link.href = URL.createObjectURL(blob);\n link.click();\n\n link.onclick = function()\n {\n requestAnimationFrame(function()\n {\n URL.revokeObjectURL(link.href);\n });\n link.removeAttribute('href');\n };\n }\n\n dispose()\n {\n this._renderer.dispose();\n this.current_render_mode.dispose();\n this.blitter.dispose();\n }\n}\n\nexport default new Graphics();\n","import frag from '../shaders/normal/normal.frag';\nimport vert from '../shaders/normal/normal.vert';\n\nimport { ShaderMaterial } from 'three';\n\nexport default class NormalMaterial extends ShaderMaterial\n{\n constructor()\n {\n super({\n uniforms: {\n },\n vertexShader: vert,\n fragmentShader: frag\n });\n }\n}\n","import CameraManager from '../CameraManager';\nimport SceneManager from '../SceneManager';\nimport BaseRender from '../render_mode/BaseRender';\nimport Graphics from '../Graphics';\nimport NormalMaterial from '../materials/NormalMaterial';\n\nexport default class DebugNormalsRender extends BaseRender\n{\n constructor()\n {\n super();\n }\n\n render()\n {\n Graphics.clear(undefined, CameraManager.current, true, true);\n\n Graphics.render(SceneManager.current, CameraManager.current, undefined, new NormalMaterial());\n }\n}\n","import { InputController } from 'pit-js';\n\nclass Input extends InputController\n{\n constructor()\n {\n super();\n\n this.left_mouse_button_clicked = false;\n this.captured_NDC = { x: 0, y: 0 };\n }\n\n clear()\n {\n super.clear();\n\n this.left_mouse_button_clicked = false;\n }\n}\n\nexport default new Input();\n","\nclass OS\n{\n init()\n {\n this.operating_systems = {\n ANDROID: 'android',\n IOS: 'ios',\n LINUX: 'linux',\n MAC: 'mac',\n WINDOWS: 'windows'\n };\n\n this.is_mobile = !!(navigator.userAgent.match(/(iPhone|iPod|iPad|Android|playbook|silk|BlackBerry|BB10|Windows Phone|Tizen|Bada|webOS|IEMobile|Opera Mini)/));\n this.is_ipad = !!(navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints && navigator.maxTouchPoints > 2);\n this.is_ios = !!navigator.userAgent.match(/(iPhone|iPod|iPad)/) || this.is_ipad;\n\n this.is_android = this.get_os() === this.operating_systems.ANDROID;\n this.is_linux = this.get_os() === this.operating_systems.LINUX;\n this.is_mac = this.get_os() === this.operating_systems.MAC;\n this.is_windows = this.get_os() === this.operating_systems.WINDOWS;\n }\n\n get_os()\n {\n let userAgent = window.navigator.userAgent;\n let platform = window.navigator.platform;\n let macosPlatforms = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'];\n let windowsPlatforms = ['Win32', 'Win64', 'Windows', 'WinCE'];\n let iosPlatforms = ['iPhone', 'iPad', 'iPod'];\n let os = null;\n\n if (macosPlatforms.indexOf(platform) !== -1)\n {\n os = this.operating_systems.MAC;\n }\n else if (iosPlatforms.indexOf(platform) !== -1)\n {\n os = this.operating_systems.IOS;\n }\n else if (windowsPlatforms.indexOf(platform) !== -1)\n {\n os = this.operating_systems.WINDOWS;\n }\n else if (/Android/.test(userAgent))\n {\n os = this.operating_systems.ANDROID;\n }\n else if (!os && /Linux/.test(platform))\n {\n os = this.operating_systems.LINUX;\n }\n\n return os;\n }\n}\n\nexport default new OS();\n","import { Vector3 } from 'three';\n\nclass ReflectionPlaneContext\n{\n init()\n {\n this.target_geometry = undefined;\n this.target_position = new Vector3();\n }\n\n set_target_geometry(geometry)\n {\n this.target_geometry = geometry;\n }\n}\n\nexport default new ReflectionPlaneContext();\n","import { Vector2 } from 'three';\nimport { ShaderMaterial } from 'three';\nimport { Mesh } from 'three';\nimport { DataTexture } from 'three';\nimport { RGBAFormat } from 'three';\nimport { RGBFormat } from 'three';\nimport { FloatType } from 'three';\n\nexport default class GeometryBatch\n{\n constructor(geometry, batch_width)\n {\n this.geometry = geometry;\n\n this.material = undefined;\n this.uniforms = {};\n this.batch_width = batch_width;\n\n this.data_textures = [];\n\n this.object_names = undefined;\n\n this.zero_offset = new Vector2();\n this.write_offset = new Vector2();\n\n this.uniform_dirty_count = 0;\n\n this.tmp_uploaded_data_count = 0;\n }\n\n init(object_names, vert_shader, frag_shader)\n {\n this.material = new ShaderMaterial({\n uniforms: this.uniforms,\n vertexShader: vert_shader,\n fragmentShader: frag_shader\n });\n this.object_names = object_names;\n }\n\n add_global_uniform(name, data)\n {\n this.uniforms[name] = { value: data };\n this.material.needsUpdate = true;\n }\n\n set_global_uniform(name, data)\n {\n this.uniforms[name].value = data;\n }\n\n add_object_uniform_v3(uniform_name, default_value_v3)\n {\n let src_tex = this.__create_rgb_texture(this.batch_width);\n let dst_tex = this.__create_rgb_texture(this.batch_width);\n let one_pixel_tex = this.__create_rgb_texture(1);\n\n let new_data_tex = this.__add_data_texture(uniform_name, src_tex, dst_tex, one_pixel_tex);\n\n if (default_value_v3)\n {\n this.__flood_data_texture_rgb(new_data_tex, default_value_v3);\n }\n }\n\n add_object_uniform_v4(uniform_name, default_value_v4)\n {\n let src_tex = this.__create_rgba_texture(this.batch_width);\n let dst_tex = this.__create_rgba_texture(this.batch_width);\n let one_pixel_tex = this.__create_rgba_texture(1);\n\n let new_data_tex = this.__add_data_texture(uniform_name, src_tex, dst_tex, one_pixel_tex);\n\n if (default_value_v4)\n {\n this.__flood_data_texture_rgba(new_data_tex, default_value_v4);\n }\n }\n\n add_object_uniform_v4_float(uniform_name, default_value_v4)\n {\n let src_tex = this.__create_rgba_float_texture(this.batch_width);\n let dst_tex = this.__create_rgba_float_texture(this.batch_width);\n let one_pixel_tex = this.__create_rgba_float_texture(1);\n\n let new_data_tex = this.__add_data_texture(uniform_name, src_tex, dst_tex, one_pixel_tex);\n\n if (default_value_v4)\n {\n this.__flood_data_texture_rgba(new_data_tex, default_value_v4);\n }\n }\n\n set_object_uniform_v3(object_name, uniform_name, vector3, use_r, use_g, use_b)\n {\n let obj_index = this.__get_object_index(object_name);\n let data_texture = this.__get_data_texture(uniform_name);\n\n this.__set_pixel_rgb(data_texture.src, obj_index, vector3, use_r, use_g, use_b);\n this.__set_pixel_rgb(data_texture.one_pixel, 0, vector3, use_r, use_g, use_b);\n\n data_texture.last_accessed_index = obj_index;\n\n data_texture.dirty_count++;\n }\n\n set_object_uniform_v4(object_name, uniform_name, vector4, use_r, use_g, use_b, use_a)\n {\n let obj_index = this.__get_object_index(object_name);\n let data_texture = this.__get_data_texture(uniform_name);\n\n this.__set_pixel_rgba(data_texture.src, obj_index, vector4, use_r, use_g, use_b, use_a);\n this.__set_pixel_rgba(data_texture.one_pixel, 0, vector4, use_r, use_g, use_b, use_a);\n data_texture.last_accessed_index = obj_index;\n\n data_texture.dirty_count++;\n }\n\n upload_texture_data(renderer, upload_budget)\n {\n for (let i = 0; i < this.data_textures.length; i++)\n {\n if (upload_budget > 0 && this.data_textures[i].dirty_count > 0)\n {\n if (this.data_textures[i].dirty_count === 1)\n {\n this.__partial_texture_data_upload(renderer, this.data_textures[i]);\n }\n if (this.data_textures[i].dirty_count > 1)\n {\n this.__full_texture_data_upload(renderer, this.data_textures[i]);\n }\n\n this.data_textures[i].dirty_count = 0;\n\n upload_budget--;\n }\n }\n }\n\n get_uniform_dirty_count()\n {\n this.uniform_dirty_count = 0;\n for (let i = 0; i < this.data_textures.length; i++)\n {\n if (this.data_textures[i].dirty_count > 0)\n {\n this.uniform_dirty_count++;\n }\n }\n return this.uniform_dirty_count;\n }\n\n __full_texture_data_upload(renderer, texture_data)\n {\n // console.log(\"full texture update of\"+ texture_data.name);\n texture_data.dst.needsUpdate = true;\n renderer.copyTextureToTexture(\n this.zero_offset,\n texture_data.src,\n texture_data.dst\n );\n }\n\n __partial_texture_data_upload(renderer, texture_data)\n {\n // console.log(\"partial texture update\"+ texture_data.name);\n let index = texture_data.last_accessed_index;\n if (index === -1)\n {\n return;\n }\n\n this.write_offset.y = Math.floor(index / this.batch_width);\n this.write_offset.x = index - this.batch_width * this.write_offset.y;\n renderer.copyTextureToTexture(\n this.write_offset,\n texture_data.one_pixel,\n texture_data.dst\n );\n }\n\n get_mesh()\n {\n return new Mesh(this.geometry, this.material);\n }\n\n __set_pixel_rgb(data_texture, index, vector3, use_r, use_g, use_b)\n {\n if (use_r)\n {\n data_texture.image.data[index * 3 + 0] = vector3.x;\n }\n if (use_g)\n {\n data_texture.image.data[index * 3 + 1] = vector3.y;\n }\n if (use_b)\n {\n data_texture.image.data[index * 3 + 2] = vector3.z;\n }\n }\n\n __set_pixel_rgba(data_texture, index, vector4, use_r, use_g, use_b, use_a)\n {\n if (use_r)\n {\n data_texture.image.data[index * 4 + 0] = vector4.x;\n }\n if (use_g)\n {\n data_texture.image.data[index * 4 + 1] = vector4.y;\n }\n if (use_b)\n {\n data_texture.image.data[index * 4 + 2] = vector4.z;\n }\n if (use_a)\n {\n data_texture.image.data[index * 4 + 3] = vector4.w;\n }\n }\n\n __flood_data_texture_rgb(data_texture, v3)\n {\n for (let i = 0; i < this.batch_width * this.batch_width; i++)\n {\n this.__set_pixel_rgb(data_texture.src, i, v3, true, true, true);\n data_texture.dirty_count++;\n }\n }\n\n __flood_data_texture_rgba(data_texture, v4)\n {\n for (let i = 0; i < this.batch_width * this.batch_width; i++)\n {\n this.__set_pixel_rgba(data_texture.src, i, v4, true, true, true, true);\n data_texture.dirty_count++;\n }\n }\n\n __create_rgb_texture(width)\n {\n let data = new Uint8Array(3 * width * width);\n return new DataTexture(data, width, width, RGBFormat);\n }\n\n __create_rgba_texture(width)\n {\n let data = new Uint8Array(4 * width * width);\n return new DataTexture(data, width, width, RGBAFormat);\n }\n\n __create_rgba_float_texture(width)\n {\n let data = new Float32Array(4 * width * width);\n return new DataTexture(data, width, width, RGBAFormat, FloatType);\n }\n\n __get_data_texture(uniform_name)\n {\n for (let i = 0; i < this.data_textures.length; i++)\n {\n if (this.data_textures[i].name === uniform_name)\n {\n return this.data_textures[i];\n }\n }\n console.error('Data texture ' + uniform_name + ' does not exist');\n return undefined;\n }\n\n __get_object_index(name)\n {\n for (let i = 0; i < this.object_names.length; i++)\n {\n if (this.object_names[i] === name)\n {\n return i;\n }\n }\n console.error('the name ' + name + ' is not contained in this batch');\n return undefined;\n }\n\n __add_data_texture(uniform_name, src_texture, dst_texture, one_pixel_text)\n {\n dst_texture.needsUpdate = true;\n\n this.data_textures.push({\n name: uniform_name,\n src: src_texture,\n dst: dst_texture,\n one_pixel: one_pixel_text,\n last_accessed_index: -1,\n dirty_count: 0\n });\n\n this.uniforms[uniform_name] = { value: dst_texture };\n return this.data_textures[this.data_textures.length - 1];\n }\n\n dispose()\n {\n for (let i = 0; i < this.data_textures.length; i++)\n {\n this.data_textures[i].src.dispose();\n this.data_textures[i].dst.dispose();\n this.data_textures[i].one_pixel.dispose();\n }\n }\n}\n","import GeometryBatch from './GeometryBatch';\n\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\n\nimport { Math as TMath } from 'three';\nimport { BufferAttribute } from 'three';\n\nclass GeometryBatcher\n{\n init()\n {\n this.batches = [];\n }\n\n batch(buffer_geometries)\n {\n let attr_accessor_uvs = [];\n let texture_width = TMath.ceilPowerOfTwo(Math.sqrt(buffer_geometries.length));\n // console.log(\"Store count: \" + buffer_geometries.length + \", Texture size: \" +texture_width);\n\n this.__init_uv_array(attr_accessor_uvs, texture_width);\n\n let uv_index = 0;\n\n for (let i = 0; i < buffer_geometries.length; i++)\n {\n let vertex_count = buffer_geometries[i].getAttribute('position').count;\n let y = Math.floor(i / texture_width);\n let x = i - texture_width * y;\n for (let count = 0; count < vertex_count; count++)\n {\n attr_accessor_uvs[uv_index] = (x / texture_width) + 0.5 / texture_width;\n attr_accessor_uvs[uv_index + 1] = (y / texture_width) + 0.5 / texture_width;\n uv_index += 2;\n }\n }\n\n let buffer_attribute = new BufferAttribute(new Float32Array(attr_accessor_uvs), 2);\n let buffer_geometry = BufferGeometryUtils.mergeBufferGeometries(buffer_geometries);\n buffer_geometry.setAttribute('attr_accessor_uv', buffer_attribute);\n\n this.batches.push(new GeometryBatch(buffer_geometry, texture_width));\n return this.batches[this.batches.length - 1];\n }\n\n upload_texture_data(renderer)\n {\n for (let i = 0; i < this.batches.length; i++)\n {\n this.batches[i].upload_texture_data(renderer, 1);\n }\n }\n\n __init_uv_array(uvs, texture_width)\n {\n for (let i = 0; i < texture_width * texture_width * 2; i++)\n {\n uvs.push(0);\n }\n }\n}\n\nexport default new GeometryBatcher();\n","import Input from './Input';\nimport CameraManager from './CameraManager';\nimport Graphics from './Graphics';\n\nimport { Vector2 } from 'three';\nimport { Scene } from 'three';\nimport { OrthographicCamera } from 'three';\n\nclass UI\n{\n init()\n {\n this.ui_elements = [];\n this._tmp_normalized_pos = new Vector2();\n this.ss_scene = new Scene();\n this.ss_scene.autoUpdate = false;\n this.ss_scene.frustumCulled = false;\n\n this.ws_scene = new Scene();\n this.ws_scene.autoUpdate = false;\n this.ws_scene.frustumCulled = false;\n\n this.ss_camera = new OrthographicCamera(-1, 1, 1, -1, -100, 100);\n }\n\n delete_element(elem)\n {\n let index = this.ui_elements.indexOf(elem);\n if (index > -1)\n {\n this.ui_elements.splice(index, 1);\n }\n\n this.ss_scene.remove(elem);\n this.ws_scene.remove(elem);\n\n elem.dispose();\n }\n\n add_screen_space_element(elem)\n {\n this.ui_elements.push(elem);\n this.ss_scene.add(elem);\n\n elem.set_screen_space_coordinate_system();\n }\n\n add_world_space_element(elem)\n {\n this.ui_elements.push(elem);\n this.ws_scene.add(elem);\n\n elem.set_world_space_coordinate_system();\n }\n\n update()\n {\n // this.ss_camera.left = -Screen.width / 2;\n // this.ss_camera.right = Screen.width / 2;\n // this.ss_camera.top = Screen.top / 2;\n // this.ss_camera.right = -Screen.bottom / 2;\n this.ss_camera.updateProjectionMatrix();\n\n this._tmp_normalized_pos.copy(Input.NDC);\n for (let i = 0; i < this.ui_elements.length; i++)\n {\n this.ui_elements[i].update_state(this._tmp_normalized_pos);\n }\n }\n\n render(renderer)\n {\n // renderer.render_ui(this.scene);\n if (this.ss_scene.children.length > 0)\n {\n Graphics.render(this.ss_scene, this.ss_camera);\n }\n if (this.ws_scene.children.length > 0)\n {\n Graphics.render(this.ws_scene, CameraManager.current);\n }\n }\n\n clear()\n {\n this.current_clicked_element = undefined;\n }\n}\n\nexport default new UI();\n","import { Vector3 } from 'three';\nimport { Math as TMath } from 'three';\n\nexport default class OMath\n{\n constructor()\n {}\n\n static linear_map(value,\n from_range_start_value,\n from_range_end_value,\n to_range_start_value,\n to_range_end_value)\n {\n return ((value - from_range_start_value) / (from_range_end_value - from_range_start_value)) * (to_range_end_value - to_range_start_value) + to_range_start_value;\n }\n\n static between(value, min, max)\n {\n return (value >= min && value <= max);\n }\n\n static mod(number, divisor)\n {\n return ((number % divisor) + divisor) % divisor;\n }\n\n static rgb_to_hex(rgb)\n {\n rgb.r = Math.round(rgb.r * 255).toString(16);\n rgb.g = Math.round(rgb.g * 255).toString(16);\n rgb.b = Math.round(rgb.b * 255).toString(16);\n\n if (rgb.r.length === 1)\n {\n rgb.r = '0' + rgb.r;\n }\n if (rgb.g.length === 1)\n {\n rgb.g = '0' + rgb.g;\n }\n if (rgb.b.length === 1)\n {\n rgb.b = '0' + rgb.b;\n }\n\n return '#' + rgb.r + rgb.g + rgb.b;\n }\n\n static project_points_on_plane(points, plane)\n {\n let projected_point = new Vector3();\n let points_on_plane = [];\n for (let i = 0; i < points.length; i++)\n {\n plane.projectPoint(points[i], projected_point);\n points_on_plane.push(projected_point.clone());\n }\n\n return points_on_plane;\n }\n\n static matrix4_lerp(from, to, target, t)\n {\n for (let i = 0; i < 16; i++)\n {\n target.elements[i] = TMath.lerp(from.elements[i], to.elements[i], t);\n }\n }\n\n static equals(x1, x2)\n {\n return Math.abs(x1 - x2) < 0.000001;\n }\n\n static lerp(x, y, t)\n {\n return (1 - t) * x + t * y;\n }\n\n static clamp(value, min, max)\n {\n return Math.max(min, Math.min(max, value));\n }\n\n static euclideanModulo(n, m)\n {\n return ((n % m) + m) % m;\n }\n\n static pingpong(x, length = 1)\n {\n return length - Math.abs(OMath.euclideanModulo(x, length * 2) - length);\n }\n\n static degToRad(degrees)\n {\n return degrees * (Math.PI / 180);\n }\n\n static radToDeg(radians)\n {\n return radians * (180 / Math.PI);\n }\n\n static deg_to_rad(degrees)\n {\n return degrees * (Math.PI / 180);\n }\n\n static rad_to_deg(radians)\n {\n return radians * (180 / Math.PI);\n }\n\n static perspective_divide(v)\n {\n v.x /= v.w;\n v.y /= v.w;\n v.z /= v.w;\n return v;\n }\n\n static points_average(points)\n {\n let center = points[0].clone();\n for (let i = 1; i < points.length; i++)\n {\n center.add(points[i]);\n }\n center.multiplyScalar(1 / points.length);\n return center;\n }\n\n static get_random_color()\n {\n let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'a', 'b', 'c', 'd', 'e', 'f'];\n\n let col = '#';\n col += arr[Math.floor(Math.random() * 16)];\n col += arr[Math.floor(Math.random() * 16)];\n\n col += arr[Math.floor(Math.random() * 16)];\n col += arr[Math.floor(Math.random() * 16)];\n\n col += arr[Math.floor(Math.random() * 16)];\n col += arr[Math.floor(Math.random() * 16)];\n return col;\n }\n\n static saturate(x)\n {\n return OMath.clamp(x, 0, 1);\n }\n}\n","import CameraManager from '../CameraManager';\nimport Input from '../Input';\nimport OMath from '../utilities/OMath';\nimport Screen from '../Screen';\n\nimport { Vector3 } from 'three';\nimport { Matrix4 } from 'three';\nimport { Plane } from 'three';\nimport { Ray } from 'three';\nimport { Sphere } from 'three';\nimport { Box3 } from 'three';\n\nclass CameraUtilities\n{\n init()\n {\n this.tmp_mat = new Matrix4();\n this.plane = new Plane();\n this.ray = new Ray();\n\n this.tmp_size = new Vector3();\n this.tmp_unproj = new Vector3();\n }\n\n get_up_dir(camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n tmp_vec.set(0, 1, 0);\n tmp_vec.applyQuaternion(camera.quaternion);\n\n return tmp_vec;\n }\n\n get_forward_dir(camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n tmp_vec.set(0, 0, -1);\n tmp_vec.applyQuaternion(camera.quaternion);\n\n return tmp_vec;\n }\n\n get_right_dir(camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n tmp_vec.set(1, 0, 0);\n tmp_vec.applyQuaternion(camera.quaternion);\n return tmp_vec;\n }\n\n unproject_mouse_position(NDC, camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n let v_fov = (camera.fov / 2) * Math.PI / 180;\n let h_fov = (2 * Math.atan(Math.tan(v_fov) * camera.aspect)) / 2;\n\n let distV = Math.tan(v_fov) * camera.far;\n let distH = Math.tan(h_fov) * camera.far;\n\n tmp_vec.set(distH * NDC.x, distV * NDC.y, -camera.far).normalize();\n\n return tmp_vec.applyQuaternion(camera.quaternion);\n }\n\n get_plane_intersection(plane_position, plane_normal, NDC, camera)\n {\n camera = camera || CameraManager.current;\n NDC = NDC || Input.NDC;\n\n const tmp_vec = new Vector3();\n\n this.plane.setFromNormalAndCoplanarPoint(plane_normal || this.get_forward_dir(camera), plane_position);\n if (camera.isPerspectiveCamera)\n {\n this.ray.set(camera.position, this.unproject_mouse_position(NDC, camera));\n }\n else\n {\n this.tmp_unproj.set(NDC.x, NDC.y, 1).unproject(camera);\n this.ray.set(camera.position, this.tmp_unproj);\n }\n\n this.ray.intersectPlane(this.plane, tmp_vec);\n return tmp_vec;\n }\n\n fit_points_on_camera(points, zoom_scale = 1)\n {\n let points_sphere = new Sphere().setFromPoints(points);\n let world_space_center = points_sphere.center;\n let camera_forward = this.get_forward_dir(CameraManager.current).clone();\n\n let plane = new Plane().setFromNormalAndCoplanarPoint(camera_forward, world_space_center);\n\n let points_on_plane = OMath.project_points_on_plane(points, plane);\n\n let projected_points_center = new Vector3();\n let box = new Box3().setFromPoints(points_on_plane);\n box.getCenter(projected_points_center);\n\n let up = new Vector3(0, 1, 0).applyQuaternion(CameraManager.current.quaternion);\n let right = up.clone().cross(camera_forward).normalize();\n let mat = new Matrix4().set(right.x, up.x, camera_forward.x, world_space_center.x,\n right.y, up.y, camera_forward.y, world_space_center.y,\n right.z, up.z, camera_forward.z, world_space_center.z,\n 0, 0, 0, 1);\n\n let inverse_mat = new Matrix4().getInverse(mat);\n for (let i = 0; i < points_on_plane.length; i++)\n {\n points_on_plane[i].applyMatrix4(inverse_mat);\n }\n\n let size = new Vector3();\n box = new Box3().setFromPoints(points_on_plane);\n box.getSize(size);\n size.multiplyScalar(zoom_scale);\n let projected_center = new Vector3();\n box.getCenter(projected_center);\n\n return {\n position: projected_points_center,\n zoom: this.get_zoom_to_fit_rect(size.x / 2, size.y / 2)\n };\n }\n\n get_zoom_to_fit_rect(width, height)\n {\n let v_fov = (CameraManager.current.fov / 2) * Math.PI / 180;\n let h_fov = (2 * Math.atan(Math.tan(v_fov) * CameraManager.current.aspect)) / 2;\n\n let distV = height / Math.tan(v_fov);\n let distH = width / Math.tan(h_fov);\n\n return Math.max(Math.abs(distH), Math.abs(distV));\n }\n\n get_zoom_to_fit_box(bb, camera)\n {\n if (camera.isOrthographicCamera)\n {\n bb.getSize(this.tmp_size);\n\n let obj_x = this.tmp_size.x;\n let obj_y = this.tmp_size.y;\n let object_aspect = obj_x / obj_y;\n if (Screen.aspect_ratio / object_aspect > 1)\n {\n return Screen.height / obj_y;\n }\n else\n {\n return Screen.width / obj_x;\n }\n }\n else\n {\n // return this.fit_points_on_camera([bb.min, bb.max], 1).zoom;\n let size = new Vector3();\n bb.getSize(size);\n return this.get_zoom_to_fit_rect(size.x, size.y);\n }\n }\n\n get_html_screen_pos(object, camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n object.getWorldPosition(tmp_vec);\n tmp_vec.project(camera);\n\n tmp_vec.x = (tmp_vec.x * 0.5 + 0.5) * (Screen.width);\n tmp_vec.y = (1 - (tmp_vec.y * 0.5 + 0.5)) * Screen.height;\n return tmp_vec;\n }\n\n world_pos_to_screen(pos, camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n tmp_vec.copy(pos);\n tmp_vec.project(camera);\n\n tmp_vec.x = (tmp_vec.x * 0.5 + 0.5) * (Screen.width);\n tmp_vec.y = (1 - (tmp_vec.y * 0.5 + 0.5)) * Screen.height;\n return tmp_vec;\n }\n\n update_projection(camera)\n {\n camera.left = -Screen.width / 2;\n camera.right = Screen.width / 2;\n camera.top = Screen.height / 2;\n camera.bottom = -Screen.height / 2;\n camera.aspect = Screen.aspect_ratio;\n camera.updateProjectionMatrix(true);\n }\n}\n\nexport default new CameraUtilities();\n","import Browser from './Browser';\nimport CameraManager from './CameraManager';\nimport Capabilities from './Capabilities';\nimport Configuration from './Configuration';\nimport Debug from './Debug';\nimport EventManager from './EventManager';\nimport Graphics from './Graphics';\nimport Input from './Input';\nimport OS from './OS';\nimport ReflectionPlaneContext from './ReflectionPlaneContext';\nimport ResourceContainer from './ResourceContainer';\nimport SceneManager from './SceneManager';\nimport Screen from './Screen';\nimport GeometryBatcher from './static_batcher/GeometryBatcher';\nimport Time from './Time';\nimport UI from './UI';\nimport CameraUtilities from './utilities/CameraUtilities';\n\nclass Initializer\n{\n constructor()\n {\n }\n\n init(canvas, app_container, context_attributes)\n {\n CameraManager.init();\n CameraUtilities.init();\n Capabilities.init();\n Configuration.init();\n EventManager.init();\n GeometryBatcher.init();\n Input.init(app_container);\n OS.init();\n Browser.init();\n ReflectionPlaneContext.init();\n ResourceContainer.init();\n SceneManager.init();\n Screen.init();\n Time.init();\n UI.init();\n\n Graphics.init(canvas, context_attributes);\n Debug.init();\n }\n\n dispose(render_loop)\n {\n Graphics.dispose();\n Input.dispose();\n SceneManager.dispose();\n\n render_loop.dispose();\n }\n}\n\nexport default new Initializer();\n","import BlitMaterial from '../materials/BlitMaterial';\nimport frag from '../shaders/ssao/ssao.frag';\nimport vert from '../shaders/ssao/ssao.vert';\n\nimport { Matrix4 } from 'three';\nimport { Math as TMath } from 'three';\nimport { Vector3 } from 'three';\nimport { DataTexture } from 'three';\nimport { RGBFormat } from 'three';\nimport { RepeatWrapping } from 'three';\n\nexport default class SSAOMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag, vert);\n\n this.uniforms._InverseProjMatrix = { value: new Matrix4() };\n this.uniforms._ProjectionMatrix = { value: new Matrix4() };\n\n this.uniforms._Bias = { value: 0.0125 };\n this.uniforms._Radius = { value: 0.3 };\n this.uniforms._FarPlane = { value: 100 };\n\n this.uniforms._SampleKernel = { value: this.__get_sample_kernel() };\n this.uniforms._RandomRotation = { value: this.__get_rotation_kernel() };\n }\n\n __get_sample_kernel()\n {\n let sample_kernel = [];\n let kernel_size = 64;\n\n for (let i = 0; i < kernel_size; i++)\n {\n let dir = new Vector3(Math.random() * 2 - 1,\n Math.random() * 2 - 1,\n Math.random());\n dir.normalize();\n let scale = i / kernel_size;\n scale = TMath.lerp(0.1, 1.0, scale * scale);\n dir.multiplyScalar(scale);\n\n sample_kernel.push(dir);\n }\n return sample_kernel;\n }\n\n __get_rotation_kernel()\n {\n let rotation_kernel = new Uint8Array(3 * 16);\n for (let i = 0; i < 16; i++)\n {\n rotation_kernel[i * 3 + 1] = Math.floor(Math.random() * 255);\n rotation_kernel[i * 3 + 2] = Math.floor(Math.random() * 255);\n rotation_kernel[i * 3 + 3] = 0;\n }\n\n let rotation_texture = new DataTexture(rotation_kernel, 4, 4, RGBFormat);\n rotation_texture.wrapS = RepeatWrapping;\n rotation_texture.wrapT = RepeatWrapping;\n\n rotation_texture.needsUpdate = true;\n return rotation_texture;\n }\n}\n","import BlitMaterial from '../materials/BlitMaterial';\nimport frag from '../shaders/ssao/ssao_compose.frag';\n\nexport default class SSAOComposeMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag);\n this.uniforms._AO = { value: undefined };\n }\n}\n","import BlitMaterial from '../materials/BlitMaterial';\nimport frag from '../shaders/depth_normals/debug_normals.frag';\nimport depth_normals_vert from '../shaders/ssao/ssao.vert';\n\nimport { Matrix4 } from 'three';\n\nexport default class DisplayNormalTextureMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag, depth_normals_vert);\n this.uniforms._FarPlane = { value: 1 };\n this.uniforms._InverseProjMatrix = { value: new Matrix4() };\n }\n}\n","import BlitMaterial from '../materials/BlitMaterial';\nimport frag from '../shaders/box_blur/box_blur.frag';\n\nimport { Vector2 } from 'three';\n\nexport default class BoxBlurMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag);\n this.uniforms._SampleDir = { value: new Vector2() };\n }\n}\n","import BoxBlurMaterial from '../materials/BoxBlurMaterial';\nimport Graphics from '../Graphics';\n\nimport { WebGLRenderTarget } from 'three';\n\nexport default class Blurrer\n{\n constructor(renderer)\n {\n this.RT1 = new WebGLRenderTarget(1, 1);\n this.RT2 = new WebGLRenderTarget(1, 1);\n this.box_blur_mat = new BoxBlurMaterial();\n }\n\n blur(RT)\n {\n if (RT.width !== this.RT1.width || RT.height !== this.RT1.height)\n {\n this.RT1.setSize(RT.width, RT.height);\n this.RT2.setSize(RT.width, RT.height);\n }\n\n this.box_blur_mat.uniforms._SampleDir.value.set(1, 0);\n Graphics.blit(RT, this.RT1, this.box_blur_mat);\n this.box_blur_mat.uniforms._SampleDir.value.set(0, 1);\n Graphics.blit(this.RT1, RT, this.box_blur_mat);\n // return this.RT2;\n }\n}\n","import CameraManager from '../CameraManager';\nimport SceneManager from '../SceneManager';\nimport Screen from '../Screen';\nimport BaseRender from '../render_mode/BaseRender';\nimport Configuration from '../Configuration';\nimport SSAOMaterial from '../materials/SSAOMaterial';\nimport SSAOComposeMaterial from '../materials/SSAOComposeMaterial';\nimport DisplayNormalTextureMaterial from '../materials/DisplayNormalTextureMaterial';\nimport Blurrer from '../render_utilities/Blurrer';\nimport Graphics from '../Graphics';\n\nimport { WebGLRenderTarget } from 'three';\n\nexport default class NormalAORender extends BaseRender\n{\n constructor()\n {\n super();\n\n this.ssao_mat = new SSAOMaterial();\n this.ssao_compose_mat = new SSAOComposeMaterial();\n this.debug_normals = new DisplayNormalTextureMaterial();\n\n this.ssaa = Configuration.use_ssaa ? 2 : 1;\n\n this.main_RT = new WebGLRenderTarget(Screen.width * this.ssaa, Screen.height * this.ssaa);\n\n this.SSAO_RT = new WebGLRenderTarget(Screen.width, Screen.height);\n\n this.blurrer = new Blurrer();\n Graphics.generateDepthNormalTexture = true;\n }\n\n render()\n {\n this.__check_RT_size();\n\n Graphics.clear(this.main_RT, CameraManager.current, true, false);\n Graphics.render(SceneManager.current, CameraManager.current, this.main_RT);\n\n this.__update_uniforms();\n\n Graphics.blit(Graphics.depth_normals_RT, this.SSAO_RT, this.ssao_mat);\n\n // // BLUR\n this.blurrer.blur(this.SSAO_RT);\n Graphics.blit(this.SSAO_RT, undefined);\n\n // // COMPOSE\n this.ssao_compose_mat.uniforms._AO.value = this.SSAO_RT.texture;\n Graphics.blit(this.main_RT, undefined, this.ssao_compose_mat);\n\n // Graphics.blit(this.SSAO_RT, undefined);\n }\n\n __update_uniforms()\n {\n this.ssao_mat.uniforms._InverseProjMatrix.value.getInverse(CameraManager.current.projectionMatrix);\n this.ssao_mat.uniforms._ProjectionMatrix.value.copy(CameraManager.current.projectionMatrix);\n this.ssao_mat.uniforms._FarPlane.value = CameraManager.current.far;\n }\n\n __check_RT_size()\n {\n if (this.main_RT.width !== Screen.width * this.ssaa || this.main_RT.height !== Screen.height * this.ssaa)\n {\n this.main_RT.setSize(Screen.width * this.ssaa, Screen.height * this.ssaa);\n this.SSAO_RT.setSize(Screen.width, Screen.height);\n }\n }\n}\n","import CameraManager from '../CameraManager';\nimport SceneManager from '../SceneManager';\nimport BaseRender from '../render_mode/BaseRender';\nimport Graphics from '../Graphics';\n\nexport default class NormalRender extends BaseRender\n{\n constructor()\n {\n super();\n }\n\n render()\n {\n Graphics.clear(undefined, CameraManager.current, true, true);\n\n if (SceneManager.current.on_pre_render)\n {\n SceneManager.current.on_pre_render();\n }\n\n if (SceneManager.current.render)\n {\n SceneManager.current.render();\n }\n else\n {\n Graphics.render(SceneManager.current, CameraManager.current);\n }\n\n if (SceneManager.current.on_post_render)\n {\n SceneManager.current.on_post_render();\n }\n }\n}\n","import BlitMaterial from './BlitMaterial';\nimport frag from '../shaders/gaussian_blur/unreal_bloom_compose.frag';\nimport { Color } from 'three';\nexport default class UnrealBloomComposeMaterial extends BlitMaterial\n{\n constructor(nMips)\n {\n super(frag, undefined, {\n NUM_MIPS: nMips\n });\n this.uniforms._MainTex = { value: undefined };\n this.uniforms._BlurredTex = { value: undefined };\n this.uniforms._BloomStrength = { value: 1 };\n\n this.uniforms.blurTexture1 = { value: null };\n this.uniforms.blurTexture2 = { value: null };\n this.uniforms.blurTexture3 = { value: null };\n this.uniforms.blurTexture4 = { value: null };\n this.uniforms.blurTexture5 = { value: null };\n\n this.uniforms.bloomStrength = { value: 1.0 };\n this.uniforms.bloomFactors = { value: [1.0, 0.8, 0.6, 0.4, 0.2] };\n this.uniforms.bloomRadius = { value: 0.0 };\n\n let bloomTintColors = [\n new Color('#FFFFFF'),\n new Color('#FFFFFF'),\n new Color('#FFFFFF'),\n new Color('#FFFFFF'),\n new Color('#FFFFFF')\n ];\n\n this.uniforms.bloomTintColors = { value: bloomTintColors };\n }\n\n set_RT_0(rt)\n {\n this.uniforms.blurTexture1.value = rt;\n }\n\n set_RT_1(rt)\n {\n this.uniforms.blurTexture2.value = rt;\n }\n\n set_RT_2(rt)\n {\n this.uniforms.blurTexture3.value = rt;\n }\n\n set_RT_3(rt)\n {\n this.uniforms.blurTexture4.value = rt;\n }\n\n set_RT_4(rt)\n {\n this.uniforms.blurTexture5.value = rt;\n }\n\n set_bloom_strength(value)\n {\n this.uniforms.bloomStrength.value = value;\n }\n\n set_bloom_radius(value)\n {\n this.uniforms.bloomRadius.value = value;\n }\n\n set_tint_color_0(col_string)\n {\n this.uniforms.bloomTintColors.value[0].set(col_string);\n }\n\n set_tint_color_1(col_string)\n {\n this.uniforms.bloomTintColors.value[1].set(col_string);\n }\n\n set_tint_color_2(col_string)\n {\n this.uniforms.bloomTintColors.value[2].set(col_string);\n }\n\n set_tint_color_3(col_string)\n {\n this.uniforms.bloomTintColors.value[3].set(col_string);\n }\n\n set_tint_color_4(col_string)\n {\n this.uniforms.bloomTintColors.value[4].set(col_string);\n }\n}\n","import BlitMaterial from './BlitMaterial';\nimport frag from '../shaders/add/add.frag';\n\nexport default class AddMaterial extends BlitMaterial\n{\n constructor(nMips)\n {\n super(frag);\n\n this.uniforms._SecondTex = { value: undefined };\n }\n\n set_add_texture(tex)\n {\n this.uniforms._SecondTex.value = tex;\n }\n}\n","import BlitMaterial from './BlitMaterial';\nimport frag from '../shaders/gaussian_blur/gaussian_blur.frag';\nimport { Vector2 } from 'three';\n\nexport default class GaussianBlurMaterial extends BlitMaterial\n{\n constructor(kernel_radius)\n {\n super(frag, undefined, {\n KERNEL_RADIUS: kernel_radius,\n SIGMA: kernel_radius\n });\n\n this.uniforms.texSize = { value: new Vector2(0.5, 0.5) };\n this.uniforms.direction = { value: new Vector2(0.5, 0.5) };\n }\n\n set_size(w, h)\n {\n this.uniforms.texSize.value.x = w;\n this.uniforms.texSize.value.y = h;\n }\n\n set_direction(x, y)\n {\n this.uniforms.direction.value.set(x, y);\n }\n}\n","import BlitMaterial from './BlitMaterial';\nimport frag from '../shaders/luminosity_high_pass/luminosity_high_pass.frag';\nimport { Color } from 'three';\nexport default class LuminosityHighPassMaterial extends BlitMaterial\n{\n constructor(kernel_radius)\n {\n super(frag);\n\n this.uniforms.luminosityThreshold = { value: 0.23 };\n this.uniforms.smoothWidth = { value: 0.01 };\n this.uniforms.defaultColor = { value: new Color('#000000') };\n this.uniforms.defaultOpacity = { value: 0.0 };\n }\n}\n","import GaussianBlurMaterial from '../materials/GaussianBlurMaterial';\nimport LuminosityHighPassMaterial from '../materials/LuminosityHighPassMaterial';\nimport Graphics from '../Graphics';\n\nimport { WebGLRenderTarget, LinearFilter, RGBAFormat } from 'three';\n\nexport default class GaussianBlurrer\n{\n constructor(nMips = 5)\n {\n this.current_width = 1;\n this.current_height = 1;\n\n this.separableBlurMaterials = [];\n this.renderTargetsHorizontal = [];\n this.renderTargetsVertical = [];\n\n this.nMips = nMips;\n this.kernelSizeArray = [3, 5, 7, 9, 11];\n this.rt_pars = { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat };\n\n this.renderTargetBright = new WebGLRenderTarget(1, 1, this.rt_pars);\n this.renderTargetBright.texture.generateMipmaps = false;\n\n this.init_materials();\n this.init_RT();\n\n this.luminosity_high_pass_mat = new LuminosityHighPassMaterial();\n }\n\n blur(RT, use_luminosity_high_pass)\n {\n this.resize_RT(RT.width, RT.height);\n\n if (use_luminosity_high_pass)\n {\n Graphics.blit(RT, this.renderTargetBright, this.luminosity_high_pass_mat);\n }\n else\n {\n Graphics.blit(RT, this.renderTargetBright);\n }\n\n let inputRenderTarget = this.renderTargetBright;\n\n for (let i = 0; i < this.nMips; i++)\n {\n let mat = this.separableBlurMaterials[i];\n\n mat.set_direction(1, 0);\n Graphics.blit(inputRenderTarget, this.renderTargetsHorizontal[i], mat);\n\n mat.set_direction(0, 1);\n Graphics.blit(this.renderTargetsHorizontal[i], this.renderTargetsVertical[i], mat);\n\n inputRenderTarget = this.renderTargetsVertical[i];\n }\n }\n\n get_blurred_texture()\n {\n return this.renderTargetsHorizontal[0].texture;\n }\n\n get_blurred_RT()\n {\n return this.renderTargetsHorizontal[0];\n }\n\n init_RT()\n {\n this.dispose_RT();\n\n this.renderTargetBright.setSize(1, 1);\n\n for (let i = 0; i < this.nMips; i++)\n {\n let hor = new WebGLRenderTarget(1, 1, this.rt_pars);\n let ver = new WebGLRenderTarget(1, 1, this.rt_pars);\n\n hor.texture.generateMipmaps = false;\n ver.texture.generateMipmaps = false;\n\n this.renderTargetsHorizontal.push(hor);\n this.renderTargetsVertical.push(ver);\n }\n }\n\n resize_RT(texture_width, texture_height)\n {\n if (this.current_width === texture_width && this.current_height === texture_height)\n {\n return;\n }\n\n this.current_width = texture_width;\n this.current_height = texture_height;\n\n let width = Math.round(texture_width / 2);\n let height = Math.round(texture_height / 2);\n\n this.renderTargetBright.setSize(width, height);\n\n for (let i = 0; i < this.nMips; i++)\n {\n this.renderTargetsVertical[i].setSize(width, height);\n this.renderTargetsHorizontal[i].setSize(width, height);\n this.separableBlurMaterials[i].set_size(width, height);\n\n width = Math.round(width / 2);\n height = Math.round(height / 2);\n }\n }\n\n init_materials(texture_width, texture_height)\n {\n this.dispose_materials();\n\n for (let i = 0; i < this.nMips; i++)\n {\n this.separableBlurMaterials.push(new GaussianBlurMaterial(this.kernelSizeArray[i]));\n }\n }\n\n dispose_materials()\n {\n for (let i = 0; i < this.separableBlurMaterials.length; i++)\n {\n this.separableBlurMaterials[i].dispose();\n }\n this.separableBlurMaterials.length = 0;\n }\n\n dispose_RT()\n {\n for (let i = 0; i < this.renderTargetsVertical.length; i++)\n {\n this.renderTargetsHorizontal[i].dispose();\n this.renderTargetsVertical[i].dispose();\n }\n this.renderTargetBright.dispose();\n\n this.renderTargetsHorizontal.length = 0;\n this.renderTargetsVertical.length = 0;\n }\n}\n","import Screen from '../Screen';\nimport BaseRender from '../render_mode/BaseRender';\nimport UnrealBloomComposeMaterial from '../materials/UnrealBloomComposeMaterial';\nimport AddMaterial from '../materials/AddMaterial';\n\nimport { WebGLRenderTarget } from 'three';\n\nimport GaussianBlurrer from '../render_utilities/GaussianBlurrer';\nimport Graphics from '../Graphics';\nimport CameraManager from '../CameraManager';\nimport SceneManager from '../SceneManager';\n\nexport default class UnrealBloomRender extends BaseRender\n{\n constructor()\n {\n super();\n\n this.bloom_compose_mat = undefined;\n\n this.main_RT = undefined;\n this.blur_RT = undefined;\n this.blurrer = undefined;\n\n this.add_mat = new AddMaterial();\n }\n\n on_enter()\n {\n this.blurrer = new GaussianBlurrer();\n this.main_RT = new WebGLRenderTarget(Screen.render_width, Screen.render_height);\n this.blur_RT = new WebGLRenderTarget(Screen.render_width, Screen.render_height);\n\n this.bloom_compose_mat = new UnrealBloomComposeMaterial(5);\n this.blurrer = new GaussianBlurrer(5);\n\n this.bloom_compose_mat.set_RT_0(this.blurrer.renderTargetsVertical[0].texture);\n this.bloom_compose_mat.set_RT_1(this.blurrer.renderTargetsVertical[1].texture);\n this.bloom_compose_mat.set_RT_2(this.blurrer.renderTargetsVertical[2].texture);\n this.bloom_compose_mat.set_RT_3(this.blurrer.renderTargetsVertical[3].texture);\n this.bloom_compose_mat.set_RT_4(this.blurrer.renderTargetsVertical[4].texture);\n\n this.bloom_compose_mat.set_bloom_strength(1);\n this.bloom_compose_mat.set_bloom_radius(1);\n\n this.add_mat.set_add_texture(this.blurrer.renderTargetsHorizontal[0].texture);\n }\n\n set_bloom_strength(val)\n {\n this.bloom_compose_mat.set_bloom_strength(val);\n }\n\n set_bloom_radius(val)\n {\n this.bloom_compose_mat.set_bloom_radius(val);\n }\n\n set_tint_color_0(col_string)\n {\n this.bloom_compose_mat.set_tint_color_0(col_string);\n }\n\n set_tint_color_1(col_string)\n {\n this.bloom_compose_mat.set_tint_color_1(col_string);\n }\n\n set_tint_color_2(col_string)\n {\n this.bloom_compose_mat.set_tint_color_2(col_string);\n }\n\n set_tint_color_3(col_string)\n {\n this.bloom_compose_mat.set_tint_color_3(col_string);\n }\n\n set_tint_color_4(col_string)\n {\n this.bloom_compose_mat.set_tint_color_4(col_string);\n }\n\n render()\n {\n this.__check_RT_size();\n\n Graphics.clear(this.main_RT, CameraManager.current, true, false);\n Graphics.render(SceneManager.current, CameraManager.current, this.main_RT);\n\n // // BLUR\n this.blurrer.blur(this.main_RT, true);\n\n // Blur compose\n Graphics.material_pass(this.bloom_compose_mat, this.blurrer.renderTargetsHorizontal[0]);\n\n // Additive blend\n Graphics.blit(this.main_RT, undefined, this.add_mat);\n }\n\n __check_RT_size()\n {\n if (this.main_RT.width !== Screen.render_width || this.main_RT.height !== Screen.render_height)\n {\n this.main_RT.setSize(Screen.render_width, Screen.render_height);\n this.blur_RT.setSize(Screen.render_width, Screen.render_height);\n }\n }\n}\n","import { Color } from 'three';\nimport { OrthographicCamera as THREEOrthographicCamera } from 'three';\n\nexport default class OrthographicCamera extends THREEOrthographicCamera\n{\n constructor(left, right, top, bottom, near, far)\n {\n super(left, right, top, bottom, near, far);\n\n this.clear_color = new Color('#000000');\n this.clear_alpha = 1;\n }\n}\n","import ViewManager from './ViewManager';\n\nclass ViewComponentManager\n{\n constructor()\n {\n this.components = [];\n this.enabled_components = new Set();\n }\n\n update()\n {\n for (let component of this.enabled_components)\n {\n component.update(ViewManager.transition_handler.current_state_data);\n }\n }\n\n register_component(component)\n {\n this.components.push(component);\n }\n\n enable_component(component)\n {\n // const component_to_enable = this.get_component_by_name(component_name);\n\n this.enabled_components.add(component);\n }\n\n disable_component(component)\n {\n // const component_to_disable = this.get_component_by_name(component_name);\n\n this.enabled_components.delete(component);\n }\n\n get_component_by_name(component_name)\n {\n console.warn('DEPRECATED. Use ViewComponentManager.get instead');\n this.get(component_name);\n }\n\n get(component_name)\n {\n for (let i = 0; i < this.components.length; i++)\n {\n if (this.components[i].name === component_name)\n {\n return this.components[i];\n }\n }\n console.error('[ViewComponentManager.get] no component found for: ', component_name);\n return undefined;\n }\n}\n\nexport default new ViewComponentManager();\n","import Time from './Time';\nimport Input from './Input';\nimport UI from './UI';\nimport Debug from './Debug';\nimport BaseApplication from './BaseApplication';\nimport ViewManager from './view_components/ViewManager';\nimport ViewComponentManager from './view_components/ViewComponentManager';\n\nexport default class RenderLoop\n{\n constructor(target_application, graphics)\n {\n target_application = target_application || new BaseApplication();\n\n this._frame_id = -1;\n\n this.target_application = target_application;\n this.graphics = graphics;\n\n this.is_running = false;\n this.frames_passed = 0;\n }\n\n update()\n {\n if (!this.is_running)\n {\n return;\n }\n Time.__update();\n\n // ###### START CYCLE ######\n if (this.frames_passed === 1)\n {\n this.target_application.on_post_start();\n }\n\n this.target_application.update();\n ViewManager.update();\n ViewComponentManager.update();\n\n this.target_application.on_pre_render();\n\n this.graphics.update(); // render scene\n UI.update(); // update after new camera matrix has been calculated\n UI.render(this.graphics); // render ui layer on top\n this.target_application.on_post_render();\n\n Debug.render(this.graphics); // render debug layer\n\n // ###### END CYCLE #######\n\n this._frame_id = requestAnimationFrame(this.update.bind(this));\n this.target_application.on_frame_end();\n this.frames_passed++;\n\n Input.clear();\n UI.clear();\n Debug.clear();\n }\n\n start()\n {\n if (this.is_running) return; // sanity check\n\n if (this.frames_passed === 0)\n {\n this.target_application.on_enter();\n }\n\n this.is_running = true;\n this.update();\n }\n\n stop()\n {\n if (this.is_running === false) return; // sanity check\n\n this.is_running = false;\n this.target_application.on_exit();\n\n cancelAnimationFrame(this._frame_id);\n }\n\n set_state(new_state)\n {\n this.target_application.on_exit(this);\n this.target_application = new_state;\n this.target_application.on_enter(this);\n }\n\n dispose()\n {\n this.stop();\n this.frames_passed = 0;\n }\n}\n","\nimport CanvasDrawer from './CanvasDrawer';\n\nimport { Vector2 } from 'three';\n\nexport default class SimpleTextDrawer extends CanvasDrawer\n{\n constructor()\n {\n super();\n this.text_margin = new Vector2(2, 0);\n }\n\n __draw(text, ctxOptions, canvas, ctx)\n {\n ctx.font = ctxOptions.font;\n\n let text_size = this.get_text_size(text, ctxOptions.font);\n // canvas.width = Math.ceilPowerOfTwo(text_size.x+this.text_margin.x*2);\n // canvas.height = Math.ceilPowerOfTwo(text_size.y+ this.text_margin.y*2);\n canvas.width = Math.ceil(text_size.x + this.text_margin.x * 2);\n canvas.height = Math.ceil(text_size.y + this.text_margin.y * 2);\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n // turn this on for debugging\n ctx.globalAlpha = 0.0;\n ctx.fillStyle = ctxOptions.font_color || '#000000';\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.globalAlpha = 1;\n\n ctx.globalAlpha = 1;\n\n ctx.font = ctxOptions.font;\n ctx.fillStyle = ctxOptions.font_color || '#000000';\n ctx.textBaseline = 'middle';\n\n ctx.textAlign = ctxOptions.textAlign || 'center';\n if (ctx.textAlign === 'center')\n {\n ctx.fillText(text, canvas.width / 2, canvas.height / 2);\n }\n else\n {\n ctx.fillText(text, 0, canvas.height / 2);\n }\n }\n}\n","import ViewComponentManager from './ViewComponentManager';\n\nexport default class ViewComponent\n{\n constructor({ name, container })\n {\n this.name = name;\n this.container = container;\n\n ViewComponentManager.register_component(this);\n }\n\n start()\n {\n }\n\n on_enter()\n {\n this.container.classList.remove('hidden');\n ViewComponentManager.enable_component(this);\n }\n\n update()\n {\n }\n\n on_exit()\n {\n this.container.classList.add('hidden');\n ViewComponentManager.disable_component(this);\n }\n\n set_opacity(opacity)\n {\n this.container.style.opacity = opacity;\n }\n}\n","import { Mesh } from 'three';\nimport { MeshBasicMaterial } from 'three';\nimport { PlaneBufferGeometry } from 'three';\n\nexport default class HorizontalPlane extends Mesh\n{\n constructor(width, height, color, material)\n {\n width = width || 1;\n height = height || 1;\n color = color || '#FF0000';\n material = material || new MeshBasicMaterial({ color: color });\n\n let geometry = new PlaneBufferGeometry(width, height);\n geometry.rotateX(-3.14 / 2);\n super(geometry, material);\n }\n}\n","import { Mesh } from 'three';\nimport { PlaneBufferGeometry } from 'three';\nimport { MeshBasicMaterial } from 'three';\n\nexport default class VerticalPlane extends Mesh\n{\n constructor(width, height, color, material)\n {\n width = width || 1;\n height = height || 1;\n color = color || '#FF0000';\n material = material || new MeshBasicMaterial({ color: color });\n\n let geometry = new PlaneBufferGeometry(width, height);\n super(geometry, material);\n }\n}\n","export default class ArrayUtilities\n{\n constructor()\n {}\n\n static merge_from_to(source, target)\n {\n target.push.apply(target, source);\n }\n\n static expand_vec3_array(array, size)\n {\n let items_left_count = size - array.length;\n\n for (let i = 0; i < items_left_count; i++)\n {\n array.push(array[i].clone());\n }\n }\n\n static remove_elem(array, elem)\n {\n let index = array.indexOf(elem);\n if (index > -1)\n {\n array.splice(index, 1);\n }\n }\n\n static get_closest_point(points, target)\n {\n let closest_point = points[0];\n let closest_distance = closest_point.distanceTo(target);\n for (let i = 1; i < points.length; i++)\n {\n if (points[i].distanceTo(target) < closest_distance)\n {\n closest_point = points[i];\n closest_distance = points[i].distanceTo(target);\n }\n }\n return closest_point;\n }\n\n static object_values_to_array(obj)\n {\n let ids = Object.keys(obj);\n let arr = [];\n for (let i = 0; i < ids.length; i++)\n {\n arr.push(obj[ids[i]]);\n }\n return arr;\n }\n}\n","import { Line3, Plane, Quaternion, Sphere, Vector3 } from 'three';\n\nexport default class FrustumPointFitter\n{\n constructor()\n {\n this.sphere = new Sphere();\n }\n\n fit_points(points, camera_quaternion, vertical_fov, aspect)\n {\n this.sphere.setFromPoints(points);\n\n let v_fov = Math.degToRad(vertical_fov / 2);\n let h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\n\n let up_plane_normal = this.get_up_plane_normal(camera_quaternion, v_fov);\n let down_plane_normal = this.get_down_plane_normal(camera_quaternion, v_fov);\n let left_plane_normal = this.get_left_plane_normal(camera_quaternion, h_fov);\n let right_plane_normal = this.get_right_plane_normal(camera_quaternion, h_fov);\n\n let camera_forward_dir = new Vector3(0, 0, -1).applyQuaternion(camera_quaternion);\n\n let sphere_center = this.sphere.center.clone();\n\n let pull_back_distance = this.get_distance_to_fit_rect(this.sphere.radius * 2, this.sphere.radius * 2, vertical_fov, aspect);\n let far_pos = sphere_center.clone().add(camera_forward_dir.clone().multiplyScalar(pull_back_distance * -1));\n\n let up_plane = new Plane().setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\n let down_plane = new Plane().setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\n\n let left_plane = new Plane().setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\n let right_plane = new Plane().setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\n\n this.apply_center_correction_to_pos(far_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane);\n\n up_plane.setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\n down_plane.setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\n\n left_plane.setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\n right_plane.setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\n\n let closest_distance = Infinity;\n\n let inverse_dir = camera_forward_dir.clone().multiplyScalar(pull_back_distance * -2);\n for (let i = 0; i < points.length; i++)\n {\n let line = new Line3(points[i].clone(), points[i].clone().add(inverse_dir));\n\n let up_line_intersection = new Vector3();\n let down_line_intersection = new Vector3();\n\n let left_line_intersection = new Vector3();\n let right_line_intersection = new Vector3();\n\n up_plane.intersectLine(line, up_line_intersection);\n down_plane.intersectLine(line, down_line_intersection);\n\n left_plane.intersectLine(line, left_line_intersection);\n right_plane.intersectLine(line, right_line_intersection);\n\n if (up_line_intersection.length() < 0.0001)\n {\n console.log('up intersection not found', i);\n }\n if (down_line_intersection.length() < 0.0001)\n {\n console.log('down intersection not found', i);\n }\n if (left_line_intersection.length() < 0.0001)\n {\n console.log('left intersection not found', i);\n }\n if (right_line_intersection.length() < 0.0001)\n {\n console.log('right intersection not found', i);\n }\n\n let new_up_distance = points[i].clone().sub(up_line_intersection).length();\n let new_down_distance = points[i].clone().sub(down_line_intersection).length();\n\n let new_left_distance = points[i].clone().sub(left_line_intersection).length();\n let new_right_distance = points[i].clone().sub(right_line_intersection).length();\n\n let vertical_min = Math.min(new_up_distance, new_down_distance);\n let horizontal_min = Math.min(new_left_distance, new_right_distance);\n\n let min = Math.min(vertical_min, horizontal_min);\n\n if (min < closest_distance)\n {\n closest_distance = min;\n }\n }\n\n let forward_correction = camera_forward_dir.clone().multiplyScalar(closest_distance);\n let closest_position = far_pos.clone().add(forward_correction);\n\n return closest_position;\n }\n\n apply_center_correction_to_pos(target_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane)\n {\n let vertical_offset = this.get_vertical_correction(points, down_plane, up_plane, camera_quaternion);\n let horizontal_offset = this.get_hozirontal_correction(points, left_plane, right_plane, camera_quaternion);\n\n target_pos.add(vertical_offset);\n target_pos.add(horizontal_offset);\n }\n\n get_vertical_correction(points, down_plane, up_plane, camera_quaternion)\n {\n let closest_distance_to_up_plane = Infinity;\n let closest_distance_to_down_plane = Infinity;\n let closest_up_point = undefined;\n let closest_down_point = undefined;\n\n let up_dir = new Vector3(0, 1, 0).applyQuaternion(camera_quaternion);\n for (let i = 0; i < points.length; i++)\n {\n let down_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(-5000000)));\n let up_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(5000000)));\n\n let down_line_intersection = new Vector3();\n let up_line_intersection = new Vector3();\n\n down_plane.intersectLine(down_line, down_line_intersection);\n up_plane.intersectLine(up_line, up_line_intersection);\n\n let down_dist = down_line_intersection.distanceTo(points[i]);\n let up_dist = up_line_intersection.distanceTo(points[i]);\n\n if (up_line_intersection.length() < 0.0001)\n {\n console.log('vertical up intersection not found', i);\n }\n if (down_line_intersection.length() < 0.0001)\n {\n console.log('vertical down intersection not found', i);\n }\n\n if (down_dist < closest_distance_to_down_plane)\n {\n closest_distance_to_down_plane = down_dist;\n closest_down_point = points[i];\n }\n if (up_dist < closest_distance_to_up_plane)\n {\n closest_distance_to_up_plane = up_dist;\n closest_up_point = points[i];\n }\n }\n\n console.log(closest_up_point, closest_down_point);\n\n let correction = (closest_distance_to_up_plane - closest_distance_to_down_plane) / 2;\n\n // console.log(\"vertical_correction\", correction)\n return up_dir.clone().multiplyScalar(-correction);\n }\n\n get_hozirontal_correction(points, left_plane, right_plane, camera_quaternion)\n {\n let closest_distance_to_right_plane = Infinity;\n let closest_distance_to_left_plane = Infinity;\n let closest_right_point = undefined;\n let closest_left_point = undefined;\n\n let right_dir = new Vector3(1, 0, 0).applyQuaternion(camera_quaternion);\n\n for (let i = 0; i < points.length; i++)\n {\n let left_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(-5000000)));\n let right_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(5000000)));\n\n let left_line_intersection = new Vector3();\n let right_line_intersection = new Vector3();\n\n left_plane.intersectLine(left_line, left_line_intersection);\n right_plane.intersectLine(right_line, right_line_intersection);\n\n let left_dist = left_line_intersection.distanceTo(points[i]);\n let right_dist = right_line_intersection.distanceTo(points[i]);\n\n if (left_line_intersection.length() < 0.0001)\n {\n console.log('left intersection not found', i);\n }\n if (right_line_intersection.length() < 0.0001)\n {\n console.log('right intersection not found', i);\n }\n\n if (left_dist < closest_distance_to_left_plane)\n {\n closest_distance_to_left_plane = left_dist;\n closest_left_point = points[i];\n }\n if (right_dist < closest_distance_to_right_plane)\n {\n closest_distance_to_right_plane = right_dist;\n closest_right_point = points[i];\n }\n }\n\n let correction = (closest_distance_to_right_plane - closest_distance_to_left_plane) / 2;\n // console.log(\"horizontal_correction\", correction)\n\n console.log(closest_right_point, closest_left_point);\n\n return right_dir.clone().multiplyScalar(-correction);\n }\n\n get_up_plane_normal(camera_quaternion, v_fov)\n {\n let up_plane_normal = new Vector3(0, -1, 0);\n up_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), v_fov));\n up_plane_normal.applyQuaternion(camera_quaternion);\n return up_plane_normal;\n }\n\n get_down_plane_normal(camera_quaternion, v_fov)\n {\n let down_plane_normal = new Vector3(0, 1, 0);\n down_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), -v_fov));\n down_plane_normal.applyQuaternion(camera_quaternion);\n return down_plane_normal;\n }\n\n get_left_plane_normal(camera_quaternion, h_fov)\n {\n let left_plane_normal = new Vector3(1, 0, 0);\n left_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), h_fov));\n left_plane_normal.applyQuaternion(camera_quaternion);\n return left_plane_normal;\n }\n\n get_right_plane_normal(camera_quaternion, h_fov)\n {\n let right_plane_normal = new Vector3(-1, 0, 0);\n right_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), -h_fov));\n right_plane_normal.applyQuaternion(camera_quaternion);\n return right_plane_normal;\n }\n\n get_distance_to_fit_rect(width, height, vertical_fov, aspect)\n {\n let v_fov = (vertical_fov / 2) * Math.PI / 180;\n let h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\n\n let distV = height / Math.tan(v_fov);\n let distH = width / Math.tan(h_fov);\n return Math.max(Math.abs(distH), Math.abs(distV));\n }\n}\n","import { BufferAttribute } from 'three';\nimport { BufferGeometry } from 'three';\n\nexport default class GeometryUtilities\n{\n static convert_to_non_indexed_geometry(geometry_buffer)\n {\n let indices = geometry_buffer.index;\n let positions = geometry_buffer.getAttribute('position');\n\n let bar_coordinates = [];\n let vertices = [];\n\n for (let i = 0; i < indices.count; i += 3)\n {\n // VERTEX 1\n vertices.push(positions.getX(indices.array[i + 0]));\n vertices.push(positions.getY(indices.array[i + 0]));\n vertices.push(positions.getZ(indices.array[i + 0]));\n\n bar_coordinates.push(1);\n bar_coordinates.push(0);\n bar_coordinates.push(0);\n\n // VERTEX 2\n\n vertices.push(positions.getX(indices.array[i + 1]));\n vertices.push(positions.getY(indices.array[i + 1]));\n vertices.push(positions.getZ(indices.array[i + 1]));\n\n bar_coordinates.push(0);\n bar_coordinates.push(1);\n bar_coordinates.push(0);\n\n // VERTEX 3\n\n vertices.push(positions.getX(indices.array[i + 2]));\n vertices.push(positions.getY(indices.array[i + 2]));\n vertices.push(positions.getZ(indices.array[i + 2]));\n\n bar_coordinates.push(0);\n bar_coordinates.push(0);\n bar_coordinates.push(1);\n }\n\n let geometry = new BufferGeometry();\n // geometry.setAttribute('barycentric', new BufferAttribute( new Float32Array(bar_coordinates), 3 ));\n geometry.setAttribute('position', new BufferAttribute(new Float32Array(vertices), 3));\n GeometryUtilities.add_barycentric_attribute(geometry);\n return geometry;\n }\n\n static add_barycentric_attribute(non_indexed_geometry_buffer)\n {\n let bar_coordinates = [];\n let positions = non_indexed_geometry_buffer.getAttribute('position');\n\n for (let i = 0; i < positions.count; i += 3)\n {\n bar_coordinates.push(1);\n bar_coordinates.push(0);\n bar_coordinates.push(0);\n\n bar_coordinates.push(0);\n bar_coordinates.push(1);\n bar_coordinates.push(0);\n\n bar_coordinates.push(0);\n bar_coordinates.push(0);\n bar_coordinates.push(1);\n }\n non_indexed_geometry_buffer.setAttribute('barycentric', new BufferAttribute(new Float32Array(bar_coordinates), 3));\n }\n}\n","import { Vector4 } from 'three';\n\nexport default class ImageUtilities\n{\n constructor()\n { }\n\n static get_image_data(image)\n {\n let canvas = document.createElement('canvas');\n canvas.width = image.width;\n canvas.height = image.height;\n\n let context = canvas.getContext('2d');\n context.drawImage(image, 0, 0);\n\n return context.getImageData(0, 0, image.width, image.height);\n }\n\n static get_pixel(imagedata, x, y)\n {\n let position = (x + imagedata.width * y) * 4;\n let data = imagedata.data;\n return new Vector4(data[position + 0], data[position + 1], data[position + 2], data[position + 3]);\n }\n}\n","import { Vector3 } from 'three';\nclass MeshSampler\n{\n constructor()\n {\n\n }\n\n sample(buffer_geometry, sample_count)\n {\n let face_areas = [];\n\n let min_area = 99999999;\n\n let vertices = buffer_geometry.getAttribute('position');\n let normals = buffer_geometry.getAttribute('normal');\n let indices = buffer_geometry.index;\n\n let faces = [];\n\n for (let i = 0; i < indices.count; i += 3)\n {\n let index_0 = indices.array[i + 0];\n let index_1 = indices.array[i + 1];\n let index_2 = indices.array[i + 2];\n\n let v1 = new Vector3();\n v1.x = vertices.getX(index_0);\n v1.y = vertices.getY(index_0);\n v1.z = vertices.getZ(index_0);\n\n let v2 = new Vector3();\n v2.x = vertices.getX(index_1);\n v2.y = vertices.getY(index_1);\n v2.z = vertices.getZ(index_1);\n\n let v3 = new Vector3();\n v3.x = vertices.getX(index_2);\n v3.y = vertices.getY(index_2);\n v3.z = vertices.getZ(index_2);\n\n let face = {\n a: v1,\n b: v2,\n c: v3\n };\n\n if (normals)\n {\n let n1 = new Vector3();\n n1.x = normals.getX(index_0);\n n1.y = normals.getY(index_0);\n n1.z = normals.getZ(index_0);\n\n let n2 = new Vector3();\n n2.x = normals.getX(index_1);\n n2.y = normals.getY(index_1);\n n2.z = normals.getZ(index_1);\n\n let n3 = new Vector3();\n n3.x = normals.getX(index_2);\n n3.y = normals.getY(index_2);\n n3.z = normals.getZ(index_2);\n\n let normal = n1.clone().add(n2).add(n3).normalize();\n face.normal = normal;\n }\n\n faces.push(face);\n\n let area = this.get_face_area(face);\n min_area = Math.min(area, min_area);\n face_areas.push(area);\n }\n\n let normalized_faces_array = this.get_uniform_face_distribution(face_areas, min_area, faces);\n let selected_faces = this.select_random_faces(normalized_faces_array, sample_count);\n let sampled_data = this.sample_data_from_faces(selected_faces);\n return sampled_data;\n }\n\n sample_data_from_faces(faces)\n {\n let sampled_points = [];\n let sampled_normals = [];\n for (let i = 0; i < faces.length; i++)\n {\n let face = faces[i];\n\n let w1 = Math.random();\n let w2 = Math.random();\n\n sampled_points.push(this.sample_point_in_face(w1, w2, face.a, face.b, face.c).clone());\n if (face.normal)\n {\n sampled_normals.push(face.normal.clone());\n }\n }\n return { points: sampled_points, normals: sampled_normals };\n }\n\n select_random_faces(faces, amount)\n {\n let selected_faces = [];\n for (let i = 0; i < amount; i++)\n {\n let random = Math.floor(Math.random() * faces.length);\n let selected_face = faces[random];\n\n selected_faces.push(selected_face);\n }\n\n return selected_faces;\n }\n\n get_uniform_face_distribution(face_areas, minimum_area, faces)\n {\n let extended_triangle_indices = [];\n for (let i = 0; i < face_areas.length; i++)\n {\n face_areas[i] /= minimum_area;\n let repetitions_needed = Math.floor(Math.round(face_areas[i]));\n for (let j = 0; j < repetitions_needed; j++)\n {\n extended_triangle_indices.push(faces[i]);\n }\n }\n return extended_triangle_indices;\n }\n\n get_face_area(face)\n {\n let vec1 = face.b.clone().sub(face.a);\n let vec2 = face.c.clone().sub(face.a);\n return vec1.cross(vec2).length() / 2;\n }\n\n sample_point_in_face(w1, w2, v1, v2, v3)\n {\n if (w1 + w2 > 1)\n {\n w1 = 1.0 - w1;\n w2 = 1.0 - w2;\n }\n\n let w3 = 1.0 - (w1 + w2);\n\n return v1.clone().multiplyScalar(w1).add(v2.clone().multiplyScalar(w2)).add(v3.clone().multiplyScalar(w3));\n }\n}\n\nexport default new MeshSampler();\n","import { Mesh } from 'three';\nimport { BufferGeometry } from 'three';\nimport { Skeleton } from 'three';\n\nclass ModelUtilities\n{\n get_mesh(scene, result_callback)\n {\n scene.traverse((child) =>\n {\n if (child instanceof Mesh)\n {\n if (child.geometry)\n {\n child.geometry = new BufferGeometry().fromGeometry(child.geometry);\n }\n result_callback(child);\n }\n });\n }\n\n get_geometries(scene)\n {\n let geometries = [];\n\n this.get_mesh(scene, (child) =>\n {\n geometries.push(child.geometry);\n });\n return geometries;\n }\n\n assign_material(scene, material, name)\n {\n scene.traverse((child) =>\n {\n if (child instanceof Mesh)\n {\n // assign to all if no name is given\n if (name === undefined)\n {\n child.material = material;\n }\n else\n {\n // if name is given, assign only to that\n if (child.name === name)\n {\n child.material = material;\n }\n }\n }\n });\n }\n\n clone_animated_gltf(gltf)\n {\n const clone = {\n animations: gltf.animations,\n scene: gltf.scene.clone(true)\n };\n\n const skinnedMeshes = {};\n\n gltf.scene.traverse(node =>\n {\n if (node.isSkinnedMesh)\n {\n skinnedMeshes[node.name] = node;\n }\n });\n\n const cloneBones = {};\n const cloneSkinnedMeshes = {};\n\n clone.scene.traverse(node =>\n {\n if (node.isBone)\n {\n cloneBones[node.name] = node;\n }\n\n if (node.isSkinnedMesh)\n {\n cloneSkinnedMeshes[node.name] = node;\n }\n });\n\n for (let name in skinnedMeshes)\n {\n const skinnedMesh = skinnedMeshes[name];\n const skeleton = skinnedMesh.skeleton;\n const cloneSkinnedMesh = cloneSkinnedMeshes[name];\n\n const orderedCloneBones = [];\n\n for (let i = 0; i < skeleton.bones.length; ++i)\n {\n const cloneBone = cloneBones[skeleton.bones[i].name];\n orderedCloneBones.push(cloneBone);\n }\n\n cloneSkinnedMesh.bind(\n new Skeleton(orderedCloneBones, skeleton.boneInverses),\n cloneSkinnedMesh.matrixWorld);\n }\n\n return clone;\n }\n\n set_shadow_config(scene, cast, receive)\n {\n scene.traverse((child) =>\n {\n if (child instanceof Mesh)\n {\n child.castShadow = cast;\n child.receiveShadow = receive;\n }\n });\n }\n\n __find_object(scene, object_name, result_callback)\n {\n scene.traverse((obj) =>\n {\n if (obj.name === object_name)\n {\n result_callback(obj);\n }\n });\n }\n\n get_object(scene, object_name)\n {\n let object = undefined;\n scene.traverse((obj) =>\n {\n if (obj.name === object_name)\n {\n object = obj;\n }\n });\n return object;\n }\n\n get_object_by_type(scene, object_type)\n {\n let object = undefined;\n scene.traverse((obj) =>\n {\n if (obj.constructor.name === object_type)\n {\n object = obj;\n }\n });\n return object;\n }\n}\n\nexport default new ModelUtilities();\n","export default class ObjectUtilities\r\n{\r\n constructor()\r\n {}\r\n\r\n // Changes XML to JSON\r\n static xml_to_json(xml)\r\n {\r\n // Create the return object\r\n let obj = {};\r\n\r\n if (xml.nodeType === 1)\r\n { // element\r\n // do attributes\r\n if (xml.attributes.length > 0)\r\n {\r\n obj['@attributes'] = {};\r\n for (let j = 0; j < xml.attributes.length; j++)\r\n {\r\n let attribute = xml.attributes.item(j);\r\n obj['@attributes'][attribute.nodeName] = attribute.nodeValue;\r\n }\r\n }\r\n }\r\n else if (xml.nodeType === 3)\r\n { // text\r\n obj = xml.nodeValue;\r\n }\r\n\r\n // do children\r\n if (xml.hasChildNodes())\r\n {\r\n for (let i = 0; i < xml.childNodes.length; i++)\r\n {\r\n let item = xml.childNodes.item(i);\r\n let nodeName = item.nodeName;\r\n if (typeof (obj[nodeName]) === 'undefined')\r\n {\r\n obj[nodeName] = this.xml_to_json(item);\r\n }\r\n else\r\n {\r\n if (typeof (obj[nodeName].push) === 'undefined')\r\n {\r\n let old = obj[nodeName];\r\n obj[nodeName] = [];\r\n obj[nodeName].push(old);\r\n }\r\n obj[nodeName].push(this.xml_to_json(item));\r\n }\r\n }\r\n }\r\n return obj;\r\n }\r\n}\r\n","export default class StringUtilities\n{\n constructor()\n {}\n\n static capitalize(string)\n {\n const words = string.split(' ');\n\n for (let i = 0; i < words.length; i++)\n {\n words[i] = words[i][0].toUpperCase() + words[i].substr(1);\n }\n\n return words.join(' ');\n }\n\n static capitalize_first_letter(string)\n {\n return string.charAt(0).toUpperCase() + string.slice(1);\n }\n\n static snake_to_camelcase(string)\n {\n return string.replace(\n /([-_][a-z])/g,\n (group) => group.toUpperCase()\n .replace('-', '')\n .replace('_', '')\n );\n }\n}\n","export default class TimeUtilities\n{\n constructor()\n {}\n\n // Converts a time string (00:00:00.45) into miliseconds\n time_str_to_ms(time_str)\n {\n time_str = time_str.split(':');\n\n let hours = Number(time_str[0]);\n hours = hours * 60 * 60 * 1000;\n\n let minutes = Number(time_str[1]);\n minutes = minutes * 60 * 1000;\n\n let seconds = Number(time_str[2]);\n seconds = seconds * 1000;\n\n return hours + minutes + seconds;\n }\n}\n","import { Vector3, Plane, Quaternion, Sphere, Math as TMath, Line3 } from 'three';\nexport default class PerspectiveFrustumPointFitter\n{\n constructor()\n {\n this.sphere = new Sphere();\n }\n\n fit_points(points, camera_quaternion, vertical_fov, aspect)\n {\n this.sphere.setFromPoints(points);\n\n let v_fov = TMath.degToRad(vertical_fov / 2);\n let h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\n\n let up_plane_normal = this.get_up_plane_normal(camera_quaternion, v_fov);\n let down_plane_normal = this.get_down_plane_normal(camera_quaternion, v_fov);\n let left_plane_normal = this.get_left_plane_normal(camera_quaternion, h_fov);\n let right_plane_normal = this.get_right_plane_normal(camera_quaternion, h_fov);\n\n let camera_forward_dir = new Vector3(0, 0, -1).applyQuaternion(camera_quaternion);\n\n let sphere_center = this.sphere.center.clone();\n\n let pull_back_distance = this.get_distance_to_fit_rect(this.sphere.radius * 2, this.sphere.radius * 2, vertical_fov, aspect);\n let far_pos = sphere_center.clone().add(camera_forward_dir.clone().multiplyScalar(pull_back_distance * -1));\n\n let up_plane = new Plane().setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\n let down_plane = new Plane().setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\n\n let left_plane = new Plane().setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\n let right_plane = new Plane().setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\n\n this.apply_center_correction_to_pos(far_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane);\n\n up_plane.setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\n down_plane.setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\n\n left_plane.setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\n right_plane.setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\n\n let closest_distance = Infinity;\n\n let inverse_dir = camera_forward_dir.clone().multiplyScalar(pull_back_distance * -2);\n for (let i = 0; i < points.length; i++)\n {\n let line = new Line3(points[i].clone(), points[i].clone().add(inverse_dir));\n\n let up_line_intersection = new Vector3();\n let down_line_intersection = new Vector3();\n\n let left_line_intersection = new Vector3();\n let right_line_intersection = new Vector3();\n\n up_plane.intersectLine(line, up_line_intersection);\n down_plane.intersectLine(line, down_line_intersection);\n\n left_plane.intersectLine(line, left_line_intersection);\n right_plane.intersectLine(line, right_line_intersection);\n\n if (up_line_intersection.length() < 0.0001)\n {\n console.log('up intersection not found', i);\n }\n if (down_line_intersection.length() < 0.0001)\n {\n console.log('down intersection not found', i);\n }\n if (left_line_intersection.length() < 0.0001)\n {\n console.log('left intersection not found', i);\n }\n if (right_line_intersection.length() < 0.0001)\n {\n console.log('right intersection not found', i);\n }\n\n let new_up_distance = points[i].clone().sub(up_line_intersection).length();\n let new_down_distance = points[i].clone().sub(down_line_intersection).length();\n\n let new_left_distance = points[i].clone().sub(left_line_intersection).length();\n let new_right_distance = points[i].clone().sub(right_line_intersection).length();\n\n let vertical_min = Math.min(new_up_distance, new_down_distance);\n let horizontal_min = Math.min(new_left_distance, new_right_distance);\n\n let min = Math.min(vertical_min, horizontal_min);\n\n if (min < closest_distance)\n {\n closest_distance = min;\n }\n }\n\n let forward_correction = camera_forward_dir.clone().multiplyScalar(closest_distance);\n let closest_position = far_pos.clone().add(forward_correction);\n\n return closest_position;\n }\n\n apply_center_correction_to_pos(target_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane)\n {\n let vertical_offset = this.get_vertical_correction(points, down_plane, up_plane, camera_quaternion);\n let horizontal_offset = this.get_horizontal_correction(points, left_plane, right_plane, camera_quaternion);\n\n target_pos.add(vertical_offset);\n target_pos.add(horizontal_offset);\n }\n\n get_vertical_correction(points, down_plane, up_plane, camera_quaternion)\n {\n let closest_distance_to_up_plane = Infinity;\n let closest_distance_to_down_plane = Infinity;\n // let closest_up_point = undefined;\n // let closest_down_point = undefined;\n\n let up_dir = new Vector3(0, 1, 0).applyQuaternion(camera_quaternion);\n for (let i = 0; i < points.length; i++)\n {\n let down_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(-5000000)));\n let up_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(5000000)));\n\n let down_line_intersection = new Vector3();\n let up_line_intersection = new Vector3();\n\n down_plane.intersectLine(down_line, down_line_intersection);\n up_plane.intersectLine(up_line, up_line_intersection);\n\n let down_dist = down_line_intersection.distanceTo(points[i]);\n let up_dist = up_line_intersection.distanceTo(points[i]);\n\n if (up_line_intersection.length() < 0.0001)\n {\n console.log('vertical up intersection not found', i);\n }\n if (down_line_intersection.length() < 0.0001)\n {\n console.log('vertical down intersection not found', i);\n }\n\n if (down_dist < closest_distance_to_down_plane)\n {\n closest_distance_to_down_plane = down_dist;\n // closest_down_point = points[i];\n }\n if (up_dist < closest_distance_to_up_plane)\n {\n closest_distance_to_up_plane = up_dist;\n // closest_up_point = points[i];\n }\n }\n\n let correction = (closest_distance_to_up_plane - closest_distance_to_down_plane) / 2;\n\n // console.log(\"vertical_correction\", correction)\n return up_dir.clone().multiplyScalar(-correction);\n }\n\n get_horizontal_correction(points, left_plane, right_plane, camera_quaternion)\n {\n let closest_distance_to_right_plane = Infinity;\n let closest_distance_to_left_plane = Infinity;\n // let closest_right_point = undefined;\n // let closest_left_point = undefined;\n\n let right_dir = new Vector3(1, 0, 0).applyQuaternion(camera_quaternion);\n\n for (let i = 0; i < points.length; i++)\n {\n let left_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(-5000000)));\n let right_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(5000000)));\n\n let left_line_intersection = new Vector3();\n let right_line_intersection = new Vector3();\n\n left_plane.intersectLine(left_line, left_line_intersection);\n right_plane.intersectLine(right_line, right_line_intersection);\n\n let left_dist = left_line_intersection.distanceTo(points[i]);\n let right_dist = right_line_intersection.distanceTo(points[i]);\n\n if (left_line_intersection.length() < 0.0001)\n {\n console.log('left intersection not found', i);\n }\n if (right_line_intersection.length() < 0.0001)\n {\n console.log('right intersection not found', i);\n }\n\n if (left_dist < closest_distance_to_left_plane)\n {\n closest_distance_to_left_plane = left_dist;\n // closest_left_point = points[i];\n }\n if (right_dist < closest_distance_to_right_plane)\n {\n closest_distance_to_right_plane = right_dist;\n // closest_right_point = points[i];\n }\n }\n\n let correction = (closest_distance_to_right_plane - closest_distance_to_left_plane) / 2;\n // console.log(\"horizontal_correction\", correction)\n\n return right_dir.clone().multiplyScalar(-correction);\n }\n\n get_up_plane_normal(camera_quaternion, v_fov)\n {\n let up_plane_normal = new Vector3(0, -1, 0);\n up_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), v_fov));\n up_plane_normal.applyQuaternion(camera_quaternion);\n return up_plane_normal;\n }\n\n get_down_plane_normal(camera_quaternion, v_fov)\n {\n let down_plane_normal = new Vector3(0, 1, 0);\n down_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), -v_fov));\n down_plane_normal.applyQuaternion(camera_quaternion);\n return down_plane_normal;\n }\n\n get_left_plane_normal(camera_quaternion, h_fov)\n {\n let left_plane_normal = new Vector3(1, 0, 0);\n left_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), h_fov));\n left_plane_normal.applyQuaternion(camera_quaternion);\n return left_plane_normal;\n }\n\n get_right_plane_normal(camera_quaternion, h_fov)\n {\n let right_plane_normal = new Vector3(-1, 0, 0);\n right_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), -h_fov));\n right_plane_normal.applyQuaternion(camera_quaternion);\n return right_plane_normal;\n }\n\n get_distance_to_fit_rect(width, height, vertical_fov, aspect)\n {\n let v_fov = (vertical_fov / 2) * Math.PI / 180;\n let h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\n\n let distV = height / Math.tan(v_fov);\n let distH = width / Math.tan(h_fov);\n return Math.max(Math.abs(distH), Math.abs(distV));\n }\n}\n","import { Vector3, Box3 } from 'three';\n\nexport default class OrthographicFrustumPointFitter\n{\n constructor()\n {\n\n }\n\n fit_points(points, camera_quaternion, vertical_fov, aspect)\n {\n let inverse_camera_quat = camera_quaternion.clone().inverse();\n\n let inverted_points = [];\n\n for (let i = 0; i < points.length; i++)\n {\n inverted_points.push(points[i].clone().applyQuaternion(inverse_camera_quat));\n }\n\n let box = new Box3().setFromPoints(inverted_points);\n let size = new Vector3();\n box.getSize(size);\n\n let distance = this.get_distance_to_fit_rect(size.x / 2, size.y / 2, vertical_fov, aspect);\n\n let center = new Vector3();\n box.getCenter(center);\n\n center.applyQuaternion(camera_quaternion);\n\n return {\n center: center,\n distance_to_center: distance\n };\n }\n\n get_distance_to_fit_rect(width, height, vertical_fov, aspect)\n {\n let v_fov = (vertical_fov / 2) * Math.PI / 180;\n let h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\n\n let distV = height / Math.tan(v_fov);\n let distH = width / Math.tan(h_fov);\n return Math.max(Math.abs(distH), Math.abs(distV));\n }\n}\n","import grid_frag from '../shaders/grid/grid.frag';\nimport grid_vert from '../shaders/grid/grid.vert';\nimport GeometryUtilities from '../utilities/GeometryUtilities';\n\nimport { Mesh } from 'three';\nimport { ShaderMaterial } from 'three';\nimport { Color } from 'three';\nimport { PlaneBufferGeometry } from 'three';\n\nexport default class Grid extends Mesh\n{\n constructor()\n {\n let material = new ShaderMaterial({\n uniforms: {\n _Color: { value: new Color('#919191') }\n },\n vertexShader: grid_vert,\n fragmentShader: grid_frag,\n extensions: { derivatives: true },\n transparent: true,\n depthWrite: false\n });\n\n let plane_geometry = new PlaneBufferGeometry(100, 100, 100, 100);\n\n let non_indexed_geometry = GeometryUtilities.convert_to_non_indexed_geometry(plane_geometry);\n\n super(non_indexed_geometry, material);\n\n this.rotation.x = -3.14 / 2;\n }\n}\n","import line_vs from '../shaders/basic_line/basic_line.vert';\nimport line_fs from '../shaders/basic_line/basic_line.frag';\n\nimport { Mesh } from 'three';\nimport { BufferAttribute } from 'three';\nimport { BufferGeometry } from 'three';\nimport { ShaderMaterial } from 'three';\nimport { Color } from 'three';\n\nexport default class Line extends Mesh\n{\n constructor(points)\n {\n let geometry = new BufferGeometry();\n geometry.setAttribute('position', new BufferAttribute(new Float32Array([]), 3));\n geometry.setAttribute('next_position', new BufferAttribute(new Float32Array([]), 3));\n geometry.setAttribute('previous_position', new BufferAttribute(new Float32Array([]), 3));\n geometry.setAttribute('orientation', new BufferAttribute(new Float32Array([]), 1));\n geometry.setAttribute('coverage', new BufferAttribute(new Float32Array([]), 1));\n\n let material = new ShaderMaterial({\n uniforms: {\n _Thickness: { value: 0.2 },\n _Length: { value: 0 },\n _ElapsedTime: { value: 0 },\n _Color: { value: new Color('#FF0000') }\n },\n vertexShader: line_vs,\n fragmentShader: line_fs,\n transparent: true,\n depthWrite: false,\n extensions: { derivatives: true }\n\n });\n\n super(geometry, material);\n\n if (points)\n {\n this.setup(points);\n }\n }\n\n setup(points)\n {\n let vertices = [];\n let next_position = [];\n let previous_position = [];\n let orientation = [];\n let coverage = [];\n let accumulated_length = 0;\n\n for (let i = 0; i < points.length; i++)\n {\n vertices.push(points[i].x);\n vertices.push(points[i].y);\n vertices.push(points[i].z);\n orientation.push(1);\n\n vertices.push(points[i].x);\n vertices.push(points[i].y);\n vertices.push(points[i].z);\n orientation.push(-1);\n\n let next_point = this.__get_next_position(points, i);\n next_position.push(next_point.x);\n next_position.push(next_point.y);\n next_position.push(next_point.z);\n\n next_position.push(next_point.x);\n next_position.push(next_point.y);\n next_position.push(next_point.z);\n\n let previous_point = this.__get_previous_position(points, i);\n previous_position.push(previous_point.x);\n previous_position.push(previous_point.y);\n previous_position.push(previous_point.z);\n\n previous_position.push(previous_point.x);\n previous_position.push(previous_point.y);\n previous_position.push(previous_point.z);\n\n coverage.push(accumulated_length);\n coverage.push(accumulated_length);\n\n if (i < points.length - 1)\n {\n accumulated_length += points[i].distanceTo(next_point);\n }\n }\n let vertexList = new Float32Array(vertices);\n let nextPositionList = new Float32Array(next_position);\n let previousPositionList = new Float32Array(previous_position);\n let orientationList = new Float32Array(orientation);\n let coverageList = new Float32Array(coverage);\n\n let indices = [];\n for (let i = 0; i < ((vertexList.length / 3) - 2) / 2; i++)\n {\n let index = (i * 2) + 1;\n indices.push(index);\n indices.push(index + 1);\n indices.push(index - 1);\n\n indices.push(index);\n indices.push(index + 2);\n indices.push(index + 1);\n }\n\n this.geometry.setIndex(indices);\n this.geometry.getAttribute('position').copy(new BufferAttribute(vertexList, 3));\n this.geometry.getAttribute('next_position').copy(new BufferAttribute(nextPositionList, 3));\n this.geometry.getAttribute('previous_position').copy(new BufferAttribute(previousPositionList, 3));\n this.geometry.getAttribute('orientation').copy(new BufferAttribute(orientationList, 1));\n this.geometry.getAttribute('coverage').copy(new BufferAttribute(coverageList, 1));\n\n this.geometry.getAttribute('position').needsUpdate = true;\n this.geometry.getAttribute('next_position').needsUpdate = true;\n this.geometry.getAttribute('previous_position').needsUpdate = true;\n this.geometry.getAttribute('orientation').needsUpdate = true;\n this.geometry.getAttribute('coverage').needsUpdate = true;\n\n this.material.uniforms._Length.value = accumulated_length;\n this._length = accumulated_length;\n }\n\n set thickness(value)\n {\n this.material.uniforms._Thickness.value = value;\n }\n\n get thickness()\n {\n return this.material.uniforms._Thickness.value;\n }\n\n __get_previous_position(points, i)\n {\n if (i === 0)\n {\n return points[1].clone().sub(points[0]).multiplyScalar(-1).add(points[0]);\n }\n else\n {\n return points[i - 1];\n }\n }\n\n __get_next_position(points, i)\n {\n if (i === points.length - 1)\n {\n return points[points.length - 2].clone().sub(points[points.length - 1]).multiplyScalar(-1).add(points[points.length - 1]);\n }\n else\n {\n return points[i + 1];\n }\n }\n\n update()\n {\n }\n\n distance()\n {\n return this.accumulated_length;\n }\n\n total_length()\n {\n return this.accumulated_length;\n }\n\n dispose()\n {\n this.geometry.dispose();\n this.material.dispose();\n if (this.parent)\n {\n this.parent.remove(this);\n }\n }\n\n set color(col)\n {\n this.material.uniforms._Color.value.set(col);\n }\n\n get color()\n {\n return this.material.uniforms._Color.value;\n }\n\n copy_color(col)\n {\n this.material.uniforms._Color.value.copy(col);\n }\n}\n","import basic_texture_vert from '../shaders/basic_texture/basic_texture.vert';\nimport basic_texture_frag from '../shaders/basic_texture/basic_texture.frag';\n\nimport { Mesh } from 'three';\nimport { Vector2 } from 'three';\nimport { ShaderMaterial } from 'three';\nimport { DoubleSide } from 'three';\nimport { PlaneGeometry } from 'three';\nimport { Vector3 } from 'three';\n\nexport default class WorldImage extends Mesh\n{\n constructor(texture, pivot)\n {\n pivot = pivot || new Vector2(0, 0);\n let material = new ShaderMaterial({\n uniforms: {\n _MainTex: { value: texture },\n _ScreenAligned: { value: 0 },\n _Scale: { value: 1 },\n _Opacity: { value: 1 }\n },\n vertexShader: basic_texture_vert,\n fragmentShader: basic_texture_frag,\n transparent: true,\n depthWrite: false,\n side: DoubleSide\n });\n let geometry = new PlaneGeometry(1, 1, 1);\n geometry.translate(-pivot.x / 2, -pivot.y / 2, 0);\n let current_scale = texture.image.width / texture.image.height;\n geometry.scale(current_scale, 1, 1);\n super(geometry, material);\n this.current_scale = current_scale;\n this.geometry.computeBoundingBox();\n\n this.tmp_bb_size = new Vector3();\n this.geometry.boundingBox.getSize(this.tmp_bb_size);\n }\n\n update_texture()\n {\n this.material.uniforms._MainTex.value.needsUpdate = true;\n let img = this.material.uniforms._MainTex.value.image;\n\n this.geometry.scale(1 / this.current_scale, 1, 1);\n this.current_scale = img.width / img.height;\n this.geometry.scale(this.current_scale, 1, 1);\n this.geometry.computeBoundingBox();\n this.geometry.boundingBox.getSize(this.tmp_bb_size);\n }\n\n get size()\n {\n return this.tmp_bb_size.clone().multiplyScalar(this.scale.x);\n }\n\n set size(value)\n {\n this.scale.set(value, value, value);\n this.material.uniforms._Scale.value = value;\n }\n\n set screen_aligned(boolean)\n {\n this.material.uniforms._ScreenAligned.value = boolean === true ? 1 : 0;\n }\n\n get screen_aligned()\n {\n return this.material.uniforms._ScreenAligned.value === 1;\n }\n\n set opacity(opacity)\n {\n this.material.uniforms._Opacity.value = opacity;\n }\n\n get opacity()\n {\n return this.material.uniforms._Opacity.value;\n }\n\n dispose()\n {\n this.geometry.dispose();\n this.parent.remove(this);\n this.material.uniforms._MainTex.value.dispose();\n this.material.dispose();\n }\n}\n","import WorldImage from './WorldImage';\nimport SimpleTextDrawer from '../canvas_drawer/SimpleTextDrawer';\n\nimport { LinearMipMapLinearFilter } from 'three';\nimport { LinearFilter } from 'three';\n\nexport default class Text2D extends WorldImage\n{\n constructor(text, font, color, pivot, is_static)\n {\n let simple_text_drawer = new SimpleTextDrawer(is_static);\n\n let draw_settings = {\n font: font,\n font_color: color || '#000000'\n };\n let canvas_texture = simple_text_drawer.draw_on_texture(text, draw_settings);\n\n canvas_texture.minFilter = LinearMipMapLinearFilter;\n canvas_texture.minFilter = LinearFilter;\n canvas_texture.needsUpdate = true;\n super(canvas_texture, pivot);\n\n this.simple_text_drawer = simple_text_drawer;\n this.canvas_texture = canvas_texture;\n this.draw_settings = draw_settings;\n }\n\n set text(value)\n {\n this.simple_text_drawer.draw_canvas(value, this.draw_settings);\n this.update_texture();\n }\n\n get text()\n {\n return 'not implemented';\n }\n}\n","import vert from '../shaders/ui_element/ui_element.vert';\nimport frag from '../shaders/ui_element/ui_element.frag';\nimport BaseShaderMaterial from '../materials/BaseShaderMaterial';\n\nimport { Vector2 } from 'three';\nimport { Vector3 } from 'three';\n\nexport default class UIElementMaterial extends BaseShaderMaterial\n{\n constructor(intensity = 1)\n {\n super(vert, frag, {\n _MainTex: { value: undefined },\n _ScreenSize: { value: new Vector2(Screen.width, Screen.height) },\n _TextureSize: { value: new Vector2() },\n _PixelOffset: { value: new Vector2(0, 0) },\n _NDC: { value: new Vector3() },\n _PivotPoint: { value: new Vector2() },\n _DepthOffset: { value: 0 }\n });\n this.transparent = true;\n this.depthWrite = false;\n this.depthTest = false;\n }\n}\n","import { Vector2 } from 'three';\n\nexport default class ScreenSpacePosition\n{\n constructor()\n {\n this.tmp_vec = new Vector2();\n }\n\n get_pos_NDC(position)\n {\n return this.tmp_vec.set(position.x, position.y);\n }\n}\n","import CameraManager from '../../CameraManager';\n\nimport { Vector2 } from 'three';\nimport { Vector3 } from 'three';\n\nexport default class WorldSpacePosition\n{\n constructor()\n {\n this.tmp_vec3 = new Vector3();\n this.tmp_vec2 = new Vector2();\n }\n\n get_pos_NDC(position)\n {\n this.tmp_vec3.copy(position);\n this.tmp_vec3.project(CameraManager.current);\n\n return this.tmp_vec2.set(this.tmp_vec3.x, this.tmp_vec3.y);\n }\n}\n","export default class UIElementState\n{\n constructor()\n {\n\n }\n\n update(ui_element, normalized_mouse_position)\n {\n\n }\n\n on_enter(ui_element)\n {}\n\n on_exit(ui_element)\n {}\n}\n","import UIElementState from './UIElementState';\n\nexport default class OnIdle extends UIElementState\n{\n constructor()\n {\n super();\n }\n\n update(ui_element, normalized_mouse_position)\n {\n if (ui_element.is_mouse_over(normalized_mouse_position))\n {\n ui_element.set_state(ui_element._on_enter_state);\n }\n }\n}\n","import UIElementState from './UIElementState';\n\nexport default class OnMouseEnter extends UIElementState\n{\n constructor()\n {\n super();\n }\n\n on_enter(ui_element)\n {\n ui_element.on_mouse_enter();\n }\n\n update(ui_element, normalized_mouse_position)\n {\n if (ui_element.is_mouse_over(normalized_mouse_position))\n {\n ui_element.set_state(ui_element._on_hover_state);\n }\n else\n {\n ui_element.set_state(ui_element._on_exit_state);\n }\n }\n}\n","import UIElementState from './UIElementState';\n\nexport default class OnMouseExit extends UIElementState\n{\n constructor()\n {\n super();\n }\n\n on_enter(ui_element)\n {\n ui_element.on_mouse_exit();\n ui_element.set_state(ui_element._on_idle_state);\n }\n}\n","import UIElementState from './UIElementState';\n\nexport default class OnMouseHover extends UIElementState\n{\n constructor()\n {\n super();\n }\n\n on_enter(ui_element)\n {\n this.__trigger_on_hover(ui_element);\n }\n\n update(ui_element, normalized_mouse_position)\n {\n if (ui_element.is_mouse_over(normalized_mouse_position))\n {\n this.__trigger_on_hover(ui_element);\n }\n else\n {\n ui_element.set_state(ui_element._on_exit_state);\n }\n }\n\n __trigger_on_hover(ui_element)\n {\n ui_element.on_mouse_hover();\n }\n}\n","\nimport Screen from '../Screen';\n\nimport UIElementMaterial from '../materials/UIElementMaterial';\n\nimport ScreenSpacePosition from '../ui/ui_element_position/ScreenSpacePosition';\nimport WorldSpacePosition from '../ui/ui_element_position/WorldSpacePosition';\n\nimport OnIdle from '../ui/ui_element_state/OnIdle';\nimport OnMouseEnter from '../ui/ui_element_state/OnMouseEnter';\nimport OnMouseExit from '../ui/ui_element_state/OnMouseExit';\nimport OnMouseHover from '../ui/ui_element_state/OnMouseHover';\n\nimport { Mesh } from 'three';\nimport { PlaneGeometry } from 'three';\nimport { Vector2 } from 'three';\nimport { Vector3 } from 'three';\nimport { NearestFilter } from 'three';\nimport { Box2 } from 'three';\n\nexport default class UIElement extends Mesh\n{\n constructor(vert, frag)\n {\n super(new PlaneGeometry(1, 1), new UIElementMaterial());\n\n this.is_clickable = false;\n\n this.position_strategy = new WorldSpacePosition();\n this.current_state = new OnIdle();\n\n this._position = new Vector3();\n\n this._on_idle_state = new OnIdle();\n this._on_enter_state = new OnMouseEnter();\n this._on_exit_state = new OnMouseExit();\n this._on_hover_state = new OnMouseHover();\n\n this.on_enter = undefined;\n this.on_exit = undefined;\n this.on_hover = undefined;\n\n this.mouse_pos_tmp = new Vector2();\n this.cached_NDC_position = new Vector2();\n this.screen_pos_tmp = new Vector2();\n\n this.texture_size = new Vector2(1, 1);\n\n this.frustumCulled = false;\n this.matrixAutoUpdate = false;\n this.renderOrder = 0;\n\n this.size = 1;\n this.pixel_offset = new Vector2();\n }\n\n set_render_order(value)\n {\n this.renderOrder = value;\n }\n\n get pivot_point()\n {\n return this.material.uniforms._PivotPoint.value;\n }\n\n set_pixel_offset(offset)\n {\n this.pixel_offset.copy(offset);\n this.material.uniforms._PixelOffset.value.copy(offset);\n }\n\n set_state(new_state)\n {\n this.current_state.on_exit(this);\n this.current_state = new_state;\n this.current_state.on_enter(this);\n }\n\n get position()\n {\n return this._position;\n }\n\n set use_depth(boolean)\n {\n this.material.depthTest = boolean;\n }\n\n get use_depth()\n {\n return this.material.depthTest;\n }\n\n set depth_offset(value)\n {\n this.material.uniforms._DepthOffset.value = value;\n }\n\n get depth_offset()\n {\n return this.material.uniforms._DepthOffset.value;\n }\n\n clear_state()\n {\n this.visible = false;\n }\n\n set_world_space_coordinate_system()\n {\n this.position_strategy = new WorldSpacePosition();\n }\n\n set_screen_space_coordinate_system()\n {\n this.position_strategy = new ScreenSpacePosition();\n }\n\n set_texture(texture)\n {\n texture.minFilter = NearestFilter;\n texture.magFilter = NearestFilter;\n texture.needsUpdate = true;\n\n this.texture_size.set(texture.image.width, texture.image.height);\n\n this.material.uniforms._MainTex.value = texture;\n this.get_size(this.material.uniforms._TextureSize.value);\n this.visible = true;\n }\n\n update_state(normalized_mouse_pos)\n {\n this.material.uniforms._ScreenSize.value.set(Screen.width, Screen.height);\n this.get_size(this.material.uniforms._TextureSize.value);\n\n this.cached_NDC_position.copy(this.position_strategy.get_pos_NDC(this.position));\n this.material.uniforms._NDC.value.copy(this.position);\n this.current_state.update(this, normalized_mouse_pos);\n }\n\n is_mouse_over(normalized_mouse_pos)\n {\n this.screen_pos_tmp.copy(this.cached_NDC_position);\n this.to_screen_position(this.screen_pos_tmp);\n this.screen_pos_tmp.x += this.pixel_offset.x;\n this.screen_pos_tmp.y += this.pixel_offset.y;\n\n let rect = new Box2().setFromCenterAndSize(this.screen_pos_tmp, this.get_size());\n\n this.mouse_pos_tmp.copy(normalized_mouse_pos);\n this.to_screen_position(this.mouse_pos_tmp);\n\n return rect.containsPoint(this.mouse_pos_tmp);\n }\n\n to_screen_position(projected_pos)\n {\n projected_pos.x = (projected_pos.x * 0.5 + 0.5) * Screen.width + this.pixel_offset.x;\n projected_pos.y = (projected_pos.y * 0.5 + 0.5) * Screen.height + this.pixel_offset.y;\n }\n\n get_screen_space_position()\n {\n let pos = this.cached_NDC_position.clone();\n this.to_screen_position(pos);\n return pos;\n }\n\n set_screen_space_position(screen_pos)\n {\n this.position.x = (screen_pos.x / Screen.width) * 2 - 1;\n this.position.y = (screen_pos.y / Screen.height) * 2 - 1;\n }\n\n dispose()\n {\n if (this.material.uniforms._MainTex.value)\n {\n this.material.uniforms._MainTex.value.dispose();\n }\n Screen.remove_screen_material(this.material);\n this.geometry.dispose();\n this.material.dispose();\n }\n\n get_size(vector2)\n {\n if (vector2)\n {\n return vector2.copy(this.texture_size).multiplyScalar(this.size / Screen.dpr);\n }\n else\n {\n return new Vector2().copy(this.texture_size).multiplyScalar(this.size / Screen.dpr);\n }\n }\n\n on_mouse_enter()\n {}\n\n on_mouse_exit()\n {}\n\n on_mouse_hover()\n {}\n}\n","import { Mesh } from 'three';\n\nexport default class UpdatableMaterialMesh extends Mesh\n{\n constructor(geometry, material)\n {\n super(geometry, material);\n\n let self = this;\n\n this.onBeforeRender = () =>\n {\n self.material.update();\n };\n }\n}\n","import { Vector2, Vector4 } from 'three';\n\nexport default class TextGlyph\n{\n constructor(offset, plane_bounds, atlas_bounds)\n {\n let width = plane_bounds.right - plane_bounds.left;\n let height = plane_bounds.top - plane_bounds.bottom;\n\n this.scale = new Vector2(width, height);\n this.position = new Vector2(offset + plane_bounds.left, plane_bounds.bottom);\n\n this.atlas_bounds = new Vector4(atlas_bounds.left, atlas_bounds.right, atlas_bounds.top, atlas_bounds.bottom);\n }\n}\n","import { Vector3, Quaternion, Matrix4, Color, Box2, Vector2 } from 'three';\nimport TextGlyph from './TextGlyph';\n\nexport default class SDFText\n{\n constructor(glyph_layout, text = '')\n {\n this.glyph_layout = glyph_layout;\n\n this.glyphs = [];\n\n this.glyph_is_dirty = true;\n this.matrix_is_dirty = true;\n this.color_is_dirty = true;\n\n this.position = new Vector3();\n this.quaternion = new Quaternion();\n this.scale = new Vector3(1, 1, 1);\n this.matrix = new Matrix4();\n\n this.color = new Color('#FFFFFF');\n\n this.pivot_point = new Vector2();\n this.__opacity = 1;\n\n this.__text = text;\n\n this.__generate_glyphs(text);\n }\n\n set text(value)\n {\n this.__text = value;\n this.__generate_glyphs(value);\n this.matrix_is_dirty = true;\n }\n\n get text()\n {\n return this.__text;\n }\n\n update_matrix()\n {\n this.matrix.compose(this.position, this.quaternion, this.scale);\n this.matrix_is_dirty = false;\n this.glyph_is_dirty = true;\n }\n\n clear_glyph_dirty()\n {\n this.glyph_is_dirty = false;\n }\n\n clear_color_dirty()\n {\n this.color_is_dirty = false;\n }\n\n set_rotation(orientation = 0, tilt = 0) // 0..360, -90..0..90\n {\n let new_orientation = new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), (orientation / 360) * Math.PI * 2);\n let new_tilt = new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), (-tilt / 360) * Math.PI * 2);\n\n this.quaternion.copy(new_orientation.multiply(new_tilt));\n this.matrix_is_dirty = true;\n }\n\n set_position(pos)\n {\n this.position.copy(pos);\n this.matrix_is_dirty = true;\n }\n\n set_size(size)\n {\n this.scale.set(size, size, size);\n this.matrix_is_dirty = true;\n }\n\n set_color(col)\n {\n this.color.set(col);\n this.color_is_dirty = true;\n }\n\n set_pivot(pivot)\n {\n this.pivot_point.copy(pivot);\n this.update_glyphs();\n }\n\n set opacity(op)\n {\n this.__opacity = op;\n this.color_is_dirty = true;\n }\n\n get opacity()\n {\n return this.__opacity;\n }\n\n update_glyphs()\n {\n this.__generate_glyphs(this.text);\n }\n\n __generate_glyphs(text)\n {\n let cursor = 0;\n\n this.glyphs.length = 0;\n\n for (let i = 0; i < text.length; i++)\n {\n let unicode = text.charCodeAt(i);\n let glyph = this.glyph_layout.find(element => element.unicode === unicode);\n if (glyph)\n {\n if (glyph.planeBounds)\n {\n let text_glyph = new TextGlyph(cursor, glyph.planeBounds, glyph.atlasBounds);\n this.glyphs.push(text_glyph);\n }\n cursor += glyph.advance;\n }\n }\n\n let box2 = new Box2();\n let first_glyph = this.glyphs[0];\n box2.setFromCenterAndSize(first_glyph.position.clone().add(new Vector2(first_glyph.scale.x / 2, first_glyph.scale.y / 2)), first_glyph.scale);\n\n for (let i = 1; i < this.glyphs.length; i++)\n {\n let g = this.glyphs[i];\n let box = new Box2().setFromCenterAndSize(g.position.clone().add(new Vector2(g.scale.x / 2, g.scale.y / 2)), g.scale);\n box2.union(box);\n }\n\n let box2_size = new Vector2();\n box2.getSize(box2_size);\n for (let i = 0; i < this.glyphs.length; i++)\n {\n this.glyphs[i].position.x -= box2_size.x / 2;\n this.glyphs[i].position.y -= box2_size.y / 2;\n\n this.glyphs[i].position.x += (box2_size.x / 2) * this.pivot_point.x;\n this.glyphs[i].position.y += (box2_size.y / 2) * this.pivot_point.y;\n }\n\n this.glyph_is_dirty = true;\n }\n}\n","import BaseShaderMaterial from './BaseShaderMaterial';\nimport frag from '../shaders/sdf_text/sdf_text.frag';\nimport vert from '../shaders/sdf_text/sdf_text.vert';\n\nimport { Vector2, DoubleSide, LinearFilter, Math as TMath } from 'three';\n\nexport default class SDFTextMaterial extends BaseShaderMaterial\n{\n constructor(texture)\n {\n super(vert, frag, {\n _Texture: { value: texture },\n _Boldness: { value: 0.5 },\n _AtlasSize: { value: new Vector2(1, 1) }\n });\n\n this.transparent = true;\n this.extensions = {\n derivatives: true\n };\n this.depthWrite = false;\n this.side = DoubleSide;\n texture.minFilter = LinearFilter;\n texture.magFilter = LinearFilter;\n texture.generateMipMaps = false;\n }\n\n set_atlas_size(size)\n {\n this.uniforms._AtlasSize.value.copy(size);\n }\n\n set_boldness(value)\n {\n this.uniforms._Boldness.value = TMath.lerp(0.5, 0.2, value);\n }\n}\n","import SDFText from './SDFText';\nimport SDFTextMaterial from '../../materials/SDFTextMaterial';\nimport ArrayUtilities from '../../utilities/ArrayUtilities';\n\nimport {\n PlaneBufferGeometry,\n Mesh,\n Vector2,\n InstancedBufferGeometry,\n InstancedBufferAttribute,\n Float32BufferAttribute,\n DynamicDrawUsage\n} from 'three';\n\nexport default class SDFTextBatch extends Mesh\n{\n constructor(font_layout, atlas_texture)\n {\n let max_allocations = 2000;\n\n let instanced_geometry = new InstancedBufferGeometry();\n instanced_geometry.instanceCount = 0;\n\n let geometry = new PlaneBufferGeometry(1, 1);\n geometry.translate(0.5, 0.5, 0);\n instanced_geometry.setAttribute('position', new Float32BufferAttribute(geometry.getAttribute('position').array, 3));\n instanced_geometry.setAttribute('uv', new Float32BufferAttribute(geometry.getAttribute('uv').array, 2));\n instanced_geometry.index = geometry.index;\n\n let transformsCol0 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n let transformsCol1 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n let transformsCol2 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n let transformsCol3 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n\n let glyph_bounds = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n let plane_bounds = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n\n let color = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n\n transformsCol0.usage = DynamicDrawUsage;\n transformsCol1.usage = DynamicDrawUsage;\n transformsCol2.usage = DynamicDrawUsage;\n transformsCol3.usage = DynamicDrawUsage;\n glyph_bounds.usage = DynamicDrawUsage;\n plane_bounds.usage = DynamicDrawUsage;\n color.usage = DynamicDrawUsage;\n\n instanced_geometry.setAttribute('transformsCol0', transformsCol0);\n instanced_geometry.setAttribute('transformsCol1', transformsCol1);\n instanced_geometry.setAttribute('transformsCol2', transformsCol2);\n instanced_geometry.setAttribute('transformsCol3', transformsCol3);\n\n instanced_geometry.setAttribute('glyph_bounds', glyph_bounds);\n instanced_geometry.setAttribute('plane_bounds', plane_bounds);\n instanced_geometry.setAttribute('color', color);\n\n super(instanced_geometry, new SDFTextMaterial(atlas_texture));\n\n this.text_elements = [];\n this.font_layout = font_layout;\n\n this.material.set_atlas_size(new Vector2(font_layout.atlas.width, font_layout.atlas.height));\n\n this.frustumCulled = false;\n }\n\n set_boldness(value)\n {\n this.material.set_boldness(value);\n }\n\n add_text(text_str)\n {\n let elem = new SDFText(this.font_layout.glyphs, text_str);\n this.text_elements.push(elem);\n return elem;\n }\n\n remove_text(text_elem)\n {\n ArrayUtilities.remove_elem(this.text_elements, text_elem);\n this.update(true);\n }\n\n update(force_update)\n {\n let glyph_bounds_atr = this.geometry.getAttribute('glyph_bounds');\n let plane_bounds_atr = this.geometry.getAttribute('plane_bounds');\n\n let transformsCol0 = this.geometry.getAttribute('transformsCol0');\n let transformsCol1 = this.geometry.getAttribute('transformsCol1');\n let transformsCol2 = this.geometry.getAttribute('transformsCol2');\n let transformsCol3 = this.geometry.getAttribute('transformsCol3');\n\n let color_atr = this.geometry.getAttribute('color');\n\n let matrix_needs_update = force_update === true;\n let glyph_needs_update = force_update === true;\n let color_needs_update = force_update === true;\n\n let glyph_count = 0;\n for (let i = 0; i < this.text_elements.length; i++)\n {\n let text = this.text_elements[i];\n\n if (text.matrix_is_dirty)\n {\n matrix_needs_update = true;\n text.update_matrix();\n }\n\n if (text.glyph_is_dirty)\n {\n glyph_needs_update = true;\n text.clear_glyph_dirty();\n }\n\n if (text.color_is_dirty)\n {\n color_needs_update = true;\n text.clear_color_dirty();\n }\n\n let matrix = text.matrix;\n let color = text.color;\n let opacity = text.opacity;\n\n for (let glyph_i = 0; glyph_i < text.glyphs.length; glyph_i++)\n {\n let glyph = text.glyphs[glyph_i];\n\n let buffer_i = glyph_count;\n\n glyph_bounds_atr.setXYZW(buffer_i, glyph.atlas_bounds.x, glyph.atlas_bounds.y, glyph.atlas_bounds.z, glyph.atlas_bounds.w);\n plane_bounds_atr.setXYZW(buffer_i, glyph.position.x, glyph.position.y, glyph.scale.x, glyph.scale.y);\n\n transformsCol0.setXYZW(buffer_i, matrix.elements[0],\n matrix.elements[1],\n matrix.elements[2],\n matrix.elements[3]);\n\n transformsCol1.setXYZW(buffer_i, matrix.elements[4],\n matrix.elements[5],\n matrix.elements[6],\n matrix.elements[7]);\n\n transformsCol2.setXYZW(buffer_i, matrix.elements[8],\n matrix.elements[9],\n matrix.elements[10],\n matrix.elements[11]);\n\n transformsCol3.setXYZW(buffer_i, matrix.elements[12],\n matrix.elements[13],\n matrix.elements[14],\n matrix.elements[15]);\n\n color_atr.setXYZW(buffer_i, color.r, color.g, color.b, opacity);\n\n glyph_count++;\n }\n }\n\n this.geometry.instanceCount = glyph_count;\n\n if (glyph_count > this.max_allocations)\n {\n console.error('SDFTextBatch exceeded maximum glyph allocations(max/current): ', this.max_allocations, glyph_count, this);\n }\n\n if (matrix_needs_update)\n {\n transformsCol0.needsUpdate = true;\n transformsCol1.needsUpdate = true;\n transformsCol2.needsUpdate = true;\n transformsCol3.needsUpdate = true;\n }\n if (glyph_needs_update)\n {\n glyph_bounds_atr.needsUpdate = true;\n plane_bounds_atr.needsUpdate = true;\n }\n if (color_needs_update)\n {\n color_atr.needsUpdate = true;\n }\n }\n\n dispose()\n {\n this.geometry.dispose();\n this.material.dispose();\n }\n}\n","import ActionInterpolator from './ActionInterpolator';\n\nexport default class VectorInterpolator extends ActionInterpolator\n{\n constructor(attribute_name, from = 0, to = 1, easing_function = 'linear')\n {\n super(easing_function);\n\n this.attribute_name = attribute_name;\n this.from = from;\n this.to = to;\n }\n\n update(context, t)\n {\n let tmp = this.from.clone();\n tmp.lerp(this.to, this.easing_function(t));\n context[this.attribute_name].copy(tmp);\n }\n}\n","import BlitMaterial from '../materials/BlitMaterial';\nimport frag from '../shaders/median_filter/median_filter.frag';\n\nimport { Vector2 } from 'three';\n\nexport default class MedianFilterMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag, undefined, {\n kernel3x3: true\n });\n\n this.uniforms._SourceTex = { value: undefined };\n this.uniforms._SourceTexSize = { value: new Vector2(1, 1) };\n }\n\n set_texture(tex)\n {\n this.uniforms._SourceTex.value = tex;\n\n let size = this.get_size(tex);\n this.uniforms._SourceTexSize.value.copy(size);\n }\n\n get_size(tex)\n {\n if (tex.isVideoTexture)\n {\n return new Vector2(Math.max(1, tex.image.videoWidth), Math.max(1, tex.image.videoHeight));\n }\n if (tex.isWebGLRenderTarget)\n {\n return new Vector2(tex.width, tex.height);\n }\n if (tex.isTexture)\n {\n return new Vector2(tex.image.width, tex.image.height);\n }\n return new Vector2(1, 1);\n }\n}\n","import MedianFilterMaterial from '../materials/MedianFilterMaterial';\nimport Graphics from '../Graphics';\n\nimport { WebGLRenderTarget, Vector2, RGBAFormat, FloatType, NearestFilter } from 'three';\n\nexport default class MedianFilter\n{\n constructor(renderer)\n {\n this.RT = new WebGLRenderTarget(1, 1, {\n type: FloatType,\n format: RGBAFormat,\n minFilter: NearestFilter,\n magFilter: NearestFilter\n });\n this.RT1 = new WebGLRenderTarget(1, 1, {\n type: FloatType,\n format: RGBAFormat,\n minFilter: NearestFilter,\n magFilter: NearestFilter\n });\n\n this.median_filter_mat = new MedianFilterMaterial();\n }\n\n filter(texture)\n {\n let tex_size = this.get_size(texture);\n if (tex_size.x !== this.RT.width || tex_size.y !== this.RT.height)\n {\n this.RT.setSize(tex_size.x, tex_size.y);\n this.RT1.setSize(tex_size.x, tex_size.y);\n }\n\n this.median_filter_mat.set_texture(texture);\n Graphics.material_pass(this.median_filter_mat, this.RT);\n\n for (let i = 0; i < 0; i++)\n {\n this.median_filter_mat.set_texture(this.RT.texture);\n Graphics.material_pass(this.median_filter_mat, this.RT1);\n\n this.median_filter_mat.set_texture(this.RT1.texture);\n Graphics.material_pass(this.median_filter_mat, this.RT);\n }\n\n return this.RT;\n }\n\n get_size(tex)\n {\n if (tex.isVideoTexture)\n {\n return new Vector2(Math.max(1, tex.image.videoWidth), Math.max(1, tex.image.videoHeight));\n }\n if (tex.isWebGLRenderTarget)\n {\n return new Vector2(tex.width, tex.height);\n }\n if (tex.isTexture)\n {\n return new Vector2(tex.image.width, tex.image.height);\n }\n return new Vector2(1, 1);\n }\n}\n","import BlitMaterial from './BlitMaterial';\nimport downsample_frag from '../shaders/dual_filter_blur/downsample.frag';\nimport upsample_frag from '../shaders/dual_filter_blur/upsample.frag';\n\nexport default class DualFilteringBlurMaterial extends BlitMaterial\n{\n constructor(upsample)\n {\n super(upsample ? upsample_frag : downsample_frag);\n }\n}\n","import BlitMaterial from './BlitMaterial';\nimport frag from '../shaders/dual_filter_blur/alpha_filter.frag';\n\nexport default class AlphaFilterMaterial extends BlitMaterial\n{\n constructor(use_alpha_mask, upsample)\n {\n super(frag);\n }\n\n set offset(value)\n {\n this.uniforms._Offset.value = value;\n }\n\n get offset()\n {\n return this.uniforms._Offset.value;\n }\n}\n","import DualFilteringBlurMaterial from '../materials/DualFilteringBlurMaterial';\nimport AlphaFilterMaterial from '../materials/AlphaFilterMaterial';\nimport Graphics from '../Graphics';\nimport { WebGLRenderTarget } from 'three';\nexport default class DualFilteringBlurrer\n{\n constructor(use_alpha_mask)\n {\n this.current_width = 1;\n this.current_height = 1;\n this.RT0 = new WebGLRenderTarget(1, 1);\n this.RT1 = new WebGLRenderTarget(1, 1);\n this.RT2 = new WebGLRenderTarget(1, 1);\n this.RT3 = new WebGLRenderTarget(1, 1);\n this.RT4 = new WebGLRenderTarget(1, 1);\n\n this.upscale_blur_mat = new DualFilteringBlurMaterial(true);\n this.downscale_blur_mat = new DualFilteringBlurMaterial(false);\n\n this.alpha_filter_mat = new AlphaFilterMaterial();\n }\n\n blur(RT)\n {\n this.check_RT_resize(RT.width, RT.height);\n Graphics.blit(RT, this.RT1, this.alpha_filter_mat);\n\n // Graphics.blit(this.RT0, this.RT1, this.downscale_blur_mat);\n Graphics.blit(this.RT1, this.RT2, this.downscale_blur_mat);\n Graphics.blit(this.RT2, this.RT3, this.downscale_blur_mat);\n Graphics.blit(this.RT3, this.RT4, this.downscale_blur_mat);\n\n // Graphics.blit(this.RT4, this.RT3, this.upscale_blur_mat);\n // Graphics.blit(this.RT3, this.RT4, this.upscale_blur_mat);\n Graphics.blit(this.RT4, this.RT3, this.upscale_blur_mat);\n Graphics.blit(this.RT3, this.RT2, this.upscale_blur_mat);\n Graphics.blit(this.RT2, RT, this.upscale_blur_mat);\n // Graphics.blit(this.RT1, RT, this.upscale_blur_mat);\n\n // return this.RT2;\n }\n\n check_RT_resize(width, height)\n {\n if (this.current_width !== width || this.current_height !== height)\n {\n this.current_width = width;\n this.current_height = height;\n this.RT0.setSize(this.current_width / 2, this.current_height / 2);\n this.RT1.setSize(this.current_width / 2, this.current_height / 2);\n this.RT2.setSize(this.current_width / 4, this.current_height / 4);\n this.RT3.setSize(this.current_width / 8, this.current_height / 8);\n this.RT4.setSize(this.current_width / 16, this.current_height / 16);\n }\n }\n}\n","import { Object3D } from 'three';\nimport { BufferAttribute } from 'three';\nimport { Points } from 'three';\n\nexport default class GPUParticleSystem extends Object3D\n{\n constructor()\n {\n super();\n this.attributes = [];\n\n this.particles = undefined;\n }\n\n set_from_geometry(geometry, material, init_attribute_uvs)\n {\n // let position = new ParticlePositionAttribute(\"_Position\");\n if (init_attribute_uvs && geometry.getAttribute('storage_uv') === undefined)\n {\n let uv_storage_attr = this.build_uv_storage_attribute(geometry.getAttribute('position').count);\n geometry.setAttribute('storage_uv', uv_storage_attr);\n }\n // position.init_from_geometry(geometry);\n // this.attributes.push(position);\n\n // material.uniforms._Position.value = position.read.texture;\n\n let points = new Points(geometry, material);\n points.frustumCulled = false;\n this.particles = points;\n\n this.add(points);\n }\n\n add_texture_attribute(buffer_attribute)\n {\n\n }\n\n add_attribute(name, buffer_attribute)\n {\n\n }\n\n build_uv_storage_attribute(particle_count)\n {\n let resolution = this.calculate_resolution(particle_count);\n let uvs = new Float32Array(particle_count * 2);\n for (let i = 0, j = 0; i < particle_count * 2; i += 2, j++)\n {\n uvs[i] = ((j % resolution) / resolution) + (0.5 / resolution);\n uvs[i + 1] = (Math.floor(j / resolution) / resolution) + (0.5 / resolution);\n }\n\n return new BufferAttribute(uvs, 2);\n }\n\n calculate_resolution(particle_count)\n {\n return Math.ceil(Math.sqrt(particle_count));\n }\n\n update()\n {\n for (let i = 0; i < this.attributes.length; i++)\n {\n this.attributes[i].update();\n }\n }\n\n set_attribute_update_material(attribute_name, mat)\n {\n for (let i = 0; i < this.attributes.length; i++)\n {\n if (this.attributes[i].name === attribute_name)\n {\n this.attributes[i].update_material = mat;\n }\n }\n }\n\n dispose()\n {\n this.particles.geometry.dispose();\n this.particles.material.dispose();\n }\n}\n","import { DataTexture } from 'three';\n\nexport default class CustomDataTexture extends DataTexture\n{\n constructor(data, width, height, format, type)\n {\n super(data, width, height, format, type);\n this.multiplier = 1;\n }\n\n set_rgba(index, r, g, b, a)\n {\n this.data[index * 3 + 0] = r * this.multiplier;\n this.data[index * 3 + 1] = g * this.multiplier;\n this.data[index * 3 + 2] = b * this.multiplier;\n this.data[index * 3 + 3] = a * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_rgb(index, r, g, b)\n {\n this.data[index * 3 + 0] = r * this.multiplier;\n this.data[index * 3 + 1] = g * this.multiplier;\n this.data[index * 3 + 2] = b * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_r(index, value)\n {\n this.data[index * 3 + 0] = value * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_g(index, value)\n {\n this.data[index * 3 + 1] = value * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_b(index, value)\n {\n this.data[index * 3 + 2] = value * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_a(index, value)\n {\n this.data[index * 3 + 2] = value * this.multiplier;\n this.needsUpdate = true;\n }\n}\n","import CustomDataTexture from './CustomDataTexture';\nimport { RGBFormat } from 'three';\n\nexport default class RGBDataTexture extends CustomDataTexture\n{\n constructor(width, height)\n {\n let data = new Uint8Array(width * height * 3);\n super(data, width, height, RGBFormat);\n this.multiplier = 255;\n }\n}\n","import CustomDataTexture from './CustomDataTexture';\nimport { RGBAFormat } from 'three';\n\nexport default class RGBADataTexture extends CustomDataTexture\n{\n constructor(width, height)\n {\n let data = new Uint8Array(width * height * 4);\n super(data, width, height, RGBAFormat);\n this.multiplier = 255;\n }\n}\n","import CustomDataTexture from './CustomDataTexture';\nimport { FloatType } from 'three';\nimport { RGBFormat } from 'three';\n\nexport default class RGBFloatDataTexture extends CustomDataTexture\n{\n constructor(width, height)\n {\n let data = new Float32Array(width * height * 3);\n super(data, width, height, RGBFormat, FloatType);\n }\n}\n","import CustomDataTexture from './CustomDataTexture';\nimport { FloatType } from 'three';\nimport { RGBAFormat } from 'three';\n\nexport default class RGBAFloatDataTexture extends CustomDataTexture\n{\n constructor(width, height)\n {\n let data = new Float32Array(width * height * 4);\n super(data, width, height, RGBAFormat, FloatType);\n }\n}\n","import { Mesh } from 'three';\nimport RGBDataTexture from '../data_textures/RGBDataTexture';\nimport RGBADataTexture from '../data_textures/RGBADataTexture';\nimport RGBFloatDataTexture from '../data_textures/RGBFloatDataTexture';\nimport RGBAFloatDataTexture from '../data_textures/RGBAFloatDataTexture';\n\nexport default class BatchedMesh extends Mesh\n{\n constructor(id_table, geometry, material, max_texture_width)\n {\n super(geometry, material);\n\n this.id_table = id_table;\n this.batched_count = Object.keys(id_table).length;\n this.max_texture_width = max_texture_width;\n this.batch_width = this.batched_count % max_texture_width;\n this.batch_height = Math.ceil(this.batched_count / max_texture_width);\n }\n\n attach_rgb_texture(uniform_name)\n {\n this.material.uniforms[uniform_name].value = new RGBDataTexture(this.batch_width, this.batch_height);\n }\n\n attach_rgba_texture(uniform_name)\n {\n this.material.uniforms[uniform_name].value = new RGBADataTexture(this.batch_width, this.batch_height);\n }\n\n attach_rgb_float_texture(uniform_name)\n {\n this.material.uniforms[uniform_name].value = new RGBFloatDataTexture(this.batch_width, this.batch_height);\n }\n\n attach_rgba_float_texture(uniform_name)\n {\n this.material.uniforms[uniform_name].value = new RGBAFloatDataTexture(this.batch_width, this.batch_height);\n }\n\n get_mesh_index(name)\n {\n return this.id_table[name];\n }\n\n set_rgb_value(uniform_name, mesh_name, r, g, b)\n {\n this.material.uniforms[uniform_name].set_rgb(this.get_mesh_index(mesh_name), r, g, b);\n }\n\n set_rgba_value(uniform_name, mesh_name, r, g, b, a)\n {\n this.material.uniforms[uniform_name].set_rgba(this.get_mesh_index(mesh_name), r, g, b, a);\n }\n}\n","import BatchedMesh from './BatchedMesh';\n\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\n\nimport { BufferAttribute } from 'three';\n\nexport default class MeshBatcher\n{\n batch(meshes, material)\n {\n let max_texture_width = 2048;\n // let texture_width = meshes.length % max_texture_width;\n // let texture_height = Math.ceil(meshes.length / max_texture_width);\n\n // console.log(\"Store count: \" + buffer_geometries.length + \", Texture size: \" +texture_width);\n\n let geometries = [];\n let id_table = {};\n\n let attr_mesh_id = [];\n\n for (let i = 0; i < meshes.length; i++)\n {\n let mesh = meshes[i];\n let vertex_count = mesh.geometry.getAttribute('position').count;\n\n for (let count = 0; count < vertex_count; count++)\n {\n attr_mesh_id.push(i);\n }\n\n geometries.push(mesh.geometry);\n\n if (id_table[mesh.name] === undefined)\n {\n id_table[mesh.name] = i;\n }\n else\n {\n console.error('Mesh name is duplicated when trying to merge meshes. Non-unique id error.', mesh.name, id_table);\n }\n }\n\n let buffer_geometry = BufferGeometryUtils.mergeBufferGeometries(geometries);\n\n let buffer_attribute = new BufferAttribute(new Float32Array(attr_mesh_id), 1);\n buffer_geometry.setAttribute('mesh_id', buffer_attribute);\n\n return this.create_batched_mesh(id_table, buffer_geometry, material, max_texture_width);\n }\n\n create_batched_mesh(id_table, buffer_geometry, material, max_texture_width)\n {\n return new BatchedMesh(id_table, buffer_geometry, material, max_texture_width);\n }\n}\n","import { Audio as TAudio } from 'three';\nimport { PositionalAudio as TPositionalAudio } from 'three';\n\nexport default class AudioClip\n{\n constructor(buffer, loop = true, volume = 1, positional = false)\n {\n this.buffer = buffer;\n this.loop = loop;\n this.volume = volume;\n this.positional = positional;\n\n this.audio = undefined;\n }\n\n init(audio_listener)\n {\n if (this.positional)\n {\n this.audio = new TPositionalAudio(audio_listener);\n }\n else\n {\n this.audio = new TAudio(audio_listener);\n }\n\n this.audio.setBuffer(this.buffer);\n this.audio.setLoop(this.loop);\n\n // This prevents undesired volume at the beginning of playing\n this.audio.gain.gain.value = 0;\n\n this.audio.setVolume(this.loop ? 0 : this.volume);\n }\n\n play()\n {\n this.audio.play();\n }\n\n pause()\n {\n this.audio.pause();\n }\n\n stop()\n {\n this.audio.stop();\n }\n\n get is_playing()\n {\n return this.audio.isPlaying;\n }\n}\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport AudioClip from '../components/AudioClip';\r\n\r\nimport { AudioContext } from 'three';\r\n\r\nexport default class AudioLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, loop = true, volume = 0, size, positional = false)\r\n {\r\n super(resource_id, url, size);\r\n this.loop = loop;\r\n this.volume = volume;\r\n this.positional = positional;\r\n }\r\n\r\n on_preloaded_finished(resource_container, response)\r\n {\r\n if (!window.user_interaction_for_audio)\r\n {\r\n setTimeout(this.on_preloaded_finished.bind(this, resource_container, response), 100);\r\n }\r\n else\r\n {\r\n this.instantiate_audio(resource_container, response);\r\n }\r\n }\r\n\r\n instantiate_audio(resource_container, response)\r\n {\r\n response.arrayBuffer().then((array_buffer) =>\r\n {\r\n const context = AudioContext.getContext();\r\n context.decodeAudioData(array_buffer, (audio_buffer) =>\r\n {\r\n resource_container.set_resource(\r\n this.resource_id,\r\n this.url,\r\n new AudioClip(audio_buffer, this.loop, this.volume, this.positional)\r\n );\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n });\r\n });\r\n }\r\n}\r\n","import AbstractLoader from './AbstractLoader';\n\nimport { sRGBEncoding } from 'three';\n\nexport default class BasisLoader extends AbstractLoader\n{\n constructor(resource_id, url, renderer, loader, size)\n {\n super(resource_id, url, size);\n\n this.loader = loader;\n\n this.loader.setWorkerLimit(1);\n\n this.loader.setTranscoderPath(\n 'libs/basis/'\n );\n\n this.loader.detectSupport(renderer);\n }\n\n on_preloaded_finished(resource_container)\n {\n let ctx = this;\n\n this.loader.load(this.url, (basis) =>\n {\n basis.encoding = sRGBEncoding;\n\n resource_container.set_resource(ctx.resource_id, ctx.url, basis);\n\n ctx.__update_downloaded_bytes(1, 1);\n ctx.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n ctx.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\n ctx.__loading_ended();\n }\n );\n }\n}\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { CubeTextureLoader as THREECubeTextureLoader } from 'three';\r\n\r\nexport default class CubemapLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREECubeTextureLoader();\r\n this.loader.setPath(url + '/');\r\n this.urls = [\r\n 'px.png',\r\n 'nx.png',\r\n 'py.png',\r\n 'ny.png',\r\n 'pz.png',\r\n 'nz.png'\r\n ];\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n let ctx = this;\r\n\r\n this.loader.load(this.urls, (image) =>\r\n {\r\n resource_container.set_resource(ctx.resource_id, ctx.url, image);\r\n\r\n ctx.__update_downloaded_bytes(1, 1);\r\n ctx.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (error) =>\r\n {\r\n ctx.__set_error('Image could not be loaded. Maybe wrong name or path, I don\\'t know' + '¯\\\\_(ツ)_/¯', error);\r\n ctx.__loading_ended();\r\n }\r\n );\r\n }\r\n}\r\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport * as THREEColladaLoader from 'three/examples/jsm/loaders/ColladaLoader.js';\r\n\r\nexport default class DAELoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREEColladaLoader.ColladaLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n let ctx = this;\r\n\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(ctx.resource_id, ctx.url, gltf);\r\n\r\n ctx.__update_downloaded_bytes(1, 1);\r\n ctx.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n ctx.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n ctx.__loading_ended();\r\n }\r\n );\r\n }\r\n}\r\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { FileLoader as THREEFileLoader } from 'three';\r\n\r\nexport default class FileLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREEFileLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n let ctx = this;\r\n\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(ctx.resource_id, ctx.url, gltf);\r\n\r\n ctx.__update_downloaded_bytes(1, 1);\r\n ctx.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n ctx.__set_error(msg);\r\n ctx.__loading_ended();\r\n }\r\n );\r\n }\r\n}\r\n","import AbstractLoader from './AbstractLoader';\n\nimport { FontLoader as TFontLoader } from 'three/examples/jsm/loaders/FontLoader.js';\n\nexport default class FontLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n this.loader = new TFontLoader();\n }\n\n on_preloaded_finished(resource_container)\n {\n let ctx = this;\n\n this.loader.load(this.url, (font) =>\n {\n resource_container.set_resource(ctx.resource_id, ctx.url, font);\n\n ctx.__update_downloaded_bytes(1, 1);\n ctx.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n ctx.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then probably the problem is related to the file not being found. Check the name and path of the resource');\n ctx.__loading_ended();\n }\n );\n }\n}\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport * as THREEGLTFLoader from 'three/examples/jsm/loaders/GLTFLoader.js';\r\n\r\nexport default class GLTFLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREEGLTFLoader.GLTFLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n let ctx = this;\r\n\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(ctx.resource_id, ctx.url, gltf);\r\n\r\n ctx.__update_downloaded_bytes(1, 1);\r\n ctx.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n\r\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n ctx.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n ctx.__loading_ended();\r\n }\r\n );\r\n }\r\n}\r\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport * as THREEGLTFLoader from 'three/examples/jsm/loaders/GLTFLoader.js';\r\nimport * as THREEDRACOLoader from 'three/examples/jsm/loaders/DRACOLoader.js';\r\n\r\nexport default class GLTFDRACOLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREEGLTFLoader.GLTFLoader();\r\n this.draco_loader = new THREEDRACOLoader.DRACOLoader();\r\n\r\n this.draco_loader.setDecoderPath(window.draco_decoder_path);\r\n this.draco_loader.setDecoderConfig({ type: 'js' });\r\n this.draco_loader.setWorkerLimit(1);\r\n\r\n this.loader.setDRACOLoader(this.draco_loader);\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n let ctx = this;\r\n\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(ctx.resource_id, ctx.url, gltf);\r\n\r\n ctx.__update_downloaded_bytes(1, 1);\r\n ctx.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n ctx.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n ctx.__loading_ended();\r\n }\r\n );\r\n }\r\n}\r\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport * as THREEHDRCubeTextureLoader from 'three/examples/jsm/loaders/HDRCubeTextureLoader.js';\r\nimport { UnsignedByteType } from 'three';\r\n\r\nexport default class HDRCubeTextureLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREEHDRCubeTextureLoader.HDRCubeTextureLoader();\r\n this.url_suffix = ['/px.hdr', '/nx.hdr', '/py.hdr', '/ny.hdr', '/pz.hdr', '/nz.hdr'];\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n let ctx = this;\r\n\r\n this.loader.setPath(this.url)\r\n .setDataType(UnsignedByteType)\r\n .load(this.url_suffix, (hdr) =>\r\n {\r\n resource_container.set_resource(ctx.resource_id, ctx.url, hdr);\r\n\r\n ctx.__update_downloaded_bytes(1, 1);\r\n ctx.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n ctx.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n ctx.__loading_ended();\r\n }\r\n );\r\n }\r\n}\r\n","import AbstractLoader from './AbstractLoader';\n\nimport { FileLoader as THREEFileLoader } from 'three';\n\nexport default class JSONLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n\n this.loader = new THREEFileLoader();\n }\n\n on_preloaded_finished(resource_container)\n {\n let ctx = this;\n\n this.loader.load(this.url, (data) =>\n {\n resource_container.set_resource(ctx.resource_id, ctx.url, JSON.parse(data));\n\n ctx.__update_downloaded_bytes(1, 1);\n ctx.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n ctx.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\n ctx.__loading_ended();\n }\n );\n }\n}\n","import AbstractLoader from './AbstractLoader';\n\nimport * as THREEOBJLoader from 'three/examples/jsm/loaders/OBJLoader.js';\n\nexport default class OBJLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n this.loader = new THREEOBJLoader.OBJLoader();\n }\n\n on_preloaded_finished(resource_container)\n {\n let ctx = this;\n\n this.loader.load(this.url, (gltf) =>\n {\n resource_container.set_resource(ctx.resource_id, ctx.url, gltf);\n\n ctx.__update_downloaded_bytes(1, 1);\n ctx.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n ctx.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then probably the problem is related to the file not being found. Check the name and path of the resource');\n ctx.__loading_ended();\n }\n );\n }\n}\n","import AbstractLoader from './AbstractLoader';\n\nimport { Vector3 as THREEVector3 } from 'three';\nimport { FileLoader as THREEFileLoader } from 'three';\n\nexport default class PointArrayLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n this.loader = new THREEFileLoader();\n }\n\n on_preloaded_finished(resource_container)\n {\n let ctx = this;\n\n this.loader.load(this.url, (text) =>\n {\n resource_container.set_resource(ctx.resource_id, ctx.url, ctx.parse_path(text));\n\n ctx.__update_downloaded_bytes(1, 1);\n ctx.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n ctx.__set_error(msg);\n ctx.__loading_ended();\n }\n );\n }\n\n parse_path(raw_data)\n {\n let string_array = raw_data.split('\\n');\n\n if (string_array[string_array.length - 1] === '')\n {\n string_array.pop();\n }\n\n let positions = [];\n\n for (let i = 0; i < string_array.length; i += 3)\n {\n let x = parseFloat(string_array[i + 0]);\n let y = parseFloat(string_array[i + 1]);\n let z = parseFloat(string_array[i + 2]);\n positions.push(new THREEVector3(x, y, z));\n }\n return positions;\n // let curve = new THREE.CatmullRomCurve3(positions);\n // return curve.getPoints(100);\n }\n}\n","import AbstractLoader from './AbstractLoader';\n\nimport * as THREERGBELoader from 'three/examples/jsm/loaders/RGBELoader.js';\n\nimport { UnsignedByteType as THREEUnsignedByteType } from 'three';\n\nexport default class RGBETextureLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n this.loader = new THREERGBELoader.RGBELoader();\n this.loader.setDataType(THREEUnsignedByteType);\n }\n\n on_preloaded_finished(resource_container)\n {\n let ctx = this;\n\n this.loader.load(this.url, (hdr) =>\n {\n resource_container.set_resource(ctx.resource_id, ctx.url, hdr);\n\n ctx.__update_downloaded_bytes(1, 1);\n ctx.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n ctx.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\n ctx.__loading_ended();\n }\n );\n }\n}\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { FileLoader as THREEFileLoader } from 'three';\r\n\r\nexport default class TextLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREEFileLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n let ctx = this;\r\n\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(ctx.resource_id, ctx.url, gltf);\r\n\r\n ctx.__update_downloaded_bytes(1, 1);\r\n ctx.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n ctx.__set_error(msg);\r\n ctx.__loading_ended();\r\n }\r\n );\r\n }\r\n}\r\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { Texture } from 'three';\r\n\r\nexport default class TextureLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n }\r\n\r\n on_preloaded_finished(resource_container, response)\r\n {\r\n response.blob().then((blob) =>\r\n {\r\n const texture = new Texture();\r\n\r\n const url = URL.createObjectURL(blob);\r\n\r\n const image = new Image();\r\n image.src = url;\r\n\r\n image.onload = () =>\r\n {\r\n texture.image = image;\r\n texture.needsUpdate = true;\r\n\r\n resource_container.set_resource(this.resource_id, this.url, texture);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n };\r\n });\r\n }\r\n}\r\n","import AbstractLoader from './AbstractLoader';\n\nexport default class VideoLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n }\n\n on_preloaded_finished(resource_container, response)\n {\n response.blob().then((blob) =>\n {\n resource_container.set_resource(this.resource_id, this.url, URL.createObjectURL(blob));\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n });\n }\n}\n","import ResourceContainer from '../ResourceContainer';\r\n\r\nexport default class ResourceBatch\r\n{\r\n constructor(batch_name)\r\n {\r\n this.resource_loaders = [];\r\n this.batch_name = batch_name || 'unnamed batch';\r\n }\r\n\r\n add_loader(loader)\r\n {\r\n this.resource_loaders.push(loader);\r\n }\r\n\r\n load(resource_container)\r\n {\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n this.resource_loaders[i].load(resource_container || ResourceContainer);\r\n }\r\n }\r\n\r\n get loading_finished()\r\n {\r\n let finished = true;\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n finished = finished && this.resource_loaders[i].has_finished;\r\n }\r\n return finished;\r\n }\r\n\r\n get has_errors()\r\n {\r\n let has_error = false;\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n has_error = has_error || this.resource_loaders[i].has_error;\r\n }\r\n return has_error;\r\n }\r\n\r\n print_errors()\r\n {\r\n console.error('Batch <' + this.batch_name + '> could not load successfully');\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n if (this.resource_loaders[i].has_error)\r\n {\r\n this.resource_loaders[i].print_error();\r\n }\r\n }\r\n }\r\n\r\n get_progress()\r\n {\r\n return this.get_loaded_bytes() / this.get_total_bytes();\r\n }\r\n\r\n get_loaded_bytes()\r\n {\r\n let loaded_bytes = 1;\r\n\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n loaded_bytes += this.resource_loaders[i].loaded_bytes;\r\n }\r\n\r\n return loaded_bytes;\r\n }\r\n\r\n get_total_bytes()\r\n {\r\n let total_bytes = 1;\r\n\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n total_bytes += this.resource_loaders[i].total_bytes;\r\n }\r\n\r\n return total_bytes;\r\n }\r\n}\r\n"],"names":["[object Object]","this","browser_name","agent","window","navigator","userAgent","toLowerCase","indexOf","opr","chrome","name","is_safari","is_chrome","is_edge","is_edge_chromium","has_webm","is_firefox","has_hvec","preferred_video_extension","Validation","n","Number","is_int","is_float","str","JSON","parse","e","AbstractLoader","resource_id","url","size","loaded_bytes","total_bytes","has_finished","has_error","error_message","loaded","total","is_number","console","warn","message","error","resource_container","cache","Browser","fetch","method","mode","credentials","redirect","then","on_progress","bind","catch","__on_error","response","response_clone","clone","reader","body","getReader","contentLength","headers","get","receivedLength","done","value","read","length","__update_downloaded_bytes","on_preloaded_finished","data","ActionSequencer","context","elapsed_time","playback_speed","playing","action_events","initial_context","stringify","tmp_t","channels","channel_names","Object","keys","i","duration","get_duration","__play_clips","delta_time","time","TMath","clamp","t","trigger_time","action","push","Math","max","from","to","interpolator","use_dynamic_from_value","keyframes","attribute_name","undefined","keyframe","__get_nearest_keyframe","evaluate","EPSILON","trigger","evaluate_keyframe","__linear_map_01","from_range_start_value","from_range_end_value","channel_name","closest","min_time","middle_time","distance_to_middle_time","abs","x","cos","sin","pow","sqrt","c4","PI","ease_out_bounce","n1","d1","sign","ActionInterpolator","easing_function","EasingFunctions","NumberInterpolator","super","lerp","app","ActionEvent","ViewContext","DrawIOAnimationSheet","xml_document","animation_nodes","DOMParser","parseFromString","querySelectorAll","animation_tracks","triggers","node","parent_node","parentElement","getAttribute","get_node_x_position","parseFloat","includes","split_data","split","trigger_name","trigger_method","at_time","value_data","to_value","from_time","to_time","sort","a","b","x_pos","ActionSequencerBuilder","initial_state_data","animation_data","current_context","tracks","initial_tracks","state_to_tracks","find","element","sequencer","add_action_interpolator","action_event","add_action_event","state","xml","transition_data","queue","zoom_changed_evt","store_clickd_evt","point_selected_evt","config_changed","path_substep_completed","path_completed","go_to_store_requested_evt","resource_loaded_evt","service_clicked_evt","unit_pos_updated_evt","floor_changed_evt","on_enter_floor_navigation","on_exit_floor_navigation","on_enter_floor_selection","on_exit_floor_selection","on_enter_outside_navigation","on_exit_outside_navigation","step_selected_evt","event","payload","callback","zoom","fire","store_id","hit_data","step_number","step_index","resource","service","unit_data","floor_id","resources","resources_by_url","EventManager","fire_resource_loaded","TransitionTable","transitions","to_state","from_animation_sheet","___time","Clock","__delta_time","__elapsed_time","__allocated_time","Vector2","shader_time","y","getDelta","getElapsedTime","ViewState","global_view_data","transition_progress","action_sequencer","update_transition","ViewStateTransitionHandler","transition_table","last_state","current_state","current_state_data","transitioning","skip","__exit_last_state","before_exit","show","before_enter","play","update","__update_transitions","is_finished","on_enter","assign","Time","update_exit_transition","get_progress","update_enter_transition","hide","on_exit","views","transition_handler","__set_views_opacities","view_name","change_url","v","go_to_state","__change_browser_url","view","add_transitions","set_transitions","set_state","get_by_url","set_initial_state_data","history","pushState","set_opacity","ApplicationView","container","ResourceContainer","ViewManager","register_view","classList","add","remove","style","opacity","BaseApplication","BaseRender","renderer","BaseShaderMaterial","ShaderMaterial","vert","frag","uniforms","vertexShader","basic_vert","fragmentShader","basic_frag","_Color","Color","BlitMaterial","frag_shader","vert_shader","defines","_MainTex","_Resolution","_TargetResolution","depthWrite","blending","NoBlending","depthTest","depthFunc","AlwaysDepth","_current","current","camera","max_anisotropy","vertex_texture_sampler_available","fp_textures_available","CanvasDrawer","uses_dynamic_font","__textHeight","canvas","document","createElement","ctx","getContext","fontStyle","getElementsByTagName","dummy","dummyText","createTextNode","appendChild","setAttribute","offsetHeight","removeChild","text","font","ceil","measureText","width","getFontHeight","ctxOptions","font_color","__draw","draw_canvas","canvas_texture","CanvasTexture","UVMapping","ClampToEdgeWrapping","NearestFilter","generateMipMaps","needsUpdate","height","radius","fill","stroke","tl","tr","br","bl","defaultRadius","side","beginPath","moveTo","lineTo","quadraticCurveTo","closePath","parameters","dpr","json","Idle","is_animating","Animating","easing_function_t","animator","set_property_value","set_current_state","finished_callback","CSSAnimator","css_property","value_prefix","value_suffix","ease_in_out_cubic","AxisHelper","Object3D","scale","blue_points","Vector3","blue_axis_mat","LineBasicMaterial","color","blue_axis_geo","BufferGeometry","setFromPoints","blue_axis_line","Line","renderOrder","green_points","green_axis_mat","green_axis_geo","green_axis_line","red_points","red_axis_mat","red_axis_geo","red_axis_line","set","Scene","scene","traverse","child","geometry","dispose","material","children","Cube","Mesh","segments","BoxGeometry","z","MeshBasicMaterial","Sphere","SphereBufferGeometry","Arrow","dir","cylinder_height","cylinder_geo","CylinderBufferGeometry","translate","cone_geometry","ConeBufferGeometry","cone_height","buffer_geometry","BufferGeometryUtils","mergeBufferGeometries","rotateX","quaternion","setFromUnitVectors","_dir","position","render_width","render_height","width_height","pixel_size","size_changed","vector2","multiplyScalar","aspect_ratio","ScreenSpaceTextureMaterial","w","h","_ScreenSpacePosition","_ScreenSize","_TextureSize","tex","image","PerspectiveCamera","THREEPerspectiveCamera","fov","aspect","near","far","clear_color","clear_alpha","Vector3_one","Vector3_zero","canvas_renderer","display_texture_meshes","origin","arrow","normalize","copy","SceneManager","axis","RT","rt_debug","position_2d","fillStyle","fillRect","clearRect","strokeStyle","points","line","frustumCulled","pos","cube","depth","distanceTo","center","sub","forward_dir","PlaneBufferGeometry","Vector4","basic_color_vert","basic_color_frag","transparent","plane","box","Box3","setFromCenterAndSize","helper","Box3Helper","sphere","input_points","open","catmull","CatmullRomCurve3","updateArcLengths","getSpacedPoints","draw_line","SphereGeometry","sphere_mesh","sphere1","bb","curve","options","offset","mesh","set_texture","graphics","set_screen_size","Screen","render","ClearDepthNormalMaterial","clear_depth","clear_normal","_DepthNormal","DepthNormalMaterial","_FarPlane","far_plane","DepthAndNormalsRenderer","WebGLRenderTarget","clear_depth_normal_mat","depth_normal_material","__resize_RT_if_necessary","clear","blit_clear_with_material","CameraManager","setSize","render_target","Blitter","_blit_scene","_blit_material","_blit_quad","_blit_camera","OrthographicCamera","src","dst","src_texture","isWebGLRenderTarget","texture","src_width","src_height","getSize","__render","mat","dst_RT","current_rt","getRenderTarget","setRenderTarget","context_attributes","_renderer","blitter","no_render","current_render_mode","generateDepthNormalTexture","depth_and_normals_renderer","is_webgl2","canvas_context","alpha","desynchronized","stencil","antialias","premultipliedAlpha","preserveDrawingBuffer","powerPreference","logarithmicDepthBuffer","force_webgl2","constructor","WebGLRenderer","autoClear","setPixelRatio","Configuration","extensions","domElement","Capabilities","capabilities","getMaxAnisotropy","maxVertexTextures","floatVertexTextures","resize_observer","ResizeObserver","on_resize","observe","dom_element","depth_normals_RT","new_state","__update_current_camera","updateProjectionMatrix","updateMatrix","updateMatrixWorld","override_mat","__apply_override_material","on_pre_render","on_post_render","overrideMaterial","buffer","readRenderTargetPixels","clear_stencil","setClearColor","entries","entry","update_position","contentRect","update_size","setViewport","material_pass","src_RT","blit_with_material","blit","blob_callback","old_width","old_height","new_width","new_height","tile_width","tile_height","divisions_x","parseInt","divisions_y","ctx_2D","setViewOffset","drawImage","toBlob","clearViewOffset","blob","link","download","href","URL","createObjectURL","click","onclick","requestAnimationFrame","revokeObjectURL","removeAttribute","NormalMaterial","DebugNormalsRender","Graphics","InputController","left_mouse_button_clicked","captured_NDC","operating_systems","ANDROID","IOS","LINUX","MAC","WINDOWS","is_mobile","match","is_ipad","maxTouchPoints","is_ios","is_android","get_os","is_linux","is_mac","is_windows","platform","os","test","target_geometry","target_position","GeometryBatch","batch_width","data_textures","object_names","zero_offset","write_offset","uniform_dirty_count","tmp_uploaded_data_count","uniform_name","default_value_v3","src_tex","__create_rgb_texture","dst_tex","one_pixel_tex","new_data_tex","__add_data_texture","__flood_data_texture_rgb","default_value_v4","__create_rgba_texture","__flood_data_texture_rgba","__create_rgba_float_texture","object_name","vector3","use_r","use_g","use_b","obj_index","__get_object_index","data_texture","__get_data_texture","__set_pixel_rgb","one_pixel","last_accessed_index","dirty_count","vector4","use_a","__set_pixel_rgba","upload_budget","__partial_texture_data_upload","__full_texture_data_upload","texture_data","copyTextureToTexture","index","floor","v3","v4","Uint8Array","DataTexture","RGBFormat","RGBAFormat","Float32Array","FloatType","dst_texture","one_pixel_text","batches","buffer_geometries","attr_accessor_uvs","texture_width","ceilPowerOfTwo","__init_uv_array","uv_index","vertex_count","count","buffer_attribute","BufferAttribute","upload_texture_data","uvs","ui_elements","_tmp_normalized_pos","ss_scene","autoUpdate","ws_scene","ss_camera","elem","splice","set_screen_space_coordinate_system","set_world_space_coordinate_system","Input","NDC","update_state","current_clicked_element","OMath","to_range_start_value","to_range_end_value","min","number","divisor","rgb","r","round","toString","g","projected_point","points_on_plane","projectPoint","target","elements","x1","x2","m","euclideanModulo","degrees","radians","arr","col","random","tmp_mat","Matrix4","Plane","ray","Ray","tmp_size","tmp_unproj","tmp_vec","applyQuaternion","v_fov","h_fov","atan","tan","distV","distH","plane_position","plane_normal","setFromNormalAndCoplanarPoint","get_forward_dir","isPerspectiveCamera","unproject_mouse_position","unproject","intersectPlane","zoom_scale","world_space_center","camera_forward","project_points_on_plane","projected_points_center","getCenter","up","right","cross","inverse_mat","getInverse","applyMatrix4","projected_center","get_zoom_to_fit_rect","isOrthographicCamera","obj_x","obj_y","object_aspect","object","getWorldPosition","project","left","top","bottom","app_container","init","CameraUtilities","GeometryBatcher","OS","ReflectionPlaneContext","UI","Debug","render_loop","SSAOMaterial","_InverseProjMatrix","_ProjectionMatrix","_Bias","_Radius","_SampleKernel","__get_sample_kernel","_RandomRotation","__get_rotation_kernel","sample_kernel","rotation_kernel","rotation_texture","wrapS","RepeatWrapping","wrapT","SSAOComposeMaterial","_AO","DisplayNormalTextureMaterial","depth_normals_vert","BoxBlurMaterial","_SampleDir","Blurrer","RT1","RT2","box_blur_mat","NormalAORender","ssao_mat","ssao_compose_mat","debug_normals","ssaa","use_ssaa","main_RT","SSAO_RT","blurrer","__check_RT_size","__update_uniforms","blur","projectionMatrix","NormalRender","UnrealBloomComposeMaterial","nMips","NUM_MIPS","_BlurredTex","_BloomStrength","blurTexture1","blurTexture2","blurTexture3","blurTexture4","blurTexture5","bloomStrength","bloomFactors","bloomRadius","bloomTintColors","rt","col_string","AddMaterial","_SecondTex","GaussianBlurMaterial","kernel_radius","KERNEL_RADIUS","SIGMA","texSize","direction","LuminosityHighPassMaterial","luminosityThreshold","smoothWidth","defaultColor","defaultOpacity","GaussianBlurrer","current_width","current_height","separableBlurMaterials","renderTargetsHorizontal","renderTargetsVertical","kernelSizeArray","rt_pars","minFilter","LinearFilter","magFilter","format","renderTargetBright","generateMipmaps","init_materials","init_RT","luminosity_high_pass_mat","use_luminosity_high_pass","resize_RT","inputRenderTarget","set_direction","dispose_RT","hor","ver","texture_height","set_size","dispose_materials","UnrealBloomRender","bloom_compose_mat","blur_RT","add_mat","set_RT_0","set_RT_1","set_RT_2","set_RT_3","set_RT_4","set_bloom_strength","set_bloom_radius","set_add_texture","val","set_tint_color_0","set_tint_color_1","set_tint_color_2","set_tint_color_3","set_tint_color_4","THREEOrthographicCamera","components","enabled_components","Set","component","delete","component_name","RenderLoop","target_application","_frame_id","is_running","frames_passed","__update","on_post_start","ViewComponentManager","on_frame_end","cancelAnimationFrame","stop","SimpleTextDrawer","text_margin","text_size","get_text_size","globalAlpha","textBaseline","textAlign","fillText","ViewComponent","register_component","enable_component","disable_component","HorizontalPlane","VerticalPlane","ArrayUtilities","source","apply","array","items_left_count","closest_point","closest_distance","obj","ids","FrustumPointFitter","camera_quaternion","vertical_fov","degToRad","up_plane_normal","get_up_plane_normal","down_plane_normal","get_down_plane_normal","left_plane_normal","get_left_plane_normal","right_plane_normal","get_right_plane_normal","camera_forward_dir","sphere_center","pull_back_distance","get_distance_to_fit_rect","far_pos","up_plane","down_plane","left_plane","right_plane","apply_center_correction_to_pos","Infinity","inverse_dir","Line3","up_line_intersection","down_line_intersection","left_line_intersection","right_line_intersection","intersectLine","log","new_up_distance","new_down_distance","new_left_distance","new_right_distance","vertical_min","horizontal_min","forward_correction","target_pos","vertical_offset","get_vertical_correction","horizontal_offset","get_hozirontal_correction","closest_up_point","closest_down_point","closest_distance_to_up_plane","closest_distance_to_down_plane","up_dir","down_line","up_line","down_dist","up_dist","correction","closest_right_point","closest_left_point","closest_distance_to_right_plane","closest_distance_to_left_plane","right_dir","left_line","right_line","left_dist","right_dist","Quaternion","setFromAxisAngle","GeometryUtilities","geometry_buffer","indices","positions","vertices","getX","getY","getZ","add_barycentric_attribute","non_indexed_geometry_buffer","bar_coordinates","ImageUtilities","getImageData","imagedata","sample_count","face_areas","min_area","normals","faces","index_0","index_1","index_2","v1","v2","face","c","n2","n3","normal","area","get_face_area","normalized_faces_array","get_uniform_face_distribution","selected_faces","select_random_faces","sample_data_from_faces","sampled_points","sampled_normals","w1","w2","sample_point_in_face","amount","selected_face","minimum_area","extended_triangle_indices","repetitions_needed","j","vec1","vec2","w3","result_callback","fromGeometry","geometries","get_mesh","gltf","animations","skinnedMeshes","isSkinnedMesh","cloneBones","cloneSkinnedMeshes","isBone","skeleton","cloneSkinnedMesh","orderedCloneBones","bones","cloneBone","Skeleton","boneInverses","matrixWorld","cast","receive","castShadow","receiveShadow","object_type","ObjectUtilities","nodeType","attributes","attribute","item","nodeName","nodeValue","hasChildNodes","childNodes","xml_to_json","old","StringUtilities","string","words","toUpperCase","substr","join","charAt","slice","replace","group","TimeUtilities","time_str","hours","minutes","seconds","PerspectiveFrustumPointFitter","get_horizontal_correction","OrthographicFrustumPointFitter","inverse_camera_quat","inverse","inverted_points","distance","distance_to_center","Grid","derivatives","plane_geometry","convert_to_non_indexed_geometry","rotation","_Thickness","_Length","_ElapsedTime","setup","next_position","previous_position","orientation","coverage","accumulated_length","next_point","__get_next_position","previous_point","__get_previous_position","vertexList","nextPositionList","previousPositionList","orientationList","coverageList","setIndex","_length","thickness","parent","WorldImage","pivot","_ScreenAligned","_Scale","_Opacity","DoubleSide","PlaneGeometry","current_scale","computeBoundingBox","tmp_bb_size","boundingBox","img","screen_aligned","boolean","Text2D","is_static","simple_text_drawer","draw_settings","draw_on_texture","LinearMipMapLinearFilter","update_texture","UIElementMaterial","intensity","_PixelOffset","_NDC","_PivotPoint","_DepthOffset","ScreenSpacePosition","WorldSpacePosition","tmp_vec3","tmp_vec2","UIElementState","ui_element","normalized_mouse_position","OnIdle","is_mouse_over","_on_enter_state","OnMouseEnter","on_mouse_enter","_on_hover_state","_on_exit_state","OnMouseExit","on_mouse_exit","_on_idle_state","OnMouseHover","__trigger_on_hover","on_mouse_hover","UIElement","is_clickable","position_strategy","_position","on_hover","mouse_pos_tmp","cached_NDC_position","screen_pos_tmp","texture_size","matrixAutoUpdate","pixel_offset","pivot_point","use_depth","depth_offset","visible","get_size","normalized_mouse_pos","get_pos_NDC","to_screen_position","rect","Box2","containsPoint","projected_pos","screen_pos","remove_screen_material","UpdatableMaterialMesh","self","onBeforeRender","TextGlyph","plane_bounds","atlas_bounds","SDFText","glyph_layout","glyphs","glyph_is_dirty","matrix_is_dirty","color_is_dirty","matrix","__opacity","__text","__generate_glyphs","compose","tilt","new_orientation","new_tilt","multiply","update_glyphs","op","cursor","unicode","charCodeAt","glyph","planeBounds","text_glyph","atlasBounds","advance","box2","first_glyph","union","box2_size","SDFTextMaterial","_Texture","_Boldness","_AtlasSize","SDFTextBatch","font_layout","atlas_texture","instanced_geometry","InstancedBufferGeometry","instanceCount","Float32BufferAttribute","transformsCol0","InstancedBufferAttribute","max_allocations","transformsCol1","transformsCol2","transformsCol3","glyph_bounds","usage","DynamicDrawUsage","text_elements","set_atlas_size","atlas","set_boldness","text_str","text_elem","remove_elem","force_update","glyph_bounds_atr","plane_bounds_atr","color_atr","matrix_needs_update","glyph_needs_update","color_needs_update","glyph_count","update_matrix","clear_glyph_dirty","clear_color_dirty","glyph_i","buffer_i","setXYZW","VectorInterpolator","tmp","MedianFilterMaterial","kernel3x3","_SourceTex","_SourceTexSize","isVideoTexture","videoWidth","videoHeight","isTexture","MedianFilter","type","median_filter_mat","tex_size","DualFilteringBlurMaterial","upsample","AlphaFilterMaterial","use_alpha_mask","_Offset","DualFilteringBlurrer","RT0","RT3","RT4","upscale_blur_mat","downscale_blur_mat","alpha_filter_mat","check_RT_resize","GPUParticleSystem","particles","init_attribute_uvs","uv_storage_attr","build_uv_storage_attribute","Points","particle_count","resolution","calculate_resolution","update_material","CustomDataTexture","multiplier","RGBDataTexture","RGBADataTexture","RGBFloatDataTexture","RGBAFloatDataTexture","BatchedMesh","id_table","max_texture_width","batched_count","batch_height","mesh_name","set_rgb","get_mesh_index","set_rgba","MeshBatcher","meshes","attr_mesh_id","create_batched_mesh","AudioClip","loop","volume","positional","audio","audio_listener","TPositionalAudio","TAudio","setBuffer","setLoop","gain","setVolume","pause","is_playing","isPlaying","AudioLoader","user_interaction_for_audio","instantiate_audio","setTimeout","arrayBuffer","array_buffer","AudioContext","decodeAudioData","audio_buffer","set_resource","__loading_ended","BasisLoader","loader","setWorkerLimit","setTranscoderPath","detectSupport","load","basis","encoding","sRGBEncoding","xhr","msg","__set_error","CubemapLoader","THREECubeTextureLoader","setPath","urls","DAELoader","THREEColladaLoader","ColladaLoader","FileLoader","THREEFileLoader","FontLoader","TFontLoader","GLTFLoader","THREEGLTFLoader","GLTFDRACOLoader","draco_loader","THREEDRACOLoader","DRACOLoader","setDecoderPath","draco_decoder_path","setDecoderConfig","setDRACOLoader","HDRCubeTextureLoader","THREEHDRCubeTextureLoader","url_suffix","setDataType","UnsignedByteType","hdr","JSONLoader","OBJLoader","THREEOBJLoader","PointArrayLoader","parse_path","raw_data","string_array","pop","THREEVector3","RGBETextureLoader","THREERGBELoader","RGBELoader","THREEUnsignedByteType","TextLoader","TextureLoader","Texture","Image","onload","VideoLoader","ResourceBatch","batch_name","resource_loaders","loading_finished","finished","has_errors","print_error","get_loaded_bytes","get_total_bytes"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.module.js","sources":["../src/Browser.js","../src/utilities/Validation.js","../src/resource_loader/AbstractLoader.js","../src/action_sequencer/ActionSequencer.js","../src/utilities/EasingFunctions.js","../src/action_sequencer/ActionInterpolator.js","../src/action_sequencer/NumberInterpolator.js","../src/view_components/ViewContext.js","../src/action_sequencer/ActionEvent.js","../src/view_components/transition/DrawIOAnimationSheet.js","../src/view_components/transition/ActionSequencerBuilder.js","../src/EventManager.js","../src/ResourceContainer.js","../src/view_components/transition/TransitionTable.js","../src/Time.js","../src/view_components/ViewState.js","../src/view_components/transition/ViewStateTransitionHandler.js","../src/view_components/ViewManager.js","../src/view_components/ApplicationView.js","../src/BaseApplication.js","../src/render_mode/BaseRender.js","../src/materials/BaseShaderMaterial.js","../src/materials/BlitMaterial.js","../src/CameraManager.js","../src/Capabilities.js","../src/canvas_drawer/CanvasDrawer.js","../src/Configuration.js","../src/html_utilities/css_animator_states/Idle.js","../src/html_utilities/css_animator_states/Animating.js","../src/html_utilities/CSSAnimator.js","../src/components/AxisHelper.js","../src/SceneManager.js","../src/primitives/Cube.js","../src/primitives/Sphere.js","../src/primitives/Arrow.js","../src/Screen.js","../src/materials/ScreenSpaceTextureMaterial.js","../src/PerspectiveCamera.js","../src/Debug.js","../src/materials/ClearDepthNormalMaterial.js","../src/materials/DepthNormalMaterial.js","../src/render_utilities/DepthAndNormalsRenderer.js","../src/render_utilities/Blitter.js","../src/Graphics.js","../src/materials/NormalMaterial.js","../src/render_mode/DebugNormalsRender.js","../src/Input.js","../src/OS.js","../src/ReflectionPlaneContext.js","../src/static_batcher/GeometryBatch.js","../src/static_batcher/GeometryBatcher.js","../src/UI.js","../src/utilities/OMath.js","../src/utilities/CameraUtilities.js","../src/Initializer.js","../src/materials/SSAOMaterial.js","../src/materials/SSAOComposeMaterial.js","../src/materials/DisplayNormalTextureMaterial.js","../src/materials/BoxBlurMaterial.js","../src/render_utilities/Blurrer.js","../src/render_mode/NormalAORender.js","../src/render_mode/NormalRender.js","../src/materials/UnrealBloomComposeMaterial.js","../src/materials/AddMaterial.js","../src/materials/GaussianBlurMaterial.js","../src/materials/LuminosityHighPassMaterial.js","../src/render_utilities/GaussianBlurrer.js","../src/render_mode/UnrealBloomRender.js","../src/OrthographicCamera.js","../src/view_components/ViewComponentManager.js","../src/RenderLoop.js","../src/canvas_drawer/SimpleTextDrawer.js","../src/view_components/ViewComponent.js","../src/primitives/HorizontalPlane.js","../src/primitives/VerticalPlane.js","../src/utilities/ArrayUtilities.js","../src/utilities/FrustumPointFitter.js","../src/utilities/GeometryUtilities.js","../src/utilities/ImageUtilities.js","../src/utilities/MeshSampler.js","../src/utilities/ModelUtilities.js","../src/utilities/ObjectUtilities.js","../src/utilities/StringUtilities.js","../src/utilities/TimeUtilities.js","../src/utilities/PerspectiveFrustumPointFitter.js","../src/utilities/OrthographicFrustumPointFitter.js","../src/components/Grid.js","../src/components/Line.js","../src/components/WorldImage.js","../src/components/Text2D.js","../src/materials/UIElementMaterial.js","../src/ui/ui_element_position/ScreenSpacePosition.js","../src/ui/ui_element_position/WorldSpacePosition.js","../src/ui/ui_element_state/UIElementState.js","../src/ui/ui_element_state/OnIdle.js","../src/ui/ui_element_state/OnMouseEnter.js","../src/ui/ui_element_state/OnMouseExit.js","../src/ui/ui_element_state/OnMouseHover.js","../src/components/UIElement.js","../src/components/UpdatableMaterialMesh.js","../src/components/sdf_text/TextGlyph.js","../src/components/sdf_text/SDFText.js","../src/materials/SDFTextMaterial.js","../src/components/sdf_text/SDFTextBatch.js","../src/action_sequencer/VectorInterpolator.js","../src/materials/MedianFilterMaterial.js","../src/render_utilities/MedianFilter.js","../src/materials/DualFilteringBlurMaterial.js","../src/materials/AlphaFilterMaterial.js","../src/render_utilities/DualFilteringBlurrer.js","../src/gpu_particles/GPUParticleSystem.js","../src/data_textures/CustomDataTexture.js","../src/data_textures/RGBDataTexture.js","../src/data_textures/RGBADataTexture.js","../src/data_textures/RGBFloatDataTexture.js","../src/data_textures/RGBAFloatDataTexture.js","../src/static_batcher/BatchedMesh.js","../src/static_batcher/MeshBatcher.js","../src/components/AudioClip.js","../src/resource_loader/AudioLoader.js","../src/resource_loader/BasisLoader.js","../src/resource_loader/CubemapLoader.js","../src/resource_loader/DAELoader.js","../src/resource_loader/FileLoader.js","../src/resource_loader/FontLoader.js","../src/resource_loader/GLTFLoader.js","../src/resource_loader/GLTFDRACOLoader.js","../src/resource_loader/HDRCubeTextureLoader.js","../src/resource_loader/JSONLoader.js","../src/resource_loader/OBJLoader.js","../src/resource_loader/PointArrayLoader.js","../src/resource_loader/RGBETextureLoader.js","../src/resource_loader/TextLoader.js","../src/resource_loader/TextureLoader.js","../src/resource_loader/VideoLoader.js","../src/resource_loader/ResourceBatch.js"],"sourcesContent":["\nclass Browser\n{\n init()\n {\n this.browser_name = '';\n this.agent = window.navigator.userAgent.toLowerCase();\n\n switch (true)\n {\n case this.agent.indexOf('edge') > -1:\n this.browser_name = 'edge_ie';\n break;\n case this.agent.indexOf('edg') > -1:\n this.browser_name = 'edge_chromium';\n break;\n case this.agent.indexOf('opr') > -1 && !!window.opr:\n this.browser_name = 'opera';\n break;\n case this.agent.indexOf('chrome') > -1 && !!window.chrome:\n this.browser_name = 'chrome';\n break;\n case this.agent.indexOf('trident') > -1:\n this.browser_name = 'iexplorer';\n break;\n case this.agent.indexOf('firefox') > -1:\n this.browser_name = 'firefox';\n break;\n case this.agent.indexOf('safari') > -1:\n this.browser_name = 'safari';\n break;\n default:\n this.browser_name = 'other';\n break;\n }\n }\n\n get name()\n {\n return this.browser_name;\n }\n\n get is_safari()\n {\n return this.browser_name === 'safari';\n }\n\n get is_chrome()\n {\n return this.browser_name === 'chrome';\n }\n\n get is_edge()\n {\n return this.browser_name === 'edge_ie';\n }\n\n get is_edge_chromium()\n {\n return this.browser_name === 'edge_chromium';\n }\n\n get has_webm()\n {\n return this.is_chrome || this.is_firefox || this.is_edge_chromium;\n }\n\n get has_hvec()\n {\n return this.is_safari;\n }\n\n get preferred_video_extension()\n {\n return this.has_webm ? 'webm' : this.has_hvec ? 'hvec.mp4' : 'mp4';\n }\n}\n\nexport default new Browser();\n","export default class Validation\n{\n constructor()\n {}\n\n static is_int(n)\n {\n return Number(n) === n && n % 1 === 0;\n }\n\n static is_float(n)\n {\n return Number(n) === n && n % 1 !== 0;\n }\n\n static is_number(n)\n {\n return this.is_int(n) || this.is_float(n);\n }\n\n static is_json(str)\n {\n try\n {\n JSON.parse(str);\n }\n catch (e)\n {\n return false;\n }\n\n return true;\n }\n}\n","import Browser from '../Browser';\r\nimport Validation from '../utilities/Validation';\r\n\r\nexport default class AbstractLoader\r\n{\r\n constructor(resource_id, url, size = 1)\r\n {\r\n this.resource_id = resource_id;\r\n this.url = url;\r\n this.loaded_bytes = 0;\r\n this.total_bytes = size;\r\n\r\n this.has_finished = false;\r\n this.has_error = false;\r\n this.error_message = 'none';\r\n }\r\n\r\n __update_downloaded_bytes(loaded, total)\r\n {\r\n loaded = Validation.is_number(loaded) ? loaded : 1;\r\n total = Validation.is_number(total) ? total : 1;\r\n\r\n this.loaded_bytes = loaded;\r\n\r\n if (total > 0)\r\n {\r\n this.total_bytes = total;\r\n }\r\n\r\n if (this.loaded_bytes > this.total_bytes)\r\n {\r\n console.warn('Total bytes is smaller than loaded ones. Please set total bytes by hand to:', this.url);\r\n }\r\n }\r\n\r\n __loading_ended()\r\n {\r\n this.has_finished = true;\r\n }\r\n\r\n __set_error(message)\r\n {\r\n this.has_error = true;\r\n this.error_message = message;\r\n }\r\n\r\n print_error()\r\n {\r\n console.error('Error while loading ' + this.resource_id + '\\n\\t path: ' + this.url + '\\n\\t\\t' + this.error_message);\r\n }\r\n\r\n load(resource_container)\r\n {\r\n const cache = Browser.is_safari ? 'no-cache' : 'default';\r\n\r\n fetch(this.url, {\r\n method: 'GET', // *GET, POST, PUT, DELETE, etc.\r\n mode: 'cors', // no-cors, *cors, same-origin\r\n cache: cache, // *default, no-cache, reload, force-cache, only-if-cached\r\n credentials: 'same-origin', // include, *same-origin, omit\r\n redirect: 'follow' // manual, *follow, error\r\n })\r\n .then(this.on_progress.bind(this, resource_container))\r\n .catch(this.__on_error.bind(this));\r\n }\r\n\r\n async on_progress(resource_container, response)\r\n {\r\n const response_clone = response.clone();\r\n const reader = response.body.getReader();\r\n\r\n // Step 2: get total length\r\n const contentLength = +response.headers.get('Content-Length');\r\n\r\n // Step 3: read the data\r\n let receivedLength = 0; // received that many bytes at the moment\r\n\r\n while (true)\r\n {\r\n const { done, value } = await reader.read();\r\n\r\n if (done)\r\n {\r\n break;\r\n }\r\n\r\n receivedLength += value.length;\r\n\r\n this.__update_downloaded_bytes(receivedLength, contentLength);\r\n // console.log(`Received ${receivedLength} of ${contentLength}`);\r\n }\r\n\r\n this.on_preloaded_finished(resource_container, response_clone);\r\n }\r\n\r\n on_preloaded_finished(resource_container, response)\r\n {\r\n }\r\n\r\n __on_error(data)\r\n {\r\n console.error(data);\r\n }\r\n}\r\n","\nimport { Math as TMath } from 'three';\n\nexport default class ActionSequencer\n{\n constructor(context)\n {\n this.elapsed_time = -0.00001;\n this.playback_speed = 1;\n this.playing = false;\n\n this.action_events = [];\n this.context = context;\n\n this.initial_context = JSON.parse(JSON.stringify(context));\n\n this.tmp_t = 0;\n\n this.channels = {};\n\n const channel_names = Object.keys(context);\n for (let i = 0; i < channel_names.length; i++)\n {\n this.channels[channel_names[i]] = [];\n }\n\n this.duration = 0;\n }\n\n play()\n {\n this.playing = true;\n }\n\n stop()\n {\n this.playing = false;\n }\n\n reset()\n {\n this.elapsed_time = -0.00001;\n }\n\n skip()\n {\n const duration = this.get_duration();\n this.__play_clips(this.elapsed_time, duration + 0.0001);\n this.elapsed_time = duration;\n }\n\n update(delta_time)\n {\n if (this.playing)\n {\n this.__play_clips(this.elapsed_time, this.elapsed_time + delta_time * this.playback_speed);\n this.elapsed_time = this.elapsed_time + delta_time * this.playback_speed;\n }\n }\n\n set_progress(time)\n {\n this.elapsed_time = TMath.clamp(time, 0, this.duration);\n this.__play_clips(this.elapsed_time, this.elapsed_time);\n }\n\n set_normalized_progress(t)\n {\n this.elapsed_time = TMath.clamp(t, 0, 1) * this.duration;\n this.__play_clips(this.elapsed_time, this.elapsed_time);\n }\n\n get_progress()\n {\n return TMath.clamp(this.elapsed_time / this.get_duration(), 0, 1);\n }\n\n is_finished()\n {\n return this.elapsed_time > this.get_duration();\n }\n\n add_action_event(trigger_time, action)\n {\n this.action_events.push({\n trigger_time: trigger_time,\n action: action\n });\n\n this.duration = Math.max(this.duration, trigger_time);\n }\n\n add_action_interpolator(from, to, interpolator, use_dynamic_from_value = false)\n {\n if (use_dynamic_from_value)\n {\n const keyframes = this.channels[interpolator.attribute_name];\n\n if (keyframes === undefined)\n {\n console.error(`${interpolator.attribute_name} missing in initial state data.`);\n }\n\n if (keyframes.length === 0)\n {\n interpolator.from = this.initial_context[interpolator.attribute_name];\n }\n else\n {\n interpolator.from = keyframes[keyframes.length - 1].interpolator.to;\n }\n }\n\n const keyframe = {\n from: from,\n to: to,\n interpolator: interpolator\n };\n\n this.duration = Math.max(this.duration, to);\n this.channels[interpolator.attribute_name].push(keyframe);\n }\n\n get_property_target_value(name)\n {\n const keyframe = this.__get_nearest_keyframe(name, this.elapsed_time);\n\n if (this.elapsed_time < keyframe.from)\n {\n return keyframe.interpolator.evaluate(0);\n }\n\n return keyframe.interpolator.evaluate(1);\n }\n\n get_duration()\n {\n return this.duration;\n }\n\n __play_clips(from, to)\n {\n for (let i = 0; i < this.action_events.length; i++)\n {\n if (this.action_events[i].trigger_time > from - Number.EPSILON &&\n this.action_events[i].trigger_time < to + Number.EPSILON)\n {\n // console.log(\"Play event: \" + this.action_events[i].action.constructor.name + \" at \"+ this.action_events[i].trigger_time);\n this.action_events[i].action.trigger();\n }\n }\n const channel_names = Object.keys(this.initial_context);\n\n for (let i = 0; i < channel_names.length; i++)\n {\n const name = channel_names[i];\n const keyframe = this.__get_nearest_keyframe(name, from);\n this.context[name] = this.evaluate_keyframe(keyframe, from);\n }\n }\n\n evaluate_keyframe(keyframe, time)\n {\n this.tmp_t = this.__linear_map_01(time, keyframe.from, keyframe.to);\n return keyframe.interpolator.evaluate(TMath.clamp(this.tmp_t, 0, 1));\n }\n\n get_keyframes(channel_name)\n {\n return this.channels[channel_name];\n }\n\n __linear_map_01(value,\n from_range_start_value,\n from_range_end_value)\n {\n return ((value - from_range_start_value) / (from_range_end_value - from_range_start_value)) * (1 - 0) + 0;\n }\n\n __get_nearest_keyframe(channel_name, time)\n {\n let closest = undefined;\n let min_time = 9999999;\n const keyframes = this.channels[channel_name];\n for (let i = 0; i < keyframes.length; i++)\n {\n const keyframe = keyframes[i];\n const middle_time = (keyframe.to - keyframe.from) / 2 + keyframe.from;\n const distance_to_middle_time = Math.abs(time - middle_time);\n\n if (distance_to_middle_time < min_time)\n {\n min_time = distance_to_middle_time;\n closest = keyframe;\n }\n }\n return closest;\n }\n}\n","class EasingFunctions\n{\n constructor()\n { }\n\n linear(x)\n {\n return x;\n }\n\n triangular(x)\n {\n return 1 - Math.abs((x * 2) % (1 * 2) - 1);\n }\n\n ease_in_sine(x)\n {\n return 1 - Math.cos(x * 3.1415926 / 2);\n }\n\n ease_out_sine(x)\n {\n return Math.sin(x * 3.1415926 / 2);\n }\n\n ease_in_out_sine(x)\n {\n return -(Math.cos(3.1415926 * x) - 1) / 2;\n }\n\n ease_in_cubic(x)\n {\n return x * x * x;\n }\n\n ease_out_cubic(x)\n {\n return 1 - Math.pow(1 - x, 3);\n }\n\n ease_in_out_cubic(x)\n {\n return x < 0.5\n ? 4 * x * x * x\n : 1 - Math.pow(-2 * x + 2, 3) / 2;\n }\n\n ease_in_quad(x)\n {\n return x * x;\n }\n\n ease_out_quad(x)\n {\n return 1 - (1 - x) * (1 - x);\n }\n\n ease_in_out_quad(x)\n {\n return x < 0.5\n ? 2 * x * x\n : 1 - Math.pow(-2 * x + 2, 2) / 2;\n }\n\n ease_in_quart(x)\n {\n return x * x * x * x;\n }\n\n ease_out_quart(x)\n {\n return 1 - Math.pow(1 - x, 4);\n }\n\n ease_in_out_quart(x)\n {\n return x < 0.5\n ? 8 * x * x * x * x\n : 1 - Math.pow(-2 * x + 2, 4) / 2;\n }\n\n ease_in_quint(x)\n {\n return x * x * x * x * x;\n }\n\n ease_out_quint(x)\n {\n return 1 - Math.pow(1 - x, 5);\n }\n\n ease_in_out_quint(x)\n {\n return x < 0.5\n ? 16 * x * x * x * x * x\n : 1 - Math.pow(-2 * x + 2, 5) / 2;\n }\n\n ease_in_expo(x)\n {\n return x === 0 ? 0 : Math.pow(2, 10 * x - 10);\n }\n\n ease_out_expo(x)\n {\n return x === 1 ? 1 : 1 - Math.pow(2, -10 * x);\n }\n\n ease_in_out_expo(x)\n {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? Math.pow(2, 20 * x - 10) / 2\n : (2 - Math.pow(2, -20 * x + 10)) / 2;\n }\n\n ease_in_circ(x)\n {\n return 1 - Math.sqrt(1 - Math.pow(x, 2));\n }\n\n ease_out_circ(x)\n {\n return Math.sqrt(1 - Math.pow(x - 1, 2));\n }\n\n ease_in_out_circ(x)\n {\n return x < 0.5\n ? (1 - Math.sqrt(1 - Math.pow(2 * x, 2))) / 2\n : (Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2;\n }\n\n ease_in_back(x)\n {\n return 2.7015 * x * x * x - 1.7015 * x * x;\n }\n\n ease_out_back(x)\n {\n return 1 + 2.7015 * Math.pow(x - 1, 3) + 1.7015 * Math.pow(x - 1, 2);\n }\n\n ease_in_out_back(x)\n {\n return x < 0.5\n ? (Math.pow(2 * x, 2) * ((2.5949095 + 1) * 2 * x - 2.5949095)) / 2\n : (Math.pow(2 * x - 2, 2) * ((2.5949095 + 1) * (x * 2 - 2) + 2.5949095) + 2) / 2;\n }\n\n ease_in_elastic(x)\n {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : -Math.pow(2, 10 * x - 10) * Math.sin((x * 10 - 10.75) * c4);\n }\n\n ease_out_elastic(x)\n {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * 2.0943950) + 1;\n }\n\n ease_in_out_elastic(x)\n {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? -(Math.pow(2, 20 * x - 10) * Math.sin((20 * x - 11.125) * 1.3962633)) / 2\n : Math.pow(2, -20 * x + 10) * Math.sin((20 * x - 11.125) * 1.3962633) / 2 + 1;\n }\n\n ease_in_bounce(x)\n {\n return 1 - this.ease_out_bounce(1 - x);\n }\n\n ease_out_bounce(x)\n {\n const n1 = 7.5625;\n const d1 = 2.75;\n\n if (x < 1 / d1)\n {\n return n1 * x * x;\n }\n else if (x < 2 / d1)\n {\n return n1 * (x -= 1.5 / d1) * x + 0.75;\n }\n else if (x < 2.5 / d1)\n {\n return n1 * (x -= 2.25 / d1) * x + 0.9375;\n }\n else\n {\n return n1 * (x -= 2.625 / d1) * x + 0.984375;\n }\n }\n\n ease_in_out_bounce(x)\n {\n return x < 0.5\n ? (1 - this.ease_out_bounce(1 - 2 * x)) / 2\n : (1 + this.ease_out_bounce(2 * x - 1)) / 2;\n }\n\n heartbeat(t)\n {\n return 1.0 - Math.pow(Math.abs(Math.sin(t + 1.0)), 63.0) * Math.sign(Math.sin(t)) * Math.sin(t + 1.5 + 1.0) * 0.8;\n }\n}\n\nexport default new EasingFunctions();\n","import EasingFunctions from '../utilities/EasingFunctions';\n\nexport default class ActionInterpolator\n{\n constructor(easing_function = 'linear')\n {\n this.easing_function = undefined;\n\n if (typeof easing_function === 'string')\n {\n this.easing_function = EasingFunctions[easing_function];\n }\n else\n {\n this.easing_function = easing_function;\n }\n }\n\n update(context, t)\n {\n\n }\n}\n","import ActionInterpolator from './ActionInterpolator';\nimport { Math as TMath } from 'three';\n\nexport default class NumberInterpolator extends ActionInterpolator\n{\n constructor(attribute_name, from = 0, to = 1, easing_function = 'linear')\n {\n super(easing_function);\n\n this.attribute_name = attribute_name;\n this.from = from;\n this.to = to;\n }\n\n update(context, t)\n {\n context[this.attribute_name] = TMath.lerp(this.from, this.to, this.easing_function(t));\n }\n\n evaluate(t)\n {\n return TMath.lerp(this.from, this.to, this.easing_function(t));\n }\n}\n","class ViewContext\n{\n constructor()\n {\n this.app = undefined;\n }\n\n set_app(app)\n {\n this.app = app;\n }\n}\n\nexport default new ViewContext();\n","import ViewContext from '../view_components/ViewContext';\n\nexport default class ActionEvent\n{\n constructor(name, method)\n {\n this.name = name;\n this.method = method;\n }\n\n trigger()\n {\n ViewContext.app[this.name][this.method]();\n }\n}\n","export default class DrawIOAnimationSheet\n{\n constructor()\n {\n\n }\n\n parse(xml_document)\n {\n const doc = new DOMParser().parseFromString(xml_document, 'text/xml');\n\n const animation_nodes = doc.querySelectorAll('mxGeometry');\n\n const animation_tracks = [];\n const triggers = [];\n\n for (let i = 0; i < animation_nodes.length; i++)\n {\n const node = animation_nodes[i];\n const parent_node = node.parentElement;\n const data = parent_node.getAttribute('value');\n\n const x_pos = this.get_node_x_position(node);\n\n const from = x_pos / 100;\n const duration = parseFloat(node.getAttribute('width')) / 100;\n\n // is trigger\n if (parent_node.getAttribute('style').includes('rhombus;'))\n {\n const split_data = data.split('.');\n const trigger_name = split_data[0];\n const trigger_method = split_data[1];\n\n triggers.push({\n name: trigger_name,\n method: trigger_method,\n at_time: from + duration * 0.5\n });\n }\n\n const valid_element = parent_node.getAttribute('style').includes('rounded=0;') &&\n !parent_node.getAttribute('style').includes('text;');\n\n if (valid_element && data !== '' && !data.includes(' '))\n {\n const split_data = data.split('=');\n\n const attribute_name = split_data[0];\n\n const value_data = split_data[1].split('--');\n const to_value = parseFloat(value_data[0]);\n const easing_function = value_data[1];\n\n if (split_data.length !== 2)\n {\n console.error('DrawIO data is malformed:', data);\n }\n\n if (value_data.length !== 2)\n {\n console.error('DrawIO data is malformed:', data);\n }\n\n animation_tracks.push({\n attribute_name: attribute_name,\n from_time: from,\n to_time: from + duration,\n to_value: to_value,\n easing_function: easing_function\n });\n }\n }\n\n animation_tracks.sort((a, b) =>\n {\n return a.from_time - b.from_time;\n });\n return {\n animation_tracks: animation_tracks,\n triggers: triggers\n };\n }\n\n get_node_x_position(node)\n {\n const x_pos = node.getAttribute('x');\n return x_pos === null ? 0 : parseFloat(x_pos);\n }\n}\n","import ActionSequencer from '../../action_sequencer/ActionSequencer';\nimport NumberInterpolator from '../../action_sequencer/NumberInterpolator';\nimport ActionEvent from '../../action_sequencer/ActionEvent';\nimport DrawIOAnimationSheet from './DrawIOAnimationSheet';\n\nexport default class ActionSequencerBuilder\n{\n constructor(initial_state_data)\n {\n this.initial_state_data = initial_state_data;\n }\n\n from_animation_sheet(animation_data, current_context, initial_context)\n {\n initial_context = initial_context || this.initial_state_data;\n const tracks = animation_data.animation_tracks;\n const triggers = animation_data.triggers;\n\n const initial_tracks = this.state_to_tracks(this.initial_state_data);\n\n for (let i = 0; i < initial_tracks.length; i++)\n {\n if (tracks.find(element => element.attribute_name === initial_tracks[i].attribute_name) === undefined)\n {\n tracks.push(initial_tracks[i]);\n }\n }\n\n const sequencer = new ActionSequencer(current_context);\n\n for (let i = 0; i < tracks.length; i++)\n {\n const t = tracks[i];\n const interpolator = new NumberInterpolator(t.attribute_name, current_context[t.attribute_name], t.to_value, t.easing_function);\n sequencer.add_action_interpolator(t.from_time, t.to_time, interpolator, true);\n }\n\n for (let i = 0; i < triggers.length; i++)\n {\n const t = triggers[i];\n const action_event = new ActionEvent(t.name, t.method);\n sequencer.add_action_event(t.at_time, action_event);\n }\n\n return sequencer;\n }\n\n state_to_tracks(state)\n {\n const tracks = [];\n\n const keys = Object.keys(state);\n\n for (let i = 0; i < keys.length; i++)\n {\n tracks.push({\n attribute_name: keys[i],\n from_time: 0,\n to_time: 1,\n to_value: state[keys[i]],\n easing_function: 'ease_in_out_cubic'\n });\n }\n\n return tracks;\n }\n\n from_draw_io(xml, context)\n {\n const transition_data = (new DrawIOAnimationSheet()).parse(xml);\n const tracks = transition_data.animation_tracks;\n const triggers = transition_data.triggers;\n const sequencer = new ActionSequencer(context);\n\n for (let i = 0; i < tracks.length; i++)\n {\n const t = tracks[i];\n const interpolator = new NumberInterpolator(t.attribute_name, context[t.attribute_name], t.to_value, t.easing_function);\n sequencer.add_action_interpolator(t.from_time, t.to_time, interpolator, true);\n }\n\n for (let i = 0; i < triggers.length; i++)\n {\n const t = triggers[i];\n const action_event = new ActionEvent(t.name, t.method);\n sequencer.add_action_event(t.at_time, action_event);\n }\n\n return sequencer;\n }\n}\n","class EventManager\n{\n init()\n {\n this.queue = {};\n\n this.zoom_changed_evt = 'zoom_changed';\n this.store_clickd_evt = 'store_clicked';\n this.point_selected_evt = 'point_selected';\n this.config_changed = 'config_changed';\n\n this.path_substep_completed = 'path_substep_completed';\n this.path_completed = 'path_completed';\n this.go_to_store_requested_evt = 'go_to_store_requested';\n\n this.resource_loaded_evt = 'resource_loaded';\n this.service_clicked_evt = 'service_clicked';\n this.unit_pos_updated_evt = 'unit_position_updated';\n\n this.floor_changed_evt = 'floor_changed';\n\n this.on_enter_floor_navigation = 'on_enter_floor_navigation';\n this.on_exit_floor_navigation = 'on_exit_floor_navigation';\n\n this.on_enter_floor_selection = 'on_enter_floor_selection';\n this.on_exit_floor_selection = 'on_exit_floor_selection';\n\n this.on_enter_outside_navigation = 'on_enter_outside_navigation';\n this.on_exit_outside_navigation = 'on_exit_outside_navigation';\n\n this.step_selected_evt = 'step_selected';\n }\n\n fire(event, payload)\n {\n const queue = this.queue[event];\n\n if (queue === undefined)\n {\n return;\n }\n let i = queue.length;\n while (i--)\n {\n queue[i](payload);\n }\n }\n\n on(event, callback)\n {\n if (typeof this.queue[event] === 'undefined')\n {\n this.queue[event] = [];\n }\n\n this.queue[event].push(callback);\n }\n\n fire_zoom_changed(zoom)\n {\n this.fire(this.zoom_changed_evt, zoom);\n }\n\n fire_store_selected(store_id)\n {\n this.fire(this.store_clickd_evt, store_id);\n }\n\n fire_point_selected(hit_data)\n {\n this.fire(this.point_selected_evt, hit_data);\n }\n\n fire_config_changed()\n {\n this.fire(this.config_changed);\n }\n\n fire_path_substep_completed(step_number)\n {\n this.fire(this.path_substep_completed, step_number);\n }\n\n fire_path_completed()\n {\n this.fire(this.path_completed);\n }\n\n fire_step_selected(step_index)\n {\n this.fire(this.step_selected_evt, step_index);\n }\n\n fire_go_to_store_requested(store_id)\n {\n this.fire(this.go_to_store_requested_evt, store_id);\n }\n\n fire_resource_loaded(resource)\n {\n this.fire(this.resource_loaded_evt, resource);\n }\n\n fire_service_clicked(service)\n {\n this.fire(this.service_clicked_evt, service);\n }\n\n fire_unit_position_updated(unit_data)\n {\n this.fire(this.unit_pos_updated_evt, unit_data);\n }\n\n fire_floor_switched(floor_id)\n {\n this.fire(this.floor_changed_evt, floor_id);\n }\n\n fire_on_enter_floor_navigation(state)\n {\n this.fire(this.on_enter_floor_navigation, state);\n }\n\n fire_on_exit_floor_navigation(state)\n {\n this.fire(this.on_exit_floor_navigation, state);\n }\n\n fire_on_enter_floor_selection(state)\n {\n this.fire(this.on_enter_floor_selection, state);\n }\n\n fire_on_exit_floor_selection(state)\n {\n this.fire(this.on_exit_floor_selection, state);\n }\n\n fire_on_enter_outside_navigation(state)\n {\n this.fire(this.on_enter_outside_navigation, state);\n }\n\n fire_on_exit_outside_navigation(state)\n {\n this.fire(this.on_exit_outside_navigation, state);\n }\n}\n\nexport default new EventManager();\n","import EventManager from './EventManager';\n\nclass ResourceContainer\n{\n init()\n {\n this.resources = {};\n this.resources_by_url = {};\n }\n\n set_resource(name, url, resource)\n {\n const urls = Object.keys(this.resources_by_url);\n\n if (urls.includes(url))\n {\n this.resources[name] = this.resources_by_url[url];\n }\n else\n {\n this.resources[name] = resource;\n this.resources_by_url[url] = resource;\n }\n\n EventManager.fire_resource_loaded({ name: name, value: resource });\n }\n\n get_resource(name)\n {\n return this.resources[name];\n }\n\n get(name)\n {\n return this.resources[name];\n }\n}\n\nexport default new ResourceContainer();\n","import ActionSequencerBuilder from './ActionSequencerBuilder';\n\nexport default class TransitionTable\n{\n constructor()\n {\n this.transitions = [];\n this.initial_state_data = {};\n }\n\n get(to_state, current_context)\n {\n for (let i = 0; i < this.transitions.length; i++)\n {\n if (this.transitions[i].to === to_state)\n {\n const action_sequencer = new ActionSequencerBuilder(this.initial_state_data).from_animation_sheet(this.transitions[i].data, current_context);\n\n return action_sequencer;\n }\n }\n\n console.error('TransitionTable.get no data found for: ', to_state);\n return undefined;\n }\n\n add_transitions(transitions)\n {\n for (let i = 0; i < transitions.length; i++)\n {\n this.transitions.push(transitions[i]);\n }\n }\n\n set_transitions(transitions)\n {\n this.transitions = transitions;\n }\n\n set_initial_state_data(initial_state_data)\n {\n this.initial_state_data = initial_state_data;\n }\n}\n","import { Vector2 } from 'three';\nimport { Clock } from 'three';\n\nclass Time\n{\n init()\n {\n this.___time = new Clock();\n this.__delta_time = 0;\n this.__elapsed_time = 0;\n this.__allocated_time = new Vector2(0, 0);\n }\n\n get delta_time()\n {\n return this.__delta_time < 0.4 ? this.__delta_time : 0.016;\n }\n\n get elapsed_time()\n {\n return this.__elapsed_time;\n }\n\n get shader_time()\n {\n this.__allocated_time.x = this.delta_time;\n this.__allocated_time.y = this.elapsed_time;\n return this.__allocated_time;\n }\n\n __update()\n {\n this.__delta_time = this.___time.getDelta();\n this.__elapsed_time = this.___time.getElapsedTime();\n }\n}\n\nexport default new Time();\n","export default class ViewState\n{\n constructor(name)\n {\n this.name = name;\n }\n\n start()\n {\n }\n\n show()\n {\n }\n\n hide()\n {\n }\n\n before_enter()\n {\n }\n\n on_enter()\n {\n }\n\n update()\n {\n }\n\n update_enter_transition(global_view_data, transition_progress, action_sequencer)\n {\n // Backward compatibility. It will be removed in future releases.\n this.update_transition(global_view_data, transition_progress, action_sequencer);\n }\n\n update_exit_transition(global_view_data, transition_progress, action_sequencer)\n {\n }\n\n // Deprecated\n update_transition(global_view_data, transition_progress, action_sequencer)\n {\n }\n\n before_exit()\n {\n }\n\n on_exit()\n {\n }\n}\n","import Time from '../../Time';\nimport ViewState from '../ViewState';\n\nexport default class ViewStateTransitionHandler\n{\n constructor(transition_table)\n {\n this.last_state = new ViewState();\n this.current_state = new ViewState();\n\n this.initial_state_data = {};\n this.current_state_data = {};\n\n this.transition_table = transition_table;\n\n this.transitioning = false;\n }\n\n go_to_state(state, skip = false)\n {\n if (this.transitioning)\n {\n this.__exit_last_state();\n }\n\n this.last_state = this.current_state;\n this.current_state = state;\n\n this.last_state.before_exit();\n this.current_state.show();\n\n this.action_sequencer = this.transition_table.get(this.current_state.name, this.current_state_data);\n this.current_state.before_enter();\n\n this.action_sequencer.play();\n\n this.transitioning = true;\n\n if (skip)\n {\n this.action_sequencer.skip();\n this.update();\n }\n }\n\n update()\n {\n if (this.transitioning)\n {\n this.__update_transitions();\n\n if (this.action_sequencer.is_finished())\n {\n this.transitioning = false;\n\n this.__update_transitions();\n\n this.__exit_last_state();\n\n this.current_state.on_enter();\n }\n }\n else\n {\n this.current_state.update();\n }\n }\n\n set_state(state)\n {\n this.current_state = state;\n }\n\n set_initial_state_data(initial_state_data)\n {\n Object.assign(this.initial_state_data, initial_state_data);\n Object.assign(this.current_state_data, initial_state_data);\n }\n\n __update_transitions()\n {\n this.action_sequencer.update(Time.delta_time);\n this.last_state.update_exit_transition(this.current_state_data, this.action_sequencer.get_progress(), this.action_sequencer);\n this.current_state.update_enter_transition(this.current_state_data, this.action_sequencer.get_progress(), this.action_sequencer);\n }\n\n __exit_last_state()\n {\n if (this.last_state.name !== this.current_state.name)\n {\n this.last_state.hide();\n }\n\n this.last_state.on_exit();\n }\n}\n","import TransitionTable from './transition/TransitionTable';\nimport ViewStateTransitionHandler from './transition/ViewStateTransitionHandler';\n\nclass ViewManager\n{\n constructor()\n {\n this.views = [];\n\n this.transition_table = new TransitionTable();\n this.transition_handler = new ViewStateTransitionHandler(this.transition_table);\n }\n\n update()\n {\n this.transition_handler.update();\n\n this.__set_views_opacities();\n }\n\n go_to_view(view_name, change_url = true, skip = false)\n {\n const v = this.get(view_name);\n this.transition_handler.go_to_state(v, skip);\n\n if (change_url)\n {\n this.__change_browser_url(v.url);\n }\n }\n\n register_view(view)\n {\n this.views.push(view);\n }\n\n has_view(view_name)\n {\n for (let i = 0; i < this.views.length; i++)\n {\n if (this.views[i].name === view_name)\n {\n return true;\n }\n }\n return false;\n }\n\n add_transitions(transitions)\n {\n this.transition_table.add_transitions(transitions);\n }\n\n set_transitions(transitions)\n {\n this.transition_table.set_transitions(transitions);\n }\n\n set_view(view_name)\n {\n const view = this.get(view_name);\n\n this.transition_handler.set_state(view);\n }\n\n get_current_view()\n {\n return this.transition_handler.current_state;\n }\n\n get_view_by_name(view_name)\n {\n console.warn('DEPRECATED. Use ViewManager.get instead');\n this.get(view_name);\n }\n\n get(view_name)\n {\n for (let i = 0; i < this.views.length; i++)\n {\n if (this.views[i].name === view_name)\n {\n return this.views[i];\n }\n }\n console.error('[ViewManager.get] no view found for: ', view_name);\n return undefined;\n }\n\n get_view_by_url(url)\n {\n console.warn('DEPRECATED. Use ViewManager.get_by_url instead');\n this.get_by_url(url);\n }\n\n get_by_url(url)\n {\n for (let i = 0; i < this.views.length; i++)\n {\n if (this.views[i].url === url)\n {\n return this.views[i];\n }\n }\n console.error('[ViewManager.get_by_url] no view found for: ', url);\n return undefined;\n }\n\n set_initial_state_data(initial_state_data)\n {\n this.transition_table.set_initial_state_data(initial_state_data);\n this.transition_handler.set_initial_state_data(initial_state_data);\n }\n\n __change_browser_url(url)\n {\n window.history.pushState('', '', url);\n }\n\n __set_views_opacities()\n {\n for (let i = 0; i < this.views.length; i++)\n {\n this.views[i].set_opacity(this.transition_handler.current_state_data);\n }\n }\n}\n\nexport default new ViewManager();\n","import ResourceContainer from '../ResourceContainer';\nimport DrawIOAnimationSheet from './transition/DrawIOAnimationSheet';\nimport ViewManager from './ViewManager';\nimport ViewState from './ViewState';\n\nexport default class ApplicationView extends ViewState\n{\n constructor({ name, url, container })\n {\n super(name);\n\n this.container = container;\n this.url = url;\n\n const transition_data = new DrawIOAnimationSheet().parse(ResourceContainer.get(`${name}_data`));\n\n const transitions = [\n {\n to: name,\n data: transition_data\n }\n ];\n\n ViewManager.register_view(this);\n ViewManager.add_transitions(transitions);\n }\n\n show()\n {\n this.container.classList.add('before_enter');\n this.container.classList.remove('before_exit');\n this.container.classList.remove('hidden');\n }\n\n on_enter()\n {\n this.container.classList.remove('before_enter');\n this.container.classList.remove('before_exit');\n this.container.classList.remove('hidden');\n }\n\n before_exit()\n {\n this.container.classList.add('before_exit');\n this.container.classList.remove('before_enter');\n this.container.classList.remove('hidden');\n }\n\n hide()\n {\n this.container.classList.add('hidden');\n this.container.classList.remove('before_enter');\n this.container.classList.remove('before_exit');\n }\n\n set_opacity(current_state_data)\n {\n this.container.style.opacity = current_state_data[`${this.name}_opacity`];\n }\n}\n","export default class BaseApplication\n{\n on_post_start()\n {}\n\n on_enter()\n {}\n\n on_exit()\n {}\n\n update()\n {}\n\n on_post_render()\n {}\n\n on_pre_render()\n {}\n\n on_frame_end()\n {}\n}\n","export default class BaseRender\n{\n constructor()\n {\n\n }\n\n render()\n {\n\n }\n\n on_enter(context, renderer)\n {\n\n }\n\n on_exit(context, renderer)\n {\n\n }\n\n resize()\n {\n\n }\n\n dispose()\n {\n\n }\n}\n","import basic_vert from '../shaders/basic_color/basic_color.vert';\nimport basic_frag from '../shaders/basic_color/basic_color.frag';\n\nimport { ShaderMaterial } from 'three';\nimport { Color } from 'three';\n\nexport default class BaseShaderMaterial extends ShaderMaterial\n{\n constructor(vert, frag, uniforms)\n {\n super({\n vertexShader: vert || basic_vert,\n fragmentShader: frag || basic_frag,\n uniforms: uniforms || {\n _Color: { value: new Color('#FF0000') }\n }\n });\n }\n}\n","import vert from '../shaders/copy/copy.vert';\nimport frag from '../shaders/copy/copy.frag';\n\nimport { ShaderMaterial } from 'three';\nimport { Vector2 } from 'three';\nimport { NoBlending } from 'three';\nimport { AlwaysDepth } from 'three';\n\nexport default class BlitMaterial extends ShaderMaterial\n{\n constructor(frag_shader, vert_shader, defines)\n {\n super({\n uniforms: {\n _MainTex: { value: null },\n _Resolution: { value: new Vector2(0, 0) },\n _TargetResolution: { value: new Vector2(0, 0) }\n },\n defines: defines || {},\n vertexShader: vert_shader || vert,\n fragmentShader: frag_shader || frag,\n depthWrite: false,\n blending: NoBlending,\n depthTest: false,\n depthFunc: AlwaysDepth\n });\n }\n}\n","class CameraManager\n{\n init()\n {\n this._current = undefined;\n }\n\n set current(camera)\n {\n this._current = camera;\n }\n\n get current()\n {\n return this._current;\n }\n}\n\nexport default new CameraManager();\n","class Capabilities\n{\n init()\n {\n this.max_anisotropy = 0;\n this.vertex_texture_sampler_available = false;\n this.fp_textures_available = false;\n }\n}\n\nexport default new Capabilities();\n","import { CanvasTexture } from 'three';\nimport { Vector2 } from 'three';\nimport { UVMapping } from 'three';\nimport { ClampToEdgeWrapping } from 'three';\nimport { NearestFilter } from 'three';\n\nexport default class CanvasDrawer\n{\n constructor(uses_dynamic_font)\n {\n this.uses_dynamic_font = uses_dynamic_font;\n this.__textHeight = null;\n\n this.canvas = document.createElement('canvas');\n this.ctx = this.canvas.getContext('2d');\n }\n\n getFontHeight(fontStyle = 'Arial')\n {\n if (this.__textHeight == null || this.uses_dynamic_font)\n {\n const body = document.getElementsByTagName('body')[0];\n const dummy = document.createElement('div');\n const dummyText = document.createTextNode('MÉqgOLAKTAL');\n dummy.appendChild(dummyText);\n dummy.setAttribute('style', `font:${fontStyle};position:absolute;top:0;left:0`);\n body.appendChild(dummy);\n this.__textHeight = dummy.offsetHeight;\n body.removeChild(dummy);\n }\n return this.__textHeight;\n }\n\n get_text_size(text, font = '24px Arial')\n {\n const size = new Vector2();\n this.ctx.font = font;\n size.x = Math.ceil(this.ctx.measureText(text).width);\n size.y = Math.ceil(this.getFontHeight(font));\n return size;\n }\n\n draw_canvas(text, ctxOptions = {})\n {\n ctxOptions.font = ctxOptions.font || '24px Arial';\n ctxOptions.font_color = ctxOptions.font_color || '#000000';\n\n this.__draw(text, ctxOptions, this.canvas, this.ctx);\n return this.canvas;\n }\n\n draw_on_texture(text, ctxOptions)\n {\n const canvas = this.draw_canvas(text, ctxOptions);\n const canvas_texture = new CanvasTexture(canvas, UVMapping,\n ClampToEdgeWrapping,\n ClampToEdgeWrapping,\n NearestFilter,\n NearestFilter);\n canvas_texture.generateMipMaps = false;\n canvas_texture.needsUpdate = true;\n\n return canvas_texture;\n }\n\n __draw(text, ctxOptions)\n {}\n\n roundRect(ctx, x, y, width, height, radius, fill, stroke)\n {\n if (typeof stroke === 'undefined')\n {\n stroke = true;\n }\n if (typeof radius === 'undefined')\n {\n radius = 5;\n }\n if (typeof radius === 'number')\n {\n radius = { tl: radius, tr: radius, br: radius, bl: radius };\n }\n else\n {\n const defaultRadius = { tl: 0, tr: 0, br: 0, bl: 0 };\n for (const side in defaultRadius)\n {\n radius[side] = radius[side] || defaultRadius[side];\n }\n }\n ctx.beginPath();\n ctx.moveTo(x + radius.tl, y);\n ctx.lineTo(x + width - radius.tr, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + radius.tr);\n ctx.lineTo(x + width, y + height - radius.br);\n ctx.quadraticCurveTo(x + width, y + height, x + width - radius.br, y + height);\n ctx.lineTo(x + radius.bl, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - radius.bl);\n ctx.lineTo(x, y + radius.tl);\n ctx.quadraticCurveTo(x, y, x + radius.tl, y);\n ctx.closePath();\n if (fill)\n {\n ctx.fill();\n }\n if (stroke)\n {\n ctx.stroke();\n }\n }\n}\n","/*\n\n A configuration class used as a singleton\n\n*/\n\nclass Configuration\n{\n init(parameters = {})\n {\n this.dpr = 1;\n\n this.app = {}; // for arbitrary use in end application\n }\n\n from_json(json)\n {\n\n }\n}\n\nexport default new Configuration();\n","export default class Idle\n{\n constructor()\n {\n }\n\n get is_animating()\n {\n return false;\n }\n\n on_enter(view)\n {\n\n }\n\n update(view)\n {\n }\n\n on_exit(view)\n {\n\n }\n}\n","import Time from '../../Time';\nimport Idle from './Idle';\n\nimport { Math as TMath } from 'three';\n\nexport default class Animating\n{\n constructor()\n {\n this.t = 0;\n this.easing_function_t = 0;\n }\n\n get is_animating()\n {\n return true;\n }\n\n on_enter(animator)\n {\n }\n\n update(animator)\n {\n this.t += Time.delta_time / animator.duration;\n\n this.easing_function_t = animator.easing_function(this.t);\n this.easing_function_t = TMath.clamp(this.easing_function_t, 0, 1);\n\n animator.set_property_value(TMath.lerp(animator.from, animator.to, this.easing_function_t));\n\n if (this.easing_function_t >= 0.9999)\n {\n animator.set_property_value(animator.to);\n\n animator.set_current_state(new Idle());\n animator.finished_callback(animator);\n }\n }\n\n on_exit(view)\n {\n\n }\n}\n","import Animating from './css_animator_states/Animating';\nimport Idle from './css_animator_states/Idle';\nimport EasingFunctions from '../utilities/EasingFunctions';\n\nexport default class CSSAnimator\n{\n constructor({\n element,\n css_property,\n from = 0,\n to = 1,\n duration = 1,\n value_prefix = '',\n value_suffix = '',\n easing_function = EasingFunctions.ease_in_out_cubic,\n finished_callback = () =>\n {}\n })\n {\n this.element = element;\n this.css_property = css_property;\n this.from = from;\n this.to = to;\n this.value_prefix = value_prefix;\n this.value_suffix = value_suffix;\n this.duration = duration;\n this.easing_function = easing_function;\n this.finished_callback = finished_callback;\n\n this.current_state = new Idle();\n }\n\n animate()\n {\n this.set_current_state(new Animating());\n }\n\n stop()\n {\n this.set_current_state(new Idle());\n }\n\n set_property_value(value)\n {\n this.element.style[this.css_property] = `${this.value_prefix}${value}${this.value_suffix}`;\n }\n\n update()\n {\n this.current_state.update(this);\n }\n\n get is_animating()\n {\n return this.current_state.is_animating;\n }\n\n set_current_state(state)\n {\n this.current_state.on_exit(this);\n this.current_state = state;\n this.current_state.on_enter(this);\n }\n}\n","\nimport { Object3D } from 'three';\nimport { LineBasicMaterial } from 'three';\nimport { AlwaysDepth } from 'three';\nimport { BufferGeometry } from 'three';\nimport { Vector3 } from 'three';\nimport { Line } from 'three';\n\nexport default class AxisHelper extends Object3D\n{\n constructor(scale = 1.0)\n {\n super();\n\n const blue_points = [];\n blue_points.push(new Vector3(0, 0, 0));\n blue_points.push(new Vector3(0, 0, 1000));\n\n const blue_axis_mat = new LineBasicMaterial({ color: 0x4444ff, depthFunc: AlwaysDepth });\n const blue_axis_geo = new BufferGeometry().setFromPoints(blue_points);\n const blue_axis_line = new Line(blue_axis_geo, blue_axis_mat);\n blue_axis_line.renderOrder = 50000;\n\n const green_points = [];\n green_points.push(new Vector3(0, 0, 0));\n green_points.push(new Vector3(0, 1000, 0));\n\n const green_axis_mat = new LineBasicMaterial({ color: 0x44ff44, depthFunc: AlwaysDepth });\n const green_axis_geo = new BufferGeometry().setFromPoints(green_points);\n const green_axis_line = new Line(green_axis_geo, green_axis_mat);\n green_axis_line.renderOrder = 50000;\n\n const red_points = [];\n red_points.push(new Vector3(0, 0, 0));\n red_points.push(new Vector3(1000, 0, 0));\n\n const red_axis_mat = new LineBasicMaterial({ color: 0xff4444, depthFunc: AlwaysDepth });\n const red_axis_geo = new BufferGeometry().setFromPoints(red_points);\n const red_axis_line = new Line(red_axis_geo, red_axis_mat);\n red_axis_line.renderOrder = 50000;\n\n this.renderOrder = 100000;\n\n this.add(blue_axis_line);\n this.add(green_axis_line);\n this.add(red_axis_line);\n\n this.scale.set(scale, scale, scale);\n }\n\n update()\n {\n }\n\n dispose()\n {\n }\n}\n","import { Scene } from 'three';\n\nclass SceneManager\n{\n init()\n {\n this._current = new Scene();\n this._current.name = 'default_scene';\n }\n\n add_scene(name)\n {\n\n }\n\n get current()\n {\n return this._current;\n }\n\n set current(scene)\n {\n this._current = scene;\n }\n\n dispose()\n {\n this.current.traverse(child =>\n {\n if (child.geometry)\n {\n child.geometry.dispose();\n child.material.dispose();\n }\n });\n\n while (this.current.children.length > 0)\n {\n this.current.remove(this.current.children[0]);\n }\n }\n}\n\nexport default new SceneManager();\n","\nimport { Vector3, Mesh } from 'three';\nimport { BoxGeometry } from 'three';\nimport { MeshBasicMaterial } from 'three';\n\nexport default class Cube extends Mesh\n{\n constructor(size, segments, color)\n {\n size = size || new Vector3(1, 1, 1);\n segments = segments || new Vector3(1, 1, 1);\n color = color || 0xff0000;\n const geometry = new BoxGeometry(size.x, size.y, size.z, segments.x, segments.y, segments.z);\n const material = new MeshBasicMaterial({ color: color });\n super(geometry, material);\n }\n}\n","import { Mesh } from 'three';\nimport { SphereBufferGeometry } from 'three';\nimport { MeshBasicMaterial } from 'three';\n\nexport default class Sphere extends Mesh\n{\n constructor(radius, color)\n {\n color = color || '#FF0000';\n radius = radius || 1;\n const geometry = new SphereBufferGeometry(radius, 64, 64);\n const material = new MeshBasicMaterial({ color: color });\n super(geometry, material);\n }\n}\n","import { CylinderBufferGeometry } from 'three';\nimport { ConeBufferGeometry } from 'three';\nimport { MeshBasicMaterial } from 'three';\nimport { Vector3, Mesh } from 'three';\n\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\n\nexport default class Arrow extends Mesh\n{\n constructor(color, length, dir)\n {\n color = color || '#FF0000';\n length = length || 1;\n\n const cone_height = 0.4;\n const cylinder_height = length - cone_height;\n const cylinder_geo = new CylinderBufferGeometry(0.01, 0.01, cylinder_height, 32);\n cylinder_geo.translate(0, cylinder_height / 2, 0);\n\n const cone_geometry = new ConeBufferGeometry(0.1, cone_height, 32);\n cone_geometry.translate(0, cylinder_height + cone_height / 2, 0);\n\n const buffer_geometry = BufferGeometryUtils.mergeBufferGeometries([cylinder_geo, cone_geometry]);\n buffer_geometry.rotateX(3.14 / 2);\n\n const material = new MeshBasicMaterial({ color: color });\n super(buffer_geometry, material);\n\n if (dir)\n {\n this.quaternion.setFromUnitVectors(new Vector3(0, 0, 1), dir);\n }\n\n this._dir = dir;\n }\n\n set dir(dir)\n {\n this.quaternion.setFromUnitVectors(new Vector3(0, 0, 1), dir);\n this._dir = dir;\n }\n\n get dir()\n {\n return this._dir;\n }\n\n set length(value)\n {\n this.scale.z = value;\n }\n\n get length()\n {\n return this.scale.z;\n }\n}\n","import { Vector2 } from 'three';\n\nclass Screen\n{\n init()\n {\n this.width = 1;\n this.height = 1;\n\n this.position = new Vector2();\n\n this.render_width = 1;\n this.render_height = 1;\n this.width_height = new Vector2(this.width, this.height);\n\n this.dpr = 1;\n this.pixel_size = new Vector2(1 / this.width, 1 / this.height);\n }\n\n update_position(x, y)\n {\n this.position.set(x, y);\n }\n\n update()\n {\n this.size_changed = false;\n }\n\n update_size(width, height)\n {\n this.width = width;\n this.height = height;\n\n this.pixel_size = new Vector2(1 / this.width, 1 / this.height);\n\n this.width_height.x = width;\n this.width_height.y = height;\n\n this.render_width = width * this.dpr;\n this.render_height = height * this.dpr;\n\n this.size_changed = true;\n }\n\n apply_pixel_density_v2(vector2)\n {\n vector2.multiplyScalar(1 / this.dpr);\n\n return vector2;\n }\n\n apply_pixel_density(value)\n {\n return value * (1 / this.dpr);\n }\n\n get_pixel_size()\n {\n return this.pixel_size;\n }\n\n get aspect_ratio()\n {\n return this.width / this.height;\n }\n}\n\nexport default new Screen();\n","import BaseShaderMaterial from './BaseShaderMaterial';\nimport { Vector2 } from 'three';\nexport default class ScreenSpaceTextureMaterial extends BaseShaderMaterial\n{\n constructor(x, y, w, h)\n {\n const vert = `\n uniform vec2 _ScreenSpacePosition;\n uniform vec2 _ScreenSize;\n uniform vec2 _TextureSize;\n varying vec2 vUv;\n void main()\n {\n vec2 pos = uv * vec2(_TextureSize.x / _ScreenSize.x, _TextureSize.y / _ScreenSize.y);\n pos += vec2(_ScreenSpacePosition.x / _ScreenSize.x, _ScreenSpacePosition.y / _ScreenSize.y);\n\n pos.x = pos.x * 2.0 - 1.0;\n pos.y = pos.y * 2.0 - 1.0;\n\n gl_Position = vec4(pos, 0.0, 1.0);\n vUv = uv;\n }\n `;\n const frag = `\n uniform sampler2D _MainTex;\n varying vec2 vUv;\n\n void main()\n {\n gl_FragColor = texture2D(_MainTex, vUv);\n }\n `;\n super(vert, frag, {\n _MainTex: { value: undefined },\n _ScreenSpacePosition: { value: new Vector2() },\n _ScreenSize: { value: new Vector2() },\n _TextureSize: { value: new Vector2() }\n });\n }\n\n set_position(x, y)\n {\n this.uniforms._ScreenSpacePosition.value.set(x, y);\n }\n\n set_texture(tex, w, h)\n {\n this.uniforms._MainTex.value = tex;\n this.uniforms._TextureSize.value.set(tex.image.width, tex.image.height);\n\n if (w !== undefined)\n {\n this.uniforms._TextureSize.value.x = w;\n }\n if (h !== undefined)\n {\n this.uniforms._TextureSize.value.y = h;\n }\n }\n\n set_screen_size(w, h)\n {\n this.uniforms._ScreenSize.value.set(w, h);\n }\n}\n","import { Color } from 'three';\nimport { PerspectiveCamera as THREEPerspectiveCamera } from 'three';\n\nexport default class PerspectiveCamera extends THREEPerspectiveCamera\n{\n constructor(fov, aspect, near, far)\n {\n super(fov, aspect, near, far);\n\n this.clear_color = new Color('#000000');\n this.clear_alpha = 1;\n }\n}\n","import AxisHelper from './components/AxisHelper';\nimport basic_color_vert from './shaders/basic_color/basic_color.vert';\nimport basic_color_frag from './shaders/basic_color/basic_color.frag';\nimport SceneManager from './SceneManager';\nimport Cube from './primitives/Cube';\nimport Sphere from './primitives/Sphere';\nimport Arrow from './primitives/Arrow';\nimport Screen from './Screen';\nimport ScreenSpaceTextureMaterial from './materials/ScreenSpaceTextureMaterial';\nimport { Vector3 } from 'three';\nimport { LineBasicMaterial } from 'three';\nimport { BufferGeometry } from 'three';\nimport { Line } from 'three';\nimport { PlaneBufferGeometry } from 'three';\nimport { ShaderMaterial } from 'three';\nimport { Vector4 } from 'three';\nimport { Mesh } from 'three';\nimport { Box3 } from 'three';\nimport { Box3Helper } from 'three';\nimport { Scene } from 'three';\nimport { CatmullRomCurve3 } from 'three';\nimport { SphereGeometry } from 'three';\nimport { MeshBasicMaterial } from 'three';\nimport PerspectiveCamera from './PerspectiveCamera';\n\nclass Debug\n{\n init()\n {\n this.Vector3_one = new Vector3(1, 1, 1);\n this.Vector3_zero = new Vector3(0, 0, 0);\n this.canvas_renderer = undefined;\n\n this.display_texture_meshes = [];\n\n this.ctx = undefined;\n this.scene = new Scene();\n this.camera = new PerspectiveCamera();\n // this.camera.clear_alpha = 0;\n }\n\n draw_arrow(origin, dir, color = 0xff0000)\n {\n const arrow = new Arrow(color, dir.length(), dir.clone().normalize());\n arrow.position.copy(origin);\n SceneManager.current.add(arrow);\n return arrow;\n }\n\n draw_axis()\n {\n const axis = new AxisHelper();\n SceneManager.current.add(axis);\n return axis;\n }\n\n set_debug_RT(RT)\n {\n this.rt_debug = RT;\n }\n\n draw_rectangle(position_2d, width, height, color)\n {\n width = width || 100;\n height = height || 100;\n this.ctx.fillStyle = color || 'rgba(255, 0, 0, 1)';\n this.ctx.fillRect(position_2d.x - width / 2,\n (this.ctx.canvas.height - position_2d.y) - height / 2, width, height);\n }\n\n clear()\n {\n if (this.ctx)\n {\n this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);\n }\n }\n\n draw_line_2D(from, to, color)\n {\n this.ctx.strokeStyle = color || 'rgba(255, 0, 0, 1)';\n this.ctx.beginPath();\n this.ctx.moveTo(from.x, from.y);\n this.ctx.lineTo(to.x, to.y);\n this.ctx.closePath();\n this.ctx.stroke();\n }\n\n draw_line(points, color = 0xff0000)\n {\n const material = new LineBasicMaterial({\n color: color\n });\n\n const geometry = new BufferGeometry().setFromPoints(points);\n\n const line = new Line(geometry, material);\n line.frustumCulled = false;\n SceneManager.current.add(line);\n return line;\n }\n\n draw_cube(pos, size, color)\n {\n size = size || 1;\n color = color || 0xff0000;\n pos = pos || new Vector3();\n\n const cube = new Cube(new Vector3(size, size, size), undefined, color);\n cube.position.copy(pos);\n SceneManager.current.add(cube);\n return cube;\n }\n\n draw_oriented_cube(from, to, height = 1, color = '#FF0000', depth = 0.1)\n {\n const size = from.distanceTo(to);\n const cube = new Cube(new Vector3(depth, height, size), undefined, color);\n\n const center = to.clone().sub(from).multiplyScalar(0.5);\n const forward_dir = center.clone().normalize();\n center.add(from);\n\n cube.position.copy(center);\n\n // let up = new Vector3(0, 1, 0);\n // let forward = forward_dir.clone();\n // let right = forward.clone().cross(up);\n\n // cube.quaternion.setFromRotationMatrix(new Matrix4().makeBasis(right,up,forward));\n cube.quaternion.setFromUnitVectors(new Vector3(0, 0, -1), forward_dir);\n\n SceneManager.current.add(cube);\n return cube;\n }\n\n draw_plane(width, height, color)\n {\n const geometry = new PlaneBufferGeometry(width, height);\n const material = new ShaderMaterial({\n uniforms: {\n _Color: { value: new Vector4(0, 1, 0, 0.2) }\n },\n vertexShader: basic_color_vert,\n fragmentShader: basic_color_frag,\n transparent: true,\n depthWrite: false\n });\n\n const plane = new Mesh(geometry, material);\n plane.renderOrder = -10000;\n SceneManager.current.add(plane);\n return plane;\n }\n\n draw_empty_cube(pos, size, color)\n {\n size = size || 1;\n color = color || 0xff0000;\n\n const box = new Box3().setFromCenterAndSize(new Vector3(), new Vector3(size, size, size));\n const helper = new Box3Helper(box, color);\n helper.position.copy(pos || new Vector3());\n return helper;\n }\n\n draw_sphere(pos, size, color)\n {\n size = size || 1;\n color = color || 0xff0000;\n pos = pos || new Vector3();\n\n const sphere = new Sphere(size, color);\n sphere.position.copy(pos);\n SceneManager.current.add(sphere);\n return sphere;\n }\n\n draw_point_array(input_points, open = false, color = 0xff0000)\n {\n const catmull = new CatmullRomCurve3(input_points, open);\n catmull.updateArcLengths();\n const points = catmull.getSpacedPoints(200);\n const line_helper = this.draw_line(points, 0x00ff00);\n // line_helper.position.y = 1.5;\n return line_helper;\n }\n\n draw_sphere_helper(sphere, color)\n {\n color = color || 0xff0000;\n const geometry = new SphereGeometry(sphere.radius, 32, 32);\n const material = new MeshBasicMaterial({ color: color });\n const sphere_mesh = new Mesh(geometry, material);\n sphere_mesh.position.copy(sphere.center);\n SceneManager.current.add(sphere_mesh);\n return sphere_mesh;\n }\n\n draw_math_sphere(sphere)\n {\n const geometry = new SphereGeometry(sphere.radius, 32, 32);\n const material = new ShaderMaterial({\n uniforms: {\n _Color: { value: new Vector4(1, 0, 0, 0.2) }\n },\n vertexShader: basic_color_vert,\n fragmentShader: basic_color_frag,\n transparent: true\n });\n // var material = new MeshBasicMaterial( {color: 0xff0000, transparent = true} );\n const sphere1 = new Mesh(geometry, material);\n sphere1.position.copy(sphere.center);\n SceneManager.current.add(sphere1);\n }\n\n draw_bounding_box(bb)\n {\n const helper = new Box3Helper(bb, 0xffff00);\n SceneManager.current.add(helper);\n }\n\n draw_curve(curve, options)\n {\n const offset = new Vector3(0, 0, 0);\n if (options)\n {\n offset.y = options.offset || 0;\n }\n\n for (let i = 0; i < curve.length - 1; i++)\n {\n this.draw_line(curve[i].clone().add(offset), curve[i + 1].clone().add(offset));\n }\n }\n\n draw_texture(tex, w, h)\n {\n const mesh = new Mesh(new PlaneBufferGeometry(1, 1), new ScreenSpaceTextureMaterial());\n this.display_texture_meshes.push(mesh);\n this.scene.add(mesh);\n\n mesh.material.set_texture(tex, w, h);\n return mesh;\n }\n\n render(graphics)\n {\n for (let i = 0; i < this.display_texture_meshes.length; i++)\n {\n this.display_texture_meshes[i].material.set_screen_size(Screen.width, Screen.height);\n }\n if (this.scene.children.length > 0)\n {\n graphics.render(this.scene, this.camera);\n }\n }\n}\n\nexport default new Debug();\n","import BlitMaterial from '../materials/BlitMaterial';\nimport frag from '../shaders/clear/clear_depth_normal.frag';\n\nimport { Vector4 } from 'three';\n\nexport default class ClearDepthNormalMaterial extends BlitMaterial\n{\n constructor(clear_depth, clear_normal)\n {\n super(frag);\n this.uniforms._DepthNormal = { value: new Vector4(clear_depth, clear_normal.x, clear_normal.y, clear_normal.z) };\n }\n}\n","import vert from '../shaders/depth_normals/depth_normals.vert';\nimport frag from '../shaders/depth_normals/depth_normals.frag';\n\nimport { ShaderMaterial } from 'three';\n\nexport default class DepthNormalMaterial extends ShaderMaterial\n{\n constructor()\n {\n super({\n uniforms: {\n _FarPlane: { value: 1 }\n },\n vertexShader: vert,\n fragmentShader: frag\n });\n }\n\n set far_plane(value)\n {\n this.uniforms._FarPlane.value = value;\n }\n\n get far_plane()\n {\n return this.uniforms._FarPlane.value;\n }\n}\n","import CameraManager from '../CameraManager';\nimport Screen from '../Screen';\n\nimport ClearDepthNormalMaterial from '../materials/ClearDepthNormalMaterial';\nimport DepthNormalMaterial from '../materials/DepthNormalMaterial';\n\nimport { WebGLRenderTarget } from 'three';\nimport { Vector3 } from 'three';\n\nexport default class DepthAndNormalsRenderer\n{\n constructor()\n {\n this.RT = new WebGLRenderTarget(Screen.width, Screen.height);\n\n this.clear_depth_normal_mat = new ClearDepthNormalMaterial(1, new Vector3(0, 0, 1));\n this.depth_normal_material = new DepthNormalMaterial();\n }\n\n render(graphics)\n {\n this.__resize_RT_if_necessary();\n\n graphics.clear(this.RT, undefined, true, true);\n\n graphics.blit_clear_with_material(this.RT, this.clear_depth_normal_mat);\n\n this.depth_normal_material.far_plane = CameraManager.current.far;\n\n graphics.render(undefined, undefined, this.RT, this.depth_normal_material);\n }\n\n __resize_RT_if_necessary()\n {\n if (this.RT.width !== Screen.width || this.RT.height !== Screen.height)\n {\n this.RT.setSize(Screen.width, Screen.height);\n }\n }\n\n get render_target()\n {\n return this.RT;\n }\n}\n","import BlitMaterial from '../materials/BlitMaterial';\n\nimport { Scene } from 'three';\nimport { Mesh } from 'three';\nimport { PlaneBufferGeometry } from 'three';\nimport { OrthographicCamera } from 'three';\n\nexport default class Blitter\n{\n constructor(renderer)\n {\n this.renderer = renderer;\n this._blit_scene = new Scene();\n this._blit_material = new BlitMaterial();\n this._blit_quad = new Mesh(\n new PlaneBufferGeometry(1, 1), this._blit_material);\n this._blit_scene.add(this._blit_quad);\n this._blit_camera = new OrthographicCamera(-1, 1, 1, -1, -10000, 10000);\n }\n\n blit(src, dst)\n {\n this._blit_quad.material = this._blit_material;\n\n const src_texture = src.isWebGLRenderTarget === true ? src.texture : src;\n const src_width = src.isWebGLRenderTarget === true ? src.width : src.image.width;\n const src_height = src.isWebGLRenderTarget === true ? src.height : src.image.height;\n\n this._blit_quad.material.uniforms._MainTex.value = src_texture;\n this._blit_quad.material.uniforms._Resolution.value.set(src_width, src_height);\n\n if (dst)\n {\n this._blit_quad.material.uniforms._TargetResolution.value.set(dst.width, dst.height);\n }\n else\n {\n this.renderer.getSize(this._blit_quad.material.uniforms._TargetResolution.value);\n }\n\n this.__render(dst);\n }\n\n material_pass(mat, dst)\n {\n this._blit_quad.material = mat;\n // this._blit_quad.material.uniforms._MainTex.value = undefined;\n // this._blit_quad.material.uniforms._Resolution.value.set(1, 1);\n\n this.__render(dst);\n }\n\n blit_with_material(src, dst, mat)\n {\n const src_texture = src.isWebGLRenderTarget === true ? src.texture : src;\n const src_width = src.isWebGLRenderTarget === true ? src.width : src.image.width;\n const src_height = src.isWebGLRenderTarget === true ? src.height : src.image.height;\n\n this._blit_quad.material = mat;\n this._blit_quad.material.uniforms._MainTex.value = src_texture;\n this._blit_quad.material.uniforms._Resolution.value.set(src_width, src_height);\n\n if (dst)\n {\n this._blit_quad.material.uniforms._TargetResolution.value.set(dst.width, dst.height);\n }\n else\n {\n this.renderer.getSize(this._blit_quad.material.uniforms._TargetResolution.value);\n }\n\n this.__render(dst);\n }\n\n blit_clear_with_material(dst_RT, mat)\n {\n this._blit_quad.material = mat;\n\n this.__render(dst_RT);\n }\n\n dispose()\n {\n this._blit_quad.geometry.dispose();\n this._blit_quad.material.dispose();\n }\n\n __render(RT)\n {\n RT = RT === undefined ? null : RT;\n\n const current_rt = this.renderer.getRenderTarget();\n\n this.renderer.setRenderTarget(RT === undefined ? null : RT);\n this.renderer.render(this._blit_scene, this._blit_camera);\n\n this.renderer.setRenderTarget(current_rt);\n }\n}\n","import Configuration from './Configuration';\nimport BaseRender from './render_mode/BaseRender';\nimport Screen from './Screen';\nimport CameraManager from './CameraManager';\nimport SceneManager from './SceneManager';\nimport Capabilities from './Capabilities';\nimport DepthAndNormalsRenderer from './render_utilities/DepthAndNormalsRenderer';\nimport Blitter from './render_utilities/Blitter';\n\nimport { WebGLRenderer } from 'three';\n\nclass Graphics\n{\n init(canvas, context_attributes)\n {\n this._renderer = undefined;\n this.blitter = undefined;\n this.canvas = undefined;\n this.no_render = undefined;\n this.current_render_mode = undefined;\n this.generateDepthNormalTexture = false;\n this.depth_and_normals_renderer = undefined;\n\n this.is_webgl2 = false;\n this.canvas_context = undefined;\n this.context_attributes = undefined;\n\n this.context_attributes = context_attributes || {\n alpha: true,\n depth: true,\n desynchronized: false,\n stencil: false,\n antialias: false,\n premultipliedAlpha: true,\n preserveDrawingBuffer: false,\n powerPreference: 'high-performance',\n logarithmicDepthBuffer: false\n };\n\n if (context_attributes.force_webgl2)\n {\n this.canvas_context = canvas.getContext('webgl2', this.context_attributes) ||\n canvas.getContext('webgl', this.context_attributes) ||\n canvas.getContext('experimental-webgl', this.context_attributes);\n }\n else\n {\n this.canvas_context = canvas.getContext('webgl', this.context_attributes) ||\n canvas.getContext('experimental-webgl', this.context_attributes);\n }\n\n this.is_webgl2 = this.canvas_context.constructor.name === 'WebGL2RenderingContext';\n\n // console.log(`Using WebGL ${this.is_webgl2 ? 2 : 1}`);\n\n this._renderer = new WebGLRenderer({\n canvas: canvas,\n context: this.canvas_context\n });\n this._renderer.autoClear = false;\n\n this._renderer.setPixelRatio(1);\n\n Screen.dpr = Configuration.dpr;\n\n if (!this.is_webgl2)\n {\n this._renderer.extensions.get('ANGLE_instanced_arrays');\n }\n\n this.blitter = new Blitter(this._renderer);\n\n this.canvas = this._renderer.domElement;\n\n this.no_render = new BaseRender();\n\n this.current_render_mode = this.no_render;\n Capabilities.max_anisotropy = this._renderer.capabilities.getMaxAnisotropy();\n Capabilities.vertex_texture_sampler_available = this._renderer.capabilities.maxVertexTextures > 0;\n Capabilities.fp_textures_available = this._renderer.capabilities.floatVertexTextures;\n\n this.generateDepthNormalTexture = false;\n\n this.depth_and_normals_renderer = new DepthAndNormalsRenderer();\n\n this.resize_observer = new ResizeObserver(this.on_resize.bind(this));\n this.resize_observer.observe(this.canvas);\n }\n\n get dom_element()\n {\n return this._renderer.domElement;\n }\n\n get depth_normals_RT()\n {\n return this.depth_and_normals_renderer.render_target;\n }\n\n set_state(new_state)\n {\n // console.log('VIEWAPI - map render mode switch to: ' + new_state.constructor.name);\n\n this.current_render_mode.on_exit(this, this._renderer);\n this.current_render_mode = new_state;\n this.current_render_mode.on_enter(this, this._renderer);\n }\n\n update()\n {\n if (this.generateDepthNormalTexture)\n {\n this.depth_and_normals_renderer.render(this);\n }\n\n this.__update_current_camera();\n\n if (CameraManager.current)\n {\n this.current_render_mode.render();\n }\n\n Screen.update();\n }\n\n __update_current_camera()\n {\n if (CameraManager.current)\n {\n CameraManager.current.aspect = Screen.aspect_ratio;\n CameraManager.current.updateProjectionMatrix();\n CameraManager.current.updateMatrix();\n CameraManager.current.updateMatrixWorld(true);\n }\n }\n\n render(scene, camera, RT, override_mat)\n {\n this.__apply_override_material(scene, override_mat);\n\n this._renderer.setRenderTarget(RT === undefined ? null : RT);\n this._renderer.render(scene || SceneManager.current,\n camera || CameraManager.current);\n\n this.__apply_override_material(scene, undefined);\n }\n\n render_scene(scene)\n {\n if (scene.on_pre_render)\n {\n scene.on_pre_render();\n }\n\n if (scene.render)\n {\n scene.render();\n }\n else\n {\n this.render(scene, undefined);\n }\n\n if (scene.on_post_render)\n {\n scene.on_post_render();\n }\n }\n\n __apply_override_material(scene, mat)\n {\n mat = mat === undefined ? null : mat;\n if (scene)\n {\n scene.overrideMaterial = mat;\n }\n else\n {\n SceneManager.current.overrideMaterial = mat;\n }\n }\n\n readback_RT(RT, buffer)\n {\n this._renderer.readRenderTargetPixels(RT, 0, 0, RT.width, RT.height, buffer);\n }\n\n clear(RT, camera, clear_depth, clear_stencil)\n {\n this._renderer.setRenderTarget(RT === undefined ? null : RT);\n\n if (camera)\n {\n this._renderer.setClearColor(camera.clear_color, camera.clear_alpha);\n }\n\n this._renderer.clear(!!camera, // clear color\n !!clear_depth,\n !!clear_stencil);\n }\n\n on_resize(entries)\n {\n for (const entry of entries)\n {\n Screen.dpr = Configuration.dpr;\n Screen.update_position(entry.contentRect.x, entry.contentRect.y);\n Screen.update_size(entry.contentRect.width, entry.contentRect.height);\n\n this.canvas.width = Screen.render_width;\n this.canvas.height = Screen.render_height;\n\n this._renderer.setViewport(0, 0, Screen.render_width, Screen.render_height);\n\n this.__update_current_camera();\n }\n }\n\n material_pass(mat, dst)\n {\n this.blitter.material_pass(mat, dst);\n }\n\n blit(src_RT, dst_RT, mat)\n {\n if (mat)\n {\n this.blitter.blit_with_material(src_RT, dst_RT, mat);\n }\n else\n {\n this.blitter.blit(src_RT, dst_RT);\n }\n }\n\n blit_clear_with_material(dst_RT, mat)\n {\n this.blitter.blit_clear_with_material(dst_RT, mat);\n }\n\n take_screenshot(blob_callback, width = Screen.width, height = Screen.height)\n {\n // const ctx = this;\n\n const old_width = Screen.width;\n const old_height = Screen.height;\n\n const new_width = width;\n const new_height = height;\n\n const tile_width = 1024;\n const tile_height = 1024;\n\n const divisions_x = parseInt(Math.ceil(new_width / tile_width));\n const divisions_y = parseInt(Math.ceil(new_height / tile_height));\n\n Screen.update_size(tile_width, tile_height);\n\n this._renderer.setPixelRatio(1);\n\n this._renderer.setSize(tile_width, tile_height, false);\n\n const canvas_2d = document.createElement('canvas');\n const ctx_2D = canvas_2d.getContext('2d');\n\n ctx_2D.canvas.width = new_width;\n ctx_2D.canvas.height = new_height;\n\n CameraManager.current.aspect = Screen.aspect_ratio;\n CameraManager.current.updateMatrix();\n CameraManager.current.updateMatrixWorld(true);\n\n for (let x = 0; x < divisions_x; x++)\n {\n for (let y = 0; y < divisions_y; y++)\n {\n CameraManager.current.setViewOffset(new_width, new_height,\n Screen.width * x, Screen.height * y,\n Screen.width, Screen.height);\n this.current_render_mode.render();\n\n ctx_2D.drawImage(this._renderer.domElement, Screen.width * x, Screen.height * y);\n }\n }\n\n // transform the result canvas into a blob\n // from them the callback turns into a ULR and download it\n ctx_2D.canvas.toBlob(blob_callback, 'image/png;base64;');\n\n CameraManager.current.clearViewOffset();\n\n Screen.update_size(old_width, old_height);\n this._renderer.setPixelRatio(Configuration.dpr);\n this._renderer.setSize(old_width, old_height, false);\n\n CameraManager.current.aspect = Screen.aspect_ratio;\n CameraManager.current.updateMatrix();\n CameraManager.current.updateMatrixWorld(true);\n }\n\n download_screenshot(blob)\n {\n const link = document.createElement('a');\n link.download = 'Snapshot.png';\n\n link.href = URL.createObjectURL(blob);\n link.click();\n\n link.onclick = function()\n {\n requestAnimationFrame(function()\n {\n URL.revokeObjectURL(link.href);\n });\n link.removeAttribute('href');\n };\n }\n\n dispose()\n {\n this._renderer.dispose();\n this.current_render_mode.dispose();\n this.blitter.dispose();\n }\n}\n\nexport default new Graphics();\n","import frag from '../shaders/normal/normal.frag';\nimport vert from '../shaders/normal/normal.vert';\n\nimport { ShaderMaterial } from 'three';\n\nexport default class NormalMaterial extends ShaderMaterial\n{\n constructor()\n {\n super({\n uniforms: {\n },\n vertexShader: vert,\n fragmentShader: frag\n });\n }\n}\n","import CameraManager from '../CameraManager';\nimport SceneManager from '../SceneManager';\nimport BaseRender from '../render_mode/BaseRender';\nimport Graphics from '../Graphics';\nimport NormalMaterial from '../materials/NormalMaterial';\n\nexport default class DebugNormalsRender extends BaseRender\n{\n constructor()\n {\n super();\n }\n\n render()\n {\n Graphics.clear(undefined, CameraManager.current, true, true);\n\n Graphics.render(SceneManager.current, CameraManager.current, undefined, new NormalMaterial());\n }\n}\n","import { InputController } from 'pit-js';\n\nclass Input extends InputController\n{\n constructor()\n {\n super();\n\n this.left_mouse_button_clicked = false;\n this.captured_NDC = { x: 0, y: 0 };\n }\n\n clear()\n {\n super.clear();\n\n this.left_mouse_button_clicked = false;\n }\n}\n\nexport default new Input();\n","\nclass OS\n{\n init()\n {\n this.operating_systems = {\n ANDROID: 'android',\n IOS: 'ios',\n LINUX: 'linux',\n MAC: 'mac',\n WINDOWS: 'windows'\n };\n\n this.is_mobile = !!(navigator.userAgent.match(/(iPhone|iPod|iPad|Android|playbook|silk|BlackBerry|BB10|Windows Phone|Tizen|Bada|webOS|IEMobile|Opera Mini)/));\n this.is_ipad = !!(navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints && navigator.maxTouchPoints > 2);\n this.is_ios = !!navigator.userAgent.match(/(iPhone|iPod|iPad)/) || this.is_ipad;\n\n this.is_android = this.get_os() === this.operating_systems.ANDROID;\n this.is_linux = this.get_os() === this.operating_systems.LINUX;\n this.is_mac = this.get_os() === this.operating_systems.MAC;\n this.is_windows = this.get_os() === this.operating_systems.WINDOWS;\n }\n\n get_os()\n {\n const userAgent = window.navigator.userAgent;\n const platform = window.navigator.platform;\n const macosPlatforms = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'];\n const windowsPlatforms = ['Win32', 'Win64', 'Windows', 'WinCE'];\n const iosPlatforms = ['iPhone', 'iPad', 'iPod'];\n let os = null;\n\n if (macosPlatforms.indexOf(platform) !== -1)\n {\n os = this.operating_systems.MAC;\n }\n else if (iosPlatforms.indexOf(platform) !== -1)\n {\n os = this.operating_systems.IOS;\n }\n else if (windowsPlatforms.indexOf(platform) !== -1)\n {\n os = this.operating_systems.WINDOWS;\n }\n else if (/Android/.test(userAgent))\n {\n os = this.operating_systems.ANDROID;\n }\n else if (!os && /Linux/.test(platform))\n {\n os = this.operating_systems.LINUX;\n }\n\n return os;\n }\n}\n\nexport default new OS();\n","import { Vector3 } from 'three';\n\nclass ReflectionPlaneContext\n{\n init()\n {\n this.target_geometry = undefined;\n this.target_position = new Vector3();\n }\n\n set_target_geometry(geometry)\n {\n this.target_geometry = geometry;\n }\n}\n\nexport default new ReflectionPlaneContext();\n","import { Vector2 } from 'three';\nimport { ShaderMaterial } from 'three';\nimport { Mesh } from 'three';\nimport { DataTexture } from 'three';\nimport { RGBAFormat } from 'three';\nimport { RGBFormat } from 'three';\nimport { FloatType } from 'three';\n\nexport default class GeometryBatch\n{\n constructor(geometry, batch_width)\n {\n this.geometry = geometry;\n\n this.material = undefined;\n this.uniforms = {};\n this.batch_width = batch_width;\n\n this.data_textures = [];\n\n this.object_names = undefined;\n\n this.zero_offset = new Vector2();\n this.write_offset = new Vector2();\n\n this.uniform_dirty_count = 0;\n\n this.tmp_uploaded_data_count = 0;\n }\n\n init(object_names, vert_shader, frag_shader)\n {\n this.material = new ShaderMaterial({\n uniforms: this.uniforms,\n vertexShader: vert_shader,\n fragmentShader: frag_shader\n });\n this.object_names = object_names;\n }\n\n add_global_uniform(name, data)\n {\n this.uniforms[name] = { value: data };\n this.material.needsUpdate = true;\n }\n\n set_global_uniform(name, data)\n {\n this.uniforms[name].value = data;\n }\n\n add_object_uniform_v3(uniform_name, default_value_v3)\n {\n const src_tex = this.__create_rgb_texture(this.batch_width);\n const dst_tex = this.__create_rgb_texture(this.batch_width);\n const one_pixel_tex = this.__create_rgb_texture(1);\n\n const new_data_tex = this.__add_data_texture(uniform_name, src_tex, dst_tex, one_pixel_tex);\n\n if (default_value_v3)\n {\n this.__flood_data_texture_rgb(new_data_tex, default_value_v3);\n }\n }\n\n add_object_uniform_v4(uniform_name, default_value_v4)\n {\n const src_tex = this.__create_rgba_texture(this.batch_width);\n const dst_tex = this.__create_rgba_texture(this.batch_width);\n const one_pixel_tex = this.__create_rgba_texture(1);\n\n const new_data_tex = this.__add_data_texture(uniform_name, src_tex, dst_tex, one_pixel_tex);\n\n if (default_value_v4)\n {\n this.__flood_data_texture_rgba(new_data_tex, default_value_v4);\n }\n }\n\n add_object_uniform_v4_float(uniform_name, default_value_v4)\n {\n const src_tex = this.__create_rgba_float_texture(this.batch_width);\n const dst_tex = this.__create_rgba_float_texture(this.batch_width);\n const one_pixel_tex = this.__create_rgba_float_texture(1);\n\n const new_data_tex = this.__add_data_texture(uniform_name, src_tex, dst_tex, one_pixel_tex);\n\n if (default_value_v4)\n {\n this.__flood_data_texture_rgba(new_data_tex, default_value_v4);\n }\n }\n\n set_object_uniform_v3(object_name, uniform_name, vector3, use_r, use_g, use_b)\n {\n const obj_index = this.__get_object_index(object_name);\n const data_texture = this.__get_data_texture(uniform_name);\n\n this.__set_pixel_rgb(data_texture.src, obj_index, vector3, use_r, use_g, use_b);\n this.__set_pixel_rgb(data_texture.one_pixel, 0, vector3, use_r, use_g, use_b);\n\n data_texture.last_accessed_index = obj_index;\n\n data_texture.dirty_count++;\n }\n\n set_object_uniform_v4(object_name, uniform_name, vector4, use_r, use_g, use_b, use_a)\n {\n const obj_index = this.__get_object_index(object_name);\n const data_texture = this.__get_data_texture(uniform_name);\n\n this.__set_pixel_rgba(data_texture.src, obj_index, vector4, use_r, use_g, use_b, use_a);\n this.__set_pixel_rgba(data_texture.one_pixel, 0, vector4, use_r, use_g, use_b, use_a);\n data_texture.last_accessed_index = obj_index;\n\n data_texture.dirty_count++;\n }\n\n upload_texture_data(renderer, upload_budget)\n {\n for (let i = 0; i < this.data_textures.length; i++)\n {\n if (upload_budget > 0 && this.data_textures[i].dirty_count > 0)\n {\n if (this.data_textures[i].dirty_count === 1)\n {\n this.__partial_texture_data_upload(renderer, this.data_textures[i]);\n }\n if (this.data_textures[i].dirty_count > 1)\n {\n this.__full_texture_data_upload(renderer, this.data_textures[i]);\n }\n\n this.data_textures[i].dirty_count = 0;\n\n upload_budget--;\n }\n }\n }\n\n get_uniform_dirty_count()\n {\n this.uniform_dirty_count = 0;\n for (let i = 0; i < this.data_textures.length; i++)\n {\n if (this.data_textures[i].dirty_count > 0)\n {\n this.uniform_dirty_count++;\n }\n }\n return this.uniform_dirty_count;\n }\n\n __full_texture_data_upload(renderer, texture_data)\n {\n // console.log(\"full texture update of\"+ texture_data.name);\n texture_data.dst.needsUpdate = true;\n renderer.copyTextureToTexture(\n this.zero_offset,\n texture_data.src,\n texture_data.dst\n );\n }\n\n __partial_texture_data_upload(renderer, texture_data)\n {\n // console.log(\"partial texture update\"+ texture_data.name);\n const index = texture_data.last_accessed_index;\n if (index === -1)\n {\n return;\n }\n\n this.write_offset.y = Math.floor(index / this.batch_width);\n this.write_offset.x = index - this.batch_width * this.write_offset.y;\n renderer.copyTextureToTexture(\n this.write_offset,\n texture_data.one_pixel,\n texture_data.dst\n );\n }\n\n get_mesh()\n {\n return new Mesh(this.geometry, this.material);\n }\n\n __set_pixel_rgb(data_texture, index, vector3, use_r, use_g, use_b)\n {\n if (use_r)\n {\n data_texture.image.data[index * 3 + 0] = vector3.x;\n }\n if (use_g)\n {\n data_texture.image.data[index * 3 + 1] = vector3.y;\n }\n if (use_b)\n {\n data_texture.image.data[index * 3 + 2] = vector3.z;\n }\n }\n\n __set_pixel_rgba(data_texture, index, vector4, use_r, use_g, use_b, use_a)\n {\n if (use_r)\n {\n data_texture.image.data[index * 4 + 0] = vector4.x;\n }\n if (use_g)\n {\n data_texture.image.data[index * 4 + 1] = vector4.y;\n }\n if (use_b)\n {\n data_texture.image.data[index * 4 + 2] = vector4.z;\n }\n if (use_a)\n {\n data_texture.image.data[index * 4 + 3] = vector4.w;\n }\n }\n\n __flood_data_texture_rgb(data_texture, v3)\n {\n for (let i = 0; i < this.batch_width * this.batch_width; i++)\n {\n this.__set_pixel_rgb(data_texture.src, i, v3, true, true, true);\n data_texture.dirty_count++;\n }\n }\n\n __flood_data_texture_rgba(data_texture, v4)\n {\n for (let i = 0; i < this.batch_width * this.batch_width; i++)\n {\n this.__set_pixel_rgba(data_texture.src, i, v4, true, true, true, true);\n data_texture.dirty_count++;\n }\n }\n\n __create_rgb_texture(width)\n {\n const data = new Uint8Array(3 * width * width);\n return new DataTexture(data, width, width, RGBFormat);\n }\n\n __create_rgba_texture(width)\n {\n const data = new Uint8Array(4 * width * width);\n return new DataTexture(data, width, width, RGBAFormat);\n }\n\n __create_rgba_float_texture(width)\n {\n const data = new Float32Array(4 * width * width);\n return new DataTexture(data, width, width, RGBAFormat, FloatType);\n }\n\n __get_data_texture(uniform_name)\n {\n for (let i = 0; i < this.data_textures.length; i++)\n {\n if (this.data_textures[i].name === uniform_name)\n {\n return this.data_textures[i];\n }\n }\n console.error('Data texture ' + uniform_name + ' does not exist');\n return undefined;\n }\n\n __get_object_index(name)\n {\n for (let i = 0; i < this.object_names.length; i++)\n {\n if (this.object_names[i] === name)\n {\n return i;\n }\n }\n console.error('the name ' + name + ' is not contained in this batch');\n return undefined;\n }\n\n __add_data_texture(uniform_name, src_texture, dst_texture, one_pixel_text)\n {\n dst_texture.needsUpdate = true;\n\n this.data_textures.push({\n name: uniform_name,\n src: src_texture,\n dst: dst_texture,\n one_pixel: one_pixel_text,\n last_accessed_index: -1,\n dirty_count: 0\n });\n\n this.uniforms[uniform_name] = { value: dst_texture };\n return this.data_textures[this.data_textures.length - 1];\n }\n\n dispose()\n {\n for (let i = 0; i < this.data_textures.length; i++)\n {\n this.data_textures[i].src.dispose();\n this.data_textures[i].dst.dispose();\n this.data_textures[i].one_pixel.dispose();\n }\n }\n}\n","import GeometryBatch from './GeometryBatch';\n\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\n\nimport { Math as TMath } from 'three';\nimport { BufferAttribute } from 'three';\n\nclass GeometryBatcher\n{\n init()\n {\n this.batches = [];\n }\n\n batch(buffer_geometries)\n {\n const attr_accessor_uvs = [];\n const texture_width = TMath.ceilPowerOfTwo(Math.sqrt(buffer_geometries.length));\n // console.log(\"Store count: \" + buffer_geometries.length + \", Texture size: \" +texture_width);\n\n this.__init_uv_array(attr_accessor_uvs, texture_width);\n\n let uv_index = 0;\n\n for (let i = 0; i < buffer_geometries.length; i++)\n {\n const vertex_count = buffer_geometries[i].getAttribute('position').count;\n const y = Math.floor(i / texture_width);\n const x = i - texture_width * y;\n for (let count = 0; count < vertex_count; count++)\n {\n attr_accessor_uvs[uv_index] = (x / texture_width) + 0.5 / texture_width;\n attr_accessor_uvs[uv_index + 1] = (y / texture_width) + 0.5 / texture_width;\n uv_index += 2;\n }\n }\n\n const buffer_attribute = new BufferAttribute(new Float32Array(attr_accessor_uvs), 2);\n const buffer_geometry = BufferGeometryUtils.mergeBufferGeometries(buffer_geometries);\n buffer_geometry.setAttribute('attr_accessor_uv', buffer_attribute);\n\n this.batches.push(new GeometryBatch(buffer_geometry, texture_width));\n return this.batches[this.batches.length - 1];\n }\n\n upload_texture_data(renderer)\n {\n for (let i = 0; i < this.batches.length; i++)\n {\n this.batches[i].upload_texture_data(renderer, 1);\n }\n }\n\n __init_uv_array(uvs, texture_width)\n {\n for (let i = 0; i < texture_width * texture_width * 2; i++)\n {\n uvs.push(0);\n }\n }\n}\n\nexport default new GeometryBatcher();\n","import Input from './Input';\nimport CameraManager from './CameraManager';\nimport Graphics from './Graphics';\n\nimport { Vector2 } from 'three';\nimport { Scene } from 'three';\nimport { OrthographicCamera } from 'three';\n\nclass UI\n{\n init()\n {\n this.ui_elements = [];\n this._tmp_normalized_pos = new Vector2();\n this.ss_scene = new Scene();\n this.ss_scene.autoUpdate = false;\n this.ss_scene.frustumCulled = false;\n\n this.ws_scene = new Scene();\n this.ws_scene.autoUpdate = false;\n this.ws_scene.frustumCulled = false;\n\n this.ss_camera = new OrthographicCamera(-1, 1, 1, -1, -100, 100);\n }\n\n delete_element(elem)\n {\n const index = this.ui_elements.indexOf(elem);\n if (index > -1)\n {\n this.ui_elements.splice(index, 1);\n }\n\n this.ss_scene.remove(elem);\n this.ws_scene.remove(elem);\n\n elem.dispose();\n }\n\n add_screen_space_element(elem)\n {\n this.ui_elements.push(elem);\n this.ss_scene.add(elem);\n\n elem.set_screen_space_coordinate_system();\n }\n\n add_world_space_element(elem)\n {\n this.ui_elements.push(elem);\n this.ws_scene.add(elem);\n\n elem.set_world_space_coordinate_system();\n }\n\n update()\n {\n // this.ss_camera.left = -Screen.width / 2;\n // this.ss_camera.right = Screen.width / 2;\n // this.ss_camera.top = Screen.top / 2;\n // this.ss_camera.right = -Screen.bottom / 2;\n this.ss_camera.updateProjectionMatrix();\n\n this._tmp_normalized_pos.copy(Input.NDC);\n for (let i = 0; i < this.ui_elements.length; i++)\n {\n this.ui_elements[i].update_state(this._tmp_normalized_pos);\n }\n }\n\n render(renderer)\n {\n // renderer.render_ui(this.scene);\n if (this.ss_scene.children.length > 0)\n {\n Graphics.render(this.ss_scene, this.ss_camera);\n }\n if (this.ws_scene.children.length > 0)\n {\n Graphics.render(this.ws_scene, CameraManager.current);\n }\n }\n\n clear()\n {\n this.current_clicked_element = undefined;\n }\n}\n\nexport default new UI();\n","import { Vector3 } from 'three';\nimport { Math as TMath } from 'three';\n\nexport default class OMath\n{\n constructor()\n {}\n\n static linear_map(value,\n from_range_start_value,\n from_range_end_value,\n to_range_start_value,\n to_range_end_value)\n {\n return ((value - from_range_start_value) / (from_range_end_value - from_range_start_value)) * (to_range_end_value - to_range_start_value) + to_range_start_value;\n }\n\n static between(value, min, max)\n {\n return (value >= min && value <= max);\n }\n\n static mod(number, divisor)\n {\n return ((number % divisor) + divisor) % divisor;\n }\n\n static rgb_to_hex(rgb)\n {\n rgb.r = Math.round(rgb.r * 255).toString(16);\n rgb.g = Math.round(rgb.g * 255).toString(16);\n rgb.b = Math.round(rgb.b * 255).toString(16);\n\n if (rgb.r.length === 1)\n {\n rgb.r = '0' + rgb.r;\n }\n if (rgb.g.length === 1)\n {\n rgb.g = '0' + rgb.g;\n }\n if (rgb.b.length === 1)\n {\n rgb.b = '0' + rgb.b;\n }\n\n return '#' + rgb.r + rgb.g + rgb.b;\n }\n\n static project_points_on_plane(points, plane)\n {\n const projected_point = new Vector3();\n const points_on_plane = [];\n for (let i = 0; i < points.length; i++)\n {\n plane.projectPoint(points[i], projected_point);\n points_on_plane.push(projected_point.clone());\n }\n\n return points_on_plane;\n }\n\n static matrix4_lerp(from, to, target, t)\n {\n for (let i = 0; i < 16; i++)\n {\n target.elements[i] = TMath.lerp(from.elements[i], to.elements[i], t);\n }\n }\n\n static equals(x1, x2)\n {\n return Math.abs(x1 - x2) < 0.000001;\n }\n\n static lerp(x, y, t)\n {\n return (1 - t) * x + t * y;\n }\n\n static clamp(value, min, max)\n {\n return Math.max(min, Math.min(max, value));\n }\n\n static euclideanModulo(n, m)\n {\n return ((n % m) + m) % m;\n }\n\n static pingpong(x, length = 1)\n {\n return length - Math.abs(OMath.euclideanModulo(x, length * 2) - length);\n }\n\n static degToRad(degrees)\n {\n return degrees * (Math.PI / 180);\n }\n\n static radToDeg(radians)\n {\n return radians * (180 / Math.PI);\n }\n\n static deg_to_rad(degrees)\n {\n return degrees * (Math.PI / 180);\n }\n\n static rad_to_deg(radians)\n {\n return radians * (180 / Math.PI);\n }\n\n static perspective_divide(v)\n {\n v.x /= v.w;\n v.y /= v.w;\n v.z /= v.w;\n return v;\n }\n\n static points_average(points)\n {\n const center = points[0].clone();\n for (let i = 1; i < points.length; i++)\n {\n center.add(points[i]);\n }\n center.multiplyScalar(1 / points.length);\n return center;\n }\n\n static get_random_color()\n {\n const arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'a', 'b', 'c', 'd', 'e', 'f'];\n\n let col = '#';\n col += arr[Math.floor(Math.random() * 16)];\n col += arr[Math.floor(Math.random() * 16)];\n\n col += arr[Math.floor(Math.random() * 16)];\n col += arr[Math.floor(Math.random() * 16)];\n\n col += arr[Math.floor(Math.random() * 16)];\n col += arr[Math.floor(Math.random() * 16)];\n return col;\n }\n\n static saturate(x)\n {\n return OMath.clamp(x, 0, 1);\n }\n}\n","import CameraManager from '../CameraManager';\nimport Input from '../Input';\nimport OMath from '../utilities/OMath';\nimport Screen from '../Screen';\n\nimport { Vector3 } from 'three';\nimport { Matrix4 } from 'three';\nimport { Plane } from 'three';\nimport { Ray } from 'three';\nimport { Sphere } from 'three';\nimport { Box3 } from 'three';\n\nclass CameraUtilities\n{\n init()\n {\n this.tmp_mat = new Matrix4();\n this.plane = new Plane();\n this.ray = new Ray();\n\n this.tmp_size = new Vector3();\n this.tmp_unproj = new Vector3();\n }\n\n get_up_dir(camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n tmp_vec.set(0, 1, 0);\n tmp_vec.applyQuaternion(camera.quaternion);\n\n return tmp_vec;\n }\n\n get_forward_dir(camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n tmp_vec.set(0, 0, -1);\n tmp_vec.applyQuaternion(camera.quaternion);\n\n return tmp_vec;\n }\n\n get_right_dir(camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n tmp_vec.set(1, 0, 0);\n tmp_vec.applyQuaternion(camera.quaternion);\n return tmp_vec;\n }\n\n unproject_mouse_position(NDC, camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n const v_fov = (camera.fov / 2) * Math.PI / 180;\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * camera.aspect)) / 2;\n\n const distV = Math.tan(v_fov) * camera.far;\n const distH = Math.tan(h_fov) * camera.far;\n\n tmp_vec.set(distH * NDC.x, distV * NDC.y, -camera.far).normalize();\n\n return tmp_vec.applyQuaternion(camera.quaternion);\n }\n\n get_plane_intersection(plane_position, plane_normal, NDC, camera)\n {\n camera = camera || CameraManager.current;\n NDC = NDC || Input.NDC;\n\n const tmp_vec = new Vector3();\n\n this.plane.setFromNormalAndCoplanarPoint(plane_normal || this.get_forward_dir(camera), plane_position);\n if (camera.isPerspectiveCamera)\n {\n this.ray.set(camera.position, this.unproject_mouse_position(NDC, camera));\n }\n else\n {\n this.tmp_unproj.set(NDC.x, NDC.y, 1).unproject(camera);\n this.ray.set(camera.position, this.tmp_unproj);\n }\n\n this.ray.intersectPlane(this.plane, tmp_vec);\n return tmp_vec;\n }\n\n fit_points_on_camera(points, zoom_scale = 1)\n {\n const points_sphere = new Sphere().setFromPoints(points);\n const world_space_center = points_sphere.center;\n const camera_forward = this.get_forward_dir(CameraManager.current).clone();\n\n const plane = new Plane().setFromNormalAndCoplanarPoint(camera_forward, world_space_center);\n\n const points_on_plane = OMath.project_points_on_plane(points, plane);\n\n const projected_points_center = new Vector3();\n let box = new Box3().setFromPoints(points_on_plane);\n box.getCenter(projected_points_center);\n\n const up = new Vector3(0, 1, 0).applyQuaternion(CameraManager.current.quaternion);\n const right = up.clone().cross(camera_forward).normalize();\n const mat = new Matrix4().set(right.x, up.x, camera_forward.x, world_space_center.x,\n right.y, up.y, camera_forward.y, world_space_center.y,\n right.z, up.z, camera_forward.z, world_space_center.z,\n 0, 0, 0, 1);\n\n const inverse_mat = new Matrix4().getInverse(mat);\n for (let i = 0; i < points_on_plane.length; i++)\n {\n points_on_plane[i].applyMatrix4(inverse_mat);\n }\n\n const size = new Vector3();\n box = new Box3().setFromPoints(points_on_plane);\n box.getSize(size);\n size.multiplyScalar(zoom_scale);\n const projected_center = new Vector3();\n box.getCenter(projected_center);\n\n return {\n position: projected_points_center,\n zoom: this.get_zoom_to_fit_rect(size.x / 2, size.y / 2)\n };\n }\n\n get_zoom_to_fit_rect(width, height)\n {\n const v_fov = (CameraManager.current.fov / 2) * Math.PI / 180;\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * CameraManager.current.aspect)) / 2;\n\n const distV = height / Math.tan(v_fov);\n const distH = width / Math.tan(h_fov);\n\n return Math.max(Math.abs(distH), Math.abs(distV));\n }\n\n get_zoom_to_fit_box(bb, camera)\n {\n if (camera.isOrthographicCamera)\n {\n bb.getSize(this.tmp_size);\n\n const obj_x = this.tmp_size.x;\n const obj_y = this.tmp_size.y;\n const object_aspect = obj_x / obj_y;\n if (Screen.aspect_ratio / object_aspect > 1)\n {\n return Screen.height / obj_y;\n }\n else\n {\n return Screen.width / obj_x;\n }\n }\n else\n {\n // return this.fit_points_on_camera([bb.min, bb.max], 1).zoom;\n const size = new Vector3();\n bb.getSize(size);\n return this.get_zoom_to_fit_rect(size.x, size.y);\n }\n }\n\n get_html_screen_pos(object, camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n object.getWorldPosition(tmp_vec);\n tmp_vec.project(camera);\n\n tmp_vec.x = (tmp_vec.x * 0.5 + 0.5) * (Screen.width);\n tmp_vec.y = (1 - (tmp_vec.y * 0.5 + 0.5)) * Screen.height;\n return tmp_vec;\n }\n\n world_pos_to_screen(pos, camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n tmp_vec.copy(pos);\n tmp_vec.project(camera);\n\n tmp_vec.x = (tmp_vec.x * 0.5 + 0.5) * (Screen.width);\n tmp_vec.y = (1 - (tmp_vec.y * 0.5 + 0.5)) * Screen.height;\n return tmp_vec;\n }\n\n update_projection(camera)\n {\n camera.left = -Screen.width / 2;\n camera.right = Screen.width / 2;\n camera.top = Screen.height / 2;\n camera.bottom = -Screen.height / 2;\n camera.aspect = Screen.aspect_ratio;\n camera.updateProjectionMatrix(true);\n }\n}\n\nexport default new CameraUtilities();\n","import Browser from './Browser';\nimport CameraManager from './CameraManager';\nimport Capabilities from './Capabilities';\nimport Configuration from './Configuration';\nimport Debug from './Debug';\nimport EventManager from './EventManager';\nimport Graphics from './Graphics';\nimport Input from './Input';\nimport OS from './OS';\nimport ReflectionPlaneContext from './ReflectionPlaneContext';\nimport ResourceContainer from './ResourceContainer';\nimport SceneManager from './SceneManager';\nimport Screen from './Screen';\nimport GeometryBatcher from './static_batcher/GeometryBatcher';\nimport Time from './Time';\nimport UI from './UI';\nimport CameraUtilities from './utilities/CameraUtilities';\n\nclass Initializer\n{\n constructor()\n {\n }\n\n init(canvas, app_container, context_attributes)\n {\n CameraManager.init();\n CameraUtilities.init();\n Capabilities.init();\n Configuration.init();\n EventManager.init();\n GeometryBatcher.init();\n Input.init(app_container);\n OS.init();\n Browser.init();\n ReflectionPlaneContext.init();\n ResourceContainer.init();\n SceneManager.init();\n Screen.init();\n Time.init();\n UI.init();\n\n Graphics.init(canvas, context_attributes);\n Debug.init();\n }\n\n dispose(render_loop)\n {\n Graphics.dispose();\n Input.dispose();\n SceneManager.dispose();\n\n render_loop.dispose();\n }\n}\n\nexport default new Initializer();\n","import BlitMaterial from '../materials/BlitMaterial';\nimport frag from '../shaders/ssao/ssao.frag';\nimport vert from '../shaders/ssao/ssao.vert';\n\nimport { Matrix4 } from 'three';\nimport { Math as TMath } from 'three';\nimport { Vector3 } from 'three';\nimport { DataTexture } from 'three';\nimport { RGBFormat } from 'three';\nimport { RepeatWrapping } from 'three';\n\nexport default class SSAOMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag, vert);\n\n this.uniforms._InverseProjMatrix = { value: new Matrix4() };\n this.uniforms._ProjectionMatrix = { value: new Matrix4() };\n\n this.uniforms._Bias = { value: 0.0125 };\n this.uniforms._Radius = { value: 0.3 };\n this.uniforms._FarPlane = { value: 100 };\n\n this.uniforms._SampleKernel = { value: this.__get_sample_kernel() };\n this.uniforms._RandomRotation = { value: this.__get_rotation_kernel() };\n }\n\n __get_sample_kernel()\n {\n const sample_kernel = [];\n const kernel_size = 64;\n\n for (let i = 0; i < kernel_size; i++)\n {\n const dir = new Vector3(Math.random() * 2 - 1,\n Math.random() * 2 - 1,\n Math.random());\n dir.normalize();\n let scale = i / kernel_size;\n scale = TMath.lerp(0.1, 1.0, scale * scale);\n dir.multiplyScalar(scale);\n\n sample_kernel.push(dir);\n }\n return sample_kernel;\n }\n\n __get_rotation_kernel()\n {\n const rotation_kernel = new Uint8Array(3 * 16);\n for (let i = 0; i < 16; i++)\n {\n rotation_kernel[i * 3 + 1] = Math.floor(Math.random() * 255);\n rotation_kernel[i * 3 + 2] = Math.floor(Math.random() * 255);\n rotation_kernel[i * 3 + 3] = 0;\n }\n\n const rotation_texture = new DataTexture(rotation_kernel, 4, 4, RGBFormat);\n rotation_texture.wrapS = RepeatWrapping;\n rotation_texture.wrapT = RepeatWrapping;\n\n rotation_texture.needsUpdate = true;\n return rotation_texture;\n }\n}\n","import BlitMaterial from '../materials/BlitMaterial';\nimport frag from '../shaders/ssao/ssao_compose.frag';\n\nexport default class SSAOComposeMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag);\n this.uniforms._AO = { value: undefined };\n }\n}\n","import BlitMaterial from '../materials/BlitMaterial';\nimport frag from '../shaders/depth_normals/debug_normals.frag';\nimport depth_normals_vert from '../shaders/ssao/ssao.vert';\n\nimport { Matrix4 } from 'three';\n\nexport default class DisplayNormalTextureMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag, depth_normals_vert);\n this.uniforms._FarPlane = { value: 1 };\n this.uniforms._InverseProjMatrix = { value: new Matrix4() };\n }\n}\n","import BlitMaterial from '../materials/BlitMaterial';\nimport frag from '../shaders/box_blur/box_blur.frag';\n\nimport { Vector2 } from 'three';\n\nexport default class BoxBlurMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag);\n this.uniforms._SampleDir = { value: new Vector2() };\n }\n}\n","import BoxBlurMaterial from '../materials/BoxBlurMaterial';\nimport Graphics from '../Graphics';\n\nimport { WebGLRenderTarget } from 'three';\n\nexport default class Blurrer\n{\n constructor(renderer)\n {\n this.RT1 = new WebGLRenderTarget(1, 1);\n this.RT2 = new WebGLRenderTarget(1, 1);\n this.box_blur_mat = new BoxBlurMaterial();\n }\n\n blur(RT)\n {\n if (RT.width !== this.RT1.width || RT.height !== this.RT1.height)\n {\n this.RT1.setSize(RT.width, RT.height);\n this.RT2.setSize(RT.width, RT.height);\n }\n\n this.box_blur_mat.uniforms._SampleDir.value.set(1, 0);\n Graphics.blit(RT, this.RT1, this.box_blur_mat);\n this.box_blur_mat.uniforms._SampleDir.value.set(0, 1);\n Graphics.blit(this.RT1, RT, this.box_blur_mat);\n // return this.RT2;\n }\n}\n","import CameraManager from '../CameraManager';\nimport SceneManager from '../SceneManager';\nimport Screen from '../Screen';\nimport BaseRender from '../render_mode/BaseRender';\nimport Configuration from '../Configuration';\nimport SSAOMaterial from '../materials/SSAOMaterial';\nimport SSAOComposeMaterial from '../materials/SSAOComposeMaterial';\nimport DisplayNormalTextureMaterial from '../materials/DisplayNormalTextureMaterial';\nimport Blurrer from '../render_utilities/Blurrer';\nimport Graphics from '../Graphics';\n\nimport { WebGLRenderTarget } from 'three';\n\nexport default class NormalAORender extends BaseRender\n{\n constructor()\n {\n super();\n\n this.ssao_mat = new SSAOMaterial();\n this.ssao_compose_mat = new SSAOComposeMaterial();\n this.debug_normals = new DisplayNormalTextureMaterial();\n\n this.ssaa = Configuration.use_ssaa ? 2 : 1;\n\n this.main_RT = new WebGLRenderTarget(Screen.width * this.ssaa, Screen.height * this.ssaa);\n\n this.SSAO_RT = new WebGLRenderTarget(Screen.width, Screen.height);\n\n this.blurrer = new Blurrer();\n Graphics.generateDepthNormalTexture = true;\n }\n\n render()\n {\n this.__check_RT_size();\n\n Graphics.clear(this.main_RT, CameraManager.current, true, false);\n Graphics.render(SceneManager.current, CameraManager.current, this.main_RT);\n\n this.__update_uniforms();\n\n Graphics.blit(Graphics.depth_normals_RT, this.SSAO_RT, this.ssao_mat);\n\n // // BLUR\n this.blurrer.blur(this.SSAO_RT);\n Graphics.blit(this.SSAO_RT, undefined);\n\n // // COMPOSE\n this.ssao_compose_mat.uniforms._AO.value = this.SSAO_RT.texture;\n Graphics.blit(this.main_RT, undefined, this.ssao_compose_mat);\n\n // Graphics.blit(this.SSAO_RT, undefined);\n }\n\n __update_uniforms()\n {\n this.ssao_mat.uniforms._InverseProjMatrix.value.getInverse(CameraManager.current.projectionMatrix);\n this.ssao_mat.uniforms._ProjectionMatrix.value.copy(CameraManager.current.projectionMatrix);\n this.ssao_mat.uniforms._FarPlane.value = CameraManager.current.far;\n }\n\n __check_RT_size()\n {\n if (this.main_RT.width !== Screen.width * this.ssaa || this.main_RT.height !== Screen.height * this.ssaa)\n {\n this.main_RT.setSize(Screen.width * this.ssaa, Screen.height * this.ssaa);\n this.SSAO_RT.setSize(Screen.width, Screen.height);\n }\n }\n}\n","import CameraManager from '../CameraManager';\nimport SceneManager from '../SceneManager';\nimport BaseRender from '../render_mode/BaseRender';\nimport Graphics from '../Graphics';\n\nexport default class NormalRender extends BaseRender\n{\n constructor()\n {\n super();\n }\n\n render()\n {\n Graphics.clear(undefined, CameraManager.current, true, true);\n\n if (SceneManager.current.on_pre_render)\n {\n SceneManager.current.on_pre_render();\n }\n\n if (SceneManager.current.render)\n {\n SceneManager.current.render();\n }\n else\n {\n Graphics.render(SceneManager.current, CameraManager.current);\n }\n\n if (SceneManager.current.on_post_render)\n {\n SceneManager.current.on_post_render();\n }\n }\n}\n","import BlitMaterial from './BlitMaterial';\nimport frag from '../shaders/gaussian_blur/unreal_bloom_compose.frag';\nimport { Color } from 'three';\nexport default class UnrealBloomComposeMaterial extends BlitMaterial\n{\n constructor(nMips)\n {\n super(frag, undefined, {\n NUM_MIPS: nMips\n });\n this.uniforms._MainTex = { value: undefined };\n this.uniforms._BlurredTex = { value: undefined };\n this.uniforms._BloomStrength = { value: 1 };\n\n this.uniforms.blurTexture1 = { value: null };\n this.uniforms.blurTexture2 = { value: null };\n this.uniforms.blurTexture3 = { value: null };\n this.uniforms.blurTexture4 = { value: null };\n this.uniforms.blurTexture5 = { value: null };\n\n this.uniforms.bloomStrength = { value: 1.0 };\n this.uniforms.bloomFactors = { value: [1.0, 0.8, 0.6, 0.4, 0.2] };\n this.uniforms.bloomRadius = { value: 0.0 };\n\n const bloomTintColors = [\n new Color('#FFFFFF'),\n new Color('#FFFFFF'),\n new Color('#FFFFFF'),\n new Color('#FFFFFF'),\n new Color('#FFFFFF')\n ];\n\n this.uniforms.bloomTintColors = { value: bloomTintColors };\n }\n\n set_RT_0(rt)\n {\n this.uniforms.blurTexture1.value = rt;\n }\n\n set_RT_1(rt)\n {\n this.uniforms.blurTexture2.value = rt;\n }\n\n set_RT_2(rt)\n {\n this.uniforms.blurTexture3.value = rt;\n }\n\n set_RT_3(rt)\n {\n this.uniforms.blurTexture4.value = rt;\n }\n\n set_RT_4(rt)\n {\n this.uniforms.blurTexture5.value = rt;\n }\n\n set_bloom_strength(value)\n {\n this.uniforms.bloomStrength.value = value;\n }\n\n set_bloom_radius(value)\n {\n this.uniforms.bloomRadius.value = value;\n }\n\n set_tint_color_0(col_string)\n {\n this.uniforms.bloomTintColors.value[0].set(col_string);\n }\n\n set_tint_color_1(col_string)\n {\n this.uniforms.bloomTintColors.value[1].set(col_string);\n }\n\n set_tint_color_2(col_string)\n {\n this.uniforms.bloomTintColors.value[2].set(col_string);\n }\n\n set_tint_color_3(col_string)\n {\n this.uniforms.bloomTintColors.value[3].set(col_string);\n }\n\n set_tint_color_4(col_string)\n {\n this.uniforms.bloomTintColors.value[4].set(col_string);\n }\n}\n","import BlitMaterial from './BlitMaterial';\nimport frag from '../shaders/add/add.frag';\n\nexport default class AddMaterial extends BlitMaterial\n{\n constructor(nMips)\n {\n super(frag);\n\n this.uniforms._SecondTex = { value: undefined };\n }\n\n set_add_texture(tex)\n {\n this.uniforms._SecondTex.value = tex;\n }\n}\n","import BlitMaterial from './BlitMaterial';\nimport frag from '../shaders/gaussian_blur/gaussian_blur.frag';\nimport { Vector2 } from 'three';\n\nexport default class GaussianBlurMaterial extends BlitMaterial\n{\n constructor(kernel_radius)\n {\n super(frag, undefined, {\n KERNEL_RADIUS: kernel_radius,\n SIGMA: kernel_radius\n });\n\n this.uniforms.texSize = { value: new Vector2(0.5, 0.5) };\n this.uniforms.direction = { value: new Vector2(0.5, 0.5) };\n }\n\n set_size(w, h)\n {\n this.uniforms.texSize.value.x = w;\n this.uniforms.texSize.value.y = h;\n }\n\n set_direction(x, y)\n {\n this.uniforms.direction.value.set(x, y);\n }\n}\n","import BlitMaterial from './BlitMaterial';\nimport frag from '../shaders/luminosity_high_pass/luminosity_high_pass.frag';\nimport { Color } from 'three';\nexport default class LuminosityHighPassMaterial extends BlitMaterial\n{\n constructor(kernel_radius)\n {\n super(frag);\n\n this.uniforms.luminosityThreshold = { value: 0.23 };\n this.uniforms.smoothWidth = { value: 0.01 };\n this.uniforms.defaultColor = { value: new Color('#000000') };\n this.uniforms.defaultOpacity = { value: 0.0 };\n }\n}\n","import GaussianBlurMaterial from '../materials/GaussianBlurMaterial';\nimport LuminosityHighPassMaterial from '../materials/LuminosityHighPassMaterial';\nimport Graphics from '../Graphics';\n\nimport { WebGLRenderTarget, LinearFilter, RGBAFormat } from 'three';\n\nexport default class GaussianBlurrer\n{\n constructor(nMips = 5)\n {\n this.current_width = 1;\n this.current_height = 1;\n\n this.separableBlurMaterials = [];\n this.renderTargetsHorizontal = [];\n this.renderTargetsVertical = [];\n\n this.nMips = nMips;\n this.kernelSizeArray = [3, 5, 7, 9, 11];\n this.rt_pars = { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat };\n\n this.renderTargetBright = new WebGLRenderTarget(1, 1, this.rt_pars);\n this.renderTargetBright.texture.generateMipmaps = false;\n\n this.init_materials();\n this.init_RT();\n\n this.luminosity_high_pass_mat = new LuminosityHighPassMaterial();\n }\n\n blur(RT, use_luminosity_high_pass)\n {\n this.resize_RT(RT.width, RT.height);\n\n if (use_luminosity_high_pass)\n {\n Graphics.blit(RT, this.renderTargetBright, this.luminosity_high_pass_mat);\n }\n else\n {\n Graphics.blit(RT, this.renderTargetBright);\n }\n\n let inputRenderTarget = this.renderTargetBright;\n\n for (let i = 0; i < this.nMips; i++)\n {\n const mat = this.separableBlurMaterials[i];\n\n mat.set_direction(1, 0);\n Graphics.blit(inputRenderTarget, this.renderTargetsHorizontal[i], mat);\n\n mat.set_direction(0, 1);\n Graphics.blit(this.renderTargetsHorizontal[i], this.renderTargetsVertical[i], mat);\n\n inputRenderTarget = this.renderTargetsVertical[i];\n }\n }\n\n get_blurred_texture()\n {\n return this.renderTargetsHorizontal[0].texture;\n }\n\n get_blurred_RT()\n {\n return this.renderTargetsHorizontal[0];\n }\n\n init_RT()\n {\n this.dispose_RT();\n\n this.renderTargetBright.setSize(1, 1);\n\n for (let i = 0; i < this.nMips; i++)\n {\n const hor = new WebGLRenderTarget(1, 1, this.rt_pars);\n const ver = new WebGLRenderTarget(1, 1, this.rt_pars);\n\n hor.texture.generateMipmaps = false;\n ver.texture.generateMipmaps = false;\n\n this.renderTargetsHorizontal.push(hor);\n this.renderTargetsVertical.push(ver);\n }\n }\n\n resize_RT(texture_width, texture_height)\n {\n if (this.current_width === texture_width && this.current_height === texture_height)\n {\n return;\n }\n\n this.current_width = texture_width;\n this.current_height = texture_height;\n\n let width = Math.round(texture_width / 2);\n let height = Math.round(texture_height / 2);\n\n this.renderTargetBright.setSize(width, height);\n\n for (let i = 0; i < this.nMips; i++)\n {\n this.renderTargetsVertical[i].setSize(width, height);\n this.renderTargetsHorizontal[i].setSize(width, height);\n this.separableBlurMaterials[i].set_size(width, height);\n\n width = Math.round(width / 2);\n height = Math.round(height / 2);\n }\n }\n\n init_materials(texture_width, texture_height)\n {\n this.dispose_materials();\n\n for (let i = 0; i < this.nMips; i++)\n {\n this.separableBlurMaterials.push(new GaussianBlurMaterial(this.kernelSizeArray[i]));\n }\n }\n\n dispose_materials()\n {\n for (let i = 0; i < this.separableBlurMaterials.length; i++)\n {\n this.separableBlurMaterials[i].dispose();\n }\n this.separableBlurMaterials.length = 0;\n }\n\n dispose_RT()\n {\n for (let i = 0; i < this.renderTargetsVertical.length; i++)\n {\n this.renderTargetsHorizontal[i].dispose();\n this.renderTargetsVertical[i].dispose();\n }\n this.renderTargetBright.dispose();\n\n this.renderTargetsHorizontal.length = 0;\n this.renderTargetsVertical.length = 0;\n }\n}\n","import Screen from '../Screen';\nimport BaseRender from '../render_mode/BaseRender';\nimport UnrealBloomComposeMaterial from '../materials/UnrealBloomComposeMaterial';\nimport AddMaterial from '../materials/AddMaterial';\n\nimport { WebGLRenderTarget } from 'three';\n\nimport GaussianBlurrer from '../render_utilities/GaussianBlurrer';\nimport Graphics from '../Graphics';\nimport CameraManager from '../CameraManager';\nimport SceneManager from '../SceneManager';\n\nexport default class UnrealBloomRender extends BaseRender\n{\n constructor()\n {\n super();\n\n this.bloom_compose_mat = undefined;\n\n this.main_RT = undefined;\n this.blur_RT = undefined;\n this.blurrer = undefined;\n\n this.add_mat = new AddMaterial();\n }\n\n on_enter()\n {\n this.blurrer = new GaussianBlurrer();\n this.main_RT = new WebGLRenderTarget(Screen.render_width, Screen.render_height);\n this.blur_RT = new WebGLRenderTarget(Screen.render_width, Screen.render_height);\n\n this.bloom_compose_mat = new UnrealBloomComposeMaterial(5);\n this.blurrer = new GaussianBlurrer(5);\n\n this.bloom_compose_mat.set_RT_0(this.blurrer.renderTargetsVertical[0].texture);\n this.bloom_compose_mat.set_RT_1(this.blurrer.renderTargetsVertical[1].texture);\n this.bloom_compose_mat.set_RT_2(this.blurrer.renderTargetsVertical[2].texture);\n this.bloom_compose_mat.set_RT_3(this.blurrer.renderTargetsVertical[3].texture);\n this.bloom_compose_mat.set_RT_4(this.blurrer.renderTargetsVertical[4].texture);\n\n this.bloom_compose_mat.set_bloom_strength(1);\n this.bloom_compose_mat.set_bloom_radius(1);\n\n this.add_mat.set_add_texture(this.blurrer.renderTargetsHorizontal[0].texture);\n }\n\n set_bloom_strength(val)\n {\n this.bloom_compose_mat.set_bloom_strength(val);\n }\n\n set_bloom_radius(val)\n {\n this.bloom_compose_mat.set_bloom_radius(val);\n }\n\n set_tint_color_0(col_string)\n {\n this.bloom_compose_mat.set_tint_color_0(col_string);\n }\n\n set_tint_color_1(col_string)\n {\n this.bloom_compose_mat.set_tint_color_1(col_string);\n }\n\n set_tint_color_2(col_string)\n {\n this.bloom_compose_mat.set_tint_color_2(col_string);\n }\n\n set_tint_color_3(col_string)\n {\n this.bloom_compose_mat.set_tint_color_3(col_string);\n }\n\n set_tint_color_4(col_string)\n {\n this.bloom_compose_mat.set_tint_color_4(col_string);\n }\n\n render()\n {\n this.__check_RT_size();\n\n Graphics.clear(this.main_RT, CameraManager.current, true, false);\n Graphics.render(SceneManager.current, CameraManager.current, this.main_RT);\n\n // // BLUR\n this.blurrer.blur(this.main_RT, true);\n\n // Blur compose\n Graphics.material_pass(this.bloom_compose_mat, this.blurrer.renderTargetsHorizontal[0]);\n\n // Additive blend\n Graphics.blit(this.main_RT, undefined, this.add_mat);\n }\n\n __check_RT_size()\n {\n if (this.main_RT.width !== Screen.render_width || this.main_RT.height !== Screen.render_height)\n {\n this.main_RT.setSize(Screen.render_width, Screen.render_height);\n this.blur_RT.setSize(Screen.render_width, Screen.render_height);\n }\n }\n}\n","import { Color } from 'three';\nimport { OrthographicCamera as THREEOrthographicCamera } from 'three';\n\nexport default class OrthographicCamera extends THREEOrthographicCamera\n{\n constructor(left, right, top, bottom, near, far)\n {\n super(left, right, top, bottom, near, far);\n\n this.clear_color = new Color('#000000');\n this.clear_alpha = 1;\n }\n}\n","import ViewManager from './ViewManager';\n\nclass ViewComponentManager\n{\n constructor()\n {\n this.components = [];\n this.enabled_components = new Set();\n }\n\n update()\n {\n this.__set_components_opacities();\n\n for (const component of this.enabled_components)\n {\n component.update(ViewManager.transition_handler.current_state_data);\n }\n }\n\n register_component(component)\n {\n this.components.push(component);\n }\n\n enable_component(component)\n {\n // const component_to_enable = this.get_component_by_name(component_name);\n\n this.enabled_components.add(component);\n }\n\n disable_component(component)\n {\n // const component_to_disable = this.get_component_by_name(component_name);\n\n this.enabled_components.delete(component);\n }\n\n get_component_by_name(component_name)\n {\n console.warn('DEPRECATED. Use ViewComponentManager.get instead');\n this.get(component_name);\n }\n\n get(component_name)\n {\n for (let i = 0; i < this.components.length; i++)\n {\n if (this.components[i].name === component_name)\n {\n return this.components[i];\n }\n }\n console.error('[ViewComponentManager.get] no component found for: ', component_name);\n return undefined;\n }\n\n __set_components_opacities()\n {\n for (let i = 0; i < this.components.length; i++)\n {\n this.components[i].set_opacity(ViewManager.transition_handler.current_state_data);\n }\n }\n}\n\nexport default new ViewComponentManager();\n","import Time from './Time';\nimport Input from './Input';\nimport UI from './UI';\nimport Debug from './Debug';\nimport BaseApplication from './BaseApplication';\nimport ViewManager from './view_components/ViewManager';\nimport ViewComponentManager from './view_components/ViewComponentManager';\n\nexport default class RenderLoop\n{\n constructor(target_application, graphics)\n {\n target_application = target_application || new BaseApplication();\n\n this._frame_id = -1;\n\n this.target_application = target_application;\n this.graphics = graphics;\n\n this.is_running = false;\n this.frames_passed = 0;\n }\n\n update()\n {\n if (!this.is_running)\n {\n return;\n }\n Time.__update();\n\n // ###### START CYCLE ######\n if (this.frames_passed === 1)\n {\n this.target_application.on_post_start();\n }\n\n this.target_application.update();\n ViewManager.update();\n ViewComponentManager.update();\n\n this.target_application.on_pre_render();\n\n this.graphics.update(); // render scene\n UI.update(); // update after new camera matrix has been calculated\n UI.render(this.graphics); // render ui layer on top\n this.target_application.on_post_render();\n\n Debug.render(this.graphics); // render debug layer\n\n // ###### END CYCLE #######\n\n this._frame_id = requestAnimationFrame(this.update.bind(this));\n this.target_application.on_frame_end();\n this.frames_passed++;\n\n Input.clear();\n UI.clear();\n Debug.clear();\n }\n\n start()\n {\n if (this.is_running) return; // sanity check\n\n if (this.frames_passed === 0)\n {\n this.target_application.on_enter();\n }\n\n this.is_running = true;\n this.update();\n }\n\n stop()\n {\n if (this.is_running === false) return; // sanity check\n\n this.is_running = false;\n this.target_application.on_exit();\n\n cancelAnimationFrame(this._frame_id);\n }\n\n set_state(new_state)\n {\n this.target_application.on_exit(this);\n this.target_application = new_state;\n this.target_application.on_enter(this);\n }\n\n dispose()\n {\n this.stop();\n this.frames_passed = 0;\n }\n}\n","\nimport CanvasDrawer from './CanvasDrawer';\n\nimport { Vector2 } from 'three';\n\nexport default class SimpleTextDrawer extends CanvasDrawer\n{\n constructor()\n {\n super();\n this.text_margin = new Vector2(2, 0);\n }\n\n __draw(text, ctxOptions, canvas, ctx)\n {\n ctx.font = ctxOptions.font;\n\n const text_size = this.get_text_size(text, ctxOptions.font);\n // canvas.width = Math.ceilPowerOfTwo(text_size.x+this.text_margin.x*2);\n // canvas.height = Math.ceilPowerOfTwo(text_size.y+ this.text_margin.y*2);\n canvas.width = Math.ceil(text_size.x + this.text_margin.x * 2);\n canvas.height = Math.ceil(text_size.y + this.text_margin.y * 2);\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n // turn this on for debugging\n ctx.globalAlpha = 0.0;\n ctx.fillStyle = ctxOptions.font_color || '#000000';\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.globalAlpha = 1;\n\n ctx.globalAlpha = 1;\n\n ctx.font = ctxOptions.font;\n ctx.fillStyle = ctxOptions.font_color || '#000000';\n ctx.textBaseline = 'middle';\n\n ctx.textAlign = ctxOptions.textAlign || 'center';\n if (ctx.textAlign === 'center')\n {\n ctx.fillText(text, canvas.width / 2, canvas.height / 2);\n }\n else\n {\n ctx.fillText(text, 0, canvas.height / 2);\n }\n }\n}\n","import ViewComponentManager from './ViewComponentManager';\n\nexport default class ViewComponent\n{\n constructor({ name, container })\n {\n this.name = name;\n this.container = container;\n this.hidden = true;\n\n ViewComponentManager.register_component(this);\n }\n\n start()\n {\n }\n\n on_enter()\n {\n this.container.classList.remove('hidden');\n ViewComponentManager.enable_component(this);\n\n this.hidden = false;\n }\n\n update()\n {\n }\n\n on_exit()\n {\n this.container.classList.add('hidden');\n ViewComponentManager.disable_component(this);\n\n this.hidden = true;\n }\n\n set_opacity(current_state_data)\n {\n this.container.style.opacity = current_state_data[`${this.name}_opacity`];\n this.toggle_hidden();\n }\n\n toggle_hidden()\n {\n if (this.container.style.opacity > 0.001)\n {\n if (this.hidden)\n {\n this.on_enter();\n }\n }\n else\n {\n if (!this.hidden)\n {\n this.on_exit();\n }\n }\n }\n}\n","import { Mesh } from 'three';\nimport { MeshBasicMaterial } from 'three';\nimport { PlaneBufferGeometry } from 'three';\n\nexport default class HorizontalPlane extends Mesh\n{\n constructor(width, height, color, material)\n {\n width = width || 1;\n height = height || 1;\n color = color || '#FF0000';\n material = material || new MeshBasicMaterial({ color: color });\n\n const geometry = new PlaneBufferGeometry(width, height);\n geometry.rotateX(-3.14 / 2);\n super(geometry, material);\n }\n}\n","import { Mesh } from 'three';\nimport { PlaneBufferGeometry } from 'three';\nimport { MeshBasicMaterial } from 'three';\n\nexport default class VerticalPlane extends Mesh\n{\n constructor(width, height, color, material)\n {\n width = width || 1;\n height = height || 1;\n color = color || '#FF0000';\n material = material || new MeshBasicMaterial({ color: color });\n\n const geometry = new PlaneBufferGeometry(width, height);\n super(geometry, material);\n }\n}\n","export default class ArrayUtilities\n{\n constructor()\n {}\n\n static merge_from_to(source, target)\n {\n target.push.apply(target, source);\n }\n\n static expand_vec3_array(array, size)\n {\n const items_left_count = size - array.length;\n\n for (let i = 0; i < items_left_count; i++)\n {\n array.push(array[i].clone());\n }\n }\n\n static remove_elem(array, elem)\n {\n const index = array.indexOf(elem);\n if (index > -1)\n {\n array.splice(index, 1);\n }\n }\n\n static get_closest_point(points, target)\n {\n let closest_point = points[0];\n let closest_distance = closest_point.distanceTo(target);\n for (let i = 1; i < points.length; i++)\n {\n if (points[i].distanceTo(target) < closest_distance)\n {\n closest_point = points[i];\n closest_distance = points[i].distanceTo(target);\n }\n }\n return closest_point;\n }\n\n static object_values_to_array(obj)\n {\n const ids = Object.keys(obj);\n const arr = [];\n for (let i = 0; i < ids.length; i++)\n {\n arr.push(obj[ids[i]]);\n }\n return arr;\n }\n}\n","import { Line3, Plane, Quaternion, Sphere, Vector3 } from 'three';\n\nexport default class FrustumPointFitter\n{\n constructor()\n {\n this.sphere = new Sphere();\n }\n\n fit_points(points, camera_quaternion, vertical_fov, aspect)\n {\n this.sphere.setFromPoints(points);\n\n const v_fov = Math.degToRad(vertical_fov / 2);\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\n\n const up_plane_normal = this.get_up_plane_normal(camera_quaternion, v_fov);\n const down_plane_normal = this.get_down_plane_normal(camera_quaternion, v_fov);\n const left_plane_normal = this.get_left_plane_normal(camera_quaternion, h_fov);\n const right_plane_normal = this.get_right_plane_normal(camera_quaternion, h_fov);\n\n const camera_forward_dir = new Vector3(0, 0, -1).applyQuaternion(camera_quaternion);\n\n const sphere_center = this.sphere.center.clone();\n\n const pull_back_distance = this.get_distance_to_fit_rect(this.sphere.radius * 2, this.sphere.radius * 2, vertical_fov, aspect);\n const far_pos = sphere_center.clone().add(camera_forward_dir.clone().multiplyScalar(pull_back_distance * -1));\n\n const up_plane = new Plane().setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\n const down_plane = new Plane().setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\n\n const left_plane = new Plane().setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\n const right_plane = new Plane().setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\n\n this.apply_center_correction_to_pos(far_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane);\n\n up_plane.setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\n down_plane.setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\n\n left_plane.setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\n right_plane.setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\n\n let closest_distance = Infinity;\n\n const inverse_dir = camera_forward_dir.clone().multiplyScalar(pull_back_distance * -2);\n for (let i = 0; i < points.length; i++)\n {\n const line = new Line3(points[i].clone(), points[i].clone().add(inverse_dir));\n\n const up_line_intersection = new Vector3();\n const down_line_intersection = new Vector3();\n\n const left_line_intersection = new Vector3();\n const right_line_intersection = new Vector3();\n\n up_plane.intersectLine(line, up_line_intersection);\n down_plane.intersectLine(line, down_line_intersection);\n\n left_plane.intersectLine(line, left_line_intersection);\n right_plane.intersectLine(line, right_line_intersection);\n\n if (up_line_intersection.length() < 0.0001)\n {\n console.log('up intersection not found', i);\n }\n if (down_line_intersection.length() < 0.0001)\n {\n console.log('down intersection not found', i);\n }\n if (left_line_intersection.length() < 0.0001)\n {\n console.log('left intersection not found', i);\n }\n if (right_line_intersection.length() < 0.0001)\n {\n console.log('right intersection not found', i);\n }\n\n const new_up_distance = points[i].clone().sub(up_line_intersection).length();\n const new_down_distance = points[i].clone().sub(down_line_intersection).length();\n\n const new_left_distance = points[i].clone().sub(left_line_intersection).length();\n const new_right_distance = points[i].clone().sub(right_line_intersection).length();\n\n const vertical_min = Math.min(new_up_distance, new_down_distance);\n const horizontal_min = Math.min(new_left_distance, new_right_distance);\n\n const min = Math.min(vertical_min, horizontal_min);\n\n if (min < closest_distance)\n {\n closest_distance = min;\n }\n }\n\n const forward_correction = camera_forward_dir.clone().multiplyScalar(closest_distance);\n const closest_position = far_pos.clone().add(forward_correction);\n\n return closest_position;\n }\n\n apply_center_correction_to_pos(target_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane)\n {\n const vertical_offset = this.get_vertical_correction(points, down_plane, up_plane, camera_quaternion);\n const horizontal_offset = this.get_hozirontal_correction(points, left_plane, right_plane, camera_quaternion);\n\n target_pos.add(vertical_offset);\n target_pos.add(horizontal_offset);\n }\n\n get_vertical_correction(points, down_plane, up_plane, camera_quaternion)\n {\n let closest_distance_to_up_plane = Infinity;\n let closest_distance_to_down_plane = Infinity;\n let closest_up_point = undefined;\n let closest_down_point = undefined;\n\n const up_dir = new Vector3(0, 1, 0).applyQuaternion(camera_quaternion);\n for (let i = 0; i < points.length; i++)\n {\n const down_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(-5000000)));\n const up_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(5000000)));\n\n const down_line_intersection = new Vector3();\n const up_line_intersection = new Vector3();\n\n down_plane.intersectLine(down_line, down_line_intersection);\n up_plane.intersectLine(up_line, up_line_intersection);\n\n const down_dist = down_line_intersection.distanceTo(points[i]);\n const up_dist = up_line_intersection.distanceTo(points[i]);\n\n if (up_line_intersection.length() < 0.0001)\n {\n console.log('vertical up intersection not found', i);\n }\n if (down_line_intersection.length() < 0.0001)\n {\n console.log('vertical down intersection not found', i);\n }\n\n if (down_dist < closest_distance_to_down_plane)\n {\n closest_distance_to_down_plane = down_dist;\n closest_down_point = points[i];\n }\n if (up_dist < closest_distance_to_up_plane)\n {\n closest_distance_to_up_plane = up_dist;\n closest_up_point = points[i];\n }\n }\n\n console.log(closest_up_point, closest_down_point);\n\n const correction = (closest_distance_to_up_plane - closest_distance_to_down_plane) / 2;\n\n // console.log(\"vertical_correction\", correction)\n return up_dir.clone().multiplyScalar(-correction);\n }\n\n get_hozirontal_correction(points, left_plane, right_plane, camera_quaternion)\n {\n let closest_distance_to_right_plane = Infinity;\n let closest_distance_to_left_plane = Infinity;\n let closest_right_point = undefined;\n let closest_left_point = undefined;\n\n const right_dir = new Vector3(1, 0, 0).applyQuaternion(camera_quaternion);\n\n for (let i = 0; i < points.length; i++)\n {\n const left_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(-5000000)));\n const right_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(5000000)));\n\n const left_line_intersection = new Vector3();\n const right_line_intersection = new Vector3();\n\n left_plane.intersectLine(left_line, left_line_intersection);\n right_plane.intersectLine(right_line, right_line_intersection);\n\n const left_dist = left_line_intersection.distanceTo(points[i]);\n const right_dist = right_line_intersection.distanceTo(points[i]);\n\n if (left_line_intersection.length() < 0.0001)\n {\n console.log('left intersection not found', i);\n }\n if (right_line_intersection.length() < 0.0001)\n {\n console.log('right intersection not found', i);\n }\n\n if (left_dist < closest_distance_to_left_plane)\n {\n closest_distance_to_left_plane = left_dist;\n closest_left_point = points[i];\n }\n if (right_dist < closest_distance_to_right_plane)\n {\n closest_distance_to_right_plane = right_dist;\n closest_right_point = points[i];\n }\n }\n\n const correction = (closest_distance_to_right_plane - closest_distance_to_left_plane) / 2;\n // console.log(\"horizontal_correction\", correction)\n\n console.log(closest_right_point, closest_left_point);\n\n return right_dir.clone().multiplyScalar(-correction);\n }\n\n get_up_plane_normal(camera_quaternion, v_fov)\n {\n const up_plane_normal = new Vector3(0, -1, 0);\n up_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), v_fov));\n up_plane_normal.applyQuaternion(camera_quaternion);\n return up_plane_normal;\n }\n\n get_down_plane_normal(camera_quaternion, v_fov)\n {\n const down_plane_normal = new Vector3(0, 1, 0);\n down_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), -v_fov));\n down_plane_normal.applyQuaternion(camera_quaternion);\n return down_plane_normal;\n }\n\n get_left_plane_normal(camera_quaternion, h_fov)\n {\n const left_plane_normal = new Vector3(1, 0, 0);\n left_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), h_fov));\n left_plane_normal.applyQuaternion(camera_quaternion);\n return left_plane_normal;\n }\n\n get_right_plane_normal(camera_quaternion, h_fov)\n {\n const right_plane_normal = new Vector3(-1, 0, 0);\n right_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), -h_fov));\n right_plane_normal.applyQuaternion(camera_quaternion);\n return right_plane_normal;\n }\n\n get_distance_to_fit_rect(width, height, vertical_fov, aspect)\n {\n const v_fov = (vertical_fov / 2) * Math.PI / 180;\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\n\n const distV = height / Math.tan(v_fov);\n const distH = width / Math.tan(h_fov);\n return Math.max(Math.abs(distH), Math.abs(distV));\n }\n}\n","import { BufferAttribute } from 'three';\nimport { BufferGeometry } from 'three';\n\nexport default class GeometryUtilities\n{\n static convert_to_non_indexed_geometry(geometry_buffer)\n {\n const indices = geometry_buffer.index;\n const positions = geometry_buffer.getAttribute('position');\n\n const bar_coordinates = [];\n const vertices = [];\n\n for (let i = 0; i < indices.count; i += 3)\n {\n // VERTEX 1\n vertices.push(positions.getX(indices.array[i + 0]));\n vertices.push(positions.getY(indices.array[i + 0]));\n vertices.push(positions.getZ(indices.array[i + 0]));\n\n bar_coordinates.push(1);\n bar_coordinates.push(0);\n bar_coordinates.push(0);\n\n // VERTEX 2\n\n vertices.push(positions.getX(indices.array[i + 1]));\n vertices.push(positions.getY(indices.array[i + 1]));\n vertices.push(positions.getZ(indices.array[i + 1]));\n\n bar_coordinates.push(0);\n bar_coordinates.push(1);\n bar_coordinates.push(0);\n\n // VERTEX 3\n\n vertices.push(positions.getX(indices.array[i + 2]));\n vertices.push(positions.getY(indices.array[i + 2]));\n vertices.push(positions.getZ(indices.array[i + 2]));\n\n bar_coordinates.push(0);\n bar_coordinates.push(0);\n bar_coordinates.push(1);\n }\n\n const geometry = new BufferGeometry();\n // geometry.setAttribute('barycentric', new BufferAttribute( new Float32Array(bar_coordinates), 3 ));\n geometry.setAttribute('position', new BufferAttribute(new Float32Array(vertices), 3));\n GeometryUtilities.add_barycentric_attribute(geometry);\n return geometry;\n }\n\n static add_barycentric_attribute(non_indexed_geometry_buffer)\n {\n const bar_coordinates = [];\n const positions = non_indexed_geometry_buffer.getAttribute('position');\n\n for (let i = 0; i < positions.count; i += 3)\n {\n bar_coordinates.push(1);\n bar_coordinates.push(0);\n bar_coordinates.push(0);\n\n bar_coordinates.push(0);\n bar_coordinates.push(1);\n bar_coordinates.push(0);\n\n bar_coordinates.push(0);\n bar_coordinates.push(0);\n bar_coordinates.push(1);\n }\n non_indexed_geometry_buffer.setAttribute('barycentric', new BufferAttribute(new Float32Array(bar_coordinates), 3));\n }\n}\n","import { Vector4 } from 'three';\n\nexport default class ImageUtilities\n{\n constructor()\n { }\n\n static get_image_data(image)\n {\n const canvas = document.createElement('canvas');\n canvas.width = image.width;\n canvas.height = image.height;\n\n const context = canvas.getContext('2d');\n context.drawImage(image, 0, 0);\n\n return context.getImageData(0, 0, image.width, image.height);\n }\n\n static get_pixel(imagedata, x, y)\n {\n const position = (x + imagedata.width * y) * 4;\n const data = imagedata.data;\n return new Vector4(data[position + 0], data[position + 1], data[position + 2], data[position + 3]);\n }\n}\n","import { Vector3 } from 'three';\nclass MeshSampler\n{\n constructor()\n {\n\n }\n\n sample(buffer_geometry, sample_count)\n {\n const face_areas = [];\n\n let min_area = 99999999;\n\n const vertices = buffer_geometry.getAttribute('position');\n const normals = buffer_geometry.getAttribute('normal');\n const indices = buffer_geometry.index;\n\n const faces = [];\n\n for (let i = 0; i < indices.count; i += 3)\n {\n const index_0 = indices.array[i + 0];\n const index_1 = indices.array[i + 1];\n const index_2 = indices.array[i + 2];\n\n const v1 = new Vector3();\n v1.x = vertices.getX(index_0);\n v1.y = vertices.getY(index_0);\n v1.z = vertices.getZ(index_0);\n\n const v2 = new Vector3();\n v2.x = vertices.getX(index_1);\n v2.y = vertices.getY(index_1);\n v2.z = vertices.getZ(index_1);\n\n const v3 = new Vector3();\n v3.x = vertices.getX(index_2);\n v3.y = vertices.getY(index_2);\n v3.z = vertices.getZ(index_2);\n\n const face = {\n a: v1,\n b: v2,\n c: v3\n };\n\n if (normals)\n {\n const n1 = new Vector3();\n n1.x = normals.getX(index_0);\n n1.y = normals.getY(index_0);\n n1.z = normals.getZ(index_0);\n\n const n2 = new Vector3();\n n2.x = normals.getX(index_1);\n n2.y = normals.getY(index_1);\n n2.z = normals.getZ(index_1);\n\n const n3 = new Vector3();\n n3.x = normals.getX(index_2);\n n3.y = normals.getY(index_2);\n n3.z = normals.getZ(index_2);\n\n const normal = n1.clone().add(n2).add(n3).normalize();\n face.normal = normal;\n }\n\n faces.push(face);\n\n const area = this.get_face_area(face);\n min_area = Math.min(area, min_area);\n face_areas.push(area);\n }\n\n const normalized_faces_array = this.get_uniform_face_distribution(face_areas, min_area, faces);\n const selected_faces = this.select_random_faces(normalized_faces_array, sample_count);\n const sampled_data = this.sample_data_from_faces(selected_faces);\n return sampled_data;\n }\n\n sample_data_from_faces(faces)\n {\n const sampled_points = [];\n const sampled_normals = [];\n for (let i = 0; i < faces.length; i++)\n {\n const face = faces[i];\n\n const w1 = Math.random();\n const w2 = Math.random();\n\n sampled_points.push(this.sample_point_in_face(w1, w2, face.a, face.b, face.c).clone());\n if (face.normal)\n {\n sampled_normals.push(face.normal.clone());\n }\n }\n return { points: sampled_points, normals: sampled_normals };\n }\n\n select_random_faces(faces, amount)\n {\n const selected_faces = [];\n for (let i = 0; i < amount; i++)\n {\n const random = Math.floor(Math.random() * faces.length);\n const selected_face = faces[random];\n\n selected_faces.push(selected_face);\n }\n\n return selected_faces;\n }\n\n get_uniform_face_distribution(face_areas, minimum_area, faces)\n {\n const extended_triangle_indices = [];\n for (let i = 0; i < face_areas.length; i++)\n {\n face_areas[i] /= minimum_area;\n const repetitions_needed = Math.floor(Math.round(face_areas[i]));\n for (let j = 0; j < repetitions_needed; j++)\n {\n extended_triangle_indices.push(faces[i]);\n }\n }\n return extended_triangle_indices;\n }\n\n get_face_area(face)\n {\n const vec1 = face.b.clone().sub(face.a);\n const vec2 = face.c.clone().sub(face.a);\n return vec1.cross(vec2).length() / 2;\n }\n\n sample_point_in_face(w1, w2, v1, v2, v3)\n {\n if (w1 + w2 > 1)\n {\n w1 = 1.0 - w1;\n w2 = 1.0 - w2;\n }\n\n const w3 = 1.0 - (w1 + w2);\n\n return v1.clone().multiplyScalar(w1).add(v2.clone().multiplyScalar(w2)).add(v3.clone().multiplyScalar(w3));\n }\n}\n\nexport default new MeshSampler();\n","import { Mesh } from 'three';\nimport { BufferGeometry } from 'three';\nimport { Skeleton } from 'three';\n\nclass ModelUtilities\n{\n get_mesh(scene, result_callback)\n {\n scene.traverse((child) =>\n {\n if (child instanceof Mesh)\n {\n if (child.geometry)\n {\n child.geometry = new BufferGeometry().fromGeometry(child.geometry);\n }\n result_callback(child);\n }\n });\n }\n\n get_geometries(scene)\n {\n const geometries = [];\n\n this.get_mesh(scene, (child) =>\n {\n geometries.push(child.geometry);\n });\n return geometries;\n }\n\n assign_material(scene, material, name)\n {\n scene.traverse((child) =>\n {\n if (child instanceof Mesh)\n {\n // assign to all if no name is given\n if (name === undefined)\n {\n child.material = material;\n }\n else\n {\n // if name is given, assign only to that\n if (child.name === name)\n {\n child.material = material;\n }\n }\n }\n });\n }\n\n clone_animated_gltf(gltf)\n {\n const clone = {\n animations: gltf.animations,\n scene: gltf.scene.clone(true)\n };\n\n const skinnedMeshes = {};\n\n gltf.scene.traverse(node =>\n {\n if (node.isSkinnedMesh)\n {\n skinnedMeshes[node.name] = node;\n }\n });\n\n const cloneBones = {};\n const cloneSkinnedMeshes = {};\n\n clone.scene.traverse(node =>\n {\n if (node.isBone)\n {\n cloneBones[node.name] = node;\n }\n\n if (node.isSkinnedMesh)\n {\n cloneSkinnedMeshes[node.name] = node;\n }\n });\n\n for (const name in skinnedMeshes)\n {\n const skinnedMesh = skinnedMeshes[name];\n const skeleton = skinnedMesh.skeleton;\n const cloneSkinnedMesh = cloneSkinnedMeshes[name];\n\n const orderedCloneBones = [];\n\n for (let i = 0; i < skeleton.bones.length; ++i)\n {\n const cloneBone = cloneBones[skeleton.bones[i].name];\n orderedCloneBones.push(cloneBone);\n }\n\n cloneSkinnedMesh.bind(\n new Skeleton(orderedCloneBones, skeleton.boneInverses),\n cloneSkinnedMesh.matrixWorld);\n }\n\n return clone;\n }\n\n set_shadow_config(scene, cast, receive)\n {\n scene.traverse((child) =>\n {\n if (child instanceof Mesh)\n {\n child.castShadow = cast;\n child.receiveShadow = receive;\n }\n });\n }\n\n __find_object(scene, object_name, result_callback)\n {\n scene.traverse((obj) =>\n {\n if (obj.name === object_name)\n {\n result_callback(obj);\n }\n });\n }\n\n get_object(scene, object_name)\n {\n let object = undefined;\n scene.traverse((obj) =>\n {\n if (obj.name === object_name)\n {\n object = obj;\n }\n });\n return object;\n }\n\n get_object_by_type(scene, object_type)\n {\n let object = undefined;\n scene.traverse((obj) =>\n {\n if (obj.constructor.name === object_type)\n {\n object = obj;\n }\n });\n return object;\n }\n}\n\nexport default new ModelUtilities();\n","export default class ObjectUtilities\r\n{\r\n constructor()\r\n {}\r\n\r\n // Changes XML to JSON\r\n static xml_to_json(xml)\r\n {\r\n // Create the return object\r\n let obj = {};\r\n\r\n if (xml.nodeType === 1)\r\n { // element\r\n // do attributes\r\n if (xml.attributes.length > 0)\r\n {\r\n obj['@attributes'] = {};\r\n for (let j = 0; j < xml.attributes.length; j++)\r\n {\r\n const attribute = xml.attributes.item(j);\r\n obj['@attributes'][attribute.nodeName] = attribute.nodeValue;\r\n }\r\n }\r\n }\r\n else if (xml.nodeType === 3)\r\n { // text\r\n obj = xml.nodeValue;\r\n }\r\n\r\n // do children\r\n if (xml.hasChildNodes())\r\n {\r\n for (let i = 0; i < xml.childNodes.length; i++)\r\n {\r\n const item = xml.childNodes.item(i);\r\n const nodeName = item.nodeName;\r\n if (typeof (obj[nodeName]) === 'undefined')\r\n {\r\n obj[nodeName] = this.xml_to_json(item);\r\n }\r\n else\r\n {\r\n if (typeof (obj[nodeName].push) === 'undefined')\r\n {\r\n const old = obj[nodeName];\r\n obj[nodeName] = [];\r\n obj[nodeName].push(old);\r\n }\r\n obj[nodeName].push(this.xml_to_json(item));\r\n }\r\n }\r\n }\r\n return obj;\r\n }\r\n}\r\n","export default class StringUtilities\n{\n constructor()\n {}\n\n static capitalize(string)\n {\n const words = string.split(' ');\n\n for (let i = 0; i < words.length; i++)\n {\n words[i] = words[i][0].toUpperCase() + words[i].substr(1);\n }\n\n return words.join(' ');\n }\n\n static capitalize_first_letter(string)\n {\n return string.charAt(0).toUpperCase() + string.slice(1);\n }\n\n static snake_to_camelcase(string)\n {\n return string.replace(\n /([-_][a-z])/g,\n (group) => group.toUpperCase()\n .replace('-', '')\n .replace('_', '')\n );\n }\n}\n","export default class TimeUtilities\n{\n constructor()\n {}\n\n // Converts a time string (00:00:00.45) into miliseconds\n time_str_to_ms(time_str)\n {\n time_str = time_str.split(':');\n\n let hours = Number(time_str[0]);\n hours = hours * 60 * 60 * 1000;\n\n let minutes = Number(time_str[1]);\n minutes = minutes * 60 * 1000;\n\n let seconds = Number(time_str[2]);\n seconds = seconds * 1000;\n\n return hours + minutes + seconds;\n }\n}\n","import { Vector3, Plane, Quaternion, Sphere, Math as TMath, Line3 } from 'three';\nexport default class PerspectiveFrustumPointFitter\n{\n constructor()\n {\n this.sphere = new Sphere();\n }\n\n fit_points(points, camera_quaternion, vertical_fov, aspect)\n {\n this.sphere.setFromPoints(points);\n\n const v_fov = TMath.degToRad(vertical_fov / 2);\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\n\n const up_plane_normal = this.get_up_plane_normal(camera_quaternion, v_fov);\n const down_plane_normal = this.get_down_plane_normal(camera_quaternion, v_fov);\n const left_plane_normal = this.get_left_plane_normal(camera_quaternion, h_fov);\n const right_plane_normal = this.get_right_plane_normal(camera_quaternion, h_fov);\n\n const camera_forward_dir = new Vector3(0, 0, -1).applyQuaternion(camera_quaternion);\n\n const sphere_center = this.sphere.center.clone();\n\n const pull_back_distance = this.get_distance_to_fit_rect(this.sphere.radius * 2, this.sphere.radius * 2, vertical_fov, aspect);\n const far_pos = sphere_center.clone().add(camera_forward_dir.clone().multiplyScalar(pull_back_distance * -1));\n\n const up_plane = new Plane().setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\n const down_plane = new Plane().setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\n\n const left_plane = new Plane().setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\n const right_plane = new Plane().setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\n\n this.apply_center_correction_to_pos(far_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane);\n\n up_plane.setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\n down_plane.setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\n\n left_plane.setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\n right_plane.setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\n\n let closest_distance = Infinity;\n\n const inverse_dir = camera_forward_dir.clone().multiplyScalar(pull_back_distance * -2);\n for (let i = 0; i < points.length; i++)\n {\n const line = new Line3(points[i].clone(), points[i].clone().add(inverse_dir));\n\n const up_line_intersection = new Vector3();\n const down_line_intersection = new Vector3();\n\n const left_line_intersection = new Vector3();\n const right_line_intersection = new Vector3();\n\n up_plane.intersectLine(line, up_line_intersection);\n down_plane.intersectLine(line, down_line_intersection);\n\n left_plane.intersectLine(line, left_line_intersection);\n right_plane.intersectLine(line, right_line_intersection);\n\n if (up_line_intersection.length() < 0.0001)\n {\n console.log('up intersection not found', i);\n }\n if (down_line_intersection.length() < 0.0001)\n {\n console.log('down intersection not found', i);\n }\n if (left_line_intersection.length() < 0.0001)\n {\n console.log('left intersection not found', i);\n }\n if (right_line_intersection.length() < 0.0001)\n {\n console.log('right intersection not found', i);\n }\n\n const new_up_distance = points[i].clone().sub(up_line_intersection).length();\n const new_down_distance = points[i].clone().sub(down_line_intersection).length();\n\n const new_left_distance = points[i].clone().sub(left_line_intersection).length();\n const new_right_distance = points[i].clone().sub(right_line_intersection).length();\n\n const vertical_min = Math.min(new_up_distance, new_down_distance);\n const horizontal_min = Math.min(new_left_distance, new_right_distance);\n\n const min = Math.min(vertical_min, horizontal_min);\n\n if (min < closest_distance)\n {\n closest_distance = min;\n }\n }\n\n const forward_correction = camera_forward_dir.clone().multiplyScalar(closest_distance);\n const closest_position = far_pos.clone().add(forward_correction);\n\n return closest_position;\n }\n\n apply_center_correction_to_pos(target_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane)\n {\n const vertical_offset = this.get_vertical_correction(points, down_plane, up_plane, camera_quaternion);\n const horizontal_offset = this.get_horizontal_correction(points, left_plane, right_plane, camera_quaternion);\n\n target_pos.add(vertical_offset);\n target_pos.add(horizontal_offset);\n }\n\n get_vertical_correction(points, down_plane, up_plane, camera_quaternion)\n {\n let closest_distance_to_up_plane = Infinity;\n let closest_distance_to_down_plane = Infinity;\n // let closest_up_point = undefined;\n // let closest_down_point = undefined;\n\n const up_dir = new Vector3(0, 1, 0).applyQuaternion(camera_quaternion);\n for (let i = 0; i < points.length; i++)\n {\n const down_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(-5000000)));\n const up_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(5000000)));\n\n const down_line_intersection = new Vector3();\n const up_line_intersection = new Vector3();\n\n down_plane.intersectLine(down_line, down_line_intersection);\n up_plane.intersectLine(up_line, up_line_intersection);\n\n const down_dist = down_line_intersection.distanceTo(points[i]);\n const up_dist = up_line_intersection.distanceTo(points[i]);\n\n if (up_line_intersection.length() < 0.0001)\n {\n console.log('vertical up intersection not found', i);\n }\n if (down_line_intersection.length() < 0.0001)\n {\n console.log('vertical down intersection not found', i);\n }\n\n if (down_dist < closest_distance_to_down_plane)\n {\n closest_distance_to_down_plane = down_dist;\n // closest_down_point = points[i];\n }\n if (up_dist < closest_distance_to_up_plane)\n {\n closest_distance_to_up_plane = up_dist;\n // closest_up_point = points[i];\n }\n }\n\n const correction = (closest_distance_to_up_plane - closest_distance_to_down_plane) / 2;\n\n // console.log(\"vertical_correction\", correction)\n return up_dir.clone().multiplyScalar(-correction);\n }\n\n get_horizontal_correction(points, left_plane, right_plane, camera_quaternion)\n {\n let closest_distance_to_right_plane = Infinity;\n let closest_distance_to_left_plane = Infinity;\n // let closest_right_point = undefined;\n // let closest_left_point = undefined;\n\n const right_dir = new Vector3(1, 0, 0).applyQuaternion(camera_quaternion);\n\n for (let i = 0; i < points.length; i++)\n {\n const left_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(-5000000)));\n const right_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(5000000)));\n\n const left_line_intersection = new Vector3();\n const right_line_intersection = new Vector3();\n\n left_plane.intersectLine(left_line, left_line_intersection);\n right_plane.intersectLine(right_line, right_line_intersection);\n\n const left_dist = left_line_intersection.distanceTo(points[i]);\n const right_dist = right_line_intersection.distanceTo(points[i]);\n\n if (left_line_intersection.length() < 0.0001)\n {\n console.log('left intersection not found', i);\n }\n if (right_line_intersection.length() < 0.0001)\n {\n console.log('right intersection not found', i);\n }\n\n if (left_dist < closest_distance_to_left_plane)\n {\n closest_distance_to_left_plane = left_dist;\n // closest_left_point = points[i];\n }\n if (right_dist < closest_distance_to_right_plane)\n {\n closest_distance_to_right_plane = right_dist;\n // closest_right_point = points[i];\n }\n }\n\n const correction = (closest_distance_to_right_plane - closest_distance_to_left_plane) / 2;\n // console.log(\"horizontal_correction\", correction)\n\n return right_dir.clone().multiplyScalar(-correction);\n }\n\n get_up_plane_normal(camera_quaternion, v_fov)\n {\n const up_plane_normal = new Vector3(0, -1, 0);\n up_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), v_fov));\n up_plane_normal.applyQuaternion(camera_quaternion);\n return up_plane_normal;\n }\n\n get_down_plane_normal(camera_quaternion, v_fov)\n {\n const down_plane_normal = new Vector3(0, 1, 0);\n down_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), -v_fov));\n down_plane_normal.applyQuaternion(camera_quaternion);\n return down_plane_normal;\n }\n\n get_left_plane_normal(camera_quaternion, h_fov)\n {\n const left_plane_normal = new Vector3(1, 0, 0);\n left_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), h_fov));\n left_plane_normal.applyQuaternion(camera_quaternion);\n return left_plane_normal;\n }\n\n get_right_plane_normal(camera_quaternion, h_fov)\n {\n const right_plane_normal = new Vector3(-1, 0, 0);\n right_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), -h_fov));\n right_plane_normal.applyQuaternion(camera_quaternion);\n return right_plane_normal;\n }\n\n get_distance_to_fit_rect(width, height, vertical_fov, aspect)\n {\n const v_fov = (vertical_fov / 2) * Math.PI / 180;\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\n\n const distV = height / Math.tan(v_fov);\n const distH = width / Math.tan(h_fov);\n return Math.max(Math.abs(distH), Math.abs(distV));\n }\n}\n","import { Vector3, Box3 } from 'three';\n\nexport default class OrthographicFrustumPointFitter\n{\n constructor()\n {\n\n }\n\n fit_points(points, camera_quaternion, vertical_fov, aspect)\n {\n const inverse_camera_quat = camera_quaternion.clone().inverse();\n\n const inverted_points = [];\n\n for (let i = 0; i < points.length; i++)\n {\n inverted_points.push(points[i].clone().applyQuaternion(inverse_camera_quat));\n }\n\n const box = new Box3().setFromPoints(inverted_points);\n const size = new Vector3();\n box.getSize(size);\n\n const distance = this.get_distance_to_fit_rect(size.x / 2, size.y / 2, vertical_fov, aspect);\n\n const center = new Vector3();\n box.getCenter(center);\n\n center.applyQuaternion(camera_quaternion);\n\n return {\n center: center,\n distance_to_center: distance\n };\n }\n\n get_distance_to_fit_rect(width, height, vertical_fov, aspect)\n {\n const v_fov = (vertical_fov / 2) * Math.PI / 180;\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\n\n const distV = height / Math.tan(v_fov);\n const distH = width / Math.tan(h_fov);\n return Math.max(Math.abs(distH), Math.abs(distV));\n }\n}\n","import grid_frag from '../shaders/grid/grid.frag';\nimport grid_vert from '../shaders/grid/grid.vert';\nimport GeometryUtilities from '../utilities/GeometryUtilities';\n\nimport { Mesh } from 'three';\nimport { ShaderMaterial } from 'three';\nimport { Color } from 'three';\nimport { PlaneBufferGeometry } from 'three';\n\nexport default class Grid extends Mesh\n{\n constructor()\n {\n const material = new ShaderMaterial({\n uniforms: {\n _Color: { value: new Color('#919191') }\n },\n vertexShader: grid_vert,\n fragmentShader: grid_frag,\n extensions: { derivatives: true },\n transparent: true,\n depthWrite: false\n });\n\n const plane_geometry = new PlaneBufferGeometry(100, 100, 100, 100);\n\n const non_indexed_geometry = GeometryUtilities.convert_to_non_indexed_geometry(plane_geometry);\n\n super(non_indexed_geometry, material);\n\n this.rotation.x = -3.14 / 2;\n }\n}\n","import line_vs from '../shaders/basic_line/basic_line.vert';\nimport line_fs from '../shaders/basic_line/basic_line.frag';\n\nimport { Mesh } from 'three';\nimport { BufferAttribute } from 'three';\nimport { BufferGeometry } from 'three';\nimport { ShaderMaterial } from 'three';\nimport { Color } from 'three';\n\nexport default class Line extends Mesh\n{\n constructor(points)\n {\n const geometry = new BufferGeometry();\n geometry.setAttribute('position', new BufferAttribute(new Float32Array([]), 3));\n geometry.setAttribute('next_position', new BufferAttribute(new Float32Array([]), 3));\n geometry.setAttribute('previous_position', new BufferAttribute(new Float32Array([]), 3));\n geometry.setAttribute('orientation', new BufferAttribute(new Float32Array([]), 1));\n geometry.setAttribute('coverage', new BufferAttribute(new Float32Array([]), 1));\n\n const material = new ShaderMaterial({\n uniforms: {\n _Thickness: { value: 0.2 },\n _Length: { value: 0 },\n _ElapsedTime: { value: 0 },\n _Color: { value: new Color('#FF0000') }\n },\n vertexShader: line_vs,\n fragmentShader: line_fs,\n transparent: true,\n depthWrite: false,\n extensions: { derivatives: true }\n\n });\n\n super(geometry, material);\n\n if (points)\n {\n this.setup(points);\n }\n }\n\n setup(points)\n {\n const vertices = [];\n const next_position = [];\n const previous_position = [];\n const orientation = [];\n const coverage = [];\n let accumulated_length = 0;\n\n for (let i = 0; i < points.length; i++)\n {\n vertices.push(points[i].x);\n vertices.push(points[i].y);\n vertices.push(points[i].z);\n orientation.push(1);\n\n vertices.push(points[i].x);\n vertices.push(points[i].y);\n vertices.push(points[i].z);\n orientation.push(-1);\n\n const next_point = this.__get_next_position(points, i);\n next_position.push(next_point.x);\n next_position.push(next_point.y);\n next_position.push(next_point.z);\n\n next_position.push(next_point.x);\n next_position.push(next_point.y);\n next_position.push(next_point.z);\n\n const previous_point = this.__get_previous_position(points, i);\n previous_position.push(previous_point.x);\n previous_position.push(previous_point.y);\n previous_position.push(previous_point.z);\n\n previous_position.push(previous_point.x);\n previous_position.push(previous_point.y);\n previous_position.push(previous_point.z);\n\n coverage.push(accumulated_length);\n coverage.push(accumulated_length);\n\n if (i < points.length - 1)\n {\n accumulated_length += points[i].distanceTo(next_point);\n }\n }\n const vertexList = new Float32Array(vertices);\n const nextPositionList = new Float32Array(next_position);\n const previousPositionList = new Float32Array(previous_position);\n const orientationList = new Float32Array(orientation);\n const coverageList = new Float32Array(coverage);\n\n const indices = [];\n for (let i = 0; i < ((vertexList.length / 3) - 2) / 2; i++)\n {\n const index = (i * 2) + 1;\n indices.push(index);\n indices.push(index + 1);\n indices.push(index - 1);\n\n indices.push(index);\n indices.push(index + 2);\n indices.push(index + 1);\n }\n\n this.geometry.setIndex(indices);\n this.geometry.getAttribute('position').copy(new BufferAttribute(vertexList, 3));\n this.geometry.getAttribute('next_position').copy(new BufferAttribute(nextPositionList, 3));\n this.geometry.getAttribute('previous_position').copy(new BufferAttribute(previousPositionList, 3));\n this.geometry.getAttribute('orientation').copy(new BufferAttribute(orientationList, 1));\n this.geometry.getAttribute('coverage').copy(new BufferAttribute(coverageList, 1));\n\n this.geometry.getAttribute('position').needsUpdate = true;\n this.geometry.getAttribute('next_position').needsUpdate = true;\n this.geometry.getAttribute('previous_position').needsUpdate = true;\n this.geometry.getAttribute('orientation').needsUpdate = true;\n this.geometry.getAttribute('coverage').needsUpdate = true;\n\n this.material.uniforms._Length.value = accumulated_length;\n this._length = accumulated_length;\n }\n\n set thickness(value)\n {\n this.material.uniforms._Thickness.value = value;\n }\n\n get thickness()\n {\n return this.material.uniforms._Thickness.value;\n }\n\n __get_previous_position(points, i)\n {\n if (i === 0)\n {\n return points[1].clone().sub(points[0]).multiplyScalar(-1).add(points[0]);\n }\n else\n {\n return points[i - 1];\n }\n }\n\n __get_next_position(points, i)\n {\n if (i === points.length - 1)\n {\n return points[points.length - 2].clone().sub(points[points.length - 1]).multiplyScalar(-1).add(points[points.length - 1]);\n }\n else\n {\n return points[i + 1];\n }\n }\n\n update()\n {\n }\n\n distance()\n {\n return this.accumulated_length;\n }\n\n total_length()\n {\n return this.accumulated_length;\n }\n\n dispose()\n {\n this.geometry.dispose();\n this.material.dispose();\n if (this.parent)\n {\n this.parent.remove(this);\n }\n }\n\n set color(col)\n {\n this.material.uniforms._Color.value.set(col);\n }\n\n get color()\n {\n return this.material.uniforms._Color.value;\n }\n\n copy_color(col)\n {\n this.material.uniforms._Color.value.copy(col);\n }\n}\n","import basic_texture_vert from '../shaders/basic_texture/basic_texture.vert';\nimport basic_texture_frag from '../shaders/basic_texture/basic_texture.frag';\n\nimport { Mesh } from 'three';\nimport { Vector2 } from 'three';\nimport { ShaderMaterial } from 'three';\nimport { DoubleSide } from 'three';\nimport { PlaneGeometry } from 'three';\nimport { Vector3 } from 'three';\n\nexport default class WorldImage extends Mesh\n{\n constructor(texture, pivot)\n {\n pivot = pivot || new Vector2(0, 0);\n const material = new ShaderMaterial({\n uniforms: {\n _MainTex: { value: texture },\n _ScreenAligned: { value: 0 },\n _Scale: { value: 1 },\n _Opacity: { value: 1 }\n },\n vertexShader: basic_texture_vert,\n fragmentShader: basic_texture_frag,\n transparent: true,\n depthWrite: false,\n side: DoubleSide\n });\n const geometry = new PlaneGeometry(1, 1, 1);\n geometry.translate(-pivot.x / 2, -pivot.y / 2, 0);\n const current_scale = texture.image.width / texture.image.height;\n geometry.scale(current_scale, 1, 1);\n super(geometry, material);\n this.current_scale = current_scale;\n this.geometry.computeBoundingBox();\n\n this.tmp_bb_size = new Vector3();\n this.geometry.boundingBox.getSize(this.tmp_bb_size);\n }\n\n update_texture()\n {\n this.material.uniforms._MainTex.value.needsUpdate = true;\n const img = this.material.uniforms._MainTex.value.image;\n\n this.geometry.scale(1 / this.current_scale, 1, 1);\n this.current_scale = img.width / img.height;\n this.geometry.scale(this.current_scale, 1, 1);\n this.geometry.computeBoundingBox();\n this.geometry.boundingBox.getSize(this.tmp_bb_size);\n }\n\n get size()\n {\n return this.tmp_bb_size.clone().multiplyScalar(this.scale.x);\n }\n\n set size(value)\n {\n this.scale.set(value, value, value);\n this.material.uniforms._Scale.value = value;\n }\n\n set screen_aligned(boolean)\n {\n this.material.uniforms._ScreenAligned.value = boolean === true ? 1 : 0;\n }\n\n get screen_aligned()\n {\n return this.material.uniforms._ScreenAligned.value === 1;\n }\n\n set opacity(opacity)\n {\n this.material.uniforms._Opacity.value = opacity;\n }\n\n get opacity()\n {\n return this.material.uniforms._Opacity.value;\n }\n\n dispose()\n {\n this.geometry.dispose();\n this.parent.remove(this);\n this.material.uniforms._MainTex.value.dispose();\n this.material.dispose();\n }\n}\n","import WorldImage from './WorldImage';\nimport SimpleTextDrawer from '../canvas_drawer/SimpleTextDrawer';\n\nimport { LinearMipMapLinearFilter } from 'three';\nimport { LinearFilter } from 'three';\n\nexport default class Text2D extends WorldImage\n{\n constructor(text, font, color, pivot, is_static)\n {\n const simple_text_drawer = new SimpleTextDrawer(is_static);\n\n const draw_settings = {\n font: font,\n font_color: color || '#000000'\n };\n const canvas_texture = simple_text_drawer.draw_on_texture(text, draw_settings);\n\n canvas_texture.minFilter = LinearMipMapLinearFilter;\n canvas_texture.minFilter = LinearFilter;\n canvas_texture.needsUpdate = true;\n super(canvas_texture, pivot);\n\n this.simple_text_drawer = simple_text_drawer;\n this.canvas_texture = canvas_texture;\n this.draw_settings = draw_settings;\n }\n\n set text(value)\n {\n this.simple_text_drawer.draw_canvas(value, this.draw_settings);\n this.update_texture();\n }\n\n get text()\n {\n return 'not implemented';\n }\n}\n","import vert from '../shaders/ui_element/ui_element.vert';\nimport frag from '../shaders/ui_element/ui_element.frag';\nimport BaseShaderMaterial from '../materials/BaseShaderMaterial';\n\nimport { Vector2 } from 'three';\nimport { Vector3 } from 'three';\n\nexport default class UIElementMaterial extends BaseShaderMaterial\n{\n constructor(intensity = 1)\n {\n super(vert, frag, {\n _MainTex: { value: undefined },\n _ScreenSize: { value: new Vector2(Screen.width, Screen.height) },\n _TextureSize: { value: new Vector2() },\n _PixelOffset: { value: new Vector2(0, 0) },\n _NDC: { value: new Vector3() },\n _PivotPoint: { value: new Vector2() },\n _DepthOffset: { value: 0 }\n });\n this.transparent = true;\n this.depthWrite = false;\n this.depthTest = false;\n }\n}\n","import { Vector2 } from 'three';\n\nexport default class ScreenSpacePosition\n{\n constructor()\n {\n this.tmp_vec = new Vector2();\n }\n\n get_pos_NDC(position)\n {\n return this.tmp_vec.set(position.x, position.y);\n }\n}\n","import CameraManager from '../../CameraManager';\n\nimport { Vector2 } from 'three';\nimport { Vector3 } from 'three';\n\nexport default class WorldSpacePosition\n{\n constructor()\n {\n this.tmp_vec3 = new Vector3();\n this.tmp_vec2 = new Vector2();\n }\n\n get_pos_NDC(position)\n {\n this.tmp_vec3.copy(position);\n this.tmp_vec3.project(CameraManager.current);\n\n return this.tmp_vec2.set(this.tmp_vec3.x, this.tmp_vec3.y);\n }\n}\n","export default class UIElementState\n{\n constructor()\n {\n\n }\n\n update(ui_element, normalized_mouse_position)\n {\n\n }\n\n on_enter(ui_element)\n {}\n\n on_exit(ui_element)\n {}\n}\n","import UIElementState from './UIElementState';\n\nexport default class OnIdle extends UIElementState\n{\n constructor()\n {\n super();\n }\n\n update(ui_element, normalized_mouse_position)\n {\n if (ui_element.is_mouse_over(normalized_mouse_position))\n {\n ui_element.set_state(ui_element._on_enter_state);\n }\n }\n}\n","import UIElementState from './UIElementState';\n\nexport default class OnMouseEnter extends UIElementState\n{\n constructor()\n {\n super();\n }\n\n on_enter(ui_element)\n {\n ui_element.on_mouse_enter();\n }\n\n update(ui_element, normalized_mouse_position)\n {\n if (ui_element.is_mouse_over(normalized_mouse_position))\n {\n ui_element.set_state(ui_element._on_hover_state);\n }\n else\n {\n ui_element.set_state(ui_element._on_exit_state);\n }\n }\n}\n","import UIElementState from './UIElementState';\n\nexport default class OnMouseExit extends UIElementState\n{\n constructor()\n {\n super();\n }\n\n on_enter(ui_element)\n {\n ui_element.on_mouse_exit();\n ui_element.set_state(ui_element._on_idle_state);\n }\n}\n","import UIElementState from './UIElementState';\n\nexport default class OnMouseHover extends UIElementState\n{\n constructor()\n {\n super();\n }\n\n on_enter(ui_element)\n {\n this.__trigger_on_hover(ui_element);\n }\n\n update(ui_element, normalized_mouse_position)\n {\n if (ui_element.is_mouse_over(normalized_mouse_position))\n {\n this.__trigger_on_hover(ui_element);\n }\n else\n {\n ui_element.set_state(ui_element._on_exit_state);\n }\n }\n\n __trigger_on_hover(ui_element)\n {\n ui_element.on_mouse_hover();\n }\n}\n","\nimport Screen from '../Screen';\n\nimport UIElementMaterial from '../materials/UIElementMaterial';\n\nimport ScreenSpacePosition from '../ui/ui_element_position/ScreenSpacePosition';\nimport WorldSpacePosition from '../ui/ui_element_position/WorldSpacePosition';\n\nimport OnIdle from '../ui/ui_element_state/OnIdle';\nimport OnMouseEnter from '../ui/ui_element_state/OnMouseEnter';\nimport OnMouseExit from '../ui/ui_element_state/OnMouseExit';\nimport OnMouseHover from '../ui/ui_element_state/OnMouseHover';\n\nimport { Mesh } from 'three';\nimport { PlaneGeometry } from 'three';\nimport { Vector2 } from 'three';\nimport { Vector3 } from 'three';\nimport { NearestFilter } from 'three';\nimport { Box2 } from 'three';\n\nexport default class UIElement extends Mesh\n{\n constructor(vert, frag)\n {\n super(new PlaneGeometry(1, 1), new UIElementMaterial());\n\n this.is_clickable = false;\n\n this.position_strategy = new WorldSpacePosition();\n this.current_state = new OnIdle();\n\n this._position = new Vector3();\n\n this._on_idle_state = new OnIdle();\n this._on_enter_state = new OnMouseEnter();\n this._on_exit_state = new OnMouseExit();\n this._on_hover_state = new OnMouseHover();\n\n this.on_enter = undefined;\n this.on_exit = undefined;\n this.on_hover = undefined;\n\n this.mouse_pos_tmp = new Vector2();\n this.cached_NDC_position = new Vector2();\n this.screen_pos_tmp = new Vector2();\n\n this.texture_size = new Vector2(1, 1);\n\n this.frustumCulled = false;\n this.matrixAutoUpdate = false;\n this.renderOrder = 0;\n\n this.size = 1;\n this.pixel_offset = new Vector2();\n }\n\n set_render_order(value)\n {\n this.renderOrder = value;\n }\n\n get pivot_point()\n {\n return this.material.uniforms._PivotPoint.value;\n }\n\n set_pixel_offset(offset)\n {\n this.pixel_offset.copy(offset);\n this.material.uniforms._PixelOffset.value.copy(offset);\n }\n\n set_state(new_state)\n {\n this.current_state.on_exit(this);\n this.current_state = new_state;\n this.current_state.on_enter(this);\n }\n\n get position()\n {\n return this._position;\n }\n\n set use_depth(boolean)\n {\n this.material.depthTest = boolean;\n }\n\n get use_depth()\n {\n return this.material.depthTest;\n }\n\n set depth_offset(value)\n {\n this.material.uniforms._DepthOffset.value = value;\n }\n\n get depth_offset()\n {\n return this.material.uniforms._DepthOffset.value;\n }\n\n clear_state()\n {\n this.visible = false;\n }\n\n set_world_space_coordinate_system()\n {\n this.position_strategy = new WorldSpacePosition();\n }\n\n set_screen_space_coordinate_system()\n {\n this.position_strategy = new ScreenSpacePosition();\n }\n\n set_texture(texture)\n {\n texture.minFilter = NearestFilter;\n texture.magFilter = NearestFilter;\n texture.needsUpdate = true;\n\n this.texture_size.set(texture.image.width, texture.image.height);\n\n this.material.uniforms._MainTex.value = texture;\n this.get_size(this.material.uniforms._TextureSize.value);\n this.visible = true;\n }\n\n update_state(normalized_mouse_pos)\n {\n this.material.uniforms._ScreenSize.value.set(Screen.width, Screen.height);\n this.get_size(this.material.uniforms._TextureSize.value);\n\n this.cached_NDC_position.copy(this.position_strategy.get_pos_NDC(this.position));\n this.material.uniforms._NDC.value.copy(this.position);\n this.current_state.update(this, normalized_mouse_pos);\n }\n\n is_mouse_over(normalized_mouse_pos)\n {\n this.screen_pos_tmp.copy(this.cached_NDC_position);\n this.to_screen_position(this.screen_pos_tmp);\n this.screen_pos_tmp.x += this.pixel_offset.x;\n this.screen_pos_tmp.y += this.pixel_offset.y;\n\n const rect = new Box2().setFromCenterAndSize(this.screen_pos_tmp, this.get_size());\n\n this.mouse_pos_tmp.copy(normalized_mouse_pos);\n this.to_screen_position(this.mouse_pos_tmp);\n\n return rect.containsPoint(this.mouse_pos_tmp);\n }\n\n to_screen_position(projected_pos)\n {\n projected_pos.x = (projected_pos.x * 0.5 + 0.5) * Screen.width + this.pixel_offset.x;\n projected_pos.y = (projected_pos.y * 0.5 + 0.5) * Screen.height + this.pixel_offset.y;\n }\n\n get_screen_space_position()\n {\n const pos = this.cached_NDC_position.clone();\n this.to_screen_position(pos);\n return pos;\n }\n\n set_screen_space_position(screen_pos)\n {\n this.position.x = (screen_pos.x / Screen.width) * 2 - 1;\n this.position.y = (screen_pos.y / Screen.height) * 2 - 1;\n }\n\n dispose()\n {\n if (this.material.uniforms._MainTex.value)\n {\n this.material.uniforms._MainTex.value.dispose();\n }\n Screen.remove_screen_material(this.material);\n this.geometry.dispose();\n this.material.dispose();\n }\n\n get_size(vector2)\n {\n if (vector2)\n {\n return vector2.copy(this.texture_size).multiplyScalar(this.size / Screen.dpr);\n }\n else\n {\n return new Vector2().copy(this.texture_size).multiplyScalar(this.size / Screen.dpr);\n }\n }\n\n on_mouse_enter()\n {}\n\n on_mouse_exit()\n {}\n\n on_mouse_hover()\n {}\n}\n","import { Mesh } from 'three';\n\nexport default class UpdatableMaterialMesh extends Mesh\n{\n constructor(geometry, material)\n {\n super(geometry, material);\n\n const self = this;\n\n this.onBeforeRender = () =>\n {\n self.material.update();\n };\n }\n}\n","import { Vector2, Vector4 } from 'three';\n\nexport default class TextGlyph\n{\n constructor(offset, plane_bounds, atlas_bounds)\n {\n const width = plane_bounds.right - plane_bounds.left;\n const height = plane_bounds.top - plane_bounds.bottom;\n\n this.scale = new Vector2(width, height);\n this.position = new Vector2(offset + plane_bounds.left, plane_bounds.bottom);\n\n this.atlas_bounds = new Vector4(atlas_bounds.left, atlas_bounds.right, atlas_bounds.top, atlas_bounds.bottom);\n }\n}\n","import { Vector3, Quaternion, Matrix4, Color, Box2, Vector2 } from 'three';\nimport TextGlyph from './TextGlyph';\n\nexport default class SDFText\n{\n constructor(glyph_layout, text = '')\n {\n this.glyph_layout = glyph_layout;\n\n this.glyphs = [];\n\n this.glyph_is_dirty = true;\n this.matrix_is_dirty = true;\n this.color_is_dirty = true;\n\n this.position = new Vector3();\n this.quaternion = new Quaternion();\n this.scale = new Vector3(1, 1, 1);\n this.matrix = new Matrix4();\n\n this.color = new Color('#FFFFFF');\n\n this.pivot_point = new Vector2();\n this.__opacity = 1;\n\n this.__text = text;\n\n this.__generate_glyphs(text);\n }\n\n set text(value)\n {\n this.__text = value;\n this.__generate_glyphs(value);\n this.matrix_is_dirty = true;\n }\n\n get text()\n {\n return this.__text;\n }\n\n update_matrix()\n {\n this.matrix.compose(this.position, this.quaternion, this.scale);\n this.matrix_is_dirty = false;\n this.glyph_is_dirty = true;\n }\n\n clear_glyph_dirty()\n {\n this.glyph_is_dirty = false;\n }\n\n clear_color_dirty()\n {\n this.color_is_dirty = false;\n }\n\n set_rotation(orientation = 0, tilt = 0) // 0..360, -90..0..90\n {\n const new_orientation = new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), (orientation / 360) * Math.PI * 2);\n const new_tilt = new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), (-tilt / 360) * Math.PI * 2);\n\n this.quaternion.copy(new_orientation.multiply(new_tilt));\n this.matrix_is_dirty = true;\n }\n\n set_position(pos)\n {\n this.position.copy(pos);\n this.matrix_is_dirty = true;\n }\n\n set_size(size)\n {\n this.scale.set(size, size, size);\n this.matrix_is_dirty = true;\n }\n\n set_color(col)\n {\n this.color.set(col);\n this.color_is_dirty = true;\n }\n\n set_pivot(pivot)\n {\n this.pivot_point.copy(pivot);\n this.update_glyphs();\n }\n\n set opacity(op)\n {\n this.__opacity = op;\n this.color_is_dirty = true;\n }\n\n get opacity()\n {\n return this.__opacity;\n }\n\n update_glyphs()\n {\n this.__generate_glyphs(this.text);\n }\n\n __generate_glyphs(text)\n {\n let cursor = 0;\n\n this.glyphs.length = 0;\n\n for (let i = 0; i < text.length; i++)\n {\n const unicode = text.charCodeAt(i);\n const glyph = this.glyph_layout.find(element => element.unicode === unicode);\n if (glyph)\n {\n if (glyph.planeBounds)\n {\n const text_glyph = new TextGlyph(cursor, glyph.planeBounds, glyph.atlasBounds);\n this.glyphs.push(text_glyph);\n }\n cursor += glyph.advance;\n }\n }\n\n const box2 = new Box2();\n const first_glyph = this.glyphs[0];\n box2.setFromCenterAndSize(first_glyph.position.clone().add(new Vector2(first_glyph.scale.x / 2, first_glyph.scale.y / 2)), first_glyph.scale);\n\n for (let i = 1; i < this.glyphs.length; i++)\n {\n const g = this.glyphs[i];\n const box = new Box2().setFromCenterAndSize(g.position.clone().add(new Vector2(g.scale.x / 2, g.scale.y / 2)), g.scale);\n box2.union(box);\n }\n\n const box2_size = new Vector2();\n box2.getSize(box2_size);\n for (let i = 0; i < this.glyphs.length; i++)\n {\n this.glyphs[i].position.x -= box2_size.x / 2;\n this.glyphs[i].position.y -= box2_size.y / 2;\n\n this.glyphs[i].position.x += (box2_size.x / 2) * this.pivot_point.x;\n this.glyphs[i].position.y += (box2_size.y / 2) * this.pivot_point.y;\n }\n\n this.glyph_is_dirty = true;\n }\n}\n","import BaseShaderMaterial from './BaseShaderMaterial';\nimport frag from '../shaders/sdf_text/sdf_text.frag';\nimport vert from '../shaders/sdf_text/sdf_text.vert';\n\nimport { Vector2, DoubleSide, LinearFilter, Math as TMath } from 'three';\n\nexport default class SDFTextMaterial extends BaseShaderMaterial\n{\n constructor(texture)\n {\n super(vert, frag, {\n _Texture: { value: texture },\n _Boldness: { value: 0.5 },\n _AtlasSize: { value: new Vector2(1, 1) }\n });\n\n this.transparent = true;\n this.extensions = {\n derivatives: true\n };\n this.depthWrite = false;\n this.side = DoubleSide;\n texture.minFilter = LinearFilter;\n texture.magFilter = LinearFilter;\n texture.generateMipMaps = false;\n }\n\n set_atlas_size(size)\n {\n this.uniforms._AtlasSize.value.copy(size);\n }\n\n set_boldness(value)\n {\n this.uniforms._Boldness.value = TMath.lerp(0.5, 0.2, value);\n }\n}\n","import SDFText from './SDFText';\nimport SDFTextMaterial from '../../materials/SDFTextMaterial';\nimport ArrayUtilities from '../../utilities/ArrayUtilities';\n\nimport {\n PlaneBufferGeometry,\n Mesh,\n Vector2,\n InstancedBufferGeometry,\n InstancedBufferAttribute,\n Float32BufferAttribute,\n DynamicDrawUsage\n} from 'three';\n\nexport default class SDFTextBatch extends Mesh\n{\n constructor(font_layout, atlas_texture)\n {\n const max_allocations = 2000;\n\n const instanced_geometry = new InstancedBufferGeometry();\n instanced_geometry.instanceCount = 0;\n\n const geometry = new PlaneBufferGeometry(1, 1);\n geometry.translate(0.5, 0.5, 0);\n instanced_geometry.setAttribute('position', new Float32BufferAttribute(geometry.getAttribute('position').array, 3));\n instanced_geometry.setAttribute('uv', new Float32BufferAttribute(geometry.getAttribute('uv').array, 2));\n instanced_geometry.index = geometry.index;\n\n const transformsCol0 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n const transformsCol1 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n const transformsCol2 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n const transformsCol3 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n\n const glyph_bounds = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n const plane_bounds = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n\n const color = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n\n transformsCol0.usage = DynamicDrawUsage;\n transformsCol1.usage = DynamicDrawUsage;\n transformsCol2.usage = DynamicDrawUsage;\n transformsCol3.usage = DynamicDrawUsage;\n glyph_bounds.usage = DynamicDrawUsage;\n plane_bounds.usage = DynamicDrawUsage;\n color.usage = DynamicDrawUsage;\n\n instanced_geometry.setAttribute('transformsCol0', transformsCol0);\n instanced_geometry.setAttribute('transformsCol1', transformsCol1);\n instanced_geometry.setAttribute('transformsCol2', transformsCol2);\n instanced_geometry.setAttribute('transformsCol3', transformsCol3);\n\n instanced_geometry.setAttribute('glyph_bounds', glyph_bounds);\n instanced_geometry.setAttribute('plane_bounds', plane_bounds);\n instanced_geometry.setAttribute('color', color);\n\n super(instanced_geometry, new SDFTextMaterial(atlas_texture));\n\n this.text_elements = [];\n this.font_layout = font_layout;\n\n this.material.set_atlas_size(new Vector2(font_layout.atlas.width, font_layout.atlas.height));\n\n this.frustumCulled = false;\n }\n\n set_boldness(value)\n {\n this.material.set_boldness(value);\n }\n\n add_text(text_str)\n {\n const elem = new SDFText(this.font_layout.glyphs, text_str);\n this.text_elements.push(elem);\n return elem;\n }\n\n remove_text(text_elem)\n {\n ArrayUtilities.remove_elem(this.text_elements, text_elem);\n this.update(true);\n }\n\n update(force_update)\n {\n const glyph_bounds_atr = this.geometry.getAttribute('glyph_bounds');\n const plane_bounds_atr = this.geometry.getAttribute('plane_bounds');\n\n const transformsCol0 = this.geometry.getAttribute('transformsCol0');\n const transformsCol1 = this.geometry.getAttribute('transformsCol1');\n const transformsCol2 = this.geometry.getAttribute('transformsCol2');\n const transformsCol3 = this.geometry.getAttribute('transformsCol3');\n\n const color_atr = this.geometry.getAttribute('color');\n\n let matrix_needs_update = force_update === true;\n let glyph_needs_update = force_update === true;\n let color_needs_update = force_update === true;\n\n let glyph_count = 0;\n for (let i = 0; i < this.text_elements.length; i++)\n {\n const text = this.text_elements[i];\n\n if (text.matrix_is_dirty)\n {\n matrix_needs_update = true;\n text.update_matrix();\n }\n\n if (text.glyph_is_dirty)\n {\n glyph_needs_update = true;\n text.clear_glyph_dirty();\n }\n\n if (text.color_is_dirty)\n {\n color_needs_update = true;\n text.clear_color_dirty();\n }\n\n const matrix = text.matrix;\n const color = text.color;\n const opacity = text.opacity;\n\n for (let glyph_i = 0; glyph_i < text.glyphs.length; glyph_i++)\n {\n const glyph = text.glyphs[glyph_i];\n\n const buffer_i = glyph_count;\n\n glyph_bounds_atr.setXYZW(buffer_i, glyph.atlas_bounds.x, glyph.atlas_bounds.y, glyph.atlas_bounds.z, glyph.atlas_bounds.w);\n plane_bounds_atr.setXYZW(buffer_i, glyph.position.x, glyph.position.y, glyph.scale.x, glyph.scale.y);\n\n transformsCol0.setXYZW(buffer_i, matrix.elements[0],\n matrix.elements[1],\n matrix.elements[2],\n matrix.elements[3]);\n\n transformsCol1.setXYZW(buffer_i, matrix.elements[4],\n matrix.elements[5],\n matrix.elements[6],\n matrix.elements[7]);\n\n transformsCol2.setXYZW(buffer_i, matrix.elements[8],\n matrix.elements[9],\n matrix.elements[10],\n matrix.elements[11]);\n\n transformsCol3.setXYZW(buffer_i, matrix.elements[12],\n matrix.elements[13],\n matrix.elements[14],\n matrix.elements[15]);\n\n color_atr.setXYZW(buffer_i, color.r, color.g, color.b, opacity);\n\n glyph_count++;\n }\n }\n\n this.geometry.instanceCount = glyph_count;\n\n if (glyph_count > this.max_allocations)\n {\n console.error('SDFTextBatch exceeded maximum glyph allocations(max/current): ', this.max_allocations, glyph_count, this);\n }\n\n if (matrix_needs_update)\n {\n transformsCol0.needsUpdate = true;\n transformsCol1.needsUpdate = true;\n transformsCol2.needsUpdate = true;\n transformsCol3.needsUpdate = true;\n }\n if (glyph_needs_update)\n {\n glyph_bounds_atr.needsUpdate = true;\n plane_bounds_atr.needsUpdate = true;\n }\n if (color_needs_update)\n {\n color_atr.needsUpdate = true;\n }\n }\n\n dispose()\n {\n this.geometry.dispose();\n this.material.dispose();\n }\n}\n","import ActionInterpolator from './ActionInterpolator';\n\nexport default class VectorInterpolator extends ActionInterpolator\n{\n constructor(attribute_name, from = 0, to = 1, easing_function = 'linear')\n {\n super(easing_function);\n\n this.attribute_name = attribute_name;\n this.from = from;\n this.to = to;\n }\n\n update(context, t)\n {\n const tmp = this.from.clone();\n tmp.lerp(this.to, this.easing_function(t));\n context[this.attribute_name].copy(tmp);\n }\n}\n","import BlitMaterial from '../materials/BlitMaterial';\nimport frag from '../shaders/median_filter/median_filter.frag';\n\nimport { Vector2 } from 'three';\n\nexport default class MedianFilterMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag, undefined, {\n kernel3x3: true\n });\n\n this.uniforms._SourceTex = { value: undefined };\n this.uniforms._SourceTexSize = { value: new Vector2(1, 1) };\n }\n\n set_texture(tex)\n {\n this.uniforms._SourceTex.value = tex;\n\n const size = this.get_size(tex);\n this.uniforms._SourceTexSize.value.copy(size);\n }\n\n get_size(tex)\n {\n if (tex.isVideoTexture)\n {\n return new Vector2(Math.max(1, tex.image.videoWidth), Math.max(1, tex.image.videoHeight));\n }\n if (tex.isWebGLRenderTarget)\n {\n return new Vector2(tex.width, tex.height);\n }\n if (tex.isTexture)\n {\n return new Vector2(tex.image.width, tex.image.height);\n }\n return new Vector2(1, 1);\n }\n}\n","import MedianFilterMaterial from '../materials/MedianFilterMaterial';\nimport Graphics from '../Graphics';\n\nimport { WebGLRenderTarget, Vector2, RGBAFormat, FloatType, NearestFilter } from 'three';\n\nexport default class MedianFilter\n{\n constructor(renderer)\n {\n this.RT = new WebGLRenderTarget(1, 1, {\n type: FloatType,\n format: RGBAFormat,\n minFilter: NearestFilter,\n magFilter: NearestFilter\n });\n this.RT1 = new WebGLRenderTarget(1, 1, {\n type: FloatType,\n format: RGBAFormat,\n minFilter: NearestFilter,\n magFilter: NearestFilter\n });\n\n this.median_filter_mat = new MedianFilterMaterial();\n }\n\n filter(texture)\n {\n const tex_size = this.get_size(texture);\n if (tex_size.x !== this.RT.width || tex_size.y !== this.RT.height)\n {\n this.RT.setSize(tex_size.x, tex_size.y);\n this.RT1.setSize(tex_size.x, tex_size.y);\n }\n\n this.median_filter_mat.set_texture(texture);\n Graphics.material_pass(this.median_filter_mat, this.RT);\n\n for (let i = 0; i < 0; i++)\n {\n this.median_filter_mat.set_texture(this.RT.texture);\n Graphics.material_pass(this.median_filter_mat, this.RT1);\n\n this.median_filter_mat.set_texture(this.RT1.texture);\n Graphics.material_pass(this.median_filter_mat, this.RT);\n }\n\n return this.RT;\n }\n\n get_size(tex)\n {\n if (tex.isVideoTexture)\n {\n return new Vector2(Math.max(1, tex.image.videoWidth), Math.max(1, tex.image.videoHeight));\n }\n if (tex.isWebGLRenderTarget)\n {\n return new Vector2(tex.width, tex.height);\n }\n if (tex.isTexture)\n {\n return new Vector2(tex.image.width, tex.image.height);\n }\n return new Vector2(1, 1);\n }\n}\n","import BlitMaterial from './BlitMaterial';\nimport downsample_frag from '../shaders/dual_filter_blur/downsample.frag';\nimport upsample_frag from '../shaders/dual_filter_blur/upsample.frag';\n\nexport default class DualFilteringBlurMaterial extends BlitMaterial\n{\n constructor(upsample)\n {\n super(upsample ? upsample_frag : downsample_frag);\n }\n}\n","import BlitMaterial from './BlitMaterial';\nimport frag from '../shaders/dual_filter_blur/alpha_filter.frag';\n\nexport default class AlphaFilterMaterial extends BlitMaterial\n{\n constructor(use_alpha_mask, upsample)\n {\n super(frag);\n }\n\n set offset(value)\n {\n this.uniforms._Offset.value = value;\n }\n\n get offset()\n {\n return this.uniforms._Offset.value;\n }\n}\n","import DualFilteringBlurMaterial from '../materials/DualFilteringBlurMaterial';\nimport AlphaFilterMaterial from '../materials/AlphaFilterMaterial';\nimport Graphics from '../Graphics';\nimport { WebGLRenderTarget } from 'three';\nexport default class DualFilteringBlurrer\n{\n constructor(use_alpha_mask)\n {\n this.current_width = 1;\n this.current_height = 1;\n this.RT0 = new WebGLRenderTarget(1, 1);\n this.RT1 = new WebGLRenderTarget(1, 1);\n this.RT2 = new WebGLRenderTarget(1, 1);\n this.RT3 = new WebGLRenderTarget(1, 1);\n this.RT4 = new WebGLRenderTarget(1, 1);\n\n this.upscale_blur_mat = new DualFilteringBlurMaterial(true);\n this.downscale_blur_mat = new DualFilteringBlurMaterial(false);\n\n this.alpha_filter_mat = new AlphaFilterMaterial();\n }\n\n blur(RT)\n {\n this.check_RT_resize(RT.width, RT.height);\n Graphics.blit(RT, this.RT1, this.alpha_filter_mat);\n\n // Graphics.blit(this.RT0, this.RT1, this.downscale_blur_mat);\n Graphics.blit(this.RT1, this.RT2, this.downscale_blur_mat);\n Graphics.blit(this.RT2, this.RT3, this.downscale_blur_mat);\n Graphics.blit(this.RT3, this.RT4, this.downscale_blur_mat);\n\n // Graphics.blit(this.RT4, this.RT3, this.upscale_blur_mat);\n // Graphics.blit(this.RT3, this.RT4, this.upscale_blur_mat);\n Graphics.blit(this.RT4, this.RT3, this.upscale_blur_mat);\n Graphics.blit(this.RT3, this.RT2, this.upscale_blur_mat);\n Graphics.blit(this.RT2, RT, this.upscale_blur_mat);\n // Graphics.blit(this.RT1, RT, this.upscale_blur_mat);\n\n // return this.RT2;\n }\n\n check_RT_resize(width, height)\n {\n if (this.current_width !== width || this.current_height !== height)\n {\n this.current_width = width;\n this.current_height = height;\n this.RT0.setSize(this.current_width / 2, this.current_height / 2);\n this.RT1.setSize(this.current_width / 2, this.current_height / 2);\n this.RT2.setSize(this.current_width / 4, this.current_height / 4);\n this.RT3.setSize(this.current_width / 8, this.current_height / 8);\n this.RT4.setSize(this.current_width / 16, this.current_height / 16);\n }\n }\n}\n","import { Object3D } from 'three';\nimport { BufferAttribute } from 'three';\nimport { Points } from 'three';\n\nexport default class GPUParticleSystem extends Object3D\n{\n constructor()\n {\n super();\n this.attributes = [];\n\n this.particles = undefined;\n }\n\n set_from_geometry(geometry, material, init_attribute_uvs)\n {\n // let position = new ParticlePositionAttribute(\"_Position\");\n if (init_attribute_uvs && geometry.getAttribute('storage_uv') === undefined)\n {\n const uv_storage_attr = this.build_uv_storage_attribute(geometry.getAttribute('position').count);\n geometry.setAttribute('storage_uv', uv_storage_attr);\n }\n // position.init_from_geometry(geometry);\n // this.attributes.push(position);\n\n // material.uniforms._Position.value = position.read.texture;\n\n const points = new Points(geometry, material);\n points.frustumCulled = false;\n this.particles = points;\n\n this.add(points);\n }\n\n add_texture_attribute(buffer_attribute)\n {\n\n }\n\n add_attribute(name, buffer_attribute)\n {\n\n }\n\n build_uv_storage_attribute(particle_count)\n {\n const resolution = this.calculate_resolution(particle_count);\n const uvs = new Float32Array(particle_count * 2);\n for (let i = 0, j = 0; i < particle_count * 2; i += 2, j++)\n {\n uvs[i] = ((j % resolution) / resolution) + (0.5 / resolution);\n uvs[i + 1] = (Math.floor(j / resolution) / resolution) + (0.5 / resolution);\n }\n\n return new BufferAttribute(uvs, 2);\n }\n\n calculate_resolution(particle_count)\n {\n return Math.ceil(Math.sqrt(particle_count));\n }\n\n update()\n {\n for (let i = 0; i < this.attributes.length; i++)\n {\n this.attributes[i].update();\n }\n }\n\n set_attribute_update_material(attribute_name, mat)\n {\n for (let i = 0; i < this.attributes.length; i++)\n {\n if (this.attributes[i].name === attribute_name)\n {\n this.attributes[i].update_material = mat;\n }\n }\n }\n\n dispose()\n {\n this.particles.geometry.dispose();\n this.particles.material.dispose();\n }\n}\n","import { DataTexture } from 'three';\n\nexport default class CustomDataTexture extends DataTexture\n{\n constructor(data, width, height, format, type)\n {\n super(data, width, height, format, type);\n this.multiplier = 1;\n }\n\n set_rgba(index, r, g, b, a)\n {\n this.data[index * 3 + 0] = r * this.multiplier;\n this.data[index * 3 + 1] = g * this.multiplier;\n this.data[index * 3 + 2] = b * this.multiplier;\n this.data[index * 3 + 3] = a * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_rgb(index, r, g, b)\n {\n this.data[index * 3 + 0] = r * this.multiplier;\n this.data[index * 3 + 1] = g * this.multiplier;\n this.data[index * 3 + 2] = b * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_r(index, value)\n {\n this.data[index * 3 + 0] = value * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_g(index, value)\n {\n this.data[index * 3 + 1] = value * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_b(index, value)\n {\n this.data[index * 3 + 2] = value * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_a(index, value)\n {\n this.data[index * 3 + 2] = value * this.multiplier;\n this.needsUpdate = true;\n }\n}\n","import CustomDataTexture from './CustomDataTexture';\nimport { RGBFormat } from 'three';\n\nexport default class RGBDataTexture extends CustomDataTexture\n{\n constructor(width, height)\n {\n const data = new Uint8Array(width * height * 3);\n super(data, width, height, RGBFormat);\n this.multiplier = 255;\n }\n}\n","import CustomDataTexture from './CustomDataTexture';\nimport { RGBAFormat } from 'three';\n\nexport default class RGBADataTexture extends CustomDataTexture\n{\n constructor(width, height)\n {\n const data = new Uint8Array(width * height * 4);\n super(data, width, height, RGBAFormat);\n this.multiplier = 255;\n }\n}\n","import CustomDataTexture from './CustomDataTexture';\nimport { FloatType } from 'three';\nimport { RGBFormat } from 'three';\n\nexport default class RGBFloatDataTexture extends CustomDataTexture\n{\n constructor(width, height)\n {\n const data = new Float32Array(width * height * 3);\n super(data, width, height, RGBFormat, FloatType);\n }\n}\n","import CustomDataTexture from './CustomDataTexture';\nimport { FloatType } from 'three';\nimport { RGBAFormat } from 'three';\n\nexport default class RGBAFloatDataTexture extends CustomDataTexture\n{\n constructor(width, height)\n {\n const data = new Float32Array(width * height * 4);\n super(data, width, height, RGBAFormat, FloatType);\n }\n}\n","import { Mesh } from 'three';\nimport RGBDataTexture from '../data_textures/RGBDataTexture';\nimport RGBADataTexture from '../data_textures/RGBADataTexture';\nimport RGBFloatDataTexture from '../data_textures/RGBFloatDataTexture';\nimport RGBAFloatDataTexture from '../data_textures/RGBAFloatDataTexture';\n\nexport default class BatchedMesh extends Mesh\n{\n constructor(id_table, geometry, material, max_texture_width)\n {\n super(geometry, material);\n\n this.id_table = id_table;\n this.batched_count = Object.keys(id_table).length;\n this.max_texture_width = max_texture_width;\n this.batch_width = this.batched_count % max_texture_width;\n this.batch_height = Math.ceil(this.batched_count / max_texture_width);\n }\n\n attach_rgb_texture(uniform_name)\n {\n this.material.uniforms[uniform_name].value = new RGBDataTexture(this.batch_width, this.batch_height);\n }\n\n attach_rgba_texture(uniform_name)\n {\n this.material.uniforms[uniform_name].value = new RGBADataTexture(this.batch_width, this.batch_height);\n }\n\n attach_rgb_float_texture(uniform_name)\n {\n this.material.uniforms[uniform_name].value = new RGBFloatDataTexture(this.batch_width, this.batch_height);\n }\n\n attach_rgba_float_texture(uniform_name)\n {\n this.material.uniforms[uniform_name].value = new RGBAFloatDataTexture(this.batch_width, this.batch_height);\n }\n\n get_mesh_index(name)\n {\n return this.id_table[name];\n }\n\n set_rgb_value(uniform_name, mesh_name, r, g, b)\n {\n this.material.uniforms[uniform_name].set_rgb(this.get_mesh_index(mesh_name), r, g, b);\n }\n\n set_rgba_value(uniform_name, mesh_name, r, g, b, a)\n {\n this.material.uniforms[uniform_name].set_rgba(this.get_mesh_index(mesh_name), r, g, b, a);\n }\n}\n","import BatchedMesh from './BatchedMesh';\n\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\n\nimport { BufferAttribute } from 'three';\n\nexport default class MeshBatcher\n{\n batch(meshes, material)\n {\n const max_texture_width = 2048;\n // let texture_width = meshes.length % max_texture_width;\n // let texture_height = Math.ceil(meshes.length / max_texture_width);\n\n // console.log(\"Store count: \" + buffer_geometries.length + \", Texture size: \" +texture_width);\n\n const geometries = [];\n const id_table = {};\n\n const attr_mesh_id = [];\n\n for (let i = 0; i < meshes.length; i++)\n {\n const mesh = meshes[i];\n const vertex_count = mesh.geometry.getAttribute('position').count;\n\n for (let count = 0; count < vertex_count; count++)\n {\n attr_mesh_id.push(i);\n }\n\n geometries.push(mesh.geometry);\n\n if (id_table[mesh.name] === undefined)\n {\n id_table[mesh.name] = i;\n }\n else\n {\n console.error('Mesh name is duplicated when trying to merge meshes. Non-unique id error.', mesh.name, id_table);\n }\n }\n\n const buffer_geometry = BufferGeometryUtils.mergeBufferGeometries(geometries);\n\n const buffer_attribute = new BufferAttribute(new Float32Array(attr_mesh_id), 1);\n buffer_geometry.setAttribute('mesh_id', buffer_attribute);\n\n return this.create_batched_mesh(id_table, buffer_geometry, material, max_texture_width);\n }\n\n create_batched_mesh(id_table, buffer_geometry, material, max_texture_width)\n {\n return new BatchedMesh(id_table, buffer_geometry, material, max_texture_width);\n }\n}\n","import { Audio as TAudio } from 'three';\nimport { PositionalAudio as TPositionalAudio } from 'three';\n\nexport default class AudioClip\n{\n constructor(buffer, loop = true, volume = 1, positional = false)\n {\n this.buffer = buffer;\n this.loop = loop;\n this.volume = volume;\n this.positional = positional;\n\n this.audio = undefined;\n }\n\n init(audio_listener)\n {\n if (this.positional)\n {\n this.audio = new TPositionalAudio(audio_listener);\n }\n else\n {\n this.audio = new TAudio(audio_listener);\n }\n\n this.audio.setBuffer(this.buffer);\n this.audio.setLoop(this.loop);\n\n // This prevents undesired volume at the beginning of playing\n this.audio.gain.gain.value = 0;\n\n this.audio.setVolume(this.loop ? 0 : this.volume);\n }\n\n play()\n {\n this.audio.play();\n }\n\n pause()\n {\n this.audio.pause();\n }\n\n stop()\n {\n this.audio.stop();\n }\n\n get is_playing()\n {\n return this.audio.isPlaying;\n }\n}\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport AudioClip from '../components/AudioClip';\r\n\r\nimport { AudioContext } from 'three';\r\n\r\nexport default class AudioLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, loop = true, volume = 0, size, positional = false)\r\n {\r\n super(resource_id, url, size);\r\n this.loop = loop;\r\n this.volume = volume;\r\n this.positional = positional;\r\n }\r\n\r\n on_preloaded_finished(resource_container, response)\r\n {\r\n if (!window.user_interaction_for_audio)\r\n {\r\n setTimeout(this.on_preloaded_finished.bind(this, resource_container, response), 100);\r\n }\r\n else\r\n {\r\n this.instantiate_audio(resource_container, response);\r\n }\r\n }\r\n\r\n instantiate_audio(resource_container, response)\r\n {\r\n response.arrayBuffer().then((array_buffer) =>\r\n {\r\n const context = AudioContext.getContext();\r\n context.decodeAudioData(array_buffer, (audio_buffer) =>\r\n {\r\n resource_container.set_resource(\r\n this.resource_id,\r\n this.url,\r\n new AudioClip(audio_buffer, this.loop, this.volume, this.positional)\r\n );\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n });\r\n });\r\n }\r\n}\r\n","import AbstractLoader from './AbstractLoader';\n\nimport { sRGBEncoding } from 'three';\n\nexport default class BasisLoader extends AbstractLoader\n{\n constructor(resource_id, url, renderer, loader, size)\n {\n super(resource_id, url, size);\n\n this.loader = loader;\n\n this.loader.setWorkerLimit(1);\n\n this.loader.setTranscoderPath(\n 'libs/basis/'\n );\n\n this.loader.detectSupport(renderer);\n }\n\n on_preloaded_finished(resource_container)\n {\n const ctx = this;\n\n this.loader.load(this.url, (basis) =>\n {\n basis.encoding = sRGBEncoding;\n\n resource_container.set_resource(ctx.resource_id, ctx.url, basis);\n\n ctx.__update_downloaded_bytes(1, 1);\n ctx.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n ctx.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\n ctx.__loading_ended();\n }\n );\n }\n}\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { CubeTextureLoader as THREECubeTextureLoader } from 'three';\r\n\r\nexport default class CubemapLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREECubeTextureLoader();\r\n this.loader.setPath(url + '/');\r\n this.urls = [\r\n 'px.png',\r\n 'nx.png',\r\n 'py.png',\r\n 'ny.png',\r\n 'pz.png',\r\n 'nz.png'\r\n ];\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n const ctx = this;\r\n\r\n this.loader.load(this.urls, (image) =>\r\n {\r\n resource_container.set_resource(ctx.resource_id, ctx.url, image);\r\n\r\n ctx.__update_downloaded_bytes(1, 1);\r\n ctx.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (error) =>\r\n {\r\n ctx.__set_error('Image could not be loaded. Maybe wrong name or path, I don\\'t know' + '¯\\\\_(ツ)_/¯', error);\r\n ctx.__loading_ended();\r\n }\r\n );\r\n }\r\n}\r\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport * as THREEColladaLoader from 'three/examples/jsm/loaders/ColladaLoader.js';\r\n\r\nexport default class DAELoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREEColladaLoader.ColladaLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n const ctx = this;\r\n\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(ctx.resource_id, ctx.url, gltf);\r\n\r\n ctx.__update_downloaded_bytes(1, 1);\r\n ctx.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n ctx.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n ctx.__loading_ended();\r\n }\r\n );\r\n }\r\n}\r\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { FileLoader as THREEFileLoader } from 'three';\r\n\r\nexport default class FileLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREEFileLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n const ctx = this;\r\n\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(ctx.resource_id, ctx.url, gltf);\r\n\r\n ctx.__update_downloaded_bytes(1, 1);\r\n ctx.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n ctx.__set_error(msg);\r\n ctx.__loading_ended();\r\n }\r\n );\r\n }\r\n}\r\n","import AbstractLoader from './AbstractLoader';\n\nimport { FontLoader as TFontLoader } from 'three/examples/jsm/loaders/FontLoader.js';\n\nexport default class FontLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n this.loader = new TFontLoader();\n }\n\n on_preloaded_finished(resource_container)\n {\n const ctx = this;\n\n this.loader.load(this.url, (font) =>\n {\n resource_container.set_resource(ctx.resource_id, ctx.url, font);\n\n ctx.__update_downloaded_bytes(1, 1);\n ctx.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n ctx.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then probably the problem is related to the file not being found. Check the name and path of the resource');\n ctx.__loading_ended();\n }\n );\n }\n}\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport * as THREEGLTFLoader from 'three/examples/jsm/loaders/GLTFLoader.js';\r\n\r\nexport default class GLTFLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREEGLTFLoader.GLTFLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n const ctx = this;\r\n\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(ctx.resource_id, ctx.url, gltf);\r\n\r\n ctx.__update_downloaded_bytes(1, 1);\r\n ctx.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n\r\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n ctx.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n ctx.__loading_ended();\r\n }\r\n );\r\n }\r\n}\r\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport * as THREEGLTFLoader from 'three/examples/jsm/loaders/GLTFLoader.js';\r\nimport * as THREEDRACOLoader from 'three/examples/jsm/loaders/DRACOLoader.js';\r\n\r\nexport default class GLTFDRACOLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREEGLTFLoader.GLTFLoader();\r\n this.draco_loader = new THREEDRACOLoader.DRACOLoader();\r\n\r\n this.draco_loader.setDecoderPath(window.draco_decoder_path);\r\n this.draco_loader.setDecoderConfig({ type: 'js' });\r\n this.draco_loader.setWorkerLimit(1);\r\n\r\n this.loader.setDRACOLoader(this.draco_loader);\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n const ctx = this;\r\n\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(ctx.resource_id, ctx.url, gltf);\r\n\r\n ctx.__update_downloaded_bytes(1, 1);\r\n ctx.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n ctx.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n ctx.__loading_ended();\r\n }\r\n );\r\n }\r\n}\r\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport * as THREEHDRCubeTextureLoader from 'three/examples/jsm/loaders/HDRCubeTextureLoader.js';\r\nimport { UnsignedByteType } from 'three';\r\n\r\nexport default class HDRCubeTextureLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREEHDRCubeTextureLoader.HDRCubeTextureLoader();\r\n this.url_suffix = ['/px.hdr', '/nx.hdr', '/py.hdr', '/ny.hdr', '/pz.hdr', '/nz.hdr'];\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n const ctx = this;\r\n\r\n this.loader.setPath(this.url)\r\n .setDataType(UnsignedByteType)\r\n .load(this.url_suffix, (hdr) =>\r\n {\r\n resource_container.set_resource(ctx.resource_id, ctx.url, hdr);\r\n\r\n ctx.__update_downloaded_bytes(1, 1);\r\n ctx.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n ctx.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n ctx.__loading_ended();\r\n }\r\n );\r\n }\r\n}\r\n","import AbstractLoader from './AbstractLoader';\n\nimport { FileLoader as THREEFileLoader } from 'three';\n\nexport default class JSONLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n\n this.loader = new THREEFileLoader();\n }\n\n on_preloaded_finished(resource_container)\n {\n const ctx = this;\n\n this.loader.load(this.url, (data) =>\n {\n resource_container.set_resource(ctx.resource_id, ctx.url, JSON.parse(data));\n\n ctx.__update_downloaded_bytes(1, 1);\n ctx.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n ctx.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\n ctx.__loading_ended();\n }\n );\n }\n}\n","import AbstractLoader from './AbstractLoader';\n\nimport * as THREEOBJLoader from 'three/examples/jsm/loaders/OBJLoader.js';\n\nexport default class OBJLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n this.loader = new THREEOBJLoader.OBJLoader();\n }\n\n on_preloaded_finished(resource_container)\n {\n const ctx = this;\n\n this.loader.load(this.url, (gltf) =>\n {\n resource_container.set_resource(ctx.resource_id, ctx.url, gltf);\n\n ctx.__update_downloaded_bytes(1, 1);\n ctx.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n ctx.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then probably the problem is related to the file not being found. Check the name and path of the resource');\n ctx.__loading_ended();\n }\n );\n }\n}\n","import AbstractLoader from './AbstractLoader';\n\nimport { Vector3 as THREEVector3 } from 'three';\nimport { FileLoader as THREEFileLoader } from 'three';\n\nexport default class PointArrayLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n this.loader = new THREEFileLoader();\n }\n\n on_preloaded_finished(resource_container)\n {\n const ctx = this;\n\n this.loader.load(this.url, (text) =>\n {\n resource_container.set_resource(ctx.resource_id, ctx.url, ctx.parse_path(text));\n\n ctx.__update_downloaded_bytes(1, 1);\n ctx.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n ctx.__set_error(msg);\n ctx.__loading_ended();\n }\n );\n }\n\n parse_path(raw_data)\n {\n const string_array = raw_data.split('\\n');\n\n if (string_array[string_array.length - 1] === '')\n {\n string_array.pop();\n }\n\n const positions = [];\n\n for (let i = 0; i < string_array.length; i += 3)\n {\n const x = parseFloat(string_array[i + 0]);\n const y = parseFloat(string_array[i + 1]);\n const z = parseFloat(string_array[i + 2]);\n positions.push(new THREEVector3(x, y, z));\n }\n return positions;\n // let curve = new THREE.CatmullRomCurve3(positions);\n // return curve.getPoints(100);\n }\n}\n","import AbstractLoader from './AbstractLoader';\n\nimport * as THREERGBELoader from 'three/examples/jsm/loaders/RGBELoader.js';\n\nimport { UnsignedByteType as THREEUnsignedByteType } from 'three';\n\nexport default class RGBETextureLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n this.loader = new THREERGBELoader.RGBELoader();\n this.loader.setDataType(THREEUnsignedByteType);\n }\n\n on_preloaded_finished(resource_container)\n {\n const ctx = this;\n\n this.loader.load(this.url, (hdr) =>\n {\n resource_container.set_resource(ctx.resource_id, ctx.url, hdr);\n\n ctx.__update_downloaded_bytes(1, 1);\n ctx.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n ctx.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\n ctx.__loading_ended();\n }\n );\n }\n}\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { FileLoader as THREEFileLoader } from 'three';\r\n\r\nexport default class TextLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREEFileLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n const ctx = this;\r\n\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(ctx.resource_id, ctx.url, gltf);\r\n\r\n ctx.__update_downloaded_bytes(1, 1);\r\n ctx.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n ctx.__set_error(msg);\r\n ctx.__loading_ended();\r\n }\r\n );\r\n }\r\n}\r\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { Texture } from 'three';\r\n\r\nexport default class TextureLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n }\r\n\r\n on_preloaded_finished(resource_container, response)\r\n {\r\n response.blob().then((blob) =>\r\n {\r\n const texture = new Texture();\r\n\r\n const url = URL.createObjectURL(blob);\r\n\r\n const image = new Image();\r\n image.src = url;\r\n\r\n image.onload = () =>\r\n {\r\n texture.image = image;\r\n texture.needsUpdate = true;\r\n\r\n resource_container.set_resource(this.resource_id, this.url, texture);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n };\r\n });\r\n }\r\n}\r\n","import AbstractLoader from './AbstractLoader';\n\nexport default class VideoLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n }\n\n on_preloaded_finished(resource_container, response)\n {\n response.blob().then((blob) =>\n {\n resource_container.set_resource(this.resource_id, this.url, URL.createObjectURL(blob));\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n });\n }\n}\n","import ResourceContainer from '../ResourceContainer';\r\n\r\nexport default class ResourceBatch\r\n{\r\n constructor(batch_name)\r\n {\r\n this.resource_loaders = [];\r\n this.batch_name = batch_name || 'unnamed batch';\r\n }\r\n\r\n add_loader(loader)\r\n {\r\n this.resource_loaders.push(loader);\r\n }\r\n\r\n load(resource_container)\r\n {\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n this.resource_loaders[i].load(resource_container || ResourceContainer);\r\n }\r\n }\r\n\r\n get loading_finished()\r\n {\r\n let finished = true;\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n finished = finished && this.resource_loaders[i].has_finished;\r\n }\r\n return finished;\r\n }\r\n\r\n get has_errors()\r\n {\r\n let has_error = false;\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n has_error = has_error || this.resource_loaders[i].has_error;\r\n }\r\n return has_error;\r\n }\r\n\r\n print_errors()\r\n {\r\n console.error('Batch <' + this.batch_name + '> could not load successfully');\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n if (this.resource_loaders[i].has_error)\r\n {\r\n this.resource_loaders[i].print_error();\r\n }\r\n }\r\n }\r\n\r\n get_progress()\r\n {\r\n return this.get_loaded_bytes() / this.get_total_bytes();\r\n }\r\n\r\n get_loaded_bytes()\r\n {\r\n let loaded_bytes = 1;\r\n\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n loaded_bytes += this.resource_loaders[i].loaded_bytes;\r\n }\r\n\r\n return loaded_bytes;\r\n }\r\n\r\n get_total_bytes()\r\n {\r\n let total_bytes = 1;\r\n\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n total_bytes += this.resource_loaders[i].total_bytes;\r\n }\r\n\r\n return total_bytes;\r\n }\r\n}\r\n"],"names":["init","this","browser_name","agent","window","navigator","userAgent","toLowerCase","indexOf","opr","chrome","name","is_safari","is_chrome","is_edge","is_edge_chromium","has_webm","is_firefox","has_hvec","preferred_video_extension","Validation","constructor","static","n","Number","is_int","is_float","str","JSON","parse","e","AbstractLoader","resource_id","url","size","loaded_bytes","total_bytes","has_finished","has_error","error_message","__update_downloaded_bytes","loaded","total","is_number","console","warn","__loading_ended","__set_error","message","print_error","error","load","resource_container","cache","Browser","fetch","method","mode","credentials","redirect","then","on_progress","bind","catch","__on_error","async","response","response_clone","clone","reader","body","getReader","contentLength","headers","get","receivedLength","done","value","read","length","on_preloaded_finished","data","ActionSequencer","context","elapsed_time","playback_speed","playing","action_events","initial_context","stringify","tmp_t","channels","channel_names","Object","keys","i","duration","play","stop","reset","skip","get_duration","__play_clips","update","delta_time","set_progress","time","TMath","clamp","set_normalized_progress","t","get_progress","is_finished","add_action_event","trigger_time","action","push","Math","max","add_action_interpolator","from","to","interpolator","use_dynamic_from_value","keyframes","attribute_name","undefined","keyframe","get_property_target_value","__get_nearest_keyframe","evaluate","EPSILON","trigger","evaluate_keyframe","__linear_map_01","get_keyframes","channel_name","from_range_start_value","from_range_end_value","closest","min_time","middle_time","distance_to_middle_time","abs","linear","x","triangular","ease_in_sine","cos","ease_out_sine","sin","ease_in_out_sine","ease_in_cubic","ease_out_cubic","pow","ease_in_out_cubic","ease_in_quad","ease_out_quad","ease_in_out_quad","ease_in_quart","ease_out_quart","ease_in_out_quart","ease_in_quint","ease_out_quint","ease_in_out_quint","ease_in_expo","ease_out_expo","ease_in_out_expo","ease_in_circ","sqrt","ease_out_circ","ease_in_out_circ","ease_in_back","ease_out_back","ease_in_out_back","ease_in_elastic","c4","PI","ease_out_elastic","ease_in_out_elastic","ease_in_bounce","ease_out_bounce","n1","d1","ease_in_out_bounce","heartbeat","sign","ActionInterpolator","easing_function","EasingFunctions","NumberInterpolator","super","lerp","app","set_app","ActionEvent","ViewContext","DrawIOAnimationSheet","xml_document","animation_nodes","DOMParser","parseFromString","querySelectorAll","animation_tracks","triggers","node","parent_node","parentElement","getAttribute","get_node_x_position","parseFloat","includes","split_data","split","trigger_name","trigger_method","at_time","value_data","to_value","from_time","to_time","sort","a","b","x_pos","ActionSequencerBuilder","initial_state_data","from_animation_sheet","animation_data","current_context","tracks","initial_tracks","state_to_tracks","find","element","sequencer","action_event","state","from_draw_io","xml","transition_data","queue","zoom_changed_evt","store_clickd_evt","point_selected_evt","config_changed","path_substep_completed","path_completed","go_to_store_requested_evt","resource_loaded_evt","service_clicked_evt","unit_pos_updated_evt","floor_changed_evt","on_enter_floor_navigation","on_exit_floor_navigation","on_enter_floor_selection","on_exit_floor_selection","on_enter_outside_navigation","on_exit_outside_navigation","step_selected_evt","fire","event","payload","on","callback","fire_zoom_changed","zoom","fire_store_selected","store_id","fire_point_selected","hit_data","fire_config_changed","fire_path_substep_completed","step_number","fire_path_completed","fire_step_selected","step_index","fire_go_to_store_requested","fire_resource_loaded","resource","fire_service_clicked","service","fire_unit_position_updated","unit_data","fire_floor_switched","floor_id","fire_on_enter_floor_navigation","fire_on_exit_floor_navigation","fire_on_enter_floor_selection","fire_on_exit_floor_selection","fire_on_enter_outside_navigation","fire_on_exit_outside_navigation","resources","resources_by_url","set_resource","EventManager","get_resource","TransitionTable","transitions","to_state","add_transitions","set_transitions","set_initial_state_data","___time","Clock","__delta_time","__elapsed_time","__allocated_time","Vector2","shader_time","y","__update","getDelta","getElapsedTime","ViewState","start","show","hide","before_enter","on_enter","update_enter_transition","global_view_data","transition_progress","action_sequencer","update_transition","update_exit_transition","before_exit","on_exit","ViewStateTransitionHandler","transition_table","last_state","current_state","current_state_data","transitioning","go_to_state","__exit_last_state","__update_transitions","set_state","assign","Time","views","transition_handler","__set_views_opacities","go_to_view","view_name","change_url","v","__change_browser_url","register_view","view","has_view","set_view","get_current_view","get_view_by_name","get_view_by_url","get_by_url","history","pushState","set_opacity","ApplicationView","container","ResourceContainer","ViewManager","classList","add","remove","style","opacity","BaseApplication","on_post_start","on_post_render","on_pre_render","on_frame_end","BaseRender","render","renderer","resize","dispose","BaseShaderMaterial","ShaderMaterial","vert","frag","uniforms","vertexShader","basic_vert","fragmentShader","basic_frag","_Color","Color","BlitMaterial","frag_shader","vert_shader","defines","_MainTex","_Resolution","_TargetResolution","depthWrite","blending","NoBlending","depthTest","depthFunc","AlwaysDepth","_current","current","camera","max_anisotropy","vertex_texture_sampler_available","fp_textures_available","CanvasDrawer","uses_dynamic_font","__textHeight","canvas","document","createElement","ctx","getContext","getFontHeight","fontStyle","getElementsByTagName","dummy","dummyText","createTextNode","appendChild","setAttribute","offsetHeight","removeChild","get_text_size","text","font","ceil","measureText","width","draw_canvas","ctxOptions","font_color","__draw","draw_on_texture","canvas_texture","CanvasTexture","UVMapping","ClampToEdgeWrapping","NearestFilter","generateMipMaps","needsUpdate","roundRect","height","radius","fill","stroke","tl","tr","br","bl","defaultRadius","side","beginPath","moveTo","lineTo","quadraticCurveTo","closePath","parameters","dpr","from_json","json","Idle","is_animating","Animating","easing_function_t","animator","set_property_value","set_current_state","finished_callback","CSSAnimator","css_property","value_prefix","value_suffix","animate","AxisHelper","Object3D","scale","blue_points","Vector3","blue_axis_mat","LineBasicMaterial","color","blue_axis_geo","BufferGeometry","setFromPoints","blue_axis_line","Line","renderOrder","green_points","green_axis_mat","green_axis_geo","green_axis_line","red_points","red_axis_mat","red_axis_geo","red_axis_line","set","Scene","add_scene","scene","traverse","child","geometry","material","children","Cube","Mesh","segments","BoxGeometry","z","MeshBasicMaterial","Sphere","SphereBufferGeometry","Arrow","dir","cylinder_height","cylinder_geo","CylinderBufferGeometry","translate","cone_geometry","ConeBufferGeometry","cone_height","buffer_geometry","BufferGeometryUtils","mergeBufferGeometries","rotateX","quaternion","setFromUnitVectors","_dir","position","render_width","render_height","width_height","pixel_size","update_position","size_changed","update_size","apply_pixel_density_v2","vector2","multiplyScalar","apply_pixel_density","get_pixel_size","aspect_ratio","ScreenSpaceTextureMaterial","w","h","_ScreenSpacePosition","_ScreenSize","_TextureSize","set_position","set_texture","tex","image","set_screen_size","PerspectiveCamera","THREEPerspectiveCamera","fov","aspect","near","far","clear_color","clear_alpha","Vector3_one","Vector3_zero","canvas_renderer","display_texture_meshes","draw_arrow","origin","arrow","normalize","copy","SceneManager","draw_axis","axis","set_debug_RT","RT","rt_debug","draw_rectangle","position_2d","fillStyle","fillRect","clear","clearRect","draw_line_2D","strokeStyle","draw_line","points","line","frustumCulled","draw_cube","pos","cube","draw_oriented_cube","depth","distanceTo","center","sub","forward_dir","draw_plane","PlaneBufferGeometry","Vector4","basic_color_vert","basic_color_frag","transparent","plane","draw_empty_cube","box","Box3","setFromCenterAndSize","helper","Box3Helper","draw_sphere","sphere","draw_point_array","input_points","open","catmull","CatmullRomCurve3","updateArcLengths","getSpacedPoints","draw_sphere_helper","SphereGeometry","sphere_mesh","draw_math_sphere","sphere1","draw_bounding_box","bb","draw_curve","curve","options","offset","draw_texture","mesh","graphics","Screen","ClearDepthNormalMaterial","clear_depth","clear_normal","_DepthNormal","DepthNormalMaterial","_FarPlane","far_plane","DepthAndNormalsRenderer","WebGLRenderTarget","clear_depth_normal_mat","depth_normal_material","__resize_RT_if_necessary","blit_clear_with_material","CameraManager","setSize","render_target","Blitter","_blit_scene","_blit_material","_blit_quad","_blit_camera","OrthographicCamera","blit","src","dst","src_texture","isWebGLRenderTarget","texture","src_width","src_height","getSize","__render","material_pass","mat","blit_with_material","dst_RT","current_rt","getRenderTarget","setRenderTarget","context_attributes","_renderer","blitter","no_render","current_render_mode","generateDepthNormalTexture","depth_and_normals_renderer","is_webgl2","canvas_context","alpha","desynchronized","stencil","antialias","premultipliedAlpha","preserveDrawingBuffer","powerPreference","logarithmicDepthBuffer","force_webgl2","WebGLRenderer","autoClear","setPixelRatio","Configuration","extensions","domElement","Capabilities","capabilities","getMaxAnisotropy","maxVertexTextures","floatVertexTextures","resize_observer","ResizeObserver","on_resize","observe","dom_element","depth_normals_RT","new_state","__update_current_camera","updateProjectionMatrix","updateMatrix","updateMatrixWorld","override_mat","__apply_override_material","render_scene","overrideMaterial","readback_RT","buffer","readRenderTargetPixels","clear_stencil","setClearColor","entries","entry","contentRect","setViewport","src_RT","take_screenshot","blob_callback","old_width","old_height","new_width","new_height","tile_width","tile_height","divisions_x","parseInt","divisions_y","ctx_2D","setViewOffset","drawImage","toBlob","clearViewOffset","download_screenshot","blob","link","download","href","URL","createObjectURL","click","onclick","requestAnimationFrame","revokeObjectURL","removeAttribute","NormalMaterial","DebugNormalsRender","Graphics","InputController","left_mouse_button_clicked","captured_NDC","operating_systems","ANDROID","IOS","LINUX","MAC","WINDOWS","is_mobile","match","is_ipad","maxTouchPoints","is_ios","is_android","get_os","is_linux","is_mac","is_windows","platform","os","test","target_geometry","target_position","set_target_geometry","GeometryBatch","batch_width","data_textures","object_names","zero_offset","write_offset","uniform_dirty_count","tmp_uploaded_data_count","add_global_uniform","set_global_uniform","add_object_uniform_v3","uniform_name","default_value_v3","src_tex","__create_rgb_texture","dst_tex","one_pixel_tex","new_data_tex","__add_data_texture","__flood_data_texture_rgb","add_object_uniform_v4","default_value_v4","__create_rgba_texture","__flood_data_texture_rgba","add_object_uniform_v4_float","__create_rgba_float_texture","set_object_uniform_v3","object_name","vector3","use_r","use_g","use_b","obj_index","__get_object_index","data_texture","__get_data_texture","__set_pixel_rgb","one_pixel","last_accessed_index","dirty_count","set_object_uniform_v4","vector4","use_a","__set_pixel_rgba","upload_texture_data","upload_budget","__partial_texture_data_upload","__full_texture_data_upload","get_uniform_dirty_count","texture_data","copyTextureToTexture","index","floor","get_mesh","v3","v4","Uint8Array","DataTexture","RGBFormat","RGBAFormat","Float32Array","FloatType","dst_texture","one_pixel_text","batches","batch","buffer_geometries","attr_accessor_uvs","texture_width","ceilPowerOfTwo","__init_uv_array","uv_index","vertex_count","count","buffer_attribute","BufferAttribute","uvs","ui_elements","_tmp_normalized_pos","ss_scene","autoUpdate","ws_scene","ss_camera","delete_element","elem","splice","add_screen_space_element","set_screen_space_coordinate_system","add_world_space_element","set_world_space_coordinate_system","Input","NDC","update_state","current_clicked_element","OMath","to_range_start_value","to_range_end_value","min","number","divisor","rgb","r","round","toString","g","projected_point","points_on_plane","projectPoint","target","elements","x1","x2","m","euclideanModulo","degrees","radians","arr","col","random","tmp_mat","Matrix4","Plane","ray","Ray","tmp_size","tmp_unproj","get_up_dir","tmp_vec","applyQuaternion","get_forward_dir","get_right_dir","unproject_mouse_position","v_fov","h_fov","atan","tan","distV","distH","get_plane_intersection","plane_position","plane_normal","setFromNormalAndCoplanarPoint","isPerspectiveCamera","unproject","intersectPlane","fit_points_on_camera","zoom_scale","world_space_center","camera_forward","project_points_on_plane","projected_points_center","getCenter","up","right","cross","inverse_mat","getInverse","applyMatrix4","projected_center","get_zoom_to_fit_rect","get_zoom_to_fit_box","isOrthographicCamera","obj_x","obj_y","object_aspect","get_html_screen_pos","object","getWorldPosition","project","world_pos_to_screen","update_projection","left","top","bottom","app_container","CameraUtilities","GeometryBatcher","OS","ReflectionPlaneContext","UI","Debug","render_loop","SSAOMaterial","_InverseProjMatrix","_ProjectionMatrix","_Bias","_Radius","_SampleKernel","__get_sample_kernel","_RandomRotation","__get_rotation_kernel","sample_kernel","rotation_kernel","rotation_texture","wrapS","RepeatWrapping","wrapT","SSAOComposeMaterial","_AO","DisplayNormalTextureMaterial","depth_normals_vert","BoxBlurMaterial","_SampleDir","Blurrer","RT1","RT2","box_blur_mat","blur","NormalAORender","ssao_mat","ssao_compose_mat","debug_normals","ssaa","use_ssaa","main_RT","SSAO_RT","blurrer","__check_RT_size","__update_uniforms","projectionMatrix","NormalRender","UnrealBloomComposeMaterial","nMips","NUM_MIPS","_BlurredTex","_BloomStrength","blurTexture1","blurTexture2","blurTexture3","blurTexture4","blurTexture5","bloomStrength","bloomFactors","bloomRadius","bloomTintColors","set_RT_0","rt","set_RT_1","set_RT_2","set_RT_3","set_RT_4","set_bloom_strength","set_bloom_radius","set_tint_color_0","col_string","set_tint_color_1","set_tint_color_2","set_tint_color_3","set_tint_color_4","AddMaterial","_SecondTex","set_add_texture","GaussianBlurMaterial","kernel_radius","KERNEL_RADIUS","SIGMA","texSize","direction","set_size","set_direction","LuminosityHighPassMaterial","luminosityThreshold","smoothWidth","defaultColor","defaultOpacity","GaussianBlurrer","current_width","current_height","separableBlurMaterials","renderTargetsHorizontal","renderTargetsVertical","kernelSizeArray","rt_pars","minFilter","LinearFilter","magFilter","format","renderTargetBright","generateMipmaps","init_materials","init_RT","luminosity_high_pass_mat","use_luminosity_high_pass","resize_RT","inputRenderTarget","get_blurred_texture","get_blurred_RT","dispose_RT","hor","ver","texture_height","dispose_materials","UnrealBloomRender","bloom_compose_mat","blur_RT","add_mat","val","THREEOrthographicCamera","components","enabled_components","Set","__set_components_opacities","component","register_component","enable_component","disable_component","delete","get_component_by_name","component_name","RenderLoop","target_application","_frame_id","is_running","frames_passed","ViewComponentManager","cancelAnimationFrame","SimpleTextDrawer","text_margin","text_size","globalAlpha","textBaseline","textAlign","fillText","ViewComponent","hidden","toggle_hidden","HorizontalPlane","VerticalPlane","ArrayUtilities","source","apply","array","items_left_count","closest_point","closest_distance","obj","ids","FrustumPointFitter","fit_points","camera_quaternion","vertical_fov","degToRad","up_plane_normal","get_up_plane_normal","down_plane_normal","get_down_plane_normal","left_plane_normal","get_left_plane_normal","right_plane_normal","get_right_plane_normal","camera_forward_dir","sphere_center","pull_back_distance","get_distance_to_fit_rect","far_pos","up_plane","down_plane","left_plane","right_plane","apply_center_correction_to_pos","Infinity","inverse_dir","Line3","up_line_intersection","down_line_intersection","left_line_intersection","right_line_intersection","intersectLine","log","new_up_distance","new_down_distance","new_left_distance","new_right_distance","vertical_min","horizontal_min","forward_correction","target_pos","vertical_offset","get_vertical_correction","horizontal_offset","get_hozirontal_correction","closest_up_point","closest_down_point","closest_distance_to_up_plane","closest_distance_to_down_plane","up_dir","down_line","up_line","down_dist","up_dist","correction","closest_right_point","closest_left_point","closest_distance_to_right_plane","closest_distance_to_left_plane","right_dir","left_line","right_line","left_dist","right_dist","Quaternion","setFromAxisAngle","GeometryUtilities","geometry_buffer","indices","positions","vertices","getX","getY","getZ","add_barycentric_attribute","non_indexed_geometry_buffer","bar_coordinates","ImageUtilities","getImageData","imagedata","sample","sample_count","face_areas","min_area","normals","faces","index_0","index_1","index_2","v1","v2","face","c","n2","n3","normal","area","get_face_area","normalized_faces_array","get_uniform_face_distribution","selected_faces","select_random_faces","sample_data_from_faces","sampled_points","sampled_normals","w1","w2","sample_point_in_face","amount","selected_face","minimum_area","extended_triangle_indices","repetitions_needed","j","vec1","vec2","w3","result_callback","fromGeometry","get_geometries","geometries","assign_material","clone_animated_gltf","gltf","animations","skinnedMeshes","isSkinnedMesh","cloneBones","cloneSkinnedMeshes","isBone","skeleton","cloneSkinnedMesh","orderedCloneBones","bones","cloneBone","Skeleton","boneInverses","matrixWorld","set_shadow_config","cast","receive","castShadow","receiveShadow","__find_object","get_object","get_object_by_type","object_type","ObjectUtilities","nodeType","attributes","attribute","item","nodeName","nodeValue","hasChildNodes","childNodes","xml_to_json","old","StringUtilities","string","words","toUpperCase","substr","join","charAt","slice","replace","group","TimeUtilities","time_str_to_ms","time_str","hours","minutes","seconds","PerspectiveFrustumPointFitter","get_horizontal_correction","OrthographicFrustumPointFitter","inverse_camera_quat","inverse","inverted_points","distance","distance_to_center","Grid","derivatives","plane_geometry","convert_to_non_indexed_geometry","rotation","_Thickness","_Length","_ElapsedTime","setup","next_position","previous_position","orientation","coverage","accumulated_length","next_point","__get_next_position","previous_point","__get_previous_position","vertexList","nextPositionList","previousPositionList","orientationList","coverageList","setIndex","_length","thickness","total_length","parent","copy_color","WorldImage","pivot","_ScreenAligned","_Scale","_Opacity","DoubleSide","PlaneGeometry","current_scale","computeBoundingBox","tmp_bb_size","boundingBox","update_texture","img","screen_aligned","boolean","Text2D","is_static","simple_text_drawer","draw_settings","LinearMipMapLinearFilter","UIElementMaterial","intensity","_PixelOffset","_NDC","_PivotPoint","_DepthOffset","ScreenSpacePosition","get_pos_NDC","WorldSpacePosition","tmp_vec3","tmp_vec2","UIElementState","ui_element","normalized_mouse_position","OnIdle","is_mouse_over","_on_enter_state","OnMouseEnter","on_mouse_enter","_on_hover_state","_on_exit_state","OnMouseExit","on_mouse_exit","_on_idle_state","OnMouseHover","__trigger_on_hover","on_mouse_hover","UIElement","is_clickable","position_strategy","_position","on_hover","mouse_pos_tmp","cached_NDC_position","screen_pos_tmp","texture_size","matrixAutoUpdate","pixel_offset","set_render_order","pivot_point","set_pixel_offset","use_depth","depth_offset","clear_state","visible","get_size","normalized_mouse_pos","to_screen_position","rect","Box2","containsPoint","projected_pos","get_screen_space_position","set_screen_space_position","screen_pos","remove_screen_material","UpdatableMaterialMesh","self","onBeforeRender","TextGlyph","plane_bounds","atlas_bounds","SDFText","glyph_layout","glyphs","glyph_is_dirty","matrix_is_dirty","color_is_dirty","matrix","__opacity","__text","__generate_glyphs","update_matrix","compose","clear_glyph_dirty","clear_color_dirty","set_rotation","tilt","new_orientation","new_tilt","multiply","set_color","set_pivot","update_glyphs","op","cursor","unicode","charCodeAt","glyph","planeBounds","text_glyph","atlasBounds","advance","box2","first_glyph","union","box2_size","SDFTextMaterial","_Texture","_Boldness","_AtlasSize","set_atlas_size","set_boldness","SDFTextBatch","font_layout","atlas_texture","instanced_geometry","InstancedBufferGeometry","instanceCount","Float32BufferAttribute","transformsCol0","InstancedBufferAttribute","max_allocations","transformsCol1","transformsCol2","transformsCol3","glyph_bounds","usage","DynamicDrawUsage","text_elements","atlas","add_text","text_str","remove_text","text_elem","remove_elem","force_update","glyph_bounds_atr","plane_bounds_atr","color_atr","matrix_needs_update","glyph_needs_update","color_needs_update","glyph_count","glyph_i","buffer_i","setXYZW","VectorInterpolator","tmp","MedianFilterMaterial","kernel3x3","_SourceTex","_SourceTexSize","isVideoTexture","videoWidth","videoHeight","isTexture","MedianFilter","type","median_filter_mat","filter","tex_size","DualFilteringBlurMaterial","upsample","AlphaFilterMaterial","use_alpha_mask","_Offset","DualFilteringBlurrer","RT0","RT3","RT4","upscale_blur_mat","downscale_blur_mat","alpha_filter_mat","check_RT_resize","GPUParticleSystem","particles","set_from_geometry","init_attribute_uvs","uv_storage_attr","build_uv_storage_attribute","Points","add_texture_attribute","add_attribute","particle_count","resolution","calculate_resolution","set_attribute_update_material","update_material","CustomDataTexture","multiplier","set_rgba","set_rgb","set_r","set_g","set_b","set_a","RGBDataTexture","RGBADataTexture","RGBFloatDataTexture","RGBAFloatDataTexture","BatchedMesh","id_table","max_texture_width","batched_count","batch_height","attach_rgb_texture","attach_rgba_texture","attach_rgb_float_texture","attach_rgba_float_texture","get_mesh_index","set_rgb_value","mesh_name","set_rgba_value","MeshBatcher","meshes","attr_mesh_id","create_batched_mesh","AudioClip","loop","volume","positional","audio","audio_listener","TPositionalAudio","TAudio","setBuffer","setLoop","gain","setVolume","pause","is_playing","isPlaying","AudioLoader","user_interaction_for_audio","instantiate_audio","setTimeout","arrayBuffer","array_buffer","AudioContext","decodeAudioData","audio_buffer","BasisLoader","loader","setWorkerLimit","setTranscoderPath","detectSupport","basis","encoding","sRGBEncoding","xhr","msg","CubemapLoader","THREECubeTextureLoader","setPath","urls","DAELoader","THREEColladaLoader","ColladaLoader","FileLoader","THREEFileLoader","FontLoader","TFontLoader","GLTFLoader","THREEGLTFLoader","GLTFDRACOLoader","draco_loader","THREEDRACOLoader","DRACOLoader","setDecoderPath","draco_decoder_path","setDecoderConfig","setDRACOLoader","HDRCubeTextureLoader","THREEHDRCubeTextureLoader","url_suffix","setDataType","UnsignedByteType","hdr","JSONLoader","OBJLoader","THREEOBJLoader","PointArrayLoader","parse_path","raw_data","string_array","pop","THREEVector3","RGBETextureLoader","THREERGBELoader","RGBELoader","THREEUnsignedByteType","TextLoader","TextureLoader","Texture","Image","onload","VideoLoader","ResourceBatch","batch_name","resource_loaders","add_loader","loading_finished","finished","has_errors","print_errors","get_loaded_bytes","get_total_bytes"],"mappings":"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"}
|