ohzi-core 5.14.2 → 5.14.3
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.module.js","sources":["../src/OS.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/resource_loader/BasisLoader.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/ReflectionPlaneContext.js","../src/static_batcher/GeometryBatch.js","../src/static_batcher/GeometryBatcher.js","../src/UI.js","../src/utilities/MathUtilities.js","../src/utilities/CameraUtilities.js","../src/Initializer.js","../src/resource_loader/JSONLoader.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/resource_loader/TextureLoader.js","../src/resource_loader/GLTFLoader.js","../src/resource_loader/DAELoader.js","../src/resource_loader/TextLoader.js","../src/resource_loader/CubemapLoader.js","../src/components/AudioClip.js","../src/resource_loader/AudioLoader.js","../src/resource_loader/OBJLoader.js","../src/resource_loader/FontLoader.js","../src/resource_loader/RGBETextureLoader.js","../src/resource_loader/PointArrayLoader.js","../src/resource_loader/HDRCubeTextureLoader.js","../src/resource_loader/GLTFDRACOLoader.js","../src/resource_loader/FileLoader.js","../src/resource_loader/ResourceBatch.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"],"sourcesContent":["\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\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 get is_android()\n {\n return this.get_os() === this.operating_systems.ANDROID;\n }\n\n get is_ios()\n {\n return navigator.userAgent.match(/(iPhone|iPod|iPad)/) || this.is_ipad;\n }\n\n get is_safari()\n {\n let ua = navigator.userAgent.toLowerCase();\n\n if (ua.indexOf('safari') !== -1)\n {\n if (ua.indexOf('chrome') > -1)\n {\n return false;\n }\n else\n {\n return true;\n }\n }\n\n return false;\n }\n\n get is_ipad()\n {\n return (navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints && navigator.maxTouchPoints > 2);\n }\n\n get is_mobile()\n {\n return !!(navigator.userAgent.match(/(iPhone|iPod|iPad|Android|playbook|silk|BlackBerry|BB10|Windows Phone|Tizen|Bada|webOS|IEMobile|Opera Mini)/));\n }\n\n get is_linux()\n {\n return this.get_os() === this.operating_systems.LINUX;\n }\n\n get is_mac()\n {\n return this.get_os() === this.operating_systems.MAC;\n }\n\n get is_windows()\n {\n return this.get_os() === this.operating_systems.WINDOWS;\n }\n}\n\nexport default new OS();\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 OS from '../OS';\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 = OS.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 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);\r\n }\r\n\r\n on_preloaded_finished(resource_container)\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\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 this.elapsed_time = this.get_duration();\n this.__play_clips(this.elapsed_time, this.elapsed_time + 0.01);\n }\n\n update(delta_time)\n {\n if (this.playing)\n {\n this.__play_clips(this.elapsed_time, this.elapsed_time + delta_time);\n this.elapsed_time = this.elapsed_time + delta_time;\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 &&\n this.action_events[i].trigger_time < to)\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 difference = Math.min(\n Math.abs(keyframe.from - time),\n Math.abs(keyframe.to - time)\n );\n\n if (difference < min_time)\n {\n min_time = difference;\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 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.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 if (this.action_sequencer.is_finished())\n {\n this.transitioning = false;\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 if (this.last_state.name !== this.current_state.name)\n {\n this.last_state.hide();\n }\n\n this.last_state.on_exit();\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","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\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\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(opacity)\n {\n this.container.style.opacity = 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","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 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 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 { BufferGeometryUtils } from 'three/examples/jsm/utils/BufferGeometryUtils.js';\n\nimport { CylinderBufferGeometry } from 'three';\nimport { ConeBufferGeometry } from 'three';\nimport { MeshBasicMaterial } from 'three';\nimport { Vector3, Mesh } from 'three';\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_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\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: true,\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\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 this.check_for_resize();\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\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_before_render)\n {\n scene.on_before_render();\n }\n\n if (scene.render)\n {\n scene.render();\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 check_for_resize()\n {\n let current_width = this.canvas.clientWidth;\n let current_height = this.canvas.clientHeight;\n\n if (\n current_width !== Screen.width ||\n current_height !== Screen.height ||\n Configuration.dpr !== Screen.dpr\n )\n {\n let canvas_rect = this.canvas.getBoundingClientRect();\n\n Screen.dpr = Configuration.dpr;\n Screen.update_position(canvas_rect.x, canvas_rect.y);\n Screen.update_size(current_width, current_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 on_resize()\n {\n console.error('Graphics.on_resize call no longer needed.');\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","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';\nimport { 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 MathUtilities\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 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","import CameraManager from '../CameraManager';\nimport Input from '../Input';\nimport MathUtilities from '../utilities/MathUtilities';\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.tmp_vec = new Vector3(0, 0, 1);\n this.tmp_vec2 = new Vector3(0, 0, 0);\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 this.tmp_vec.set(0, 1, 0);\n this.tmp_vec.applyQuaternion(camera.quaternion);\n\n return this.tmp_vec;\n }\n\n get_forward_dir(camera)\n {\n camera = camera || CameraManager.current;\n this.tmp_vec.set(0, 0, -1);\n this.tmp_vec.applyQuaternion(camera.quaternion);\n\n return this.tmp_vec;\n }\n\n get_right_dir(camera)\n {\n camera = camera || CameraManager.current;\n this.tmp_vec.set(1, 0, 0);\n this.tmp_vec.applyQuaternion(camera.quaternion);\n return this.tmp_vec;\n }\n\n unproject_mouse_position(NDC, camera)\n {\n camera = camera || CameraManager.current;\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 this.tmp_vec.set(distH * NDC.x, distV * NDC.y, -camera.far).normalize();\n\n return this.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 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, this.tmp_vec2);\n return this.tmp_vec2;\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 = MathUtilities.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 object.getWorldPosition(this.tmp_vec);\n this.tmp_vec.project(camera);\n\n this.tmp_vec.x = (this.tmp_vec.x * 0.5 + 0.5) * (Screen.width);\n this.tmp_vec.y = (1 - (this.tmp_vec.y * 0.5 + 0.5)) * Screen.height;\n return this.tmp_vec;\n }\n\n world_pos_to_screen(pos, camera)\n {\n camera = camera || CameraManager.current;\n this.tmp_vec.copy(pos);\n this.tmp_vec.project(camera);\n\n this.tmp_vec.x = (this.tmp_vec.x * 0.5 + 0.5) * (Screen.width);\n this.tmp_vec.y = (1 - (this.tmp_vec.y * 0.5 + 0.5)) * Screen.height;\n return this.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 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 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 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 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 Input.clear();\n UI.clear();\n Debug.clear();\n\n this._frame_id = requestAnimationFrame(this.update.bind(this));\n this.frames_passed++;\n }\n\n start()\n {\n if (this.is_running) return; // sanity check\n\n this.graphics.check_for_resize();\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","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { TextureLoader as THREETextureLoader } 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 this.loader = new THREETextureLoader();\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, (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 // This is never called (See THREE.ImageLoader)\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 () =>\r\n {\r\n ctx.__set_error('Image could not be loaded. Maybe wrong name or path, I don\\'t know' + '¯\\\\_(ツ)_/¯');\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\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 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 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 { 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 { Audio as THREEAudio } from 'three';\n\nexport default class AudioClip\n{\n constructor(buffer, loop = true, volume = 1)\n {\n this.buffer = buffer;\n this.loop = loop;\n this.volume = volume;\n\n this.audio = undefined;\n }\n\n init(audio_listener)\n {\n this.audio = new THREEAudio(audio_listener);\n this.audio.setBuffer(this.buffer);\n this.audio.setLoop(this.loop);\n this.audio.setVolume(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\nimport { AudioLoader as THREEAudioLoader } from 'three';\r\n\r\nexport default class AudioLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, loop = true, volume = 1, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREEAudioLoader();\r\n this.loop = loop;\r\n this.volume = volume;\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, (buffer) =>\r\n {\r\n resource_container.set_resource(ctx.resource_id, ctx.url, new AudioClip(buffer, this.loop, this.volume));\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 (error) =>\r\n {\r\n ctx.__set_error('Audio 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","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 { FontLoader as TFontLoader } from 'three';\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';\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';\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';\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';\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.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 { 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 TextureLoader from './TextureLoader';\r\nimport GLTFLoader from './GLTFLoader';\r\nimport DAELoader from './DAELoader';\r\nimport TextLoader from './TextLoader';\r\nimport CubemapLoader from './CubemapLoader';\r\nimport AudioLoader from './AudioLoader';\r\nimport JSONLoader from './JSONLoader';\r\nimport OBJLoader from './OBJLoader';\r\nimport FontLoader from './FontLoader';\r\nimport RGBETextureLoader from './RGBETextureLoader';\r\nimport PointArrayLoader from './PointArrayLoader';\r\nimport HDRCubeTextureLoader from './HDRCubeTextureLoader';\r\nimport GLTFDRACOLoader from './GLTFDRACOLoader';\r\nimport BasisLoader from './BasisLoader';\r\nimport ResourceContainer from '../ResourceContainer';\r\nimport FileLoader from './FileLoader';\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_texture(resource_id, url, size)\r\n {\r\n this.resource_loaders.push(new TextureLoader(resource_id, url, size));\r\n }\r\n\r\n add_gltf(resource_id, url, size)\r\n {\r\n this.resource_loaders.push(new GLTFLoader(resource_id, url, size));\r\n }\r\n\r\n add_basis(resource_id, url, renderer, loader, size)\r\n {\r\n this.resource_loaders.push(new BasisLoader(resource_id, url, renderer, loader, size));\r\n }\r\n\r\n add_gltf_draco(resource_id, url, size)\r\n {\r\n this.resource_loaders.push(new GLTFDRACOLoader(resource_id, url, size));\r\n }\r\n\r\n add_dae(resource_id, url, size)\r\n {\r\n this.resource_loaders.push(new DAELoader(resource_id, url, size));\r\n }\r\n\r\n add_obj(resource_id, url, size)\r\n {\r\n this.resource_loaders.push(new OBJLoader(resource_id, url, size));\r\n }\r\n\r\n add_file(resource_id, url, size)\r\n {\r\n this.resource_loaders.push(new FileLoader(resource_id, url, size));\r\n }\r\n\r\n add_text(resource_id, url, size)\r\n {\r\n this.resource_loaders.push(new TextLoader(resource_id, url, size));\r\n }\r\n\r\n add_cubemap(resource_id, url, size)\r\n {\r\n this.resource_loaders.push(new CubemapLoader(resource_id, url, size));\r\n }\r\n\r\n add_audio(resource_id, url, loop, volume, size)\r\n {\r\n this.resource_loaders.push(new AudioLoader(resource_id, url, loop, volume, size));\r\n }\r\n\r\n add_json(resource_id, url, size)\r\n {\r\n this.resource_loaders.push(new JSONLoader(resource_id, url, size));\r\n }\r\n\r\n add_point_array(resource_id, url, size)\r\n {\r\n this.resource_loaders.push(new PointArrayLoader(resource_id, url, size));\r\n }\r\n\r\n add_hdr(resource_id, url, size)\r\n {\r\n this.resource_loaders.push(new RGBETextureLoader(resource_id, url, size));\r\n }\r\n\r\n add_hdr_cubemap(resource_id, url, size)\r\n {\r\n this.resource_loaders.push(new HDRCubeTextureLoader(resource_id, url, size));\r\n }\r\n\r\n add_font(resource_id, url, size)\r\n {\r\n this.resource_loaders.push(new FontLoader(resource_id, url, size));\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","\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","class MeshSampler\n{\n constructor()\n {\n\n }\n\n sample(geometry, sample_count)\n {\n let face_areas = [];\n\n let min_area = 99999999;\n for (let i = 0; i < geometry.faces.length; i++)\n {\n let area = this.get_face_area(geometry.faces[i], geometry.vertices);\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, geometry.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, geometry.vertices);\n return sampled_data;\n }\n\n sample_data_from_faces(faces, vertices)\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, vertices[face.a], vertices[face.b], vertices[face.c]).clone());\n if (sampled_normals && 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 = parseInt(Math.random() * (faces.length - 1));\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 = parseInt(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, vertices)\n {\n let v1 = vertices[face.a].clone();\n let v2 = vertices[face.b].clone();\n let v3 = vertices[face.c].clone();\n\n let vec1 = v2.clone().sub(v1);\n let vec2 = v3.clone().sub(v1);\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"],"names":["init","this","operating_systems","ANDROID","IOS","LINUX","MAC","WINDOWS","get_os","userAgent","window","navigator","platform","os","indexOf","test","is_android","is_ios","match","is_ipad","is_safari","ua","toLowerCase","maxTouchPoints","is_mobile","is_linux","is_mac","is_windows","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","OS","fetch","method","mode","credentials","redirect","then","on_progress","bind","catch","__on_error","async","response","reader","body","getReader","contentLength","headers","get","receivedLength","done","value","read","length","on_preloaded_finished","data","ActionSequencer","context","elapsed_time","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","name","__get_nearest_keyframe","evaluate","trigger","evaluate_keyframe","__linear_map_01","from_range_start_value","from_range_end_value","channel_name","closest","min_time","difference","min","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","Time","set_state","assign","views","transition_handler","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","ApplicationView","container","ResourceContainer","ViewManager","classList","add","remove","set_opacity","opacity","style","BaseApplication","on_post_start","on_post_render","on_pre_render","BaseRender","render","renderer","resize","dispose","BaseShaderMaterial","ShaderMaterial","vert","frag","uniforms","vertexShader","basic_vert","fragmentShader","basic_frag","_Color","Color","BasisLoader","loader","setWorkerLimit","setTranscoderPath","detectSupport","ctx","basis","encoding","sRGBEncoding","xhr","msg","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","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","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","clone","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","log","WebGLRenderer","autoClear","setPixelRatio","Configuration","extensions","domElement","Capabilities","capabilities","getMaxAnisotropy","maxVertexTextures","floatVertexTextures","dom_element","depth_normals_RT","new_state","check_for_resize","__update_current_camera","updateProjectionMatrix","updateMatrix","updateMatrixWorld","override_mat","__apply_override_material","render_scene","on_before_render","overrideMaterial","readback_RT","buffer","readRenderTargetPixels","clear_stencil","setClearColor","current_width","clientWidth","current_height","clientHeight","canvas_rect","getBoundingClientRect","setViewport","on_resize","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","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","MathUtilities","to_range_start_value","to_range_end_value","number","divisor","rgb","r","round","toString","g","projected_point","points_on_plane","projectPoint","target","elements","x1","x2","arr","col","random","tmp_mat","Matrix4","tmp_vec","tmp_vec2","Plane","ray","Ray","tmp_size","tmp_unproj","get_up_dir","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","ReflectionPlaneContext","UI","Debug","render_loop","JSONLoader","THREEFileLoader","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","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","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","TextureLoader","THREETextureLoader","GLTFLoader","THREEGLTFLoader","gltf","DAELoader","THREEColladaLoader","ColladaLoader","TextLoader","CubemapLoader","THREECubeTextureLoader","setPath","urls","AudioClip","loop","volume","audio","audio_listener","THREEAudio","setBuffer","setLoop","setVolume","pause","is_playing","isPlaying","AudioLoader","THREEAudioLoader","OBJLoader","THREEOBJLoader","FontLoader","TFontLoader","RGBETextureLoader","THREERGBELoader","RGBELoader","setDataType","THREEUnsignedByteType","hdr","PointArrayLoader","parse_path","raw_data","string_array","pop","positions","THREEVector3","HDRCubeTextureLoader","THREEHDRCubeTextureLoader","url_suffix","UnsignedByteType","GLTFDRACOLoader","draco_loader","THREEDRACOLoader","DRACOLoader","setDecoderPath","draco_decoder_path","setDecoderConfig","type","setDRACOLoader","FileLoader","ResourceBatch","batch_name","resource_loaders","add_texture","add_gltf","add_basis","add_gltf_draco","add_dae","add_obj","add_file","add_text","add_cubemap","add_audio","add_json","add_point_array","add_hdr","add_hdr_cubemap","add_font","add_loader","loading_finished","finished","has_errors","print_errors","get_loaded_bytes","get_total_bytes","SimpleTextDrawer","text_margin","text_size","globalAlpha","textBaseline","textAlign","fillText","ViewComponent","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","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","vertices","getX","getY","getZ","add_barycentric_attribute","non_indexed_geometry_buffer","bar_coordinates","ImageUtilities","getImageData","imagedata","sample","sample_count","face_areas","min_area","faces","area","get_face_area","normalized_faces_array","get_uniform_face_distribution","selected_faces","select_random_faces","sample_data_from_faces","sampled_points","sampled_normals","face","w1","w2","sample_point_in_face","c","normal","normals","amount","selected_face","minimum_area","extended_triangle_indices","repetitions_needed","j","v1","v2","vec1","vec2","w3","result_callback","fromGeometry","get_geometries","geometries","assign_material","clone_animated_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","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","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","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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.module.js","sources":["../src/OS.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/resource_loader/BasisLoader.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/ReflectionPlaneContext.js","../src/static_batcher/GeometryBatch.js","../src/static_batcher/GeometryBatcher.js","../src/UI.js","../src/utilities/MathUtilities.js","../src/utilities/CameraUtilities.js","../src/Initializer.js","../src/resource_loader/JSONLoader.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/resource_loader/TextureLoader.js","../src/resource_loader/GLTFLoader.js","../src/resource_loader/DAELoader.js","../src/resource_loader/TextLoader.js","../src/resource_loader/CubemapLoader.js","../src/components/AudioClip.js","../src/resource_loader/AudioLoader.js","../src/resource_loader/OBJLoader.js","../src/resource_loader/FontLoader.js","../src/resource_loader/RGBETextureLoader.js","../src/resource_loader/PointArrayLoader.js","../src/resource_loader/HDRCubeTextureLoader.js","../src/resource_loader/GLTFDRACOLoader.js","../src/resource_loader/FileLoader.js","../src/resource_loader/ResourceBatch.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"],"sourcesContent":["\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\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 get is_android()\n {\n return this.get_os() === this.operating_systems.ANDROID;\n }\n\n get is_ios()\n {\n return navigator.userAgent.match(/(iPhone|iPod|iPad)/) || this.is_ipad;\n }\n\n get is_safari()\n {\n let ua = navigator.userAgent.toLowerCase();\n\n if (ua.indexOf('safari') !== -1)\n {\n if (ua.indexOf('chrome') > -1)\n {\n return false;\n }\n else\n {\n return true;\n }\n }\n\n return false;\n }\n\n get is_ipad()\n {\n return (navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints && navigator.maxTouchPoints > 2);\n }\n\n get is_mobile()\n {\n return !!(navigator.userAgent.match(/(iPhone|iPod|iPad|Android|playbook|silk|BlackBerry|BB10|Windows Phone|Tizen|Bada|webOS|IEMobile|Opera Mini)/));\n }\n\n get is_linux()\n {\n return this.get_os() === this.operating_systems.LINUX;\n }\n\n get is_mac()\n {\n return this.get_os() === this.operating_systems.MAC;\n }\n\n get is_windows()\n {\n return this.get_os() === this.operating_systems.WINDOWS;\n }\n}\n\nexport default new OS();\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 OS from '../OS';\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 = OS.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 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);\r\n }\r\n\r\n on_preloaded_finished(resource_container)\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\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 this.elapsed_time = this.get_duration();\n this.__play_clips(this.elapsed_time, this.elapsed_time + 0.01);\n }\n\n update(delta_time)\n {\n if (this.playing)\n {\n this.__play_clips(this.elapsed_time, this.elapsed_time + delta_time);\n this.elapsed_time = this.elapsed_time + delta_time;\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 &&\n this.action_events[i].trigger_time < to)\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 difference = Math.min(\n Math.abs(keyframe.from - time),\n Math.abs(keyframe.to - time)\n );\n\n if (difference < min_time)\n {\n min_time = difference;\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 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.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 if (this.action_sequencer.is_finished())\n {\n this.transitioning = false;\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 if (this.last_state.name !== this.current_state.name)\n {\n this.last_state.hide();\n }\n\n this.last_state.on_exit();\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","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\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\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(opacity)\n {\n this.container.style.opacity = 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","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 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 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 { BufferGeometryUtils } from 'three/examples/jsm/utils/BufferGeometryUtils.js';\n\nimport { CylinderBufferGeometry } from 'three';\nimport { ConeBufferGeometry } from 'three';\nimport { MeshBasicMaterial } from 'three';\nimport { Vector3, Mesh } from 'three';\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_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\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: true,\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\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 this.check_for_resize();\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\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_before_render)\n {\n scene.on_before_render();\n }\n\n if (scene.render)\n {\n scene.render();\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 check_for_resize()\n {\n let current_width = this.canvas.clientWidth;\n let current_height = this.canvas.clientHeight;\n\n if (\n current_width !== Screen.width ||\n current_height !== Screen.height ||\n Configuration.dpr !== Screen.dpr\n )\n {\n let canvas_rect = this.canvas.getBoundingClientRect();\n\n Screen.dpr = Configuration.dpr;\n Screen.update_position(canvas_rect.x, canvas_rect.y);\n Screen.update_size(current_width, current_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 on_resize()\n {\n console.error('Graphics.on_resize call no longer needed.');\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","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';\nimport { 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 MathUtilities\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 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","import CameraManager from '../CameraManager';\nimport Input from '../Input';\nimport MathUtilities from '../utilities/MathUtilities';\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.tmp_vec = new Vector3(0, 0, 1);\n this.tmp_vec2 = new Vector3(0, 0, 0);\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 this.tmp_vec.set(0, 1, 0);\n this.tmp_vec.applyQuaternion(camera.quaternion);\n\n return this.tmp_vec;\n }\n\n get_forward_dir(camera)\n {\n camera = camera || CameraManager.current;\n this.tmp_vec.set(0, 0, -1);\n this.tmp_vec.applyQuaternion(camera.quaternion);\n\n return this.tmp_vec;\n }\n\n get_right_dir(camera)\n {\n camera = camera || CameraManager.current;\n this.tmp_vec.set(1, 0, 0);\n this.tmp_vec.applyQuaternion(camera.quaternion);\n return this.tmp_vec;\n }\n\n unproject_mouse_position(NDC, camera)\n {\n camera = camera || CameraManager.current;\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 this.tmp_vec.set(distH * NDC.x, distV * NDC.y, -camera.far).normalize();\n\n return this.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 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, this.tmp_vec2);\n return this.tmp_vec2;\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 = MathUtilities.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 object.getWorldPosition(this.tmp_vec);\n this.tmp_vec.project(camera);\n\n this.tmp_vec.x = (this.tmp_vec.x * 0.5 + 0.5) * (Screen.width);\n this.tmp_vec.y = (1 - (this.tmp_vec.y * 0.5 + 0.5)) * Screen.height;\n return this.tmp_vec;\n }\n\n world_pos_to_screen(pos, camera)\n {\n camera = camera || CameraManager.current;\n this.tmp_vec.copy(pos);\n this.tmp_vec.project(camera);\n\n this.tmp_vec.x = (this.tmp_vec.x * 0.5 + 0.5) * (Screen.width);\n this.tmp_vec.y = (1 - (this.tmp_vec.y * 0.5 + 0.5)) * Screen.height;\n return this.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 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 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 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 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 Input.clear();\n UI.clear();\n Debug.clear();\n\n this._frame_id = requestAnimationFrame(this.update.bind(this));\n this.frames_passed++;\n }\n\n start()\n {\n if (this.is_running) return; // sanity check\n\n this.graphics.check_for_resize();\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","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { TextureLoader as THREETextureLoader } 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 this.loader = new THREETextureLoader();\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, (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 // This is never called (See THREE.ImageLoader)\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 () =>\r\n {\r\n ctx.__set_error('Image could not be loaded. Maybe wrong name or path, I don\\'t know' + '¯\\\\_(ツ)_/¯');\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\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 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 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 { 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 { Audio as THREEAudio } from 'three';\n\nexport default class AudioClip\n{\n constructor(buffer, loop = true, volume = 1)\n {\n this.buffer = buffer;\n this.loop = loop;\n this.volume = volume;\n\n this.audio = undefined;\n }\n\n init(audio_listener)\n {\n this.audio = new THREEAudio(audio_listener);\n this.audio.setBuffer(this.buffer);\n this.audio.setLoop(this.loop);\n this.audio.setVolume(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\nimport { AudioLoader as THREEAudioLoader } from 'three';\r\n\r\nexport default class AudioLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, loop = true, volume = 1, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREEAudioLoader();\r\n this.loop = loop;\r\n this.volume = volume;\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, (buffer) =>\r\n {\r\n resource_container.set_resource(ctx.resource_id, ctx.url, new AudioClip(buffer, this.loop, this.volume));\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 (error) =>\r\n {\r\n ctx.__set_error('Audio 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","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 { FontLoader as TFontLoader } from 'three';\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';\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';\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';\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';\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.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 { 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 TextureLoader from './TextureLoader';\r\nimport GLTFLoader from './GLTFLoader';\r\nimport DAELoader from './DAELoader';\r\nimport TextLoader from './TextLoader';\r\nimport CubemapLoader from './CubemapLoader';\r\nimport AudioLoader from './AudioLoader';\r\nimport JSONLoader from './JSONLoader';\r\nimport OBJLoader from './OBJLoader';\r\nimport FontLoader from './FontLoader';\r\nimport RGBETextureLoader from './RGBETextureLoader';\r\nimport PointArrayLoader from './PointArrayLoader';\r\nimport HDRCubeTextureLoader from './HDRCubeTextureLoader';\r\nimport GLTFDRACOLoader from './GLTFDRACOLoader';\r\nimport BasisLoader from './BasisLoader';\r\nimport ResourceContainer from '../ResourceContainer';\r\nimport FileLoader from './FileLoader';\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_texture(resource_id, url, size)\r\n {\r\n this.resource_loaders.push(new TextureLoader(resource_id, url, size));\r\n }\r\n\r\n add_gltf(resource_id, url, size)\r\n {\r\n this.resource_loaders.push(new GLTFLoader(resource_id, url, size));\r\n }\r\n\r\n add_basis(resource_id, url, renderer, loader, size)\r\n {\r\n this.resource_loaders.push(new BasisLoader(resource_id, url, renderer, loader, size));\r\n }\r\n\r\n add_gltf_draco(resource_id, url, size)\r\n {\r\n this.resource_loaders.push(new GLTFDRACOLoader(resource_id, url, size));\r\n }\r\n\r\n add_dae(resource_id, url, size)\r\n {\r\n this.resource_loaders.push(new DAELoader(resource_id, url, size));\r\n }\r\n\r\n add_obj(resource_id, url, size)\r\n {\r\n this.resource_loaders.push(new OBJLoader(resource_id, url, size));\r\n }\r\n\r\n add_file(resource_id, url, size)\r\n {\r\n this.resource_loaders.push(new FileLoader(resource_id, url, size));\r\n }\r\n\r\n add_text(resource_id, url, size)\r\n {\r\n this.resource_loaders.push(new TextLoader(resource_id, url, size));\r\n }\r\n\r\n add_cubemap(resource_id, url, size)\r\n {\r\n this.resource_loaders.push(new CubemapLoader(resource_id, url, size));\r\n }\r\n\r\n add_audio(resource_id, url, loop, volume, size)\r\n {\r\n this.resource_loaders.push(new AudioLoader(resource_id, url, loop, volume, size));\r\n }\r\n\r\n add_json(resource_id, url, size)\r\n {\r\n this.resource_loaders.push(new JSONLoader(resource_id, url, size));\r\n }\r\n\r\n add_point_array(resource_id, url, size)\r\n {\r\n this.resource_loaders.push(new PointArrayLoader(resource_id, url, size));\r\n }\r\n\r\n add_hdr(resource_id, url, size)\r\n {\r\n this.resource_loaders.push(new RGBETextureLoader(resource_id, url, size));\r\n }\r\n\r\n add_hdr_cubemap(resource_id, url, size)\r\n {\r\n this.resource_loaders.push(new HDRCubeTextureLoader(resource_id, url, size));\r\n }\r\n\r\n add_font(resource_id, url, size)\r\n {\r\n this.resource_loaders.push(new FontLoader(resource_id, url, size));\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","\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","class MeshSampler\n{\n constructor()\n {\n\n }\n\n sample(geometry, sample_count)\n {\n let face_areas = [];\n\n let min_area = 99999999;\n for (let i = 0; i < geometry.faces.length; i++)\n {\n let area = this.get_face_area(geometry.faces[i], geometry.vertices);\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, geometry.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, geometry.vertices);\n return sampled_data;\n }\n\n sample_data_from_faces(faces, vertices)\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, vertices[face.a], vertices[face.b], vertices[face.c]).clone());\n if (sampled_normals && 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 = parseInt(Math.random() * (faces.length - 1));\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 = parseInt(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, vertices)\n {\n let v1 = vertices[face.a].clone();\n let v2 = vertices[face.b].clone();\n let v3 = vertices[face.c].clone();\n\n let vec1 = v2.clone().sub(v1);\n let vec2 = v3.clone().sub(v1);\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"],"names":["[object Object]","this","operating_systems","ANDROID","IOS","LINUX","MAC","WINDOWS","userAgent","window","navigator","platform","os","indexOf","test","is_android","get_os","is_ios","match","is_ipad","is_safari","ua","toLowerCase","maxTouchPoints","is_mobile","is_linux","is_mac","is_windows","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","OS","fetch","method","mode","credentials","redirect","then","on_progress","bind","catch","__on_error","response","reader","body","getReader","contentLength","headers","get","receivedLength","done","value","read","length","__update_downloaded_bytes","on_preloaded_finished","data","ActionSequencer","context","elapsed_time","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","name","__get_nearest_keyframe","evaluate","trigger","evaluate_keyframe","__linear_map_01","from_range_start_value","from_range_end_value","channel_name","closest","min_time","difference","min","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","before_exit","show","before_enter","play","update","Time","update_exit_transition","get_progress","update_enter_transition","is_finished","hide","on_exit","on_enter","assign","views","transition_handler","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","ApplicationView","container","ResourceContainer","ViewManager","register_view","classList","add","remove","opacity","style","BaseApplication","BaseRender","renderer","BaseShaderMaterial","ShaderMaterial","vert","frag","uniforms","vertexShader","basic_vert","fragmentShader","basic_frag","_Color","Color","BasisLoader","loader","setWorkerLimit","setTranscoderPath","detectSupport","ctx","load","basis","encoding","sRGBEncoding","set_resource","__loading_ended","xhr","msg","__set_error","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","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","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","clone","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","log","WebGLRenderer","autoClear","setPixelRatio","Configuration","extensions","domElement","Capabilities","capabilities","getMaxAnisotropy","maxVertexTextures","floatVertexTextures","dom_element","depth_normals_RT","new_state","check_for_resize","__update_current_camera","updateProjectionMatrix","updateMatrix","updateMatrixWorld","override_mat","__apply_override_material","on_before_render","on_post_render","overrideMaterial","buffer","readRenderTargetPixels","clear_stencil","setClearColor","current_width","clientWidth","current_height","clientHeight","canvas_rect","getBoundingClientRect","update_position","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","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","MathUtilities","to_range_start_value","to_range_end_value","number","divisor","rgb","r","round","toString","g","projected_point","points_on_plane","projectPoint","target","elements","x1","x2","arr","col","random","tmp_mat","Matrix4","tmp_vec","tmp_vec2","Plane","ray","Ray","tmp_size","tmp_unproj","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","ReflectionPlaneContext","UI","Debug","render_loop","JSONLoader","THREEFileLoader","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","on_pre_render","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","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","cancelAnimationFrame","stop","TextureLoader","THREETextureLoader","GLTFLoader","THREEGLTFLoader","gltf","DAELoader","THREEColladaLoader","ColladaLoader","TextLoader","CubemapLoader","THREECubeTextureLoader","setPath","urls","AudioClip","loop","volume","audio","audio_listener","THREEAudio","setBuffer","setLoop","setVolume","pause","is_playing","isPlaying","AudioLoader","THREEAudioLoader","OBJLoader","THREEOBJLoader","FontLoader","TFontLoader","RGBETextureLoader","THREERGBELoader","RGBELoader","setDataType","THREEUnsignedByteType","hdr","PointArrayLoader","parse_path","raw_data","string_array","pop","positions","THREEVector3","HDRCubeTextureLoader","THREEHDRCubeTextureLoader","url_suffix","UnsignedByteType","GLTFDRACOLoader","draco_loader","THREEDRACOLoader","DRACOLoader","setDecoderPath","draco_decoder_path","setDecoderConfig","type","setDRACOLoader","FileLoader","ResourceBatch","batch_name","resource_loaders","loading_finished","finished","has_errors","print_error","get_loaded_bytes","get_total_bytes","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","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","vertices","getX","getY","getZ","add_barycentric_attribute","non_indexed_geometry_buffer","bar_coordinates","ImageUtilities","getImageData","imagedata","sample_count","face_areas","min_area","faces","area","get_face_area","normalized_faces_array","get_uniform_face_distribution","selected_faces","select_random_faces","sample_data_from_faces","sampled_points","sampled_normals","face","w1","w2","sample_point_in_face","c","normal","normals","amount","selected_face","minimum_area","extended_triangle_indices","repetitions_needed","j","v1","v2","vec1","vec2","w3","result_callback","fromGeometry","geometries","get_mesh","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","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","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"],"mappings":"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"}
|