ohzi-core 9.4.0 → 9.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.module.js","sources":["../src/Browser.js","../src/utilities/Validation.js","../src/resource_loader/AbstractLoader.js","../src/utilities/OMath.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/utilities/HTMLUtilities.js","../src/view_components/transition/TransitionTable.js","../src/Time.js","../src/view_components/ViewState.js","../src/view_components/transition/ViewStateTransitionHandler.js","../src/view_components/ViewManager.js","../src/view_components/ApplicationView.js","../src/BaseApplication.js","../src/render_mode/BaseRender.js","../src/materials/BaseShaderMaterial.js","../src/materials/BlitMaterial.js","../src/materials/AddMaterial.js","../src/materials/UnrealBloomComposeMaterial.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/OScreen.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/KeyboardInput.js","../src/Input.js","../src/OS.js","../src/ReflectionPlaneContext.js","../src/static_batcher/GeometryBatch.js","../src/static_batcher/GeometryBatcher.js","../src/UI.js","../src/utilities/CameraUtilities.js","../src/Initializer.js","../src/materials/SSAOMaterial.js","../src/materials/SSAOComposeMaterial.js","../src/materials/DisplayNormalTextureMaterial.js","../src/materials/BoxBlurMaterial.js","../src/render_utilities/Blurrer.js","../src/render_mode/NormalAORender.js","../src/render_mode/NormalRender.js","../src/render_mode/VRRender.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/Screen.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/ParticleAttribute.js","../src/gpu_particles/GPUParticleSystem.js","../src/materials/gpu_particles/ParticleStorageMaterial.js","../src/gpu_particles/ParticlePositionAttribute.js","../src/data_textures/CustomDataTexture.js","../src/data_textures/RGBDataTexture.js","../src/data_textures/RGBADataTexture.js","../src/data_textures/RGBFloatDataTexture.js","../src/data_textures/RGBAFloatDataTexture.js","../src/static_batcher/BatchedMesh.js","../src/static_batcher/MeshBatcher.js","../src/components/AudioClip.js","../src/resource_loader/AudioLoader.js","../src/resource_loader/BasisLoader.js","../src/resource_loader/CubemapLoader.js","../src/resource_loader/DAELoader.js","../src/resource_loader/FileLoader.js","../src/resource_loader/FontLoader.js","../src/resource_loader/GLTFLoader.js","../src/resource_loader/GLTFDRACOLoader.js","../src/resource_loader/HDRCubeTextureLoader.js","../src/resource_loader/JSONLoader.js","../src/resource_loader/OBJLoader.js","../src/resource_loader/PointArrayLoader.js","../src/resource_loader/RGBETextureLoader.js","../src/resource_loader/TextLoader.js","../src/resource_loader/AsyncTextureLoader.js","../src/resource_loader/TextureLoader.js","../src/resource_loader/VideoLoader.js","../src/resource_loader/ResourceBatch.js"],"sourcesContent":["\nclass Browser\n{\n init()\n {\n this.browser_name = '';\n this.agent = window.navigator.userAgent.toLowerCase();\n\n switch (true)\n {\n case this.agent.indexOf('edge') > -1:\n this.browser_name = 'edge_ie';\n break;\n case this.agent.indexOf('edg') > -1:\n this.browser_name = 'edge_chromium';\n break;\n case this.agent.indexOf('opr') > -1 && !!window.opr:\n this.browser_name = 'opera';\n break;\n case this.agent.indexOf('chrome') > -1 && !!window.chrome:\n this.browser_name = 'chrome';\n break;\n case this.agent.indexOf('trident') > -1:\n this.browser_name = 'iexplorer';\n break;\n case this.agent.indexOf('firefox') > -1:\n this.browser_name = 'firefox';\n break;\n case this.agent.indexOf('safari') > -1:\n this.browser_name = 'safari';\n break;\n default:\n this.browser_name = 'other';\n break;\n }\n\n this.version = this.get_version();\n }\n\n get name()\n {\n return this.browser_name;\n }\n\n get is_safari()\n {\n return this.browser_name === 'safari';\n }\n\n get is_chrome()\n {\n return this.browser_name === 'chrome';\n }\n\n get is_edge()\n {\n return this.browser_name === 'edge_ie';\n }\n\n get is_edge_chromium()\n {\n return this.browser_name === 'edge_chromium';\n }\n\n get has_webm()\n {\n return this.is_chrome || this.is_firefox || this.is_edge_chromium;\n }\n\n get has_hvec()\n {\n return this.is_safari;\n }\n\n get preferred_video_extension()\n {\n return this.has_webm ? 'webm' : this.has_hvec ? 'hvec.mp4' : 'mp4';\n }\n\n get_version()\n {\n const ua = navigator.userAgent;\n let tem = '';\n let version = 0;\n\n let M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\\/))\\/?\\s*(\\d+)/i) || [];\n if (/trident/i.test(M[1]))\n {\n tem = /\\brv[ :]+(\\d+)/g.exec(ua) || [];\n version = 'IE ' + (tem[1] || '');\n }\n if (M[1] === 'Chrome')\n {\n tem = ua.match(/\\b(OPR|Edge)\\/(\\d+)/);\n if (tem != null) version = tem.slice(1).join(' ').replace('OPR', 'Opera');\n }\n M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];\n if ((tem = ua.match(/version\\/(\\d+)/i)) != null) M.splice(1, 1, tem[1]);\n version = M.join(' ');\n\n return version.split(' ')[1];\n }\n}\n\nconst browser = new Browser();\nexport { browser as Browser };\n","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\nexport { Validation };\n","import { Browser } from '../Browser';\r\nimport { Validation } from '../utilities/Validation';\r\n\r\nclass 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 if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n const cache = Browser.is_safari ? 'no-cache' : 'default';\r\n\r\n fetch(this.url, {\r\n method: 'GET', // *GET, POST, PUT, DELETE, etc.\r\n mode: 'cors', // no-cors, *cors, same-origin\r\n cache: cache, // *default, no-cache, reload, force-cache, only-if-cached\r\n credentials: 'same-origin', // include, *same-origin, omit\r\n redirect: 'follow' // manual, *follow, error\r\n })\r\n .then(this.on_progress.bind(this, resource_container))\r\n .catch(this.__on_error.bind(this));\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n\r\n async on_progress(resource_container, response)\r\n {\r\n const response_clone = response.clone();\r\n const reader = response.body.getReader();\r\n\r\n // Step 2: get total length\r\n const contentLength = +response.headers.get('Content-Length');\r\n\r\n // Step 3: read the data\r\n let receivedLength = 0; // received that many bytes at the moment\r\n\r\n while (true)\r\n {\r\n const { done, value } = await reader.read();\r\n\r\n if (done)\r\n {\r\n break;\r\n }\r\n\r\n receivedLength += value.length;\r\n\r\n this.__update_downloaded_bytes(receivedLength, contentLength);\r\n // console.log(`Received ${receivedLength} of ${contentLength}`);\r\n }\r\n\r\n this.on_preloaded_finished(resource_container, response_clone);\r\n }\r\n\r\n on_preloaded_finished(resource_container, response)\r\n {\r\n }\r\n\r\n __on_error(data)\r\n {\r\n console.error(data);\r\n }\r\n}\r\n\r\nexport { AbstractLoader };\r\n","import { Vector3 } from 'three';\n\nclass OMath\n{\n constructor()\n {}\n\n static linear_map(value,\n from_range_start_value,\n from_range_end_value,\n to_range_start_value,\n to_range_end_value)\n {\n return ((value - from_range_start_value) / (from_range_end_value - from_range_start_value)) * (to_range_end_value - to_range_start_value) + to_range_start_value;\n }\n\n static between(value, min, max)\n {\n return (value >= min && value <= max);\n }\n\n static mod(number, divisor)\n {\n return ((number % divisor) + divisor) % divisor;\n }\n\n static rgb_to_hex(rgb)\n {\n rgb.r = Math.round(rgb.r * 255).toString(16);\n rgb.g = Math.round(rgb.g * 255).toString(16);\n rgb.b = Math.round(rgb.b * 255).toString(16);\n\n if (rgb.r.length === 1)\n {\n rgb.r = '0' + rgb.r;\n }\n if (rgb.g.length === 1)\n {\n rgb.g = '0' + rgb.g;\n }\n if (rgb.b.length === 1)\n {\n rgb.b = '0' + rgb.b;\n }\n\n return '#' + rgb.r + rgb.g + rgb.b;\n }\n\n static project_points_on_plane(points, plane)\n {\n const projected_point = new Vector3();\n const points_on_plane = [];\n for (let i = 0; i < points.length; i++)\n {\n plane.projectPoint(points[i], projected_point);\n points_on_plane.push(projected_point.clone());\n }\n\n return points_on_plane;\n }\n\n static matrix4_lerp(from, to, target, t)\n {\n for (let i = 0; i < 16; i++)\n {\n target.elements[i] = this.lerp(from.elements[i], to.elements[i], t);\n }\n }\n\n static equals(x1, x2)\n {\n return Math.abs(x1 - x2) < 0.000001;\n }\n\n static lerp(x, y, t)\n {\n return (1 - t) * x + t * y;\n }\n\n static clamp(value, min, max)\n {\n return Math.max(min, Math.min(max, value));\n }\n\n static euclideanModulo(n, m)\n {\n return ((n % m) + m) % m;\n }\n\n static pingpong(x, length = 1)\n {\n return length - Math.abs(OMath.euclideanModulo(x, length * 2) - length);\n }\n\n static degToRad(degrees)\n {\n return degrees * (Math.PI / 180);\n }\n\n static radToDeg(radians)\n {\n return radians * (180 / Math.PI);\n }\n\n static deg_to_rad(degrees)\n {\n return degrees * (Math.PI / 180);\n }\n\n static rad_to_deg(radians)\n {\n return radians * (180 / Math.PI);\n }\n\n static perspective_divide(v)\n {\n v.x /= v.w;\n v.y /= v.w;\n v.z /= v.w;\n return v;\n }\n\n static points_average(points)\n {\n const center = points[0].clone();\n for (let i = 1; i < points.length; i++)\n {\n center.add(points[i]);\n }\n center.multiplyScalar(1 / points.length);\n return center;\n }\n\n static get_random_color()\n {\n const arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'a', 'b', 'c', 'd', 'e', 'f'];\n\n let col = '#';\n col += arr[Math.floor(Math.random() * 16)];\n col += arr[Math.floor(Math.random() * 16)];\n\n col += arr[Math.floor(Math.random() * 16)];\n col += arr[Math.floor(Math.random() * 16)];\n\n col += arr[Math.floor(Math.random() * 16)];\n col += arr[Math.floor(Math.random() * 16)];\n return col;\n }\n\n static saturate(x)\n {\n return OMath.clamp(x, 0, 1);\n }\n}\n\nexport { OMath };\n","\nimport { OMath } from '../utilities/OMath';\n\nclass ActionSequencer\n{\n constructor(context)\n {\n this.elapsed_time = -0.00001;\n this.playback_speed = 1;\n this.playing = false;\n\n this.action_events = [];\n this.context = context;\n\n this.initial_context = JSON.parse(JSON.stringify(context));\n\n this.tmp_t = 0;\n\n this.channels = {};\n\n const channel_names = Object.keys(context);\n for (let i = 0; i < channel_names.length; i++)\n {\n this.channels[channel_names[i]] = [];\n }\n\n this.duration = 0;\n }\n\n play()\n {\n this.playing = true;\n }\n\n stop()\n {\n this.playing = false;\n }\n\n reset()\n {\n this.elapsed_time = -0.00001;\n }\n\n skip()\n {\n const duration = this.get_duration();\n this.__play_clips(this.elapsed_time, duration + 0.0001);\n this.elapsed_time = duration;\n }\n\n update(delta_time)\n {\n if (this.playing)\n {\n this.__play_clips(this.elapsed_time, this.elapsed_time + delta_time * this.playback_speed);\n this.elapsed_time = this.elapsed_time + delta_time * this.playback_speed;\n }\n }\n\n set_progress(time)\n {\n this.elapsed_time = OMath.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 = OMath.clamp(t, 0, 1) * this.duration;\n this.__play_clips(this.elapsed_time, this.elapsed_time);\n }\n\n get_progress()\n {\n return OMath.clamp(this.elapsed_time / this.get_duration(), 0, 1);\n }\n\n is_finished()\n {\n return this.elapsed_time > this.get_duration();\n }\n\n add_action_event(trigger_time, action)\n {\n this.action_events.push({\n trigger_time: trigger_time,\n action: action\n });\n\n this.duration = Math.max(this.duration, trigger_time);\n }\n\n add_action_interpolator(from, to, interpolator, use_dynamic_from_value = false)\n {\n if (use_dynamic_from_value)\n {\n const keyframes = this.channels[interpolator.attribute_name];\n\n if (keyframes === undefined)\n {\n console.error(`${interpolator.attribute_name} missing in initial state data.`);\n }\n\n if (keyframes.length === 0)\n {\n interpolator.from = this.initial_context[interpolator.attribute_name];\n }\n else\n {\n interpolator.from = keyframes[keyframes.length - 1].interpolator.to;\n }\n }\n\n const keyframe = {\n from: from,\n to: to,\n interpolator: interpolator\n };\n\n this.duration = Math.max(this.duration, to);\n this.channels[interpolator.attribute_name].push(keyframe);\n }\n\n get_current_target_value(name)\n {\n const keyframe = this.__get_current_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_current_starting_value(name)\n {\n const keyframe = this.__get_current_keyframe(name, this.elapsed_time);\n\n return keyframe.interpolator.evaluate(0);\n }\n\n get_current_progress(name)\n {\n const keyframe = this.__get_current_keyframe(name, this.elapsed_time);\n const t = this.__linear_map_01(this.elapsed_time, keyframe.from, keyframe.to);\n\n return keyframe.interpolator.easing_function(t);\n }\n\n get_duration()\n {\n return this.duration;\n }\n\n __play_clips(from, to)\n {\n for (let i = 0; i < this.action_events.length; i++)\n {\n if (this.action_events[i].trigger_time > from - Number.EPSILON &&\n this.action_events[i].trigger_time < to + Number.EPSILON)\n {\n // console.log(\"Play event: \" + this.action_events[i].action.constructor.name + \" at \"+ this.action_events[i].trigger_time);\n this.action_events[i].action.trigger();\n }\n }\n const channel_names = Object.keys(this.initial_context);\n\n for (let i = 0; i < channel_names.length; i++)\n {\n const name = channel_names[i];\n const keyframe = this.__get_current_keyframe(name, from);\n\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\n return keyframe.interpolator.evaluate(OMath.clamp(this.tmp_t, 0, 1));\n }\n\n get_keyframes(channel_name)\n {\n return this.channels[channel_name];\n }\n\n is_channel_redefined(channel_name)\n {\n for (let i = 0; i < this.channels[channel_name].length; i++)\n {\n const keyframe = this.channels[channel_name][i];\n\n if (keyframe.interpolator.initial)\n {\n return false;\n }\n }\n\n return true;\n }\n\n __linear_map_01(value,\n from_range_start_value,\n from_range_end_value)\n {\n return OMath.saturate(((value - from_range_start_value) / (from_range_end_value - from_range_start_value)) * (1 - 0) + 0);\n }\n\n __get_current_keyframe(channel_name, time)\n {\n let current = undefined;\n\n const keyframes = this.channels[channel_name];\n\n for (let i = 0; i < keyframes.length; i++)\n {\n const keyframe = keyframes[i];\n\n if (time >= keyframe.from && time <= keyframe.to)\n {\n current = keyframe;\n return current;\n }\n }\n\n let min = Infinity;\n\n for (let i = 0; i < keyframes.length; i++)\n {\n const keyframe = keyframes[i];\n const distance = Math.abs(keyframe.to - time);\n\n if (distance < min)\n {\n current = keyframe;\n min = distance;\n }\n }\n\n return current;\n }\n}\n\nexport { ActionSequencer };\n","class EasingFunctions\n{\n constructor()\n {}\n\n static linear(x)\n {\n return x;\n }\n\n static triangular(x)\n {\n return 1 - Math.abs((x * 2) % (1 * 2) - 1);\n }\n\n static ease_in_sine(x)\n {\n return 1 - Math.cos(x * 3.1415926 / 2);\n }\n\n static ease_out_sine(x)\n {\n return Math.sin(x * 3.1415926 / 2);\n }\n\n static ease_in_out_sine(x)\n {\n return -(Math.cos(3.1415926 * x) - 1) / 2;\n }\n\n static ease_in_cubic(x)\n {\n return x * x * x;\n }\n\n static ease_out_cubic(x)\n {\n return 1 - Math.pow(1 - x, 3);\n }\n\n static 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 static ease_in_quad(x)\n {\n return x * x;\n }\n\n static ease_out_quad(x)\n {\n return 1 - (1 - x) * (1 - x);\n }\n\n static 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 static ease_in_quart(x)\n {\n return x * x * x * x;\n }\n\n static ease_out_quart(x)\n {\n return 1 - Math.pow(1 - x, 4);\n }\n\n static 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 static ease_in_quint(x)\n {\n return x * x * x * x * x;\n }\n\n static ease_out_quint(x)\n {\n return 1 - Math.pow(1 - x, 5);\n }\n\n static 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 static ease_in_expo(x)\n {\n return x === 0 ? 0 : Math.pow(2, 10 * x - 10);\n }\n\n static ease_out_expo(x)\n {\n return x === 1 ? 1 : 1 - Math.pow(2, -10 * x);\n }\n\n static ease_in_out_expo(x)\n {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? Math.pow(2, 20 * x - 10) / 2\n : (2 - Math.pow(2, -20 * x + 10)) / 2;\n }\n\n static ease_in_circ(x)\n {\n return 1 - Math.sqrt(1 - Math.pow(x, 2));\n }\n\n static ease_out_circ(x)\n {\n return Math.sqrt(1 - Math.pow(x - 1, 2));\n }\n\n static 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 static ease_in_back(x)\n {\n return 2.7015 * x * x * x - 1.7015 * x * x;\n }\n\n static 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 static 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 static 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 static ease_out_elastic(x)\n {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * 2.0943950) + 1;\n }\n\n static ease_in_out_elastic(x)\n {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? -(Math.pow(2, 20 * x - 10) * Math.sin((20 * x - 11.125) * 1.3962633)) / 2\n : Math.pow(2, -20 * x + 10) * Math.sin((20 * x - 11.125) * 1.3962633) / 2 + 1;\n }\n\n static ease_in_bounce(x)\n {\n return 1 - this.ease_out_bounce(1 - x);\n }\n\n static 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 static 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 static 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 { EasingFunctions };\n","import { EasingFunctions } from '../utilities/EasingFunctions';\n\nclass 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\nexport { ActionInterpolator };\n","import { ActionInterpolator } from './ActionInterpolator';\nimport { OMath } from '../utilities/OMath';\n\nclass NumberInterpolator extends ActionInterpolator\n{\n constructor(attribute_name, from = 0, to = 1, initial = false, easing_function = 'linear')\n {\n super(easing_function);\n\n this.attribute_name = attribute_name;\n this.from = from;\n this.to = to;\n this.initial = initial;\n }\n\n update(context, t)\n {\n context[this.attribute_name] = OMath.lerp(this.from, this.to, this.easing_function(t));\n }\n\n evaluate(t)\n {\n return OMath.lerp(this.from, this.to, this.easing_function(t));\n }\n}\n\nexport { NumberInterpolator };\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\nconst view_context = new ViewContext();\nexport { view_context as ViewContext };\n","import { ViewContext } from '../view_components/ViewContext';\n\nclass 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\nexport { ActionEvent };\n","class DrawIOAnimationSheet\n{\n constructor()\n {\n\n }\n\n parse(xml_document)\n {\n const doc = new DOMParser().parseFromString(xml_document, 'text/xml');\n\n const animation_nodes = doc.querySelectorAll('mxGeometry');\n\n const animation_tracks = [];\n const triggers = [];\n\n for (let i = 0; i < animation_nodes.length; i++)\n {\n const node = animation_nodes[i];\n const parent_node = node.parentElement;\n const data = parent_node.getAttribute('value');\n\n const x_pos = this.get_node_x_position(node);\n\n const from = x_pos / 100;\n const duration = parseFloat(node.getAttribute('width')) / 100;\n\n // is trigger\n if (parent_node.getAttribute('style').includes('rhombus;'))\n {\n const split_data = data.split('.');\n const trigger_name = split_data[0];\n const trigger_method = split_data[1];\n\n triggers.push({\n name: trigger_name,\n method: trigger_method,\n at_time: from + duration * 0.5\n });\n }\n\n const valid_element = parent_node.getAttribute('style').includes('rounded=0;') &&\n !parent_node.getAttribute('style').includes('text;');\n\n if (valid_element && data !== '' && !data.includes(' '))\n {\n const split_data = data.split('=');\n\n const attribute_name = split_data[0];\n\n const value_data = split_data[1].split('--');\n const to_value = parseFloat(value_data[0]);\n const easing_function = value_data[1];\n\n if (split_data.length !== 2)\n {\n console.error('DrawIO data is malformed:', data);\n }\n\n if (value_data.length !== 2)\n {\n console.error('DrawIO data is malformed:', data);\n }\n\n animation_tracks.push({\n attribute_name: attribute_name,\n from_time: from,\n to_time: from + duration,\n to_value: to_value,\n easing_function: easing_function\n });\n }\n }\n\n animation_tracks.sort((a, b) =>\n {\n return a.from_time - b.from_time;\n });\n return {\n animation_tracks: animation_tracks,\n triggers: triggers\n };\n }\n\n get_node_x_position(node)\n {\n const x_pos = node.getAttribute('x');\n return x_pos === null ? 0 : parseFloat(x_pos);\n }\n}\n\nexport { DrawIOAnimationSheet };\n","import { ActionSequencer } from '../../action_sequencer/ActionSequencer';\nimport { NumberInterpolator } from '../../action_sequencer/NumberInterpolator';\nimport { ActionEvent } from '../../action_sequencer/ActionEvent';\nimport { DrawIOAnimationSheet } from './DrawIOAnimationSheet';\n\nclass ActionSequencerBuilder\n{\n constructor(default_state_data)\n {\n this.default_state_data = default_state_data;\n }\n\n from_animation_sheet(animation_data, current_context, initial_context)\n {\n initial_context = initial_context || this.default_state_data;\n const tracks = animation_data.animation_tracks;\n const triggers = animation_data.triggers;\n\n const initial_tracks = this.state_to_tracks(this.default_state_data, this.get_longest_time(animation_data.animation_tracks));\n\n for (let i = 0; i < initial_tracks.length; i++)\n {\n if (tracks.find(element => element.attribute_name === initial_tracks[i].attribute_name) === undefined)\n {\n tracks.push(initial_tracks[i]);\n }\n }\n\n const sequencer = new ActionSequencer(current_context);\n\n for (let i = 0; i < tracks.length; i++)\n {\n const t = tracks[i];\n const interpolator = new NumberInterpolator(\n t.attribute_name,\n current_context[t.attribute_name],\n t.to_value,\n t.initial,\n t.easing_function\n );\n\n sequencer.add_action_interpolator(t.from_time, t.to_time, interpolator, true);\n }\n\n for (let i = 0; i < triggers.length; i++)\n {\n const t = triggers[i];\n const action_event = new ActionEvent(t.name, t.method);\n sequencer.add_action_event(t.at_time, action_event);\n }\n\n return sequencer;\n }\n\n state_to_tracks(state, longest_time)\n {\n const tracks = [];\n\n const keys = Object.keys(state);\n\n for (let i = 0; i < keys.length; i++)\n {\n tracks.push({\n attribute_name: keys[i],\n from_time: 0,\n to_time: longest_time < 1 ? longest_time : 1,\n to_value: state[keys[i]],\n initial: true,\n easing_function: 'ease_in_out_cubic'\n });\n }\n\n return tracks;\n }\n\n from_draw_io(xml, context)\n {\n const transition_data = (new DrawIOAnimationSheet()).parse(xml);\n const tracks = transition_data.animation_tracks;\n const triggers = transition_data.triggers;\n const sequencer = new ActionSequencer(context);\n\n for (let i = 0; i < tracks.length; i++)\n {\n const t = tracks[i];\n const interpolator = new NumberInterpolator(\n t.attribute_name,\n context[t.attribute_name],\n t.to_value,\n t.initial,\n t.easing_function\n );\n\n sequencer.add_action_interpolator(t.from_time, t.to_time, interpolator, true);\n }\n\n for (let i = 0; i < triggers.length; i++)\n {\n const t = triggers[i];\n const action_event = new ActionEvent(t.name, t.method);\n sequencer.add_action_event(t.at_time, action_event);\n }\n\n return sequencer;\n }\n\n get_longest_time(tracks)\n {\n let longest_time = -1;\n\n for (let i = 0; i < tracks.length; i++)\n {\n const track = tracks[i];\n\n const track_time = track.to_time;\n\n longest_time = track_time > longest_time ? track_time : longest_time;\n }\n\n return longest_time;\n }\n}\n\nexport { ActionSequencerBuilder };\n","class EventManager\n{\n init()\n {\n this.queue = {};\n\n this.zoom_changed_evt = 'zoom_changed';\n this.store_clickd_evt = 'store_clicked';\n this.point_selected_evt = 'point_selected';\n this.config_changed = 'config_changed';\n\n this.path_substep_completed = 'path_substep_completed';\n this.path_completed = 'path_completed';\n this.go_to_store_requested_evt = 'go_to_store_requested';\n\n this.resource_loaded_evt = 'resource_loaded';\n this.service_clicked_evt = 'service_clicked';\n this.unit_pos_updated_evt = 'unit_position_updated';\n\n this.floor_changed_evt = 'floor_changed';\n\n this.on_enter_floor_navigation = 'on_enter_floor_navigation';\n this.on_exit_floor_navigation = 'on_exit_floor_navigation';\n\n this.on_enter_floor_selection = 'on_enter_floor_selection';\n this.on_exit_floor_selection = 'on_exit_floor_selection';\n\n this.on_enter_outside_navigation = 'on_enter_outside_navigation';\n this.on_exit_outside_navigation = 'on_exit_outside_navigation';\n\n this.step_selected_evt = 'step_selected';\n }\n\n fire(event, payload)\n {\n const queue = this.queue[event];\n\n if (queue === undefined)\n {\n return;\n }\n let i = queue.length;\n while (i--)\n {\n queue[i](payload);\n }\n }\n\n on(event, callback)\n {\n if (typeof this.queue[event] === 'undefined')\n {\n this.queue[event] = [];\n }\n\n this.queue[event].push(callback);\n }\n\n fire_zoom_changed(zoom)\n {\n this.fire(this.zoom_changed_evt, zoom);\n }\n\n fire_store_selected(store_id)\n {\n this.fire(this.store_clickd_evt, store_id);\n }\n\n fire_point_selected(hit_data)\n {\n this.fire(this.point_selected_evt, hit_data);\n }\n\n fire_config_changed()\n {\n this.fire(this.config_changed);\n }\n\n fire_path_substep_completed(step_number)\n {\n this.fire(this.path_substep_completed, step_number);\n }\n\n fire_path_completed()\n {\n this.fire(this.path_completed);\n }\n\n fire_step_selected(step_index)\n {\n this.fire(this.step_selected_evt, step_index);\n }\n\n fire_go_to_store_requested(store_id)\n {\n this.fire(this.go_to_store_requested_evt, store_id);\n }\n\n fire_resource_loaded(resource)\n {\n this.fire(this.resource_loaded_evt, resource);\n }\n\n fire_service_clicked(service)\n {\n this.fire(this.service_clicked_evt, service);\n }\n\n fire_unit_position_updated(unit_data)\n {\n this.fire(this.unit_pos_updated_evt, unit_data);\n }\n\n fire_floor_switched(floor_id)\n {\n this.fire(this.floor_changed_evt, floor_id);\n }\n\n fire_on_enter_floor_navigation(state)\n {\n this.fire(this.on_enter_floor_navigation, state);\n }\n\n fire_on_exit_floor_navigation(state)\n {\n this.fire(this.on_exit_floor_navigation, state);\n }\n\n fire_on_enter_floor_selection(state)\n {\n this.fire(this.on_enter_floor_selection, state);\n }\n\n fire_on_exit_floor_selection(state)\n {\n this.fire(this.on_exit_floor_selection, state);\n }\n\n fire_on_enter_outside_navigation(state)\n {\n this.fire(this.on_enter_outside_navigation, state);\n }\n\n fire_on_exit_outside_navigation(state)\n {\n this.fire(this.on_exit_outside_navigation, state);\n }\n}\n\nconst event_manager = new EventManager();\nexport { event_manager as 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\nconst resource_container = new ResourceContainer();\nexport { resource_container as ResourceContainer };\n","class HTMLUtilities\n{\n static load_images(container)\n {\n const images = container.querySelectorAll('img');\n\n for (let i = 0; i < images.length; i++)\n {\n const image = images[i];\n\n if (image.dataset.src)\n {\n image.src = image.dataset.src;\n }\n }\n\n const image_objects = container.querySelectorAll('object');\n\n for (let i = 0; i < image_objects.length; i++)\n {\n const image_object = image_objects[i];\n\n if (image_object.dataset.src)\n {\n image_object.data = image_object.dataset.src;\n }\n }\n }\n\n static load_videos(container)\n {\n const videos = container.querySelectorAll('video');\n\n for (let i = 0; i < videos.length; i++)\n {\n const video = videos[i];\n\n if (video.dataset.src)\n {\n video.src = video.dataset.src;\n }\n }\n }\n}\n\nexport { HTMLUtilities };\n","import { ActionSequencerBuilder } from './ActionSequencerBuilder';\n\nclass TransitionTable\n{\n constructor()\n {\n this.transitions = [];\n this.default_state_data = {};\n }\n\n get(from_state_name, to_state_name, current_context)\n {\n for (let i = 0; i < this.transitions.length; i++)\n {\n if (this.transitions[i].from === from_state_name && this.transitions[i].to === to_state_name)\n {\n const action_sequencer = new ActionSequencerBuilder(this.default_state_data).from_animation_sheet(this.transitions[i].data, current_context);\n return action_sequencer;\n }\n }\n\n for (let i = 0; i < this.transitions.length; i++)\n {\n if (this.transitions[i].to === to_state_name && this.transitions[i].from === undefined)\n {\n const action_sequencer = new ActionSequencerBuilder(this.default_state_data).from_animation_sheet(this.transitions[i].data, current_context);\n return action_sequencer;\n }\n }\n\n console.error('TransitionTable.get no data found for: ', from_state_name, to_state_name);\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_default_state_data(default_state_data)\n {\n this.default_state_data = default_state_data;\n }\n}\n\nexport { TransitionTable };\n","import { Vector2 } from 'three';\nimport { Clock } from 'three';\n\nclass Time\n{\n constructor()\n {\n this.delta_buffer = [0.016, 0.016, 0.016, 0.016, 0.016, 0.016, 0.016, 0.016, 0.016, 0.016];\n }\n\n init()\n {\n this.___time = new Clock();\n this.__raw_delta_time = 0;\n this.__elapsed_time = 0;\n this.__allocated_time = new Vector2(0, 0);\n\n 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.__raw_delta_time = this.___time.getDelta();\n this.__elapsed_time = this.___time.getElapsedTime();\n\n this.delta_buffer.shift();\n this.delta_buffer.push(this.__raw_delta_time < 0.32 ? this.__raw_delta_time : 0.032);\n\n this.__calculate_delta_time();\n }\n\n __calculate_delta_time()\n {\n this.delta_time = 0;\n\n for (let i = 0; i < this.delta_buffer.length; i++)\n {\n this.delta_time += this.delta_buffer[i];\n }\n\n this.delta_time = this.delta_time / this.delta_buffer.length;\n }\n}\n\nconst time = new Time();\nexport { time as Time };\n","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\nexport { ViewState };\n","import { Time } from '../../Time';\nimport { ViewState } from '../ViewState';\n\nclass ViewStateTransitionHandler\n{\n constructor(transition_table)\n {\n this.last_state = new ViewState();\n this.current_state = new ViewState();\n\n this.default_state_data = {};\n this.current_state_data = {};\n\n this.transition_table = transition_table;\n\n this.transitioning = false;\n }\n\n go_to_state(state, skip = false)\n {\n if (this.transitioning)\n {\n this.__exit_last_state();\n }\n\n this.last_state = this.current_state;\n this.current_state = state;\n\n this.last_state.before_exit();\n this.current_state.show();\n\n this.action_sequencer = this.transition_table.get(this.last_state.name, this.current_state.name, this.current_state_data);\n this.current_state.before_enter();\n\n this.action_sequencer.play();\n\n this.transitioning = true;\n\n if (skip)\n {\n this.action_sequencer.skip();\n this.update();\n }\n }\n\n update()\n {\n if (this.transitioning)\n {\n this.__update_transitions();\n\n if (this.action_sequencer.is_finished())\n {\n this.transitioning = false;\n\n this.__update_transitions();\n\n this.__exit_last_state();\n\n this.current_state.on_enter();\n }\n }\n else\n {\n this.current_state.update();\n }\n }\n\n set_state(state)\n {\n this.current_state = state;\n }\n\n set_default_state_data(default_state_data)\n {\n Object.assign(this.default_state_data, default_state_data);\n Object.assign(this.current_state_data, default_state_data);\n }\n\n __update_transitions()\n {\n this.action_sequencer.update(Time.delta_time);\n this.last_state.update_exit_transition(this.current_state_data, this.action_sequencer.get_progress(), this.action_sequencer);\n this.current_state.update_enter_transition(this.current_state_data, this.action_sequencer.get_progress(), this.action_sequencer);\n }\n\n __exit_last_state()\n {\n if (this.last_state.name !== this.current_state.name)\n {\n this.last_state.hide();\n }\n\n this.last_state.on_exit();\n }\n}\n\nexport { ViewStateTransitionHandler };\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 this.view_change_subscribers = [];\n\n this.browser_title_suffix = '';\n }\n\n update()\n {\n this.transition_handler.update();\n\n this.__set_views_opacities();\n }\n\n go_to_view(view_name, change_url = true, skip = false)\n {\n const v = this.get(view_name);\n this.transition_handler.go_to_state(v, skip);\n\n if (change_url)\n {\n this.__change_browser_url(v.url);\n this.__change_browser_title(v.url);\n }\n\n this.notify_view_change(view_name);\n }\n\n go_to_scene(scene_name, change_url = false, skip = false)\n {\n const next_view = this.get(scene_name);\n const transition_view = this.get('transition');\n\n transition_view.set_next_view(next_view);\n this.go_to_view(transition_view.name, change_url, skip);\n }\n\n subscribe_to_view_change(subscriber)\n {\n this.view_change_subscribers.push(subscriber);\n }\n\n notify_view_change(view_name)\n {\n for (let i = 0; i < this.view_change_subscribers.length; i++)\n {\n const subscriber = this.view_change_subscribers[i];\n subscriber.on_view_change(view_name);\n }\n }\n\n register_view(view)\n {\n this.views.push(view);\n }\n\n has_view(view_name)\n {\n for (let i = 0; i < this.views.length; i++)\n {\n if (this.views[i].name === view_name)\n {\n return true;\n }\n }\n return false;\n }\n\n add_transitions(transitions)\n {\n this.transition_table.add_transitions(transitions);\n }\n\n set_transitions(transitions)\n {\n this.transition_table.set_transitions(transitions);\n }\n\n set_view(view_name)\n {\n const view = this.get(view_name);\n\n this.transition_handler.set_state(view);\n }\n\n set_browser_title_suffix(title_suffix)\n {\n this.browser_title_suffix = title_suffix;\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_default_state_data(default_state_data)\n {\n this.transition_table.set_default_state_data(default_state_data);\n this.transition_handler.set_default_state_data(default_state_data);\n }\n\n __change_browser_url(url)\n {\n window.history.pushState('', '', url);\n }\n\n __change_browser_title(name)\n {\n const title = this.__capitalize(name);\n\n document.title = title ? `${title} | ${this.browser_title_suffix}` : this.browser_title_suffix;\n }\n\n __set_views_opacities()\n {\n for (let i = 0; i < this.views.length; i++)\n {\n this.views[i].set_opacity(this.transition_handler.current_state_data);\n }\n }\n\n __capitalize(string)\n {\n let aux_string = string.toUpperCase().replace('/', '');\n aux_string = this.__snake_to_whitespace(aux_string);\n\n return aux_string;\n }\n\n __snake_to_whitespace(string)\n {\n return string.replace(\n /([-_][A-Z])/g,\n (group) => group\n .replace('-', ' ')\n .replace('_', ' ')\n );\n }\n}\n\nconst view_manager = new ViewManager();\nexport { view_manager as ViewManager };\n","import { ResourceContainer } from '../ResourceContainer';\nimport { HTMLUtilities } from '../utilities/HTMLUtilities';\nimport { ViewManager } from './ViewManager';\nimport { ViewState } from './ViewState';\n\nclass 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 = ResourceContainer.get(`${name}_data`);\n\n transition_data = transition_data || {\n animation_tracks: [],\n triggers: []\n };\n\n const transitions = [\n {\n to: name,\n data: transition_data\n }\n ];\n\n ViewManager.register_view(this);\n ViewManager.add_transitions(transitions);\n }\n\n show()\n {\n this.container.classList.add('before_enter');\n this.container.classList.remove('before_exit');\n this.container.classList.remove('hidden');\n }\n\n on_enter()\n {\n this.container.classList.remove('before_enter');\n this.container.classList.remove('before_exit');\n this.container.classList.remove('hidden');\n }\n\n before_exit()\n {\n this.container.classList.add('before_exit');\n this.container.classList.remove('before_enter');\n this.container.classList.remove('hidden');\n }\n\n hide()\n {\n this.container.classList.add('hidden');\n this.container.classList.remove('before_enter');\n this.container.classList.remove('before_exit');\n }\n\n load_html_images()\n {\n HTMLUtilities.load_images(this.container);\n }\n\n load_html_videos()\n {\n HTMLUtilities.load_videos(this.container);\n }\n\n set_opacity(current_state_data)\n {\n this.container.style.opacity = current_state_data[`${this.name}_opacity`];\n }\n}\n\nexport { ApplicationView };\n","class BaseApplication\n{\n on_post_start()\n {}\n\n on_enter()\n {}\n\n on_exit()\n {}\n\n update()\n {}\n\n on_post_render()\n {}\n\n on_pre_render()\n {}\n\n on_frame_end()\n {}\n}\n\nexport { BaseApplication };\n","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\nexport { BaseRender };\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\nclass 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\nexport { BaseShaderMaterial };\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\nclass 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\nexport { BlitMaterial };\n","import { BlitMaterial } from './BlitMaterial';\n\nimport frag from '../shaders/add/add.frag';\n\nclass 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\nexport { AddMaterial };\n","import { BlitMaterial } from './BlitMaterial';\n\nimport frag from '../shaders/gaussian_blur/unreal_bloom_compose.frag';\n\nimport { Color } from 'three';\nclass UnrealBloomComposeMaterial extends BlitMaterial\n{\n constructor(nMips)\n {\n super(frag, undefined, {\n NUM_MIPS: nMips\n });\n this.uniforms._MainTex = { value: undefined };\n this.uniforms._BlurredTex = { value: undefined };\n this.uniforms._BloomStrength = { value: 1 };\n\n this.uniforms.blurTexture1 = { value: null };\n this.uniforms.blurTexture2 = { value: null };\n this.uniforms.blurTexture3 = { value: null };\n this.uniforms.blurTexture4 = { value: null };\n this.uniforms.blurTexture5 = { value: null };\n\n this.uniforms.bloomStrength = { value: 1.0 };\n this.uniforms.bloomFactors = { value: [1.0, 0.8, 0.6, 0.4, 0.2] };\n this.uniforms.bloomRadius = { value: 0.0 };\n\n const bloomTintColors = [\n new Color('#FFFFFF'),\n new Color('#FFFFFF'),\n new Color('#FFFFFF'),\n new Color('#FFFFFF'),\n new Color('#FFFFFF')\n ];\n\n this.uniforms.bloomTintColors = { value: bloomTintColors };\n }\n\n set_RT_0(rt)\n {\n this.uniforms.blurTexture1.value = rt;\n }\n\n set_RT_1(rt)\n {\n this.uniforms.blurTexture2.value = rt;\n }\n\n set_RT_2(rt)\n {\n this.uniforms.blurTexture3.value = rt;\n }\n\n set_RT_3(rt)\n {\n this.uniforms.blurTexture4.value = rt;\n }\n\n set_RT_4(rt)\n {\n this.uniforms.blurTexture5.value = rt;\n }\n\n set_bloom_strength(value)\n {\n this.uniforms.bloomStrength.value = value;\n }\n\n set_bloom_radius(value)\n {\n this.uniforms.bloomRadius.value = value;\n }\n\n set_tint_color_0(col_string)\n {\n this.uniforms.bloomTintColors.value[0].set(col_string);\n }\n\n set_tint_color_1(col_string)\n {\n this.uniforms.bloomTintColors.value[1].set(col_string);\n }\n\n set_tint_color_2(col_string)\n {\n this.uniforms.bloomTintColors.value[2].set(col_string);\n }\n\n set_tint_color_3(col_string)\n {\n this.uniforms.bloomTintColors.value[3].set(col_string);\n }\n\n set_tint_color_4(col_string)\n {\n this.uniforms.bloomTintColors.value[4].set(col_string);\n }\n}\n\nexport { UnrealBloomComposeMaterial };\n","class CameraManager\n{\n init()\n {\n this._current = undefined;\n // VR Spectator\n this._spectator = 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 set spectator(camera)\n {\n this._spectator = camera;\n }\n\n get spectator()\n {\n return this._spectator;\n }\n}\n\nconst camera_manager = new CameraManager();\nexport { camera_manager as 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\nconst capabilities = new Capabilities();\nexport { capabilities as Capabilities };\n","import { CanvasTexture } from 'three';\nimport { Vector2 } from 'three';\nimport { UVMapping } from 'three';\nimport { ClampToEdgeWrapping } from 'three';\nimport { NearestFilter } from 'three';\n\nclass CanvasDrawer\n{\n constructor(uses_dynamic_font)\n {\n this.uses_dynamic_font = uses_dynamic_font;\n this.__textHeight = null;\n\n this.canvas = document.createElement('canvas');\n this.ctx = this.canvas.getContext('2d');\n }\n\n getFontHeight(fontStyle = 'Arial')\n {\n if (this.__textHeight == null || this.uses_dynamic_font)\n {\n const body = document.getElementsByTagName('body')[0];\n const dummy = document.createElement('div');\n const dummyText = document.createTextNode('MÉqgOLAKTAL');\n dummy.appendChild(dummyText);\n dummy.setAttribute('style', `font:${fontStyle};position:absolute;top:0;left:0`);\n body.appendChild(dummy);\n this.__textHeight = dummy.offsetHeight;\n body.removeChild(dummy);\n }\n return this.__textHeight;\n }\n\n get_text_size(text, font = '24px Arial')\n {\n const size = new Vector2();\n this.ctx.font = font;\n size.x = Math.ceil(this.ctx.measureText(text).width);\n size.y = Math.ceil(this.getFontHeight(font));\n return size;\n }\n\n draw_canvas(text, ctxOptions = {})\n {\n ctxOptions.font = ctxOptions.font || '24px Arial';\n ctxOptions.font_color = ctxOptions.font_color || '#000000';\n\n this.__draw(text, ctxOptions, this.canvas, this.ctx);\n return this.canvas;\n }\n\n draw_on_texture(text, ctxOptions)\n {\n const canvas = this.draw_canvas(text, ctxOptions);\n const canvas_texture = new CanvasTexture(canvas, UVMapping,\n ClampToEdgeWrapping,\n ClampToEdgeWrapping,\n NearestFilter,\n NearestFilter);\n canvas_texture.generateMipMaps = false;\n canvas_texture.needsUpdate = true;\n\n return canvas_texture;\n }\n\n __draw(text, ctxOptions)\n {}\n\n roundRect(ctx, x, y, width, height, radius, fill, stroke)\n {\n if (typeof stroke === 'undefined')\n {\n stroke = true;\n }\n if (typeof radius === 'undefined')\n {\n radius = 5;\n }\n if (typeof radius === 'number')\n {\n radius = { tl: radius, tr: radius, br: radius, bl: radius };\n }\n else\n {\n const defaultRadius = { tl: 0, tr: 0, br: 0, bl: 0 };\n for (const side in defaultRadius)\n {\n radius[side] = radius[side] || defaultRadius[side];\n }\n }\n ctx.beginPath();\n ctx.moveTo(x + radius.tl, y);\n ctx.lineTo(x + width - radius.tr, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + radius.tr);\n ctx.lineTo(x + width, y + height - radius.br);\n ctx.quadraticCurveTo(x + width, y + height, x + width - radius.br, y + height);\n ctx.lineTo(x + radius.bl, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - radius.bl);\n ctx.lineTo(x, y + radius.tl);\n ctx.quadraticCurveTo(x, y, x + radius.tl, y);\n ctx.closePath();\n if (fill)\n {\n ctx.fill();\n }\n if (stroke)\n {\n ctx.stroke();\n }\n }\n}\n\nexport { CanvasDrawer };\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\nconst configuration = new Configuration();\nexport { configuration as Configuration };\n","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\nexport { Idle };\n","import { Time } from '../../Time';\nimport { Idle } from './Idle';\n\nimport { OMath } from '../../utilities/OMath';\nclass 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 = OMath.clamp(this.easing_function_t, 0, 1);\n\n animator.set_property_value(OMath.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\nexport { Animating };\n","import { Animating } from './css_animator_states/Animating';\nimport { Idle } from './css_animator_states/Idle';\nimport { EasingFunctions } from '../utilities/EasingFunctions';\n\nclass 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\nexport { CSSAnimator };\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\nclass 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\nexport { AxisHelper };\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\nconst scene_manager = new SceneManager();\nexport { scene_manager as SceneManager };\n","\nimport { Vector3, Mesh } from 'three';\nimport { BoxGeometry } from 'three';\nimport { MeshBasicMaterial } from 'three';\n\nclass Cube extends Mesh\n{\n constructor(size, segments, color)\n {\n size = size || new Vector3(1, 1, 1);\n segments = segments || new Vector3(1, 1, 1);\n color = color || 0xff0000;\n const geometry = new BoxGeometry(size.x, size.y, size.z, segments.x, segments.y, segments.z);\n const material = new MeshBasicMaterial({ color: color });\n super(geometry, material);\n }\n}\n\nexport { Cube };\n","import { Mesh } from 'three';\nimport { SphereBufferGeometry } from 'three';\nimport { MeshBasicMaterial } from 'three';\n\nclass Sphere extends Mesh\n{\n constructor(radius, color)\n {\n color = color || '#FF0000';\n radius = radius || 1;\n const geometry = new SphereBufferGeometry(radius, 64, 64);\n const material = new MeshBasicMaterial({ color: color });\n super(geometry, material);\n }\n}\n\nexport { Sphere };\n","import { CylinderBufferGeometry } from 'three';\nimport { ConeBufferGeometry } from 'three';\nimport { MeshBasicMaterial } from 'three';\nimport { Vector3, Mesh } from 'three';\n\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\n\nclass Arrow extends Mesh\n{\n constructor(color, length, dir)\n {\n color = color || '#FF0000';\n length = length || 1;\n\n const cone_height = 0.4;\n const cylinder_height = length - cone_height;\n const cylinder_geo = new CylinderBufferGeometry(0.01, 0.01, cylinder_height, 32);\n cylinder_geo.translate(0, cylinder_height / 2, 0);\n\n const cone_geometry = new ConeBufferGeometry(0.1, cone_height, 32);\n cone_geometry.translate(0, cylinder_height + cone_height / 2, 0);\n\n const buffer_geometry = BufferGeometryUtils.mergeBufferGeometries([cylinder_geo, cone_geometry]);\n buffer_geometry.rotateX(3.14 / 2);\n\n const material = new MeshBasicMaterial({ color: color });\n super(buffer_geometry, material);\n\n if (dir)\n {\n this.quaternion.setFromUnitVectors(new Vector3(0, 0, 1), dir);\n }\n\n this._dir = dir;\n }\n\n set dir(dir)\n {\n this.quaternion.setFromUnitVectors(new Vector3(0, 0, 1), dir);\n this._dir = dir;\n }\n\n get dir()\n {\n return this._dir;\n }\n\n set length(value)\n {\n this.scale.z = value;\n }\n\n get length()\n {\n return this.scale.z;\n }\n}\n\nexport { Arrow };\n","import { Vector2 } from 'three';\n\nclass OScreen\n{\n init()\n {\n this.width = 1;\n this.height = 1;\n\n this.position = new Vector2();\n\n this.render_width = 1;\n this.render_height = 1;\n this.width_height = new Vector2(this.width, this.height);\n\n this.dpr = 1;\n this.pixel_size = new Vector2(1 / this.width, 1 / this.height);\n }\n\n update_position(x, y)\n {\n this.position.set(x, y);\n }\n\n update()\n {\n this.size_changed = false;\n }\n\n update_size(width, height)\n {\n this.width = width;\n this.height = height;\n\n this.pixel_size = new Vector2(1 / this.width, 1 / this.height);\n\n this.width_height.x = width;\n this.width_height.y = height;\n\n this.render_width = width * this.dpr;\n this.render_height = height * this.dpr;\n\n this.size_changed = true;\n }\n\n apply_pixel_density_v2(vector2)\n {\n vector2.multiplyScalar(1 / this.dpr);\n\n return vector2;\n }\n\n apply_pixel_density(value)\n {\n return value * (1 / this.dpr);\n }\n\n get_pixel_size()\n {\n return this.pixel_size;\n }\n\n get aspect_ratio()\n {\n return this.width / this.height;\n }\n\n get portrait()\n {\n return this.width < this.height;\n }\n}\n\nconst oscreen = new OScreen();\nexport { oscreen as OScreen };\n","import { BaseShaderMaterial } from './BaseShaderMaterial';\nimport { Vector2 } from 'three';\nclass ScreenSpaceTextureMaterial extends BaseShaderMaterial\n{\n constructor(x, y, w, h)\n {\n const vert = `\n uniform vec2 _ScreenSpacePosition;\n uniform vec2 _ScreenSize;\n uniform vec2 _TextureSize;\n varying vec2 vUv;\n void main()\n {\n vec2 pos = uv * vec2(_TextureSize.x / _ScreenSize.x, _TextureSize.y / _ScreenSize.y);\n pos += vec2(_ScreenSpacePosition.x / _ScreenSize.x, _ScreenSpacePosition.y / _ScreenSize.y);\n\n pos.x = pos.x * 2.0 - 1.0;\n pos.y = pos.y * 2.0 - 1.0;\n\n gl_Position = vec4(pos, 0.0, 1.0);\n vUv = uv;\n }\n `;\n const frag = `\n uniform sampler2D _MainTex;\n varying vec2 vUv;\n\n void main()\n {\n gl_FragColor = texture2D(_MainTex, vUv);\n }\n `;\n super(vert, frag, {\n _MainTex: { value: undefined },\n _ScreenSpacePosition: { value: new Vector2() },\n _ScreenSize: { value: new Vector2() },\n _TextureSize: { value: new Vector2() }\n });\n }\n\n set_position(x, y)\n {\n this.uniforms._ScreenSpacePosition.value.set(x, y);\n }\n\n set_texture(tex, w, h)\n {\n this.uniforms._MainTex.value = tex;\n this.uniforms._TextureSize.value.set(tex.image.width, tex.image.height);\n\n if (w !== undefined)\n {\n this.uniforms._TextureSize.value.x = w;\n }\n if (h !== undefined)\n {\n this.uniforms._TextureSize.value.y = h;\n }\n }\n\n set_screen_size(w, h)\n {\n this.uniforms._ScreenSize.value.set(w, h);\n }\n}\n\nexport { ScreenSpaceTextureMaterial };\n","import { Color } from 'three';\nimport { PerspectiveCamera as TPerspectiveCamera } from 'three';\n\nclass PerspectiveCamera extends TPerspectiveCamera\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 copy(camera)\n {\n super.copy(camera);\n this.clear_color.copy(camera.clear_color);\n this.clear_alpha = camera.clear_alpha;\n return this;\n }\n}\n\nexport { PerspectiveCamera };\n","import { AxisHelper } from './components/AxisHelper';\n\nimport { SceneManager } from './SceneManager';\nimport { Cube } from './primitives/Cube';\nimport { Sphere } from './primitives/Sphere';\nimport { Arrow } from './primitives/Arrow';\nimport { OScreen } from './OScreen';\nimport { ScreenSpaceTextureMaterial } from './materials/ScreenSpaceTextureMaterial';\nimport { PerspectiveCamera } from './PerspectiveCamera';\n\nimport { Vector3 } from 'three';\nimport { LineBasicMaterial } from 'three';\nimport { BufferGeometry } from 'three';\nimport { Line } from 'three';\nimport { PlaneGeometry } 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';\n\nimport basic_color_vert from './shaders/basic_color/basic_color.vert';\nimport basic_color_frag from './shaders/basic_color/basic_color.frag';\n\nclass Debug\n{\n init()\n {\n this.Vector3_one = new Vector3(1, 1, 1);\n this.Vector3_zero = new Vector3(0, 0, 0);\n this.canvas_renderer = undefined;\n\n this.display_texture_meshes = [];\n\n this.ctx = undefined;\n this.scene = new Scene();\n this.camera = new PerspectiveCamera();\n // this.camera.clear_alpha = 0;\n }\n\n draw_arrow(origin, dir, color = 0xff0000)\n {\n const arrow = new Arrow(color, dir.length(), dir.clone().normalize());\n arrow.position.copy(origin);\n SceneManager.current.add(arrow);\n return arrow;\n }\n\n draw_axis()\n {\n const axis = new AxisHelper();\n SceneManager.current.add(axis);\n return axis;\n }\n\n set_debug_RT(RT)\n {\n this.rt_debug = RT;\n }\n\n draw_rectangle(position_2d, width, height, color)\n {\n width = width || 100;\n height = height || 100;\n this.ctx.fillStyle = color || 'rgba(255, 0, 0, 1)';\n this.ctx.fillRect(position_2d.x - width / 2,\n (this.ctx.canvas.height - position_2d.y) - height / 2, width, height);\n }\n\n clear()\n {\n if (this.ctx)\n {\n this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);\n }\n }\n\n draw_line_2D(from, to, color)\n {\n this.ctx.strokeStyle = color || 'rgba(255, 0, 0, 1)';\n this.ctx.beginPath();\n this.ctx.moveTo(from.x, from.y);\n this.ctx.lineTo(to.x, to.y);\n this.ctx.closePath();\n this.ctx.stroke();\n }\n\n draw_line(points, color = 0xff0000)\n {\n const material = new LineBasicMaterial({\n color: color\n });\n\n const geometry = new BufferGeometry().setFromPoints(points);\n\n const line = new Line(geometry, material);\n line.frustumCulled = false;\n SceneManager.current.add(line);\n return line;\n }\n\n draw_cube(pos, size, color)\n {\n size = size || 1;\n color = color || 0xff0000;\n pos = pos || new Vector3();\n\n const cube = new Cube(new Vector3(size, size, size), undefined, color);\n cube.position.copy(pos);\n SceneManager.current.add(cube);\n return cube;\n }\n\n draw_oriented_cube(from, to, height = 1, color = '#FF0000', depth = 0.1)\n {\n const size = from.distanceTo(to);\n const cube = new Cube(new Vector3(depth, height, size), undefined, color);\n\n const center = to.clone().sub(from).multiplyScalar(0.5);\n const forward_dir = center.clone().normalize();\n center.add(from);\n\n cube.position.copy(center);\n\n // let up = new Vector3(0, 1, 0);\n // let forward = forward_dir.clone();\n // let right = forward.clone().cross(up);\n\n // cube.quaternion.setFromRotationMatrix(new Matrix4().makeBasis(right,up,forward));\n cube.quaternion.setFromUnitVectors(new Vector3(0, 0, -1), forward_dir);\n\n SceneManager.current.add(cube);\n return cube;\n }\n\n draw_plane(width, height, color)\n {\n const geometry = new PlaneGeometry(width, height);\n const material = new ShaderMaterial({\n uniforms: {\n _Color: { value: new Vector4(0, 1, 0, 0.2) }\n },\n vertexShader: basic_color_vert,\n fragmentShader: basic_color_frag,\n transparent: true,\n depthWrite: false\n });\n\n const plane = new Mesh(geometry, material);\n plane.renderOrder = -10000;\n SceneManager.current.add(plane);\n return plane;\n }\n\n draw_empty_cube(pos, size, color)\n {\n size = size || 1;\n color = color || 0xff0000;\n\n const box = new Box3().setFromCenterAndSize(new Vector3(), new Vector3(size, size, size));\n const helper = new Box3Helper(box, color);\n helper.position.copy(pos || new Vector3());\n return helper;\n }\n\n draw_sphere(pos, size, color)\n {\n size = size || 1;\n color = color || 0xff0000;\n pos = pos || new Vector3();\n\n const sphere = new Sphere(size, color);\n sphere.position.copy(pos);\n SceneManager.current.add(sphere);\n return sphere;\n }\n\n draw_point_array(input_points, open = false, color = 0xff0000)\n {\n const catmull = new CatmullRomCurve3(input_points, open);\n catmull.updateArcLengths();\n const points = catmull.getSpacedPoints(200);\n const line_helper = this.draw_line(points, 0x00ff00);\n // line_helper.position.y = 1.5;\n return line_helper;\n }\n\n draw_sphere_helper(sphere, color)\n {\n color = color || 0xff0000;\n const geometry = new SphereGeometry(sphere.radius, 32, 32);\n const material = new MeshBasicMaterial({ color: color });\n const sphere_mesh = new Mesh(geometry, material);\n sphere_mesh.position.copy(sphere.center);\n SceneManager.current.add(sphere_mesh);\n return sphere_mesh;\n }\n\n draw_math_sphere(sphere)\n {\n const geometry = new SphereGeometry(sphere.radius, 32, 32);\n const material = new ShaderMaterial({\n uniforms: {\n _Color: { value: new Vector4(1, 0, 0, 0.2) }\n },\n vertexShader: basic_color_vert,\n fragmentShader: basic_color_frag,\n transparent: true\n });\n // var material = new MeshBasicMaterial( {color: 0xff0000, transparent = true} );\n const sphere1 = new Mesh(geometry, material);\n sphere1.position.copy(sphere.center);\n SceneManager.current.add(sphere1);\n }\n\n draw_bounding_box(bb)\n {\n const helper = new Box3Helper(bb, 0xffff00);\n SceneManager.current.add(helper);\n }\n\n draw_curve(curve, options)\n {\n const offset = new Vector3(0, 0, 0);\n if (options)\n {\n offset.y = options.offset || 0;\n }\n\n for (let i = 0; i < curve.length - 1; i++)\n {\n this.draw_line(curve[i].clone().add(offset), curve[i + 1].clone().add(offset));\n }\n }\n\n draw_texture(tex, w, h)\n {\n const mesh = new Mesh(new PlaneGeometry(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(OScreen.width, OScreen.height);\n }\n if (this.scene.children.length > 0)\n {\n graphics.render(this.scene, this.camera);\n }\n }\n}\n\nconst debug = new Debug();\nexport { debug as Debug };\n","import { BlitMaterial } from '../materials/BlitMaterial';\n\nimport frag from '../shaders/clear/clear_depth_normal.frag';\n\nimport { Vector4 } from 'three';\n\nclass 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\nexport { ClearDepthNormalMaterial };\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\nclass 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\nexport { DepthNormalMaterial };\n","import { CameraManager } from '../CameraManager';\nimport { OScreen } from '../OScreen';\n\nimport { ClearDepthNormalMaterial } from '../materials/ClearDepthNormalMaterial';\nimport { DepthNormalMaterial } from '../materials/DepthNormalMaterial';\n\nimport { WebGLRenderTarget } from 'three';\nimport { Vector3 } from 'three';\n\nclass DepthAndNormalsRenderer\n{\n constructor()\n {\n this.RT = new WebGLRenderTarget(OScreen.width, OScreen.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 !== OScreen.width || this.RT.height !== OScreen.height)\n {\n this.RT.setSize(OScreen.width, OScreen.height);\n }\n }\n\n get render_target()\n {\n return this.RT;\n }\n}\n\nexport { DepthAndNormalsRenderer };\n","import { BlitMaterial } from '../materials/BlitMaterial';\n\nimport { Scene } from 'three';\nimport { Mesh } from 'three';\nimport { PlaneGeometry } from 'three';\nimport { OrthographicCamera } from 'three';\n\nclass 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 PlaneGeometry(1, 1), this._blit_material);\n this._blit_scene.add(this._blit_quad);\n this._blit_camera = new OrthographicCamera(-1, 1, 1, -1, -10000, 10000);\n }\n\n blit(src, dst)\n {\n this._blit_quad.material = this._blit_material;\n\n const src_texture = src.isWebGLRenderTarget === true ? src.texture : src;\n const src_width = src.isWebGLRenderTarget === true ? src.width : src.image.width;\n const src_height = src.isWebGLRenderTarget === true ? src.height : src.image.height;\n\n this._blit_quad.material.uniforms._MainTex.value = src_texture;\n this._blit_quad.material.uniforms._Resolution.value.set(src_width, src_height);\n\n if (dst)\n {\n this._blit_quad.material.uniforms._TargetResolution.value.set(dst.width, dst.height);\n }\n else\n {\n this.renderer.getSize(this._blit_quad.material.uniforms._TargetResolution.value);\n }\n\n this.__render(dst);\n }\n\n material_pass(mat, dst)\n {\n this._blit_quad.material = mat;\n // this._blit_quad.material.uniforms._MainTex.value = undefined;\n // this._blit_quad.material.uniforms._Resolution.value.set(1, 1);\n\n this.__render(dst);\n }\n\n blit_with_material(src, dst, mat)\n {\n const src_texture = src.isWebGLRenderTarget === true ? src.texture : src;\n const src_width = src.isWebGLRenderTarget === true ? src.width : src.image.width;\n const src_height = src.isWebGLRenderTarget === true ? src.height : src.image.height;\n\n this._blit_quad.material = mat;\n this._blit_quad.material.uniforms._MainTex.value = src_texture;\n this._blit_quad.material.uniforms._Resolution.value.set(src_width, src_height);\n\n if (dst)\n {\n this._blit_quad.material.uniforms._TargetResolution.value.set(dst.width, dst.height);\n }\n else\n {\n this.renderer.getSize(this._blit_quad.material.uniforms._TargetResolution.value);\n }\n\n this.__render(dst);\n }\n\n blit_clear_with_material(dst_RT, mat)\n {\n this._blit_quad.material = mat;\n\n this.__render(dst_RT);\n }\n\n dispose()\n {\n this._blit_quad.geometry.dispose();\n this._blit_quad.material.dispose();\n }\n\n __render(RT)\n {\n RT = RT === undefined ? null : RT;\n\n const current_rt = this.renderer.getRenderTarget();\n\n this.renderer.setRenderTarget(RT === undefined ? null : RT);\n this.renderer.render(this._blit_scene, this._blit_camera);\n\n this.renderer.setRenderTarget(current_rt);\n }\n}\n\nexport { Blitter };\n","import { Configuration } from './Configuration';\nimport { BaseRender } from './render_mode/BaseRender';\nimport { OScreen } from './OScreen';\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 {\n NearestFilter,\n RGBAFormat,\n LinearEncoding,\n FloatType,\n WebGLRenderTarget,\n ShaderMaterial,\n NoBlending,\n AlwaysDepth\n} from 'three';\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 = {\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 force_webgl2: true,\n xr_enabled: false\n };\n\n Object.assign(this.context_attributes, context_attributes);\n\n if (this.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\n if (this.context_attributes.xr_enabled)\n {\n this._renderer.xr.enabled = true;\n }\n else\n {\n this._renderer.autoClear = false;\n }\n\n this._renderer.setPixelRatio(1);\n\n OScreen.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.is_floating_point_texture_available();\n\n this.generateDepthNormalTexture = false;\n\n this.depth_and_normals_renderer = new DepthAndNormalsRenderer();\n\n this.resize_observer = new ResizeObserver(this.on_resize.bind(this));\n this.resize_observer.observe(this.canvas);\n }\n\n get dom_element()\n {\n return this._renderer.domElement;\n }\n\n get depth_normals_RT()\n {\n return this.depth_and_normals_renderer.render_target;\n }\n\n set_state(new_state)\n {\n // console.log('VIEWAPI - map render mode switch to: ' + new_state.constructor.name);\n\n this.current_render_mode.on_exit(this, this._renderer);\n this.current_render_mode = new_state;\n this.current_render_mode.on_enter(this, this._renderer);\n }\n\n update()\n {\n if (this.generateDepthNormalTexture)\n {\n this.depth_and_normals_renderer.render(this);\n }\n\n this.__update_current_camera();\n\n if (CameraManager.current)\n {\n this.current_render_mode.render();\n }\n\n OScreen.update();\n }\n\n __update_current_camera()\n {\n if (CameraManager.current)\n {\n CameraManager.current.aspect = OScreen.aspect_ratio;\n CameraManager.current.updateProjectionMatrix();\n CameraManager.current.updateMatrix();\n CameraManager.current.updateMatrixWorld(true);\n }\n }\n\n render(scene, camera, RT, override_mat)\n {\n this.__apply_override_material(scene, override_mat);\n\n this._renderer.setRenderTarget(RT === undefined ? null : RT);\n this._renderer.render(scene || SceneManager.current,\n camera || CameraManager.current);\n\n this.__apply_override_material(scene, undefined);\n }\n\n render_scene(scene)\n {\n if (scene.on_pre_render)\n {\n scene.on_pre_render();\n }\n\n if (scene.render)\n {\n scene.render();\n }\n else\n {\n this.render(scene, undefined);\n }\n\n if (scene.on_post_render)\n {\n scene.on_post_render();\n }\n }\n\n __apply_override_material(scene, mat)\n {\n mat = mat === undefined ? null : mat;\n if (scene)\n {\n scene.overrideMaterial = mat;\n }\n else\n {\n SceneManager.current.overrideMaterial = mat;\n }\n }\n\n readback_RT(RT, buffer)\n {\n this._renderer.readRenderTargetPixels(RT, 0, 0, RT.width, RT.height, buffer);\n }\n\n clear(RT, camera, clear_depth, clear_stencil)\n {\n this._renderer.setRenderTarget(RT === undefined ? null : RT);\n\n if (camera)\n {\n this._renderer.setClearColor(camera.clear_color, camera.clear_alpha);\n }\n\n this._renderer.clear(!!camera, // clear color\n !!clear_depth,\n !!clear_stencil);\n }\n\n on_resize(entries)\n {\n for (const entry of entries)\n {\n OScreen.dpr = Configuration.dpr;\n OScreen.update_position(entry.contentRect.x, entry.contentRect.y);\n OScreen.update_size(entry.contentRect.width, entry.contentRect.height);\n\n this.canvas.width = OScreen.render_width;\n this.canvas.height = OScreen.render_height;\n\n this._renderer.setViewport(0, 0, OScreen.render_width, OScreen.render_height);\n\n this.__update_current_camera();\n }\n }\n\n material_pass(mat, dst)\n {\n this.blitter.material_pass(mat, dst);\n }\n\n blit(src_RT, dst_RT, mat)\n {\n if (mat)\n {\n this.blitter.blit_with_material(src_RT, dst_RT, mat);\n }\n else\n {\n this.blitter.blit(src_RT, dst_RT);\n }\n }\n\n blit_clear_with_material(dst_RT, mat)\n {\n this.blitter.blit_clear_with_material(dst_RT, mat);\n }\n\n take_screenshot(blob_callback, width = OScreen.width, height = OScreen.height)\n {\n // const ctx = this;\n\n const old_width = OScreen.width;\n const old_height = OScreen.height;\n\n const new_width = width;\n const new_height = height;\n\n const tile_width = 1024;\n const tile_height = 1024;\n\n const divisions_x = parseInt(Math.ceil(new_width / tile_width));\n const divisions_y = parseInt(Math.ceil(new_height / tile_height));\n\n OScreen.update_size(tile_width, tile_height);\n const old_dpr = this._renderer.getPixelRatio();\n this._renderer.setPixelRatio(1);\n\n this._renderer.setSize(tile_width, tile_height, false);\n\n const canvas_2d = document.createElement('canvas');\n const ctx_2D = canvas_2d.getContext('2d');\n\n ctx_2D.canvas.width = new_width;\n ctx_2D.canvas.height = new_height;\n\n CameraManager.current.aspect = OScreen.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 OScreen.width * x, OScreen.height * y,\n OScreen.width, OScreen.height);\n this.current_render_mode.render();\n\n ctx_2D.drawImage(this._renderer.domElement, OScreen.width * x, OScreen.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 OScreen.update_size(old_width, old_height);\n this._renderer.setPixelRatio(old_dpr);\n this._renderer.setSize(old_width, old_height, false);\n\n CameraManager.current.aspect = OScreen.aspect_ratio;\n CameraManager.current.updateMatrix();\n CameraManager.current.updateMatrixWorld(true);\n }\n\n download_screenshot(blob)\n {\n const link = document.createElement('a');\n link.download = 'Snapshot.png';\n\n link.href = URL.createObjectURL(blob);\n link.click();\n\n link.onclick = function()\n {\n requestAnimationFrame(function()\n {\n URL.revokeObjectURL(link.href);\n });\n link.removeAttribute('href');\n };\n }\n\n dispose()\n {\n this._renderer.dispose();\n this.current_render_mode.dispose();\n this.blitter.dispose();\n }\n\n is_floating_point_texture_available()\n {\n const RT = new WebGLRenderTarget(1, 1, {\n minFilter: NearestFilter,\n magFilter: NearestFilter,\n format: RGBAFormat,\n encoding: LinearEncoding,\n type: FloatType,\n stencilBuffer: false,\n depthBuffer: false\n });\n\n const vert = `\n void main()\n {\n gl_Position = vec4(uv * 2.0 - 1.0, 1.0, 1.0);\n }\n `;\n const frag = `\n void main()\n {\n gl_FragColor = vec4(0.0, 4865.35, 0.0, 1.0);\n }\n `;\n\n const mat = new ShaderMaterial({\n vertexShader: vert,\n fragmentShader: frag,\n depthWrite: false,\n blending: NoBlending,\n depthTest: false,\n depthFunc: AlwaysDepth\n });\n\n this.material_pass(mat, RT);\n\n const output = new Float32Array(4);\n this._renderer.readRenderTargetPixels(RT, 0, 0, 1, 1, output);\n\n return Math.abs(output[1] - 4865.35) < 0.001;\n }\n}\n\nconst graphics = new Graphics();\nexport { graphics as Graphics };\n","import frag from '../shaders/normal/normal.frag';\nimport vert from '../shaders/normal/normal.vert';\n\nimport { ShaderMaterial } from 'three';\n\nclass NormalMaterial extends ShaderMaterial\n{\n constructor()\n {\n super({\n uniforms: {\n },\n vertexShader: vert,\n fragmentShader: frag\n });\n }\n}\n\nexport { NormalMaterial };\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\nclass 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\nexport { DebugNormalsRender };\n","class KeyboardInput\n{\n init(container)\n {\n this.ctrlz_pressed = false;\n this.ctrlz_fired = false;\n\n this.keys = {};\n this.keys_keys = [];\n this.container = container;\n\n this.container.addEventListener('keydown', this.on_key_down.bind(this), false);\n this.container.addEventListener('keyup', this.on_key_up.bind(this), false);\n }\n\n on_key_down(e)\n {\n if (e.keyCode === 90 && e.ctrlKey && !this.ctrlz_fired)\n {\n this.ctrlz_pressed = true;\n this.ctrlz_fired = true;\n }\n if (e.key)\n {\n this.press_key(e.key);\n }\n }\n\n on_key_up(e)\n {\n this.release_key(e.key);\n }\n\n clear()\n {\n this.ctrlz_pressed = false;\n\n for (let i = 0; i < this.keys_keys.length; i++)\n {\n this.keys[this.keys_keys[i]].pressed = false;\n this.keys[this.keys_keys[i]].released = false;\n }\n }\n\n release_key(key_name)\n {\n const key = this.keys[key_name];\n if (key)\n {\n key.fired = false;\n key.down = false;\n key.released = true;\n }\n }\n\n release_keys()\n {\n this.ctrlz_fired = false;\n\n for (let i = 0; i < this.keys_keys.length; i++)\n {\n this.keys[this.keys_keys[i]].fired = false;\n this.keys[this.keys_keys[i]].down = false;\n }\n }\n\n press_key(key_name)\n {\n const key = this.keys[key_name];\n if (key)\n {\n if (key.down === false)\n {\n key.pressed = true;\n }\n key.down = true;\n key.fired = true;\n }\n }\n\n is_key_pressed(key_name)\n {\n const key = this.keys[key_name];\n if (key)\n {\n return key.pressed;\n }\n return false;\n }\n\n is_key_down(key_name)\n {\n const key = this.keys[key_name];\n if (key)\n {\n return key.down;\n }\n return false;\n }\n\n is_key_released(key_name)\n {\n const key = this.keys[key_name];\n if (key)\n {\n return key.released;\n }\n\n return false;\n }\n\n register_key(key)\n {\n this.keys[key] =\n {\n key_name: key,\n pressed: false,\n down: false,\n fired: false\n };\n\n this.keys_keys = Object.keys(this.keys);\n }\n\n unregister_key(key_name)\n {\n delete this.keys[key_name];\n }\n\n dispose()\n {\n this.container.removeEventListener('keydown', this.on_key_down.bind(this), false);\n this.container.removeEventListener('keyup', this.on_key_up.bind(this), false);\n }\n}\n\nexport { KeyboardInput };\n","import { InputController } from 'pit-js';\nimport { KeyboardInput } from './KeyboardInput';\n\nclass Input extends InputController\n{\n constructor()\n {\n super();\n\n this.clicked = false;\n this.captured_NDC = { x: 0, y: 0 };\n this.current_NDC_delta = { x: 0, y: 0 };\n\n this.keyboard = new KeyboardInput();\n }\n\n init(container, keyboard_input_container)\n {\n super.init(container);\n\n this.keyboard.init(keyboard_input_container);\n }\n\n dispose()\n {\n super.dispose();\n\n this.keyboard.dispose();\n }\n\n update()\n {\n if (this.left_mouse_button_pressed)\n {\n this.captured_NDC.x = this.NDC.x;\n this.captured_NDC.y = this.NDC.y;\n }\n\n if (this.left_mouse_button_down)\n {\n this.current_NDC_delta.x += Math.abs(this.NDC_delta.x);\n this.current_NDC_delta.y += Math.abs(this.NDC_delta.y);\n }\n\n if (this.left_mouse_button_released)\n {\n if (this.current_NDC_delta.x < 0.001 || this.current_NDC_delta.y < 0.001)\n {\n this.clicked = true;\n }\n\n this.current_NDC_delta = { x: 0, y: 0 };\n }\n }\n\n clear()\n {\n super.clear();\n\n this.clicked = false;\n\n this.keyboard.clear();\n }\n}\n\nconst input = new Input();\nexport { input as Input };\n","\nclass OS\n{\n init()\n {\n this.operating_systems = {\n ANDROID: 'android',\n IOS: 'ios',\n LINUX: 'linux',\n MAC: 'mac',\n WINDOWS: 'windows'\n };\n\n this.is_mobile = !!(navigator.userAgent.match(/(iPhone|iPod|iPad|Android|playbook|silk|BlackBerry|BB10|Windows Phone|Tizen|Bada|webOS|IEMobile|Opera Mini)/));\n this.is_ipad = !!(navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints && navigator.maxTouchPoints > 2);\n this.is_ios = !!navigator.userAgent.match(/(iPhone|iPod|iPad)/) || this.is_ipad;\n\n this.is_android = this.get_os() === this.operating_systems.ANDROID;\n this.is_linux = this.get_os() === this.operating_systems.LINUX;\n this.is_mac = this.get_os() === this.operating_systems.MAC;\n this.is_windows = this.get_os() === this.operating_systems.WINDOWS;\n }\n\n get_os()\n {\n const userAgent = window.navigator.userAgent;\n const platform = window.navigator.platform;\n const macosPlatforms = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'];\n const windowsPlatforms = ['Win32', 'Win64', 'Windows', 'WinCE'];\n const iosPlatforms = ['iPhone', 'iPad', 'iPod'];\n let os = null;\n\n if (macosPlatforms.indexOf(platform) !== -1)\n {\n os = this.operating_systems.MAC;\n }\n else if (iosPlatforms.indexOf(platform) !== -1)\n {\n os = this.operating_systems.IOS;\n }\n else if (windowsPlatforms.indexOf(platform) !== -1)\n {\n os = this.operating_systems.WINDOWS;\n }\n else if (/Android/.test(userAgent))\n {\n os = this.operating_systems.ANDROID;\n }\n else if (!os && /Linux/.test(platform))\n {\n os = this.operating_systems.LINUX;\n }\n\n return os;\n }\n}\n\nconst os = new OS();\nexport { os as OS };\n","import { Vector3 } from 'three';\n\nclass ReflectionPlaneContext\n{\n init()\n {\n this.target_geometry = undefined;\n this.target_position = new Vector3();\n }\n\n set_target_geometry(geometry)\n {\n this.target_geometry = geometry;\n }\n}\n\nconst reflection_plane_context = new ReflectionPlaneContext();\nexport { reflection_plane_context as 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\nclass GeometryBatch\n{\n constructor(geometry, batch_width)\n {\n this.geometry = geometry;\n\n this.material = undefined;\n this.uniforms = {};\n this.batch_width = batch_width;\n\n this.data_textures = [];\n\n this.object_names = undefined;\n\n this.zero_offset = new Vector2();\n this.write_offset = new Vector2();\n\n this.uniform_dirty_count = 0;\n\n this.tmp_uploaded_data_count = 0;\n }\n\n init(object_names, vert_shader, frag_shader)\n {\n this.material = new ShaderMaterial({\n uniforms: this.uniforms,\n vertexShader: vert_shader,\n fragmentShader: frag_shader\n });\n this.object_names = object_names;\n }\n\n add_global_uniform(name, data)\n {\n this.uniforms[name] = { value: data };\n this.material.needsUpdate = true;\n }\n\n set_global_uniform(name, data)\n {\n this.uniforms[name].value = data;\n }\n\n add_object_uniform_v3(uniform_name, default_value_v3)\n {\n const src_tex = this.__create_rgb_texture(this.batch_width);\n const dst_tex = this.__create_rgb_texture(this.batch_width);\n const one_pixel_tex = this.__create_rgb_texture(1);\n\n const new_data_tex = this.__add_data_texture(uniform_name, src_tex, dst_tex, one_pixel_tex);\n\n if (default_value_v3)\n {\n this.__flood_data_texture_rgb(new_data_tex, default_value_v3);\n }\n }\n\n add_object_uniform_v4(uniform_name, default_value_v4)\n {\n const src_tex = this.__create_rgba_texture(this.batch_width);\n const dst_tex = this.__create_rgba_texture(this.batch_width);\n const one_pixel_tex = this.__create_rgba_texture(1);\n\n const new_data_tex = this.__add_data_texture(uniform_name, src_tex, dst_tex, one_pixel_tex);\n\n if (default_value_v4)\n {\n this.__flood_data_texture_rgba(new_data_tex, default_value_v4);\n }\n }\n\n add_object_uniform_v4_float(uniform_name, default_value_v4)\n {\n const src_tex = this.__create_rgba_float_texture(this.batch_width);\n const dst_tex = this.__create_rgba_float_texture(this.batch_width);\n const one_pixel_tex = this.__create_rgba_float_texture(1);\n\n const new_data_tex = this.__add_data_texture(uniform_name, src_tex, dst_tex, one_pixel_tex);\n\n if (default_value_v4)\n {\n this.__flood_data_texture_rgba(new_data_tex, default_value_v4);\n }\n }\n\n set_object_uniform_v3(object_name, uniform_name, vector3, use_r, use_g, use_b)\n {\n const obj_index = this.__get_object_index(object_name);\n const data_texture = this.__get_data_texture(uniform_name);\n\n this.__set_pixel_rgb(data_texture.src, obj_index, vector3, use_r, use_g, use_b);\n this.__set_pixel_rgb(data_texture.one_pixel, 0, vector3, use_r, use_g, use_b);\n\n data_texture.last_accessed_index = obj_index;\n\n data_texture.dirty_count++;\n }\n\n set_object_uniform_v4(object_name, uniform_name, vector4, use_r, use_g, use_b, use_a)\n {\n const obj_index = this.__get_object_index(object_name);\n const data_texture = this.__get_data_texture(uniform_name);\n\n this.__set_pixel_rgba(data_texture.src, obj_index, vector4, use_r, use_g, use_b, use_a);\n this.__set_pixel_rgba(data_texture.one_pixel, 0, vector4, use_r, use_g, use_b, use_a);\n data_texture.last_accessed_index = obj_index;\n\n data_texture.dirty_count++;\n }\n\n upload_texture_data(renderer, upload_budget)\n {\n for (let i = 0; i < this.data_textures.length; i++)\n {\n if (upload_budget > 0 && this.data_textures[i].dirty_count > 0)\n {\n if (this.data_textures[i].dirty_count === 1)\n {\n this.__partial_texture_data_upload(renderer, this.data_textures[i]);\n }\n if (this.data_textures[i].dirty_count > 1)\n {\n this.__full_texture_data_upload(renderer, this.data_textures[i]);\n }\n\n this.data_textures[i].dirty_count = 0;\n\n upload_budget--;\n }\n }\n }\n\n get_uniform_dirty_count()\n {\n this.uniform_dirty_count = 0;\n for (let i = 0; i < this.data_textures.length; i++)\n {\n if (this.data_textures[i].dirty_count > 0)\n {\n this.uniform_dirty_count++;\n }\n }\n return this.uniform_dirty_count;\n }\n\n __full_texture_data_upload(renderer, texture_data)\n {\n // console.log(\"full texture update of\"+ texture_data.name);\n texture_data.dst.needsUpdate = true;\n renderer.copyTextureToTexture(\n this.zero_offset,\n texture_data.src,\n texture_data.dst\n );\n }\n\n __partial_texture_data_upload(renderer, texture_data)\n {\n // console.log(\"partial texture update\"+ texture_data.name);\n const index = texture_data.last_accessed_index;\n if (index === -1)\n {\n return;\n }\n\n this.write_offset.y = Math.floor(index / this.batch_width);\n this.write_offset.x = index - this.batch_width * this.write_offset.y;\n renderer.copyTextureToTexture(\n this.write_offset,\n texture_data.one_pixel,\n texture_data.dst\n );\n }\n\n get_mesh()\n {\n return new Mesh(this.geometry, this.material);\n }\n\n __set_pixel_rgb(data_texture, index, vector3, use_r, use_g, use_b)\n {\n if (use_r)\n {\n data_texture.image.data[index * 3 + 0] = vector3.x;\n }\n if (use_g)\n {\n data_texture.image.data[index * 3 + 1] = vector3.y;\n }\n if (use_b)\n {\n data_texture.image.data[index * 3 + 2] = vector3.z;\n }\n }\n\n __set_pixel_rgba(data_texture, index, vector4, use_r, use_g, use_b, use_a)\n {\n if (use_r)\n {\n data_texture.image.data[index * 4 + 0] = vector4.x;\n }\n if (use_g)\n {\n data_texture.image.data[index * 4 + 1] = vector4.y;\n }\n if (use_b)\n {\n data_texture.image.data[index * 4 + 2] = vector4.z;\n }\n if (use_a)\n {\n data_texture.image.data[index * 4 + 3] = vector4.w;\n }\n }\n\n __flood_data_texture_rgb(data_texture, v3)\n {\n for (let i = 0; i < this.batch_width * this.batch_width; i++)\n {\n this.__set_pixel_rgb(data_texture.src, i, v3, true, true, true);\n data_texture.dirty_count++;\n }\n }\n\n __flood_data_texture_rgba(data_texture, v4)\n {\n for (let i = 0; i < this.batch_width * this.batch_width; i++)\n {\n this.__set_pixel_rgba(data_texture.src, i, v4, true, true, true, true);\n data_texture.dirty_count++;\n }\n }\n\n __create_rgb_texture(width)\n {\n const data = new Uint8Array(3 * width * width);\n return new DataTexture(data, width, width, RGBFormat);\n }\n\n __create_rgba_texture(width)\n {\n const data = new Uint8Array(4 * width * width);\n return new DataTexture(data, width, width, RGBAFormat);\n }\n\n __create_rgba_float_texture(width)\n {\n const data = new Float32Array(4 * width * width);\n return new DataTexture(data, width, width, RGBAFormat, FloatType);\n }\n\n __get_data_texture(uniform_name)\n {\n for (let i = 0; i < this.data_textures.length; i++)\n {\n if (this.data_textures[i].name === uniform_name)\n {\n return this.data_textures[i];\n }\n }\n console.error('Data texture ' + uniform_name + ' does not exist');\n return undefined;\n }\n\n __get_object_index(name)\n {\n for (let i = 0; i < this.object_names.length; i++)\n {\n if (this.object_names[i] === name)\n {\n return i;\n }\n }\n console.error('the name ' + name + ' is not contained in this batch');\n return undefined;\n }\n\n __add_data_texture(uniform_name, src_texture, dst_texture, one_pixel_text)\n {\n dst_texture.needsUpdate = true;\n\n this.data_textures.push({\n name: uniform_name,\n src: src_texture,\n dst: dst_texture,\n one_pixel: one_pixel_text,\n last_accessed_index: -1,\n dirty_count: 0\n });\n\n this.uniforms[uniform_name] = { value: dst_texture };\n return this.data_textures[this.data_textures.length - 1];\n }\n\n dispose()\n {\n for (let i = 0; i < this.data_textures.length; i++)\n {\n this.data_textures[i].src.dispose();\n this.data_textures[i].dst.dispose();\n this.data_textures[i].one_pixel.dispose();\n }\n }\n}\n\nexport { GeometryBatch };\n","import { GeometryBatch } from './GeometryBatch';\n\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\n\nimport { BufferAttribute } from 'three';\nimport { OMath } from '../utilities/OMath';\n\nclass GeometryBatcher\n{\n init()\n {\n this.batches = [];\n }\n\n batch(buffer_geometries)\n {\n const attr_accessor_uvs = [];\n const texture_width = OMath.ceilPowerOfTwo(Math.sqrt(buffer_geometries.length));\n // console.log(\"Store count: \" + buffer_geometries.length + \", Texture size: \" +texture_width);\n\n this.__init_uv_array(attr_accessor_uvs, texture_width);\n\n let uv_index = 0;\n\n for (let i = 0; i < buffer_geometries.length; i++)\n {\n const vertex_count = buffer_geometries[i].getAttribute('position').count;\n const y = Math.floor(i / texture_width);\n const x = i - texture_width * y;\n for (let count = 0; count < vertex_count; count++)\n {\n attr_accessor_uvs[uv_index] = (x / texture_width) + 0.5 / texture_width;\n attr_accessor_uvs[uv_index + 1] = (y / texture_width) + 0.5 / texture_width;\n uv_index += 2;\n }\n }\n\n const buffer_attribute = new BufferAttribute(new Float32Array(attr_accessor_uvs), 2);\n const buffer_geometry = BufferGeometryUtils.mergeBufferGeometries(buffer_geometries);\n buffer_geometry.setAttribute('attr_accessor_uv', buffer_attribute);\n\n this.batches.push(new GeometryBatch(buffer_geometry, texture_width));\n return this.batches[this.batches.length - 1];\n }\n\n upload_texture_data(renderer)\n {\n for (let i = 0; i < this.batches.length; i++)\n {\n this.batches[i].upload_texture_data(renderer, 1);\n }\n }\n\n __init_uv_array(uvs, texture_width)\n {\n for (let i = 0; i < texture_width * texture_width * 2; i++)\n {\n uvs.push(0);\n }\n }\n}\n\nconst geometry_batcher = new GeometryBatcher();\nexport { geometry_batcher as 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.matrixWorldAutoUpdate = false;\n this.ss_scene.frustumCulled = false;\n\n this.ws_scene = new Scene();\n this.ws_scene.matrixWorldAutoUpdate = false;\n this.ws_scene.frustumCulled = false;\n\n this.ss_camera = new OrthographicCamera(-1, 1, 1, -1, -100, 100);\n }\n\n delete_element(elem)\n {\n const index = this.ui_elements.indexOf(elem);\n if (index > -1)\n {\n this.ui_elements.splice(index, 1);\n }\n\n this.ss_scene.remove(elem);\n this.ws_scene.remove(elem);\n\n elem.dispose();\n }\n\n add_screen_space_element(elem)\n {\n this.ui_elements.push(elem);\n this.ss_scene.add(elem);\n\n elem.set_screen_space_coordinate_system();\n }\n\n add_world_space_element(elem)\n {\n this.ui_elements.push(elem);\n this.ws_scene.add(elem);\n\n elem.set_world_space_coordinate_system();\n }\n\n update()\n {\n // this.ss_camera.left = -OScreen.width / 2;\n // this.ss_camera.right = OScreen.width / 2;\n // this.ss_camera.top = OScreen.top / 2;\n // this.ss_camera.right = -OScreen.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\nconst ui = new UI();\nexport { ui as UI };\n","import { CameraManager } from '../CameraManager';\nimport { Input } from '../Input';\nimport { OMath } from '../utilities/OMath';\nimport { OScreen } from '../OScreen';\n\nimport { Vector3 } from 'three';\nimport { Matrix4 } from 'three';\nimport { Plane } from 'three';\nimport { Ray } from 'three';\nimport { Sphere } from 'three';\nimport { Box3 } from 'three';\n\nclass CameraUtilities\n{\n init()\n {\n this.tmp_mat = new Matrix4();\n this.plane = new Plane();\n this.ray = new Ray();\n\n this.tmp_size = new Vector3();\n this.tmp_unproj = new Vector3();\n }\n\n get_up_dir(camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n tmp_vec.set(0, 1, 0);\n tmp_vec.applyQuaternion(camera.quaternion);\n\n return tmp_vec;\n }\n\n get_forward_dir(camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n tmp_vec.set(0, 0, -1);\n tmp_vec.applyQuaternion(camera.quaternion);\n\n return tmp_vec;\n }\n\n get_right_dir(camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n tmp_vec.set(1, 0, 0);\n tmp_vec.applyQuaternion(camera.quaternion);\n return tmp_vec;\n }\n\n unproject_mouse_position(NDC, camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n const v_fov = (camera.fov / 2) * Math.PI / 180;\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * camera.aspect)) / 2;\n\n const distV = Math.tan(v_fov) * camera.far;\n const distH = Math.tan(h_fov) * camera.far;\n\n tmp_vec.set(distH * NDC.x, distV * NDC.y, -camera.far).normalize();\n\n return tmp_vec.applyQuaternion(camera.quaternion);\n }\n\n get_plane_intersection(plane_position, plane_normal, NDC, camera)\n {\n camera = camera || CameraManager.current;\n NDC = NDC || Input.NDC;\n\n const tmp_vec = new Vector3();\n\n this.plane.setFromNormalAndCoplanarPoint(plane_normal || this.get_forward_dir(camera), plane_position);\n if (camera.isPerspectiveCamera)\n {\n this.ray.set(camera.position, this.unproject_mouse_position(NDC, camera));\n }\n else\n {\n this.tmp_unproj.set(NDC.x, NDC.y, 1).unproject(camera);\n this.ray.set(camera.position, this.tmp_unproj);\n }\n\n this.ray.intersectPlane(this.plane, tmp_vec);\n return tmp_vec;\n }\n\n fit_points_on_camera(points, zoom_scale = 1)\n {\n const points_sphere = new Sphere().setFromPoints(points);\n const world_space_center = points_sphere.center;\n const camera_forward = this.get_forward_dir(CameraManager.current).clone();\n\n const plane = new Plane().setFromNormalAndCoplanarPoint(camera_forward, world_space_center);\n\n const points_on_plane = OMath.project_points_on_plane(points, plane);\n\n const projected_points_center = new Vector3();\n let box = new Box3().setFromPoints(points_on_plane);\n box.getCenter(projected_points_center);\n\n const up = new Vector3(0, 1, 0).applyQuaternion(CameraManager.current.quaternion);\n const right = up.clone().cross(camera_forward).normalize();\n const mat = new Matrix4().set(right.x, up.x, camera_forward.x, world_space_center.x,\n right.y, up.y, camera_forward.y, world_space_center.y,\n right.z, up.z, camera_forward.z, world_space_center.z,\n 0, 0, 0, 1);\n\n const inverse_mat = new Matrix4().getInverse(mat);\n for (let i = 0; i < points_on_plane.length; i++)\n {\n points_on_plane[i].applyMatrix4(inverse_mat);\n }\n\n const size = new Vector3();\n box = new Box3().setFromPoints(points_on_plane);\n box.getSize(size);\n size.multiplyScalar(zoom_scale);\n const projected_center = new Vector3();\n box.getCenter(projected_center);\n\n return {\n position: projected_points_center,\n zoom: this.get_zoom_to_fit_rect(size.x / 2, size.y / 2)\n };\n }\n\n get_zoom_to_fit_rect(width, height)\n {\n const v_fov = (CameraManager.current.fov / 2) * Math.PI / 180;\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * CameraManager.current.aspect)) / 2;\n\n const distV = height / Math.tan(v_fov);\n const distH = width / Math.tan(h_fov);\n\n return Math.max(Math.abs(distH), Math.abs(distV));\n }\n\n get_zoom_to_fit_box(bb, camera)\n {\n if (camera.isOrthographicCamera)\n {\n bb.getSize(this.tmp_size);\n\n const obj_x = this.tmp_size.x;\n const obj_y = this.tmp_size.y;\n const object_aspect = obj_x / obj_y;\n if (OScreen.aspect_ratio / object_aspect > 1)\n {\n return OScreen.height / obj_y;\n }\n else\n {\n return OScreen.width / obj_x;\n }\n }\n else\n {\n // return this.fit_points_on_camera([bb.min, bb.max], 1).zoom;\n const size = new Vector3();\n bb.getSize(size);\n return this.get_zoom_to_fit_rect(size.x, size.y);\n }\n }\n\n get_html_screen_pos(object, camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n object.getWorldPosition(tmp_vec);\n tmp_vec.project(camera);\n\n tmp_vec.x = (tmp_vec.x * 0.5 + 0.5) * (OScreen.width);\n tmp_vec.y = (1 - (tmp_vec.y * 0.5 + 0.5)) * OScreen.height;\n return tmp_vec;\n }\n\n world_pos_to_screen(pos, camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n tmp_vec.copy(pos);\n tmp_vec.project(camera);\n\n tmp_vec.x = (tmp_vec.x * 0.5 + 0.5) * (OScreen.width);\n tmp_vec.y = (1 - (tmp_vec.y * 0.5 + 0.5)) * OScreen.height;\n return tmp_vec;\n }\n\n update_projection(camera)\n {\n camera.left = -OScreen.width / 2;\n camera.right = OScreen.width / 2;\n camera.top = OScreen.height / 2;\n camera.bottom = -OScreen.height / 2;\n camera.aspect = OScreen.aspect_ratio;\n camera.updateProjectionMatrix(true);\n }\n}\n\nconst camera_utilities = new CameraUtilities();\nexport { camera_utilities as CameraUtilities };\n","import { Browser } from './Browser';\nimport { CameraManager } from './CameraManager';\nimport { Capabilities } from './Capabilities';\nimport { Configuration } from './Configuration';\nimport { Debug } from './Debug';\nimport { EventManager } from './EventManager';\nimport { Graphics } from './Graphics';\nimport { Input } from './Input';\nimport { OS } from './OS';\nimport { OScreen } from './OScreen';\nimport { ReflectionPlaneContext } from './ReflectionPlaneContext';\nimport { ResourceContainer } from './ResourceContainer';\nimport { SceneManager } from './SceneManager';\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, keyboard_input_container = document)\n {\n CameraManager.init();\n CameraUtilities.init();\n Capabilities.init();\n Configuration.init();\n EventManager.init();\n GeometryBatcher.init();\n Input.init(app_container, keyboard_input_container);\n OS.init();\n Browser.init();\n ReflectionPlaneContext.init();\n ResourceContainer.init();\n SceneManager.init();\n OScreen.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\nconst initializer = new Initializer();\nexport { initializer as Initializer };\n","import { BlitMaterial } from '../materials/BlitMaterial';\n\nimport frag from '../shaders/ssao/ssao.frag';\nimport vert from '../shaders/ssao/ssao.vert';\n\nimport { Matrix4 } from 'three';\nimport { Vector3 } from 'three';\nimport { DataTexture } from 'three';\nimport { RGBFormat } from 'three';\nimport { RepeatWrapping } from 'three';\n\nimport { OMath } from '../utilities/OMath';\nclass SSAOMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag, vert);\n\n this.uniforms._InverseProjMatrix = { value: new Matrix4() };\n this.uniforms._ProjectionMatrix = { value: new Matrix4() };\n\n this.uniforms._Bias = { value: 0.0125 };\n this.uniforms._Radius = { value: 0.3 };\n this.uniforms._FarPlane = { value: 100 };\n\n this.uniforms._SampleKernel = { value: this.__get_sample_kernel() };\n this.uniforms._RandomRotation = { value: this.__get_rotation_kernel() };\n }\n\n __get_sample_kernel()\n {\n const sample_kernel = [];\n const kernel_size = 64;\n\n for (let i = 0; i < kernel_size; i++)\n {\n const dir = new Vector3(Math.random() * 2 - 1,\n Math.random() * 2 - 1,\n Math.random());\n dir.normalize();\n let scale = i / kernel_size;\n scale = OMath.lerp(0.1, 1.0, scale * scale);\n dir.multiplyScalar(scale);\n\n sample_kernel.push(dir);\n }\n return sample_kernel;\n }\n\n __get_rotation_kernel()\n {\n const rotation_kernel = new Uint8Array(3 * 16);\n for (let i = 0; i < 16; i++)\n {\n rotation_kernel[i * 3 + 1] = Math.floor(Math.random() * 255);\n rotation_kernel[i * 3 + 2] = Math.floor(Math.random() * 255);\n rotation_kernel[i * 3 + 3] = 0;\n }\n\n const rotation_texture = new DataTexture(rotation_kernel, 4, 4, RGBFormat);\n rotation_texture.wrapS = RepeatWrapping;\n rotation_texture.wrapT = RepeatWrapping;\n\n rotation_texture.needsUpdate = true;\n return rotation_texture;\n }\n}\n\nexport { SSAOMaterial };\n","import { BlitMaterial } from '../materials/BlitMaterial';\n\nimport frag from '../shaders/ssao/ssao_compose.frag';\n\nclass SSAOComposeMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag);\n this.uniforms._AO = { value: undefined };\n }\n}\n\nexport { SSAOComposeMaterial };\n","import { BlitMaterial } from '../materials/BlitMaterial';\n\nimport frag from '../shaders/depth_normals/debug_normals.frag';\nimport depth_normals_vert from '../shaders/ssao/ssao.vert';\n\nimport { Matrix4 } from 'three';\n\nclass 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\nexport { DisplayNormalTextureMaterial };\n","import { BlitMaterial } from '../materials/BlitMaterial';\n\nimport frag from '../shaders/box_blur/box_blur.frag';\n\nimport { Vector2 } from 'three';\n\nclass BoxBlurMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag);\n this.uniforms._SampleDir = { value: new Vector2() };\n }\n}\n\nexport { BoxBlurMaterial };\n","import { BoxBlurMaterial } from '../materials/BoxBlurMaterial';\nimport { Graphics } from '../Graphics';\n\nimport { WebGLRenderTarget } from 'three';\n\nclass 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\nexport { Blurrer };\n","import { CameraManager } from '../CameraManager';\nimport { SceneManager } from '../SceneManager';\nimport { OScreen } from '../OScreen';\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\nclass 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(OScreen.width * this.ssaa, OScreen.height * this.ssaa);\n\n this.SSAO_RT = new WebGLRenderTarget(OScreen.width, OScreen.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 !== OScreen.width * this.ssaa || this.main_RT.height !== OScreen.height * this.ssaa)\n {\n this.main_RT.setSize(OScreen.width * this.ssaa, OScreen.height * this.ssaa);\n this.SSAO_RT.setSize(OScreen.width, OScreen.height);\n }\n }\n}\n\nexport { NormalAORender };\n","import { CameraManager } from '../CameraManager';\nimport { SceneManager } from '../SceneManager';\nimport { BaseRender } from '../render_mode/BaseRender';\nimport { Graphics } from '../Graphics';\n\nclass 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\nexport { NormalRender };\n","import { CameraManager } from '../CameraManager';\nimport { SceneManager } from '../SceneManager';\nimport { BaseRender } from '../render_mode/BaseRender';\nimport { Graphics } from '../Graphics';\n\nclass VRRender 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, Graphics._renderer.getRenderTarget());\n }\n\n this.render_spectator_camera();\n\n if (SceneManager.current.on_post_render)\n {\n SceneManager.current.on_post_render();\n }\n }\n\n render_spectator_camera()\n {\n const spectator_camera = CameraManager.spectator;\n\n if (spectator_camera && Graphics._renderer.xr.isPresenting)\n {\n // Copy the XR Camera's position and rotation, but use your\n // main camera's projection matrix\n const xrCam = Graphics._renderer.xr.getCamera(CameraManager.current);\n\n spectator_camera.projectionMatrix.copy(CameraManager.current.projectionMatrix);\n\n spectator_camera.position.copy(xrCam.position);\n spectator_camera.quaternion.copy(xrCam.quaternion);\n\n // we'll restore this later\n const currentRenderTarget = Graphics._renderer.getRenderTarget();\n\n // turn off the WebXR rendering\n Graphics._renderer.xr.isPresenting = false;\n\n // render to the canvas on our main display\n Graphics._renderer.setRenderTarget(null);\n Graphics._renderer.render(SceneManager.current, spectator_camera);\n\n // reset back to enable WebXR\n Graphics._renderer.setRenderTarget(currentRenderTarget);\n Graphics._renderer.xr.isPresenting = true;\n }\n }\n}\n\nexport { VRRender };\n","import { BlitMaterial } from './BlitMaterial';\n\nimport frag from '../shaders/gaussian_blur/gaussian_blur.frag';\n\nimport { Vector2 } from 'three';\n\nclass 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\nexport { GaussianBlurMaterial };\n","import { BlitMaterial } from './BlitMaterial';\n\nimport frag from '../shaders/luminosity_high_pass/luminosity_high_pass.frag';\n\nimport { Color } from 'three';\nclass 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\nexport { LuminosityHighPassMaterial };\n","import { GaussianBlurMaterial } from '../materials/GaussianBlurMaterial';\nimport { LuminosityHighPassMaterial } from '../materials/LuminosityHighPassMaterial';\nimport { Graphics } from '../Graphics';\n\nimport { WebGLRenderTarget, LinearFilter, RGBAFormat } from 'three';\n\nclass GaussianBlurrer\n{\n constructor(nMips = 5)\n {\n this.current_width = 1;\n this.current_height = 1;\n\n this.separableBlurMaterials = [];\n this.renderTargetsHorizontal = [];\n this.renderTargetsVertical = [];\n\n this.nMips = nMips;\n this.kernelSizeArray = [3, 5, 7, 9, 11];\n this.rt_pars = { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat };\n\n this.renderTargetBright = new WebGLRenderTarget(1, 1, this.rt_pars);\n this.renderTargetBright.texture.generateMipmaps = false;\n\n this.init_materials();\n this.init_RT();\n\n this.luminosity_high_pass_mat = new LuminosityHighPassMaterial();\n }\n\n blur(RT, use_luminosity_high_pass)\n {\n this.resize_RT(RT.width, RT.height);\n\n if (use_luminosity_high_pass)\n {\n Graphics.blit(RT, this.renderTargetBright, this.luminosity_high_pass_mat);\n }\n else\n {\n Graphics.blit(RT, this.renderTargetBright);\n }\n\n let inputRenderTarget = this.renderTargetBright;\n\n for (let i = 0; i < this.nMips; i++)\n {\n const mat = this.separableBlurMaterials[i];\n\n mat.set_direction(1, 0);\n Graphics.blit(inputRenderTarget, this.renderTargetsHorizontal[i], mat);\n\n mat.set_direction(0, 1);\n Graphics.blit(this.renderTargetsHorizontal[i], this.renderTargetsVertical[i], mat);\n\n inputRenderTarget = this.renderTargetsVertical[i];\n }\n }\n\n get_blurred_texture()\n {\n return this.renderTargetsHorizontal[0].texture;\n }\n\n get_blurred_RT()\n {\n return this.renderTargetsHorizontal[0];\n }\n\n init_RT()\n {\n this.dispose_RT();\n\n this.renderTargetBright.setSize(1, 1);\n\n for (let i = 0; i < this.nMips; i++)\n {\n const hor = new WebGLRenderTarget(1, 1, this.rt_pars);\n const ver = new WebGLRenderTarget(1, 1, this.rt_pars);\n\n hor.texture.generateMipmaps = false;\n ver.texture.generateMipmaps = false;\n\n this.renderTargetsHorizontal.push(hor);\n this.renderTargetsVertical.push(ver);\n }\n }\n\n resize_RT(texture_width, texture_height)\n {\n if (this.current_width === texture_width && this.current_height === texture_height)\n {\n return;\n }\n\n this.current_width = texture_width;\n this.current_height = texture_height;\n\n let width = Math.round(texture_width / 2);\n let height = Math.round(texture_height / 2);\n\n this.renderTargetBright.setSize(width, height);\n\n for (let i = 0; i < this.nMips; i++)\n {\n this.renderTargetsVertical[i].setSize(width, height);\n this.renderTargetsHorizontal[i].setSize(width, height);\n this.separableBlurMaterials[i].set_size(width, height);\n\n width = Math.round(width / 2);\n height = Math.round(height / 2);\n }\n }\n\n init_materials(texture_width, texture_height)\n {\n this.dispose_materials();\n\n for (let i = 0; i < this.nMips; i++)\n {\n this.separableBlurMaterials.push(new GaussianBlurMaterial(this.kernelSizeArray[i]));\n }\n }\n\n dispose_materials()\n {\n for (let i = 0; i < this.separableBlurMaterials.length; i++)\n {\n this.separableBlurMaterials[i].dispose();\n }\n this.separableBlurMaterials.length = 0;\n }\n\n dispose_RT()\n {\n for (let i = 0; i < this.renderTargetsVertical.length; i++)\n {\n this.renderTargetsHorizontal[i].dispose();\n this.renderTargetsVertical[i].dispose();\n }\n this.renderTargetBright.dispose();\n\n this.renderTargetsHorizontal.length = 0;\n this.renderTargetsVertical.length = 0;\n }\n}\n\nexport { GaussianBlurrer };\n","import { OScreen } from '../OScreen';\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\nclass 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(OScreen.render_width, OScreen.render_height);\n this.blur_RT = new WebGLRenderTarget(OScreen.render_width, OScreen.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 !== OScreen.render_width || this.main_RT.height !== OScreen.render_height)\n {\n this.main_RT.setSize(OScreen.render_width, OScreen.render_height);\n this.blur_RT.setSize(OScreen.render_width, OScreen.render_height);\n }\n }\n}\n\nexport { UnrealBloomRender };\n","import { Color } from 'three';\nimport { OrthographicCamera as TOrthographicCamera } from 'three';\n\nclass OrthographicCamera extends TOrthographicCamera\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 copy(camera)\n {\n super.copy(camera);\n this.clear_color.copy(camera.clear_color);\n this.clear_alpha = camera.clear_alpha;\n return this;\n }\n}\n\nexport { OrthographicCamera };\n","import { ViewManager } from './ViewManager';\n\nclass ViewComponentManager\n{\n constructor()\n {\n this.components = [];\n this.enabled_components = new Set();\n }\n\n update()\n {\n this.__set_components_opacities();\n\n for (const component of this.enabled_components)\n {\n component.update(ViewManager.transition_handler.current_state_data);\n }\n }\n\n register_component(component)\n {\n this.components.push(component);\n }\n\n enable_component(component)\n {\n // const component_to_enable = this.get_component_by_name(component_name);\n\n this.enabled_components.add(component);\n }\n\n disable_component(component)\n {\n // const component_to_disable = this.get_component_by_name(component_name);\n\n this.enabled_components.delete(component);\n }\n\n get_component_by_name(component_name)\n {\n console.warn('DEPRECATED. Use ViewComponentManager.get instead');\n this.get(component_name);\n }\n\n get(component_name)\n {\n for (let i = 0; i < this.components.length; i++)\n {\n if (this.components[i].name === component_name)\n {\n return this.components[i];\n }\n }\n console.error('[ViewComponentManager.get] no component found for: ', component_name);\n return undefined;\n }\n\n __set_components_opacities()\n {\n for (let i = 0; i < this.components.length; i++)\n {\n this.components[i].set_opacity(ViewManager.transition_handler.current_state_data);\n }\n }\n}\n\nconst view_component_manager = new ViewComponentManager();\nexport { view_component_manager as 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\nclass RenderLoop\n{\n constructor(target_application, graphics)\n {\n target_application = target_application || new BaseApplication();\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 Input.update();\n\n this.target_application.update();\n ViewManager.update();\n ViewComponentManager.update();\n\n this.target_application.on_pre_render();\n\n this.graphics.update(); // render scene\n UI.update(); // update after new camera matrix has been calculated\n UI.render(this.graphics); // render ui layer on top\n this.target_application.on_post_render();\n\n Debug.render(this.graphics); // render debug layer\n\n // ###### END CYCLE #######\n\n this.target_application.on_frame_end();\n this.frames_passed++;\n\n Input.clear();\n UI.clear();\n Debug.clear();\n }\n\n start()\n {\n if (this.is_running) return; // sanity check\n\n if (this.frames_passed === 0)\n {\n this.target_application.on_enter();\n }\n\n this.is_running = true;\n\n this.graphics._renderer.setAnimationLoop(this.update.bind(this));\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 this.graphics._renderer.setAnimationLoop(null);\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\nexport { RenderLoop };\n","import { OScreen } from './OScreen';\n\nclass Screen\n{\n init()\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n OScreen.init();\n }\n\n update_position(x, y)\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n OScreen.update_position(x, y);\n }\n\n update()\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n OScreen.update();\n }\n\n update_size(width, height)\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n OScreen.update_size(width, height);\n }\n\n apply_pixel_density_v2(vector2)\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n return OScreen.apply_pixel_density_v2(vector2);\n }\n\n apply_pixel_density(value)\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n return OScreen.apply_pixel_density(value);\n }\n\n get_pixel_size()\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n return OScreen.get_pixel_size();\n }\n\n get aspect_ratio()\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n return OScreen.aspect_ratio;\n }\n}\n\nconst screen = new Screen();\nexport { screen as Screen };\n","\nimport { CanvasDrawer } from './CanvasDrawer';\n\nimport { Vector2 } from 'three';\n\nclass SimpleTextDrawer extends CanvasDrawer\n{\n constructor()\n {\n super();\n this.text_margin = new Vector2(2, 0);\n }\n\n __draw(text, ctxOptions, canvas, ctx)\n {\n ctx.font = ctxOptions.font;\n\n const text_size = this.get_text_size(text, ctxOptions.font);\n // canvas.width = Math.ceilPowerOfTwo(text_size.x+this.text_margin.x*2);\n // canvas.height = Math.ceilPowerOfTwo(text_size.y+ this.text_margin.y*2);\n canvas.width = Math.ceil(text_size.x + this.text_margin.x * 2);\n canvas.height = Math.ceil(text_size.y + this.text_margin.y * 2);\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n // turn this on for debugging\n ctx.globalAlpha = 0.0;\n ctx.fillStyle = ctxOptions.font_color || '#000000';\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.globalAlpha = 1;\n\n ctx.globalAlpha = 1;\n\n ctx.font = ctxOptions.font;\n ctx.fillStyle = ctxOptions.font_color || '#000000';\n ctx.textBaseline = 'middle';\n\n ctx.textAlign = ctxOptions.textAlign || 'center';\n if (ctx.textAlign === 'center')\n {\n ctx.fillText(text, canvas.width / 2, canvas.height / 2);\n }\n else\n {\n ctx.fillText(text, 0, canvas.height / 2);\n }\n }\n}\n\nexport { SimpleTextDrawer };\n","import { HTMLUtilities } from '../utilities/HTMLUtilities';\nimport { ViewComponentManager } from './ViewComponentManager';\n\nclass ViewComponent\n{\n constructor({ name, container })\n {\n this.name = name;\n this.container = container;\n this.hidden = true;\n\n ViewComponentManager.register_component(this);\n }\n\n start()\n {\n }\n\n on_enter()\n {\n this.container.classList.remove('hidden');\n ViewComponentManager.enable_component(this);\n\n this.hidden = false;\n }\n\n update()\n {\n }\n\n on_exit()\n {\n this.container.classList.add('hidden');\n ViewComponentManager.disable_component(this);\n\n this.hidden = true;\n }\n\n set_opacity(current_state_data)\n {\n this.container.style.opacity = current_state_data[`${this.name}_opacity`];\n this.toggle_hidden();\n }\n\n toggle_hidden()\n {\n if (this.container.style.opacity > 0.001)\n {\n if (this.hidden)\n {\n this.on_enter();\n }\n }\n else\n {\n if (!this.hidden)\n {\n this.on_exit();\n }\n }\n }\n\n load_html_images()\n {\n HTMLUtilities.load_images(this.container);\n }\n\n load_html_videos()\n {\n HTMLUtilities.load_videos(this.container);\n }\n}\n\nexport { ViewComponent };\n","import { Mesh } from 'three';\nimport { MeshBasicMaterial } from 'three';\nimport { PlaneGeometry } from 'three';\n\nclass HorizontalPlane extends Mesh\n{\n constructor(width, height, color, material)\n {\n width = width || 1;\n height = height || 1;\n color = color || '#FF0000';\n material = material || new MeshBasicMaterial({ color: color });\n\n const geometry = new PlaneGeometry(width, height);\n geometry.rotateX(-3.14 / 2);\n super(geometry, material);\n }\n}\n\nexport { HorizontalPlane };\n","import { Mesh } from 'three';\nimport { PlaneGeometry } from 'three';\nimport { MeshBasicMaterial } from 'three';\n\nclass VerticalPlane extends Mesh\n{\n constructor(width, height, color, material)\n {\n width = width || 1;\n height = height || 1;\n color = color || '#FF0000';\n material = material || new MeshBasicMaterial({ color: color });\n\n const geometry = new PlaneGeometry(width, height);\n super(geometry, material);\n }\n}\n\nexport { VerticalPlane };\n","class ArrayUtilities\n{\n constructor()\n {}\n\n static merge_from_to(source, target)\n {\n target.push.apply(target, source);\n }\n\n static expand_vec3_array(array, size)\n {\n const items_left_count = size - array.length;\n\n for (let i = 0; i < items_left_count; i++)\n {\n array.push(array[i].clone());\n }\n }\n\n static remove_elem(array, elem)\n {\n const index = array.indexOf(elem);\n if (index > -1)\n {\n array.splice(index, 1);\n }\n }\n\n static get_closest_point(points, target)\n {\n let closest_point = points[0];\n let closest_distance = closest_point.distanceTo(target);\n for (let i = 1; i < points.length; i++)\n {\n if (points[i].distanceTo(target) < closest_distance)\n {\n closest_point = points[i];\n closest_distance = points[i].distanceTo(target);\n }\n }\n return closest_point;\n }\n\n static object_values_to_array(obj)\n {\n const ids = Object.keys(obj);\n const arr = [];\n for (let i = 0; i < ids.length; i++)\n {\n arr.push(obj[ids[i]]);\n }\n return arr;\n }\n}\n\nexport { ArrayUtilities };\n","import { Line3, Plane, Quaternion, Sphere, Vector3 } from 'three';\n\nclass FrustumPointFitter\n{\n constructor()\n {\n this.sphere = new Sphere();\n }\n\n fit_points(points, camera_quaternion, vertical_fov, aspect)\n {\n this.sphere.setFromPoints(points);\n\n const v_fov = Math.degToRad(vertical_fov / 2);\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\n\n const up_plane_normal = this.get_up_plane_normal(camera_quaternion, v_fov);\n const down_plane_normal = this.get_down_plane_normal(camera_quaternion, v_fov);\n const left_plane_normal = this.get_left_plane_normal(camera_quaternion, h_fov);\n const right_plane_normal = this.get_right_plane_normal(camera_quaternion, h_fov);\n\n const camera_forward_dir = new Vector3(0, 0, -1).applyQuaternion(camera_quaternion);\n\n const sphere_center = this.sphere.center.clone();\n\n const pull_back_distance = this.get_distance_to_fit_rect(this.sphere.radius * 2, this.sphere.radius * 2, vertical_fov, aspect);\n const far_pos = sphere_center.clone().add(camera_forward_dir.clone().multiplyScalar(pull_back_distance * -1));\n\n const up_plane = new Plane().setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\n const down_plane = new Plane().setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\n\n const left_plane = new Plane().setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\n const right_plane = new Plane().setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\n\n this.apply_center_correction_to_pos(far_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane);\n\n up_plane.setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\n down_plane.setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\n\n left_plane.setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\n right_plane.setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\n\n let closest_distance = Infinity;\n\n const inverse_dir = camera_forward_dir.clone().multiplyScalar(pull_back_distance * -2);\n for (let i = 0; i < points.length; i++)\n {\n const line = new Line3(points[i].clone(), points[i].clone().add(inverse_dir));\n\n const up_line_intersection = new Vector3();\n const down_line_intersection = new Vector3();\n\n const left_line_intersection = new Vector3();\n const right_line_intersection = new Vector3();\n\n up_plane.intersectLine(line, up_line_intersection);\n down_plane.intersectLine(line, down_line_intersection);\n\n left_plane.intersectLine(line, left_line_intersection);\n right_plane.intersectLine(line, right_line_intersection);\n\n if (up_line_intersection.length() < 0.0001)\n {\n console.log('up intersection not found', i);\n }\n if (down_line_intersection.length() < 0.0001)\n {\n console.log('down intersection not found', i);\n }\n if (left_line_intersection.length() < 0.0001)\n {\n console.log('left intersection not found', i);\n }\n if (right_line_intersection.length() < 0.0001)\n {\n console.log('right intersection not found', i);\n }\n\n const new_up_distance = points[i].clone().sub(up_line_intersection).length();\n const new_down_distance = points[i].clone().sub(down_line_intersection).length();\n\n const new_left_distance = points[i].clone().sub(left_line_intersection).length();\n const new_right_distance = points[i].clone().sub(right_line_intersection).length();\n\n const vertical_min = Math.min(new_up_distance, new_down_distance);\n const horizontal_min = Math.min(new_left_distance, new_right_distance);\n\n const min = Math.min(vertical_min, horizontal_min);\n\n if (min < closest_distance)\n {\n closest_distance = min;\n }\n }\n\n const forward_correction = camera_forward_dir.clone().multiplyScalar(closest_distance);\n const closest_position = far_pos.clone().add(forward_correction);\n\n return closest_position;\n }\n\n apply_center_correction_to_pos(target_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane)\n {\n const vertical_offset = this.get_vertical_correction(points, down_plane, up_plane, camera_quaternion);\n const horizontal_offset = this.get_hozirontal_correction(points, left_plane, right_plane, camera_quaternion);\n\n target_pos.add(vertical_offset);\n target_pos.add(horizontal_offset);\n }\n\n get_vertical_correction(points, down_plane, up_plane, camera_quaternion)\n {\n let closest_distance_to_up_plane = Infinity;\n let closest_distance_to_down_plane = Infinity;\n let closest_up_point = undefined;\n let closest_down_point = undefined;\n\n const up_dir = new Vector3(0, 1, 0).applyQuaternion(camera_quaternion);\n for (let i = 0; i < points.length; i++)\n {\n const down_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(-5000000)));\n const up_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(5000000)));\n\n const down_line_intersection = new Vector3();\n const up_line_intersection = new Vector3();\n\n down_plane.intersectLine(down_line, down_line_intersection);\n up_plane.intersectLine(up_line, up_line_intersection);\n\n const down_dist = down_line_intersection.distanceTo(points[i]);\n const up_dist = up_line_intersection.distanceTo(points[i]);\n\n if (up_line_intersection.length() < 0.0001)\n {\n console.log('vertical up intersection not found', i);\n }\n if (down_line_intersection.length() < 0.0001)\n {\n console.log('vertical down intersection not found', i);\n }\n\n if (down_dist < closest_distance_to_down_plane)\n {\n closest_distance_to_down_plane = down_dist;\n closest_down_point = points[i];\n }\n if (up_dist < closest_distance_to_up_plane)\n {\n closest_distance_to_up_plane = up_dist;\n closest_up_point = points[i];\n }\n }\n\n console.log(closest_up_point, closest_down_point);\n\n const correction = (closest_distance_to_up_plane - closest_distance_to_down_plane) / 2;\n\n // console.log(\"vertical_correction\", correction)\n return up_dir.clone().multiplyScalar(-correction);\n }\n\n get_hozirontal_correction(points, left_plane, right_plane, camera_quaternion)\n {\n let closest_distance_to_right_plane = Infinity;\n let closest_distance_to_left_plane = Infinity;\n let closest_right_point = undefined;\n let closest_left_point = undefined;\n\n const right_dir = new Vector3(1, 0, 0).applyQuaternion(camera_quaternion);\n\n for (let i = 0; i < points.length; i++)\n {\n const left_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(-5000000)));\n const right_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(5000000)));\n\n const left_line_intersection = new Vector3();\n const right_line_intersection = new Vector3();\n\n left_plane.intersectLine(left_line, left_line_intersection);\n right_plane.intersectLine(right_line, right_line_intersection);\n\n const left_dist = left_line_intersection.distanceTo(points[i]);\n const right_dist = right_line_intersection.distanceTo(points[i]);\n\n if (left_line_intersection.length() < 0.0001)\n {\n console.log('left intersection not found', i);\n }\n if (right_line_intersection.length() < 0.0001)\n {\n console.log('right intersection not found', i);\n }\n\n if (left_dist < closest_distance_to_left_plane)\n {\n closest_distance_to_left_plane = left_dist;\n closest_left_point = points[i];\n }\n if (right_dist < closest_distance_to_right_plane)\n {\n closest_distance_to_right_plane = right_dist;\n closest_right_point = points[i];\n }\n }\n\n const correction = (closest_distance_to_right_plane - closest_distance_to_left_plane) / 2;\n // console.log(\"horizontal_correction\", correction)\n\n console.log(closest_right_point, closest_left_point);\n\n return right_dir.clone().multiplyScalar(-correction);\n }\n\n get_up_plane_normal(camera_quaternion, v_fov)\n {\n const up_plane_normal = new Vector3(0, -1, 0);\n up_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), v_fov));\n up_plane_normal.applyQuaternion(camera_quaternion);\n return up_plane_normal;\n }\n\n get_down_plane_normal(camera_quaternion, v_fov)\n {\n const down_plane_normal = new Vector3(0, 1, 0);\n down_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), -v_fov));\n down_plane_normal.applyQuaternion(camera_quaternion);\n return down_plane_normal;\n }\n\n get_left_plane_normal(camera_quaternion, h_fov)\n {\n const left_plane_normal = new Vector3(1, 0, 0);\n left_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), h_fov));\n left_plane_normal.applyQuaternion(camera_quaternion);\n return left_plane_normal;\n }\n\n get_right_plane_normal(camera_quaternion, h_fov)\n {\n const right_plane_normal = new Vector3(-1, 0, 0);\n right_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), -h_fov));\n right_plane_normal.applyQuaternion(camera_quaternion);\n return right_plane_normal;\n }\n\n get_distance_to_fit_rect(width, height, vertical_fov, aspect)\n {\n const v_fov = (vertical_fov / 2) * Math.PI / 180;\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\n\n const distV = height / Math.tan(v_fov);\n const distH = width / Math.tan(h_fov);\n return Math.max(Math.abs(distH), Math.abs(distV));\n }\n}\n\nexport { FrustumPointFitter };\n","import { BufferAttribute } from 'three';\nimport { BufferGeometry } from 'three';\n\nclass GeometryUtilities\n{\n static convert_to_non_indexed_geometry(geometry_buffer)\n {\n const indices = geometry_buffer.index;\n const positions = geometry_buffer.getAttribute('position');\n\n const bar_coordinates = [];\n const vertices = [];\n\n for (let i = 0; i < indices.count; i += 3)\n {\n // VERTEX 1\n vertices.push(positions.getX(indices.array[i + 0]));\n vertices.push(positions.getY(indices.array[i + 0]));\n vertices.push(positions.getZ(indices.array[i + 0]));\n\n bar_coordinates.push(1);\n bar_coordinates.push(0);\n bar_coordinates.push(0);\n\n // VERTEX 2\n\n vertices.push(positions.getX(indices.array[i + 1]));\n vertices.push(positions.getY(indices.array[i + 1]));\n vertices.push(positions.getZ(indices.array[i + 1]));\n\n bar_coordinates.push(0);\n bar_coordinates.push(1);\n bar_coordinates.push(0);\n\n // VERTEX 3\n\n vertices.push(positions.getX(indices.array[i + 2]));\n vertices.push(positions.getY(indices.array[i + 2]));\n vertices.push(positions.getZ(indices.array[i + 2]));\n\n bar_coordinates.push(0);\n bar_coordinates.push(0);\n bar_coordinates.push(1);\n }\n\n const geometry = new BufferGeometry();\n // geometry.setAttribute('barycentric', new BufferAttribute( new Float32Array(bar_coordinates), 3 ));\n geometry.setAttribute('position', new BufferAttribute(new Float32Array(vertices), 3));\n GeometryUtilities.add_barycentric_attribute(geometry);\n return geometry;\n }\n\n static add_barycentric_attribute(non_indexed_geometry_buffer)\n {\n const bar_coordinates = [];\n const positions = non_indexed_geometry_buffer.getAttribute('position');\n\n for (let i = 0; i < positions.count; i += 3)\n {\n bar_coordinates.push(1);\n bar_coordinates.push(0);\n bar_coordinates.push(0);\n\n bar_coordinates.push(0);\n bar_coordinates.push(1);\n bar_coordinates.push(0);\n\n bar_coordinates.push(0);\n bar_coordinates.push(0);\n bar_coordinates.push(1);\n }\n non_indexed_geometry_buffer.setAttribute('barycentric', new BufferAttribute(new Float32Array(bar_coordinates), 3));\n }\n}\n\nexport { GeometryUtilities };\n","import { Vector4 } from 'three';\n\nclass ImageUtilities\n{\n constructor()\n { }\n\n static get_image_data(image)\n {\n const canvas = document.createElement('canvas');\n canvas.width = image.width;\n canvas.height = image.height;\n\n const context = canvas.getContext('2d');\n context.drawImage(image, 0, 0);\n\n return context.getImageData(0, 0, image.width, image.height);\n }\n\n static get_pixel(imagedata, x, y)\n {\n const position = (x + imagedata.width * y) * 4;\n const data = imagedata.data;\n return new Vector4(data[position + 0], data[position + 1], data[position + 2], data[position + 3]);\n }\n}\n\nexport { ImageUtilities };\n","import { Vector3 } from 'three';\nimport { Vector2 } from 'three';\nclass MeshSampler\n{\n constructor()\n {\n\n }\n\n sample(buffer_geometry, sample_count)\n {\n const face_areas = [];\n\n let min_area = 99999999;\n\n const vertices = buffer_geometry.getAttribute('position');\n const normals = buffer_geometry.getAttribute('normal');\n const tangents = buffer_geometry.getAttribute('tangent');\n const uvs = buffer_geometry.getAttribute('uv');\n const indices = buffer_geometry.index;\n\n const faces = [];\n\n for (let i = 0; i < indices.count; i += 3)\n {\n const index_0 = indices.array[i + 0];\n const index_1 = indices.array[i + 1];\n const index_2 = indices.array[i + 2];\n\n const v1 = new Vector3();\n v1.x = vertices.getX(index_0);\n v1.y = vertices.getY(index_0);\n v1.z = vertices.getZ(index_0);\n\n const v2 = new Vector3();\n v2.x = vertices.getX(index_1);\n v2.y = vertices.getY(index_1);\n v2.z = vertices.getZ(index_1);\n\n const v3 = new Vector3();\n v3.x = vertices.getX(index_2);\n v3.y = vertices.getY(index_2);\n v3.z = vertices.getZ(index_2);\n\n const face = {\n a: v1,\n b: v2,\n c: v3\n };\n\n if (normals)\n {\n const n1 = new Vector3();\n n1.x = normals.getX(index_0);\n n1.y = normals.getY(index_0);\n n1.z = normals.getZ(index_0);\n\n const n2 = new Vector3();\n n2.x = normals.getX(index_1);\n n2.y = normals.getY(index_1);\n n2.z = normals.getZ(index_1);\n\n const n3 = new Vector3();\n n3.x = normals.getX(index_2);\n n3.y = normals.getY(index_2);\n n3.z = normals.getZ(index_2);\n\n const normal = n1.clone().add(n2).add(n3).normalize();\n face.normal = normal;\n }\n\n if (tangents)\n {\n const n1 = new Vector3();\n n1.x = tangents.getX(index_0);\n n1.y = tangents.getY(index_0);\n n1.z = tangents.getZ(index_0);\n\n const n2 = new Vector3();\n n2.x = tangents.getX(index_1);\n n2.y = tangents.getY(index_1);\n n2.z = tangents.getZ(index_1);\n\n const n3 = new Vector3();\n n3.x = tangents.getX(index_2);\n n3.y = tangents.getY(index_2);\n n3.z = tangents.getZ(index_2);\n\n const tangent = n1.clone().add(n2).add(n3).normalize();\n face.tangent = tangent;\n }\n if (uvs)\n {\n const uv_a = new Vector2();\n uv_a.x = uvs.getX(index_0);\n uv_a.y = uvs.getY(index_0);\n\n const uv_b = new Vector2();\n uv_b.x = uvs.getX(index_1);\n uv_b.y = uvs.getY(index_1);\n\n const uv_c = new Vector2();\n uv_c.x = uvs.getX(index_2);\n uv_c.y = uvs.getY(index_2);\n\n face.uv_a = uv_a;\n face.uv_b = uv_b;\n face.uv_c = uv_c;\n }\n\n faces.push(face);\n\n const area = this.get_face_area(face);\n min_area = Math.min(area, min_area);\n face_areas.push(area);\n }\n\n const normalized_faces_array = this.get_uniform_face_distribution(face_areas, min_area, faces);\n const selected_faces = this.select_random_faces(normalized_faces_array, sample_count);\n const sampled_data = this.sample_data_from_faces(selected_faces);\n return sampled_data;\n }\n\n sample_data_from_faces(faces)\n {\n const sampled_points = [];\n const sampled_normals = [];\n const sampled_tangents = [];\n const sampled_uvs = [];\n\n for (let i = 0; i < faces.length; i++)\n {\n const face = faces[i];\n\n const w1 = Math.random();\n const w2 = Math.random();\n\n sampled_points.push(this.sample_point_in_face(w1, w2, face.a, face.b, face.c).clone());\n if (face.normal)\n {\n sampled_normals.push(face.normal.clone());\n }\n if (face.tangent)\n {\n sampled_tangents.push(face.tangent.clone());\n }\n if (face.uv_a)\n {\n sampled_uvs.push(this.sample_point_in_face(w1, w2, face.uv_a, face.uv_b, face.uv_c).clone());\n }\n }\n return { points: sampled_points, normals: sampled_normals, tangents: sampled_tangents, uvs: sampled_uvs };\n }\n\n select_random_faces(faces, amount)\n {\n const selected_faces = [];\n for (let i = 0; i < amount; i++)\n {\n const random = Math.floor(Math.random() * faces.length);\n const selected_face = faces[random];\n\n selected_faces.push(selected_face);\n }\n\n return selected_faces;\n }\n\n get_uniform_face_distribution(face_areas, minimum_area, faces)\n {\n const extended_triangle_indices = [];\n for (let i = 0; i < face_areas.length; i++)\n {\n face_areas[i] /= minimum_area;\n const repetitions_needed = Math.floor(Math.round(face_areas[i]));\n for (let j = 0; j < repetitions_needed; j++)\n {\n extended_triangle_indices.push(faces[i]);\n }\n }\n return extended_triangle_indices;\n }\n\n get_face_area(face)\n {\n const vec1 = face.b.clone().sub(face.a);\n const vec2 = face.c.clone().sub(face.a);\n return vec1.cross(vec2).length() / 2;\n }\n\n sample_point_in_face(w1, w2, v1, v2, v3)\n {\n if (w1 + w2 > 1)\n {\n w1 = 1.0 - w1;\n w2 = 1.0 - w2;\n }\n\n const w3 = 1.0 - (w1 + w2);\n\n return v1.clone().multiplyScalar(w1).add(v2.clone().multiplyScalar(w2)).add(v3.clone().multiplyScalar(w3));\n }\n}\n\nconst mesh_sampler = new MeshSampler();\nexport { mesh_sampler as MeshSampler };\n","import { Mesh } from 'three';\nimport { BufferGeometry } from 'three';\nimport { Skeleton } from 'three';\n\nclass ModelUtilities\n{\n get_mesh(scene, result_callback)\n {\n scene.traverse((child) =>\n {\n if (child instanceof Mesh)\n {\n if (child.geometry)\n {\n child.geometry = new BufferGeometry().fromGeometry(child.geometry);\n }\n result_callback(child);\n }\n });\n }\n\n get_geometries(scene)\n {\n const geometries = [];\n\n this.get_mesh(scene, (child) =>\n {\n geometries.push(child.geometry);\n });\n return geometries;\n }\n\n assign_material(scene, material, name)\n {\n scene.traverse((child) =>\n {\n if (child instanceof Mesh)\n {\n // assign to all if no name is given\n if (name === undefined)\n {\n child.material = material;\n }\n else\n {\n // if name is given, assign only to that\n if (child.name === name)\n {\n child.material = material;\n }\n }\n }\n });\n }\n\n clone_animated_gltf(gltf)\n {\n const clone = {\n animations: gltf.animations,\n scene: gltf.scene.clone(true)\n };\n\n const skinnedMeshes = {};\n\n gltf.scene.traverse(node =>\n {\n if (node.isSkinnedMesh)\n {\n skinnedMeshes[node.name] = node;\n }\n });\n\n const cloneBones = {};\n const cloneSkinnedMeshes = {};\n\n clone.scene.traverse(node =>\n {\n if (node.isBone)\n {\n cloneBones[node.name] = node;\n }\n\n if (node.isSkinnedMesh)\n {\n cloneSkinnedMeshes[node.name] = node;\n }\n });\n\n for (const name in skinnedMeshes)\n {\n const skinnedMesh = skinnedMeshes[name];\n const skeleton = skinnedMesh.skeleton;\n const cloneSkinnedMesh = cloneSkinnedMeshes[name];\n\n const orderedCloneBones = [];\n\n for (let i = 0; i < skeleton.bones.length; ++i)\n {\n const cloneBone = cloneBones[skeleton.bones[i].name];\n orderedCloneBones.push(cloneBone);\n }\n\n cloneSkinnedMesh.bind(\n new Skeleton(orderedCloneBones, skeleton.boneInverses),\n cloneSkinnedMesh.matrixWorld);\n }\n\n return clone;\n }\n\n set_shadow_config(scene, cast, receive)\n {\n scene.traverse((child) =>\n {\n if (child instanceof Mesh)\n {\n child.castShadow = cast;\n child.receiveShadow = receive;\n }\n });\n }\n\n __find_object(scene, object_name, result_callback)\n {\n scene.traverse((obj) =>\n {\n if (obj.name === object_name)\n {\n result_callback(obj);\n }\n });\n }\n\n get_object(scene, object_name)\n {\n let object = undefined;\n scene.traverse((obj) =>\n {\n if (obj.name === object_name)\n {\n object = obj;\n }\n });\n return object;\n }\n\n get_object_by_type(scene, object_type)\n {\n let object = undefined;\n scene.traverse((obj) =>\n {\n if (obj.constructor.name === object_type)\n {\n object = obj;\n }\n });\n return object;\n }\n}\n\nconst model_utilities = new ModelUtilities();\nexport { model_utilities as ModelUtilities };\n","class ObjectUtilities\r\n{\r\n static is_object(item)\r\n {\r\n return (item && typeof item === 'object' && !Array.isArray(item));\r\n }\r\n\r\n static merge_deep(target, ...sources)\r\n {\r\n if (!sources.length) return target;\r\n const source = sources.shift();\r\n\r\n if (ObjectUtilities.is_object(target) && ObjectUtilities.is_object(source))\r\n {\r\n for (const key in source)\r\n {\r\n if (ObjectUtilities.is_object(source[key]))\r\n {\r\n if (!target[key]) Object.assign(target, { [key]: {} });\r\n ObjectUtilities.merge_deep(target[key], source[key]);\r\n }\r\n else\r\n {\r\n Object.assign(target, { [key]: source[key] });\r\n }\r\n }\r\n }\r\n\r\n return ObjectUtilities.merge_deep(target, ...sources);\r\n }\r\n\r\n static xml_to_json(xml)\r\n {\r\n // Create the return object\r\n let obj = {};\r\n\r\n if (xml.nodeType === 1)\r\n { // element\r\n // do attributes\r\n if (xml.attributes.length > 0)\r\n {\r\n obj['@attributes'] = {};\r\n for (let j = 0; j < xml.attributes.length; j++)\r\n {\r\n const attribute = xml.attributes.item(j);\r\n obj['@attributes'][attribute.nodeName] = attribute.nodeValue;\r\n }\r\n }\r\n }\r\n else if (xml.nodeType === 3)\r\n { // text\r\n obj = xml.nodeValue;\r\n }\r\n\r\n // do children\r\n if (xml.hasChildNodes())\r\n {\r\n for (let i = 0; i < xml.childNodes.length; i++)\r\n {\r\n const item = xml.childNodes.item(i);\r\n const nodeName = item.nodeName;\r\n if (typeof (obj[nodeName]) === 'undefined')\r\n {\r\n obj[nodeName] = this.xml_to_json(item);\r\n }\r\n else\r\n {\r\n if (typeof (obj[nodeName].push) === 'undefined')\r\n {\r\n const old = obj[nodeName];\r\n obj[nodeName] = [];\r\n obj[nodeName].push(old);\r\n }\r\n obj[nodeName].push(this.xml_to_json(item));\r\n }\r\n }\r\n }\r\n return obj;\r\n }\r\n}\r\n\r\nexport { ObjectUtilities };\r\n","class StringUtilities\n{\n constructor()\n {}\n\n static get_random_color()\n {\n const hexValues = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'A', 'B', 'C', 'D', 'E', 'F'];\n let hex = '#';\n\n for (let i = 0; i < 6; i++)\n {\n const index = Math.floor(Math.random() * hexValues.length);\n hex += hexValues[index];\n }\n\n return hex;\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\nexport { StringUtilities };\n","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\nexport { TimeUtilities };\n","import { Vector3, Plane, Quaternion, Sphere, Line3 } from 'three';\nimport { OMath } from './OMath';\n\nclass PerspectiveFrustumPointFitter\n{\n constructor()\n {\n this.sphere = new Sphere();\n }\n\n fit_points(points, camera_quaternion, vertical_fov, aspect)\n {\n this.sphere.setFromPoints(points);\n\n const v_fov = OMath.degToRad(vertical_fov / 2);\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\n\n const up_plane_normal = this.get_up_plane_normal(camera_quaternion, v_fov);\n const down_plane_normal = this.get_down_plane_normal(camera_quaternion, v_fov);\n const left_plane_normal = this.get_left_plane_normal(camera_quaternion, h_fov);\n const right_plane_normal = this.get_right_plane_normal(camera_quaternion, h_fov);\n\n const camera_forward_dir = new Vector3(0, 0, -1).applyQuaternion(camera_quaternion);\n\n const sphere_center = this.sphere.center.clone();\n\n const pull_back_distance = this.get_distance_to_fit_rect(this.sphere.radius * 2, this.sphere.radius * 2, vertical_fov, aspect);\n const far_pos = sphere_center.clone().add(camera_forward_dir.clone().multiplyScalar(pull_back_distance * -1));\n\n const up_plane = new Plane().setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\n const down_plane = new Plane().setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\n\n const left_plane = new Plane().setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\n const right_plane = new Plane().setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\n\n this.apply_center_correction_to_pos(far_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane);\n\n up_plane.setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\n down_plane.setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\n\n left_plane.setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\n right_plane.setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\n\n let closest_distance = Infinity;\n\n const inverse_dir = camera_forward_dir.clone().multiplyScalar(pull_back_distance * -2);\n for (let i = 0; i < points.length; i++)\n {\n const line = new Line3(points[i].clone(), points[i].clone().add(inverse_dir));\n\n const up_line_intersection = new Vector3();\n const down_line_intersection = new Vector3();\n\n const left_line_intersection = new Vector3();\n const right_line_intersection = new Vector3();\n\n up_plane.intersectLine(line, up_line_intersection);\n down_plane.intersectLine(line, down_line_intersection);\n\n left_plane.intersectLine(line, left_line_intersection);\n right_plane.intersectLine(line, right_line_intersection);\n\n if (up_line_intersection.length() < 0.0001)\n {\n console.log('up intersection not found', i);\n }\n if (down_line_intersection.length() < 0.0001)\n {\n console.log('down intersection not found', i);\n }\n if (left_line_intersection.length() < 0.0001)\n {\n console.log('left intersection not found', i);\n }\n if (right_line_intersection.length() < 0.0001)\n {\n console.log('right intersection not found', i);\n }\n\n const new_up_distance = points[i].clone().sub(up_line_intersection).length();\n const new_down_distance = points[i].clone().sub(down_line_intersection).length();\n\n const new_left_distance = points[i].clone().sub(left_line_intersection).length();\n const new_right_distance = points[i].clone().sub(right_line_intersection).length();\n\n const vertical_min = Math.min(new_up_distance, new_down_distance);\n const horizontal_min = Math.min(new_left_distance, new_right_distance);\n\n const min = Math.min(vertical_min, horizontal_min);\n\n if (min < closest_distance)\n {\n closest_distance = min;\n }\n }\n\n const forward_correction = camera_forward_dir.clone().multiplyScalar(closest_distance);\n const closest_position = far_pos.clone().add(forward_correction);\n\n return closest_position;\n }\n\n apply_center_correction_to_pos(target_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane)\n {\n const vertical_offset = this.get_vertical_correction(points, down_plane, up_plane, camera_quaternion);\n const horizontal_offset = this.get_horizontal_correction(points, left_plane, right_plane, camera_quaternion);\n\n target_pos.add(vertical_offset);\n target_pos.add(horizontal_offset);\n }\n\n get_vertical_correction(points, down_plane, up_plane, camera_quaternion)\n {\n let closest_distance_to_up_plane = Infinity;\n let closest_distance_to_down_plane = Infinity;\n // let closest_up_point = undefined;\n // let closest_down_point = undefined;\n\n const up_dir = new Vector3(0, 1, 0).applyQuaternion(camera_quaternion);\n for (let i = 0; i < points.length; i++)\n {\n const down_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(-5000000)));\n const up_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(5000000)));\n\n const down_line_intersection = new Vector3();\n const up_line_intersection = new Vector3();\n\n down_plane.intersectLine(down_line, down_line_intersection);\n up_plane.intersectLine(up_line, up_line_intersection);\n\n const down_dist = down_line_intersection.distanceTo(points[i]);\n const up_dist = up_line_intersection.distanceTo(points[i]);\n\n if (up_line_intersection.length() < 0.0001)\n {\n console.log('vertical up intersection not found', i);\n }\n if (down_line_intersection.length() < 0.0001)\n {\n console.log('vertical down intersection not found', i);\n }\n\n if (down_dist < closest_distance_to_down_plane)\n {\n closest_distance_to_down_plane = down_dist;\n // closest_down_point = points[i];\n }\n if (up_dist < closest_distance_to_up_plane)\n {\n closest_distance_to_up_plane = up_dist;\n // closest_up_point = points[i];\n }\n }\n\n const correction = (closest_distance_to_up_plane - closest_distance_to_down_plane) / 2;\n\n // console.log(\"vertical_correction\", correction)\n return up_dir.clone().multiplyScalar(-correction);\n }\n\n get_horizontal_correction(points, left_plane, right_plane, camera_quaternion)\n {\n let closest_distance_to_right_plane = Infinity;\n let closest_distance_to_left_plane = Infinity;\n // let closest_right_point = undefined;\n // let closest_left_point = undefined;\n\n const right_dir = new Vector3(1, 0, 0).applyQuaternion(camera_quaternion);\n\n for (let i = 0; i < points.length; i++)\n {\n const left_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(-5000000)));\n const right_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(5000000)));\n\n const left_line_intersection = new Vector3();\n const right_line_intersection = new Vector3();\n\n left_plane.intersectLine(left_line, left_line_intersection);\n right_plane.intersectLine(right_line, right_line_intersection);\n\n const left_dist = left_line_intersection.distanceTo(points[i]);\n const right_dist = right_line_intersection.distanceTo(points[i]);\n\n if (left_line_intersection.length() < 0.0001)\n {\n console.log('left intersection not found', i);\n }\n if (right_line_intersection.length() < 0.0001)\n {\n console.log('right intersection not found', i);\n }\n\n if (left_dist < closest_distance_to_left_plane)\n {\n closest_distance_to_left_plane = left_dist;\n // closest_left_point = points[i];\n }\n if (right_dist < closest_distance_to_right_plane)\n {\n closest_distance_to_right_plane = right_dist;\n // closest_right_point = points[i];\n }\n }\n\n const correction = (closest_distance_to_right_plane - closest_distance_to_left_plane) / 2;\n // console.log(\"horizontal_correction\", correction)\n\n return right_dir.clone().multiplyScalar(-correction);\n }\n\n get_up_plane_normal(camera_quaternion, v_fov)\n {\n const up_plane_normal = new Vector3(0, -1, 0);\n up_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), v_fov));\n up_plane_normal.applyQuaternion(camera_quaternion);\n return up_plane_normal;\n }\n\n get_down_plane_normal(camera_quaternion, v_fov)\n {\n const down_plane_normal = new Vector3(0, 1, 0);\n down_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), -v_fov));\n down_plane_normal.applyQuaternion(camera_quaternion);\n return down_plane_normal;\n }\n\n get_left_plane_normal(camera_quaternion, h_fov)\n {\n const left_plane_normal = new Vector3(1, 0, 0);\n left_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), h_fov));\n left_plane_normal.applyQuaternion(camera_quaternion);\n return left_plane_normal;\n }\n\n get_right_plane_normal(camera_quaternion, h_fov)\n {\n const right_plane_normal = new Vector3(-1, 0, 0);\n right_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), -h_fov));\n right_plane_normal.applyQuaternion(camera_quaternion);\n return right_plane_normal;\n }\n\n get_distance_to_fit_rect(width, height, vertical_fov, aspect)\n {\n const v_fov = (vertical_fov / 2) * Math.PI / 180;\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\n\n const distV = height / Math.tan(v_fov);\n const distH = width / Math.tan(h_fov);\n return Math.max(Math.abs(distH), Math.abs(distV));\n }\n}\n\nexport { PerspectiveFrustumPointFitter };\n","import { Vector3, Box3 } from 'three';\n\nclass OrthographicFrustumPointFitter\n{\n constructor()\n {\n\n }\n\n fit_points(points, camera_quaternion, vertical_fov, aspect)\n {\n const inverse_camera_quat = camera_quaternion.clone().inverse();\n\n const inverted_points = [];\n\n for (let i = 0; i < points.length; i++)\n {\n inverted_points.push(points[i].clone().applyQuaternion(inverse_camera_quat));\n }\n\n const box = new Box3().setFromPoints(inverted_points);\n const size = new Vector3();\n box.getSize(size);\n\n const distance = this.get_distance_to_fit_rect(size.x / 2, size.y / 2, vertical_fov, aspect);\n\n const center = new Vector3();\n box.getCenter(center);\n\n center.applyQuaternion(camera_quaternion);\n\n return {\n center: center,\n distance_to_center: distance\n };\n }\n\n get_distance_to_fit_rect(width, height, vertical_fov, aspect)\n {\n const v_fov = (vertical_fov / 2) * Math.PI / 180;\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\n\n const distV = height / Math.tan(v_fov);\n const distH = width / Math.tan(h_fov);\n return Math.max(Math.abs(distH), Math.abs(distV));\n }\n}\n\nexport { OrthographicFrustumPointFitter };\n","import grid_frag from '../shaders/grid/grid.frag';\nimport grid_vert from '../shaders/grid/grid.vert';\n\nimport { GeometryUtilities } from '../utilities/GeometryUtilities';\n\nimport { Mesh } from 'three';\nimport { ShaderMaterial } from 'three';\nimport { Color } from 'three';\nimport { PlaneGeometry } from 'three';\n\nclass Grid extends Mesh\n{\n constructor()\n {\n const material = new ShaderMaterial({\n uniforms: {\n _Color: { value: new Color('#919191') }\n },\n vertexShader: grid_vert,\n fragmentShader: grid_frag,\n extensions: { derivatives: true },\n transparent: true,\n depthWrite: false\n });\n\n const plane_geometry = new PlaneGeometry(100, 100, 100, 100);\n\n const non_indexed_geometry = GeometryUtilities.convert_to_non_indexed_geometry(plane_geometry);\n\n super(non_indexed_geometry, material);\n\n this.rotation.x = -3.14 / 2;\n }\n}\n\nexport { Grid };\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\nclass Line extends Mesh\n{\n constructor(points)\n {\n const geometry = new BufferGeometry();\n geometry.setAttribute('position', new BufferAttribute(new Float32Array([]), 3));\n geometry.setAttribute('next_position', new BufferAttribute(new Float32Array([]), 3));\n geometry.setAttribute('previous_position', new BufferAttribute(new Float32Array([]), 3));\n geometry.setAttribute('orientation', new BufferAttribute(new Float32Array([]), 1));\n geometry.setAttribute('coverage', new BufferAttribute(new Float32Array([]), 1));\n\n const material = new ShaderMaterial({\n uniforms: {\n _Thickness: { value: 0.2 },\n _Length: { value: 0 },\n _ElapsedTime: { value: 0 },\n _Color: { value: new Color('#FF0000') }\n },\n vertexShader: line_vs,\n fragmentShader: line_fs,\n transparent: true,\n depthWrite: false,\n extensions: { derivatives: true }\n\n });\n\n super(geometry, material);\n\n if (points)\n {\n this.setup(points);\n }\n }\n\n setup(points)\n {\n const vertices = [];\n const next_position = [];\n const previous_position = [];\n const orientation = [];\n const coverage = [];\n let accumulated_length = 0;\n\n for (let i = 0; i < points.length; i++)\n {\n vertices.push(points[i].x);\n vertices.push(points[i].y);\n vertices.push(points[i].z);\n orientation.push(1);\n\n vertices.push(points[i].x);\n vertices.push(points[i].y);\n vertices.push(points[i].z);\n orientation.push(-1);\n\n const next_point = this.__get_next_position(points, i);\n next_position.push(next_point.x);\n next_position.push(next_point.y);\n next_position.push(next_point.z);\n\n next_position.push(next_point.x);\n next_position.push(next_point.y);\n next_position.push(next_point.z);\n\n const previous_point = this.__get_previous_position(points, i);\n previous_position.push(previous_point.x);\n previous_position.push(previous_point.y);\n previous_position.push(previous_point.z);\n\n previous_position.push(previous_point.x);\n previous_position.push(previous_point.y);\n previous_position.push(previous_point.z);\n\n coverage.push(accumulated_length);\n coverage.push(accumulated_length);\n\n if (i < points.length - 1)\n {\n accumulated_length += points[i].distanceTo(next_point);\n }\n }\n const vertexList = new Float32Array(vertices);\n const nextPositionList = new Float32Array(next_position);\n const previousPositionList = new Float32Array(previous_position);\n const orientationList = new Float32Array(orientation);\n const coverageList = new Float32Array(coverage);\n\n const indices = [];\n for (let i = 0; i < ((vertexList.length / 3) - 2) / 2; i++)\n {\n const index = (i * 2) + 1;\n indices.push(index);\n indices.push(index + 1);\n indices.push(index - 1);\n\n indices.push(index);\n indices.push(index + 2);\n indices.push(index + 1);\n }\n\n this.geometry.setIndex(indices);\n this.geometry.getAttribute('position').copy(new BufferAttribute(vertexList, 3));\n this.geometry.getAttribute('next_position').copy(new BufferAttribute(nextPositionList, 3));\n this.geometry.getAttribute('previous_position').copy(new BufferAttribute(previousPositionList, 3));\n this.geometry.getAttribute('orientation').copy(new BufferAttribute(orientationList, 1));\n this.geometry.getAttribute('coverage').copy(new BufferAttribute(coverageList, 1));\n\n this.geometry.getAttribute('position').needsUpdate = true;\n this.geometry.getAttribute('next_position').needsUpdate = true;\n this.geometry.getAttribute('previous_position').needsUpdate = true;\n this.geometry.getAttribute('orientation').needsUpdate = true;\n this.geometry.getAttribute('coverage').needsUpdate = true;\n\n this.material.uniforms._Length.value = accumulated_length;\n this._length = accumulated_length;\n }\n\n set thickness(value)\n {\n this.material.uniforms._Thickness.value = value;\n }\n\n get thickness()\n {\n return this.material.uniforms._Thickness.value;\n }\n\n __get_previous_position(points, i)\n {\n if (i === 0)\n {\n return points[1].clone().sub(points[0]).multiplyScalar(-1).add(points[0]);\n }\n else\n {\n return points[i - 1];\n }\n }\n\n __get_next_position(points, i)\n {\n if (i === points.length - 1)\n {\n return points[points.length - 2].clone().sub(points[points.length - 1]).multiplyScalar(-1).add(points[points.length - 1]);\n }\n else\n {\n return points[i + 1];\n }\n }\n\n update()\n {\n }\n\n distance()\n {\n return this.accumulated_length;\n }\n\n total_length()\n {\n return this.accumulated_length;\n }\n\n dispose()\n {\n this.geometry.dispose();\n this.material.dispose();\n if (this.parent)\n {\n this.parent.remove(this);\n }\n }\n\n set color(col)\n {\n this.material.uniforms._Color.value.set(col);\n }\n\n get color()\n {\n return this.material.uniforms._Color.value;\n }\n\n copy_color(col)\n {\n this.material.uniforms._Color.value.copy(col);\n }\n}\n\nexport { Line };\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\nclass WorldImage extends Mesh\n{\n constructor(texture, pivot)\n {\n pivot = pivot || new Vector2(0, 0);\n const material = new ShaderMaterial({\n uniforms: {\n _MainTex: { value: texture },\n _ScreenAligned: { value: 0 },\n _Scale: { value: 1 },\n _Opacity: { value: 1 }\n },\n vertexShader: basic_texture_vert,\n fragmentShader: basic_texture_frag,\n transparent: true,\n depthWrite: false,\n side: DoubleSide\n });\n const geometry = new PlaneGeometry(1, 1, 1);\n geometry.translate(-pivot.x / 2, -pivot.y / 2, 0);\n const current_scale = texture.image.width / texture.image.height;\n geometry.scale(current_scale, 1, 1);\n super(geometry, material);\n this.current_scale = current_scale;\n this.geometry.computeBoundingBox();\n\n this.tmp_bb_size = new Vector3();\n this.geometry.boundingBox.getSize(this.tmp_bb_size);\n }\n\n update_texture()\n {\n this.material.uniforms._MainTex.value.needsUpdate = true;\n const img = this.material.uniforms._MainTex.value.image;\n\n this.geometry.scale(1 / this.current_scale, 1, 1);\n this.current_scale = img.width / img.height;\n this.geometry.scale(this.current_scale, 1, 1);\n this.geometry.computeBoundingBox();\n this.geometry.boundingBox.getSize(this.tmp_bb_size);\n }\n\n get size()\n {\n return this.tmp_bb_size.clone().multiplyScalar(this.scale.x);\n }\n\n set size(value)\n {\n this.scale.set(value, value, value);\n this.material.uniforms._Scale.value = value;\n }\n\n set screen_aligned(boolean)\n {\n this.material.uniforms._ScreenAligned.value = boolean === true ? 1 : 0;\n }\n\n get screen_aligned()\n {\n return this.material.uniforms._ScreenAligned.value === 1;\n }\n\n set opacity(opacity)\n {\n this.material.uniforms._Opacity.value = opacity;\n }\n\n get opacity()\n {\n return this.material.uniforms._Opacity.value;\n }\n\n dispose()\n {\n this.geometry.dispose();\n this.parent.remove(this);\n this.material.uniforms._MainTex.value.dispose();\n this.material.dispose();\n }\n}\n\nexport { WorldImage };\n","import { WorldImage } from './WorldImage';\nimport { SimpleTextDrawer } from '../canvas_drawer/SimpleTextDrawer';\n\nimport { LinearMipMapLinearFilter } from 'three';\nimport { LinearFilter } from 'three';\n\nclass Text2D extends WorldImage\n{\n constructor(text, font, color, pivot, is_static)\n {\n const simple_text_drawer = new SimpleTextDrawer(is_static);\n\n const draw_settings = {\n font: font,\n font_color: color || '#000000'\n };\n const canvas_texture = simple_text_drawer.draw_on_texture(text, draw_settings);\n\n canvas_texture.minFilter = LinearMipMapLinearFilter;\n canvas_texture.minFilter = LinearFilter;\n canvas_texture.needsUpdate = true;\n super(canvas_texture, pivot);\n\n this.simple_text_drawer = simple_text_drawer;\n this.canvas_texture = canvas_texture;\n this.draw_settings = draw_settings;\n }\n\n set text(value)\n {\n this.simple_text_drawer.draw_canvas(value, this.draw_settings);\n this.update_texture();\n }\n\n get text()\n {\n return 'not implemented';\n }\n}\n\nexport { Text2D };\n","import vert from '../shaders/ui_element/ui_element.vert';\nimport frag from '../shaders/ui_element/ui_element.frag';\n\nimport { BaseShaderMaterial } from '../materials/BaseShaderMaterial';\n\nimport { Vector2 } from 'three';\nimport { Vector3 } from 'three';\n\nimport { OScreen } from '../OScreen';\n\nclass UIElementMaterial extends BaseShaderMaterial\n{\n constructor(intensity = 1)\n {\n super(vert, frag, {\n _MainTex: { value: undefined },\n _ScreenSize: { value: new Vector2(OScreen.width, OScreen.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\nexport { UIElementMaterial };\n","import { Vector2 } from 'three';\n\nclass 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\nexport { ScreenSpacePosition };\n","import { CameraManager } from '../../CameraManager';\n\nimport { Vector2 } from 'three';\nimport { Vector3 } from 'three';\n\nclass 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\nexport { WorldSpacePosition };\n","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\nexport { UIElementState };\n","import { UIElementState } from './UIElementState';\n\nclass 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\nexport { OnIdle };\n","import { UIElementState } from './UIElementState';\n\nclass 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\nexport { OnMouseEnter };\n","import { UIElementState } from './UIElementState';\n\nclass 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\nexport { OnMouseExit };\n","import { UIElementState } from './UIElementState';\n\nclass 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\nexport { OnMouseHover };\n","\nimport { OScreen } from '../OScreen';\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\nclass 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(OScreen.width, OScreen.height);\n this.get_size(this.material.uniforms._TextureSize.value);\n\n this.cached_NDC_position.copy(this.position_strategy.get_pos_NDC(this.position));\n this.material.uniforms._NDC.value.copy(this.position);\n this.current_state.update(this, normalized_mouse_pos);\n }\n\n is_mouse_over(normalized_mouse_pos)\n {\n this.screen_pos_tmp.copy(this.cached_NDC_position);\n this.to_screen_position(this.screen_pos_tmp);\n this.screen_pos_tmp.x += this.pixel_offset.x;\n this.screen_pos_tmp.y += this.pixel_offset.y;\n\n const rect = new Box2().setFromCenterAndSize(this.screen_pos_tmp, this.get_size());\n\n this.mouse_pos_tmp.copy(normalized_mouse_pos);\n this.to_screen_position(this.mouse_pos_tmp);\n\n return rect.containsPoint(this.mouse_pos_tmp);\n }\n\n to_screen_position(projected_pos)\n {\n projected_pos.x = (projected_pos.x * 0.5 + 0.5) * OScreen.width + this.pixel_offset.x;\n projected_pos.y = (projected_pos.y * 0.5 + 0.5) * OScreen.height + this.pixel_offset.y;\n }\n\n get_screen_space_position()\n {\n const pos = this.cached_NDC_position.clone();\n this.to_screen_position(pos);\n return pos;\n }\n\n set_screen_space_position(screen_pos)\n {\n this.position.x = (screen_pos.x / OScreen.width) * 2 - 1;\n this.position.y = (screen_pos.y / OScreen.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 // OScreen.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 / OScreen.dpr);\n }\n else\n {\n return new Vector2().copy(this.texture_size).multiplyScalar(this.size / OScreen.dpr);\n }\n }\n\n on_mouse_enter()\n {}\n\n on_mouse_exit()\n {}\n\n on_mouse_hover()\n {}\n}\n\nexport { UIElement };\n","import { Mesh } from 'three';\n\nclass UpdatableMaterialMesh extends Mesh\n{\n constructor(geometry, material)\n {\n super(geometry, material);\n\n const self = this;\n\n this.onBeforeRender = () =>\n {\n self.material.update();\n };\n }\n}\n\nexport { UpdatableMaterialMesh };\n","import { Vector2, Vector4 } from 'three';\n\nclass TextGlyph\n{\n constructor(offset, plane_bounds, atlas_bounds)\n {\n const width = plane_bounds.right - plane_bounds.left;\n const height = plane_bounds.top - plane_bounds.bottom;\n\n this.scale = new Vector2(width, height);\n this.position = new Vector2(offset + plane_bounds.left, plane_bounds.bottom);\n\n this.atlas_bounds = new Vector4(atlas_bounds.left, atlas_bounds.right, atlas_bounds.top, atlas_bounds.bottom);\n }\n}\n\nexport { TextGlyph };\n","import { Vector3, Quaternion, Matrix4, Color, Box2, Vector2 } from 'three';\nimport { TextGlyph } from './TextGlyph';\n\nclass SDFText\n{\n constructor(glyph_layout, text = '')\n {\n this.glyph_layout = glyph_layout;\n\n this.glyphs = [];\n\n this.glyph_is_dirty = true;\n this.matrix_is_dirty = true;\n this.color_is_dirty = true;\n\n this.position = new Vector3();\n this.quaternion = new Quaternion();\n this.scale = new Vector3(1, 1, 1);\n this.matrix = new Matrix4();\n\n this.color = new Color('#FFFFFF');\n\n this.pivot_point = new Vector2();\n this.__opacity = 1;\n\n this.__text = text;\n\n this.__generate_glyphs(text);\n }\n\n set text(value)\n {\n this.__text = value;\n this.__generate_glyphs(value);\n this.matrix_is_dirty = true;\n }\n\n get text()\n {\n return this.__text;\n }\n\n update_matrix()\n {\n this.matrix.compose(this.position, this.quaternion, this.scale);\n this.matrix_is_dirty = false;\n this.glyph_is_dirty = true;\n }\n\n clear_glyph_dirty()\n {\n this.glyph_is_dirty = false;\n }\n\n clear_color_dirty()\n {\n this.color_is_dirty = false;\n }\n\n set_rotation(orientation = 0, tilt = 0) // 0..360, -90..0..90\n {\n const new_orientation = new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), (orientation / 360) * Math.PI * 2);\n const new_tilt = new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), (-tilt / 360) * Math.PI * 2);\n\n this.quaternion.copy(new_orientation.multiply(new_tilt));\n this.matrix_is_dirty = true;\n }\n\n set_position(pos)\n {\n this.position.copy(pos);\n this.matrix_is_dirty = true;\n }\n\n set_size(size)\n {\n this.scale.set(size, size, size);\n this.matrix_is_dirty = true;\n }\n\n set_color(col)\n {\n this.color.set(col);\n this.color_is_dirty = true;\n }\n\n set_pivot(pivot)\n {\n this.pivot_point.copy(pivot);\n this.update_glyphs();\n }\n\n set opacity(op)\n {\n this.__opacity = op;\n this.color_is_dirty = true;\n }\n\n get opacity()\n {\n return this.__opacity;\n }\n\n update_glyphs()\n {\n this.__generate_glyphs(this.text);\n }\n\n __generate_glyphs(text)\n {\n let cursor = 0;\n\n this.glyphs.length = 0;\n\n for (let i = 0; i < text.length; i++)\n {\n const unicode = text.charCodeAt(i);\n const glyph = this.glyph_layout.find(element => element.unicode === unicode);\n if (glyph)\n {\n if (glyph.planeBounds)\n {\n const text_glyph = new TextGlyph(cursor, glyph.planeBounds, glyph.atlasBounds);\n this.glyphs.push(text_glyph);\n }\n cursor += glyph.advance;\n }\n }\n\n const box2 = new Box2();\n const first_glyph = this.glyphs[0];\n box2.setFromCenterAndSize(first_glyph.position.clone().add(new Vector2(first_glyph.scale.x / 2, first_glyph.scale.y / 2)), first_glyph.scale);\n\n for (let i = 1; i < this.glyphs.length; i++)\n {\n const g = this.glyphs[i];\n const box = new Box2().setFromCenterAndSize(g.position.clone().add(new Vector2(g.scale.x / 2, g.scale.y / 2)), g.scale);\n box2.union(box);\n }\n\n const box2_size = new Vector2();\n box2.getSize(box2_size);\n for (let i = 0; i < this.glyphs.length; i++)\n {\n this.glyphs[i].position.x -= box2_size.x / 2;\n this.glyphs[i].position.y -= box2_size.y / 2;\n\n this.glyphs[i].position.x += (box2_size.x / 2) * this.pivot_point.x;\n this.glyphs[i].position.y += (box2_size.y / 2) * this.pivot_point.y;\n }\n\n this.glyph_is_dirty = true;\n }\n}\n\nexport { SDFText };\n","import { BaseShaderMaterial } from './BaseShaderMaterial';\n\nimport frag from '../shaders/sdf_text/sdf_text.frag';\nimport vert from '../shaders/sdf_text/sdf_text.vert';\n\nimport { Vector2, DoubleSide, LinearFilter } from 'three';\nimport { OMath } from '../utilities/OMath';\n\nclass 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 = OMath.lerp(0.5, 0.2, value);\n }\n}\n\nexport { SDFTextMaterial };\n","import { SDFText } from './SDFText';\nimport { SDFTextMaterial } from '../../materials/SDFTextMaterial';\nimport { ArrayUtilities } from '../../utilities/ArrayUtilities';\n\nimport {\n PlaneGeometry,\n Mesh,\n Vector2,\n InstancedBufferGeometry,\n InstancedBufferAttribute,\n Float32BufferAttribute,\n DynamicDrawUsage\n} from 'three';\n\nclass SDFTextBatch extends Mesh\n{\n constructor(font_layout, atlas_texture)\n {\n const max_allocations = 2000;\n\n const instanced_geometry = new InstancedBufferGeometry();\n instanced_geometry.instanceCount = 0;\n\n const geometry = new PlaneGeometry(1, 1);\n geometry.translate(0.5, 0.5, 0);\n instanced_geometry.setAttribute('position', new Float32BufferAttribute(geometry.getAttribute('position').array, 3));\n instanced_geometry.setAttribute('uv', new Float32BufferAttribute(geometry.getAttribute('uv').array, 2));\n instanced_geometry.index = geometry.index;\n\n const transformsCol0 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n const transformsCol1 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n const transformsCol2 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n const transformsCol3 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n\n const glyph_bounds = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n const plane_bounds = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n\n const color = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n\n transformsCol0.usage = DynamicDrawUsage;\n transformsCol1.usage = DynamicDrawUsage;\n transformsCol2.usage = DynamicDrawUsage;\n transformsCol3.usage = DynamicDrawUsage;\n glyph_bounds.usage = DynamicDrawUsage;\n plane_bounds.usage = DynamicDrawUsage;\n color.usage = DynamicDrawUsage;\n\n instanced_geometry.setAttribute('transformsCol0', transformsCol0);\n instanced_geometry.setAttribute('transformsCol1', transformsCol1);\n instanced_geometry.setAttribute('transformsCol2', transformsCol2);\n instanced_geometry.setAttribute('transformsCol3', transformsCol3);\n\n instanced_geometry.setAttribute('glyph_bounds', glyph_bounds);\n instanced_geometry.setAttribute('plane_bounds', plane_bounds);\n instanced_geometry.setAttribute('color', color);\n\n super(instanced_geometry, new SDFTextMaterial(atlas_texture));\n\n this.text_elements = [];\n this.font_layout = font_layout;\n\n this.material.set_atlas_size(new Vector2(font_layout.atlas.width, font_layout.atlas.height));\n\n this.frustumCulled = false;\n }\n\n set_boldness(value)\n {\n this.material.set_boldness(value);\n }\n\n add_text(text_str)\n {\n const elem = new SDFText(this.font_layout.glyphs, text_str);\n this.text_elements.push(elem);\n return elem;\n }\n\n remove_text(text_elem)\n {\n ArrayUtilities.remove_elem(this.text_elements, text_elem);\n this.update(true);\n }\n\n update(force_update)\n {\n const glyph_bounds_atr = this.geometry.getAttribute('glyph_bounds');\n const plane_bounds_atr = this.geometry.getAttribute('plane_bounds');\n\n const transformsCol0 = this.geometry.getAttribute('transformsCol0');\n const transformsCol1 = this.geometry.getAttribute('transformsCol1');\n const transformsCol2 = this.geometry.getAttribute('transformsCol2');\n const transformsCol3 = this.geometry.getAttribute('transformsCol3');\n\n const color_atr = this.geometry.getAttribute('color');\n\n let matrix_needs_update = force_update === true;\n let glyph_needs_update = force_update === true;\n let color_needs_update = force_update === true;\n\n let glyph_count = 0;\n for (let i = 0; i < this.text_elements.length; i++)\n {\n const text = this.text_elements[i];\n\n if (text.matrix_is_dirty)\n {\n matrix_needs_update = true;\n text.update_matrix();\n }\n\n if (text.glyph_is_dirty)\n {\n glyph_needs_update = true;\n text.clear_glyph_dirty();\n }\n\n if (text.color_is_dirty)\n {\n color_needs_update = true;\n text.clear_color_dirty();\n }\n\n const matrix = text.matrix;\n const color = text.color;\n const opacity = text.opacity;\n\n for (let glyph_i = 0; glyph_i < text.glyphs.length; glyph_i++)\n {\n const glyph = text.glyphs[glyph_i];\n\n const buffer_i = glyph_count;\n\n glyph_bounds_atr.setXYZW(buffer_i, glyph.atlas_bounds.x, glyph.atlas_bounds.y, glyph.atlas_bounds.z, glyph.atlas_bounds.w);\n plane_bounds_atr.setXYZW(buffer_i, glyph.position.x, glyph.position.y, glyph.scale.x, glyph.scale.y);\n\n transformsCol0.setXYZW(buffer_i, matrix.elements[0],\n matrix.elements[1],\n matrix.elements[2],\n matrix.elements[3]);\n\n transformsCol1.setXYZW(buffer_i, matrix.elements[4],\n matrix.elements[5],\n matrix.elements[6],\n matrix.elements[7]);\n\n transformsCol2.setXYZW(buffer_i, matrix.elements[8],\n matrix.elements[9],\n matrix.elements[10],\n matrix.elements[11]);\n\n transformsCol3.setXYZW(buffer_i, matrix.elements[12],\n matrix.elements[13],\n matrix.elements[14],\n matrix.elements[15]);\n\n color_atr.setXYZW(buffer_i, color.r, color.g, color.b, opacity);\n\n glyph_count++;\n }\n }\n\n this.geometry.instanceCount = glyph_count;\n\n if (glyph_count > this.max_allocations)\n {\n console.error('SDFTextBatch exceeded maximum glyph allocations(max/current): ', this.max_allocations, glyph_count, this);\n }\n\n if (matrix_needs_update)\n {\n transformsCol0.needsUpdate = true;\n transformsCol1.needsUpdate = true;\n transformsCol2.needsUpdate = true;\n transformsCol3.needsUpdate = true;\n }\n if (glyph_needs_update)\n {\n glyph_bounds_atr.needsUpdate = true;\n plane_bounds_atr.needsUpdate = true;\n }\n if (color_needs_update)\n {\n color_atr.needsUpdate = true;\n }\n }\n\n dispose()\n {\n this.geometry.dispose();\n this.material.dispose();\n }\n}\n\nexport { SDFTextBatch };\n","import { ActionInterpolator } from './ActionInterpolator';\n\nclass VectorInterpolator extends ActionInterpolator\n{\n constructor(attribute_name, from = 0, to = 1, easing_function = 'linear')\n {\n super(easing_function);\n\n this.attribute_name = attribute_name;\n this.from = from;\n this.to = to;\n }\n\n update(context, t)\n {\n const tmp = this.from.clone();\n tmp.lerp(this.to, this.easing_function(t));\n context[this.attribute_name].copy(tmp);\n }\n}\n\nexport { VectorInterpolator };\n","import { BlitMaterial } from '../materials/BlitMaterial';\n\nimport frag from '../shaders/median_filter/median_filter.frag';\n\nimport { Vector2 } from 'three';\n\nclass MedianFilterMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag, undefined, {\n kernel3x3: true\n });\n\n this.uniforms._SourceTex = { value: undefined };\n this.uniforms._SourceTexSize = { value: new Vector2(1, 1) };\n }\n\n set_texture(tex)\n {\n this.uniforms._SourceTex.value = tex;\n\n const size = this.get_size(tex);\n this.uniforms._SourceTexSize.value.copy(size);\n }\n\n get_size(tex)\n {\n if (tex.isVideoTexture)\n {\n return new Vector2(Math.max(1, tex.image.videoWidth), Math.max(1, tex.image.videoHeight));\n }\n if (tex.isWebGLRenderTarget)\n {\n return new Vector2(tex.width, tex.height);\n }\n if (tex.isTexture)\n {\n return new Vector2(tex.image.width, tex.image.height);\n }\n return new Vector2(1, 1);\n }\n}\n\nexport { MedianFilterMaterial };\n","import { MedianFilterMaterial } from '../materials/MedianFilterMaterial';\nimport { Graphics } from '../Graphics';\n\nimport { WebGLRenderTarget, Vector2, RGBAFormat, FloatType, NearestFilter } from 'three';\n\nclass MedianFilter\n{\n constructor(renderer)\n {\n this.RT = new WebGLRenderTarget(1, 1, {\n type: FloatType,\n format: RGBAFormat,\n minFilter: NearestFilter,\n magFilter: NearestFilter\n });\n this.RT1 = new WebGLRenderTarget(1, 1, {\n type: FloatType,\n format: RGBAFormat,\n minFilter: NearestFilter,\n magFilter: NearestFilter\n });\n\n this.median_filter_mat = new MedianFilterMaterial();\n }\n\n filter(texture)\n {\n const tex_size = this.get_size(texture);\n if (tex_size.x !== this.RT.width || tex_size.y !== this.RT.height)\n {\n this.RT.setSize(tex_size.x, tex_size.y);\n this.RT1.setSize(tex_size.x, tex_size.y);\n }\n\n this.median_filter_mat.set_texture(texture);\n Graphics.material_pass(this.median_filter_mat, this.RT);\n\n for (let i = 0; i < 0; i++)\n {\n this.median_filter_mat.set_texture(this.RT.texture);\n Graphics.material_pass(this.median_filter_mat, this.RT1);\n\n this.median_filter_mat.set_texture(this.RT1.texture);\n Graphics.material_pass(this.median_filter_mat, this.RT);\n }\n\n return this.RT;\n }\n\n get_size(tex)\n {\n if (tex.isVideoTexture)\n {\n return new Vector2(Math.max(1, tex.image.videoWidth), Math.max(1, tex.image.videoHeight));\n }\n if (tex.isWebGLRenderTarget)\n {\n return new Vector2(tex.width, tex.height);\n }\n if (tex.isTexture)\n {\n return new Vector2(tex.image.width, tex.image.height);\n }\n return new Vector2(1, 1);\n }\n}\n\nexport { MedianFilter };\n","import { BlitMaterial } from './BlitMaterial';\n\nimport downsample_frag from '../shaders/dual_filter_blur/downsample.frag';\nimport upsample_frag from '../shaders/dual_filter_blur/upsample.frag';\n\nclass DualFilteringBlurMaterial extends BlitMaterial\n{\n constructor(upsample)\n {\n super(upsample ? upsample_frag : downsample_frag);\n }\n}\n\nexport { DualFilteringBlurMaterial };\n","import { BlitMaterial } from './BlitMaterial';\n\nimport frag from '../shaders/dual_filter_blur/alpha_filter.frag';\n\nclass 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\nexport { AlphaFilterMaterial };\n","import { DualFilteringBlurMaterial } from '../materials/DualFilteringBlurMaterial';\nimport { AlphaFilterMaterial } from '../materials/AlphaFilterMaterial';\nimport { Graphics } from '../Graphics';\nimport { WebGLRenderTarget } from 'three';\nclass 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\nexport { DualFilteringBlurrer };\n","import { Graphics } from '../Graphics';\n\nimport { NearestFilter } from 'three';\nimport { RGBAFormat } from 'three';\nimport { LinearEncoding } from 'three';\nimport { HalfFloatType } from 'three';\nimport { FloatType } from 'three';\nimport { WebGLRenderTarget } from 'three';\nimport { Capabilities } from '../Capabilities';\n\nclass ParticleAttribute\n{\n constructor(attr_name, update_material)\n {\n this.read = undefined;\n this.write = undefined;\n\n this.name = attr_name;\n\n this.update_material = update_material;\n }\n\n init_from_geometry(geometry)\n {\n // overrided by inheritance\n }\n\n init_from_attribute(particle_attribute)\n {\n\n }\n\n build_RT(particle_count)\n {\n const resolution = ParticleAttribute.calculate_resolution(particle_count);\n const options = {\n minFilter: NearestFilter,\n magFilter: NearestFilter,\n format: RGBAFormat,\n encoding: LinearEncoding,\n type: Capabilities.fp_textures_available ? FloatType : HalfFloatType,\n stencilBuffer: false,\n depthBuffer: false\n };\n\n return new WebGLRenderTarget(resolution.width, resolution.height, options);\n }\n\n static calculate_resolution(particle_count)\n {\n const width = Math.min(particle_count, 512);\n const height = Math.max(1, Math.ceil(particle_count / width));\n return { width, height };\n }\n\n swap_RT()\n {\n const tmp = this.read;\n this.read = this.write;\n this.write = tmp;\n }\n\n update(attribute_writter_scene)\n {\n if (this.update_material)\n {\n this.update_material.update();\n attribute_writter_scene.children[0].material = this.update_material;\n this.update_material.uniforms._MainTex.value = this.read.texture;\n Graphics.render(attribute_writter_scene, undefined, this.write);\n attribute_writter_scene.children[0].material = undefined;\n\n this.swap_RT();\n }\n }\n\n store_geometry_attribute_in_RT(attribute, RT, storage_material, attribute_writter_scene)\n {\n attribute_writter_scene.children[0].geometry.setAttribute('data', attribute);\n attribute_writter_scene.children[0].material = storage_material;\n\n Graphics.render(attribute_writter_scene, undefined, RT);\n\n attribute_writter_scene.children[0].geometry.deleteAttribute('data');\n attribute_writter_scene.children[0].material = undefined;\n }\n\n get_texture()\n {\n return this.read.texture;\n }\n}\n\nexport { ParticleAttribute };\n","import { Object3D } from 'three';\nimport { BufferAttribute } from 'three';\nimport { PlaneGeometry } from 'three';\nimport { Mesh } from 'three';\nimport { BufferGeometry } from 'three';\nimport { Scene } from 'three';\nimport { Points } from 'three';\nimport { InstancedBufferGeometry } from 'three';\nimport { InstancedBufferAttribute } from 'three';\nimport { ParticleAttribute } from './ParticleAttribute';\n\nclass GPUParticleSystem extends Object3D\n{\n constructor(particle_count, material)\n {\n super();\n this.attributes = [];\n\n this.mesh = this.build_point_mesh(particle_count, material);\n this.add(this.mesh);\n\n this.attribute_writter_mesh = this.build_attribute_writter_mesh(particle_count);\n this.attribute_writter_scene = new Scene();\n this.attribute_writter_scene.add(this.attribute_writter_mesh);\n }\n\n add_texture_attribute(buffer_attribute)\n {\n this.attributes.push(buffer_attribute);\n }\n\n add_update_attribute_array(name, array, item_size)\n {\n this.attribute_writter_mesh.geometry.setAttribute(name, new BufferAttribute(array, item_size, false));\n }\n\n add_attribute_array(name, array, item_size)\n {\n this.mesh.geometry.setAttribute(name, new InstancedBufferAttribute(array, item_size, false));\n }\n\n update()\n {\n this.mesh.material.update();\n for (let i = 0; i < this.attributes.length; i++)\n {\n this.attributes[i].update(this.attribute_writter_scene);\n }\n }\n\n dispose()\n {\n this.mesh.geometry.dispose();\n this.mesh.material.dispose();\n }\n\n build_point_mesh(instance_count = 1, material)\n {\n const geo = new PlaneGeometry();\n\n const instanced_geo = new InstancedBufferGeometry();\n instanced_geo.setAttribute('position', geo.getAttribute('position'));\n instanced_geo.index = geo.index;\n\n instanced_geo.setAttribute('storage_uv', this.build_uv_storage_attribute(instance_count));\n instanced_geo.instanceCount = instance_count;\n const mesh = new Mesh(instanced_geo, material);\n mesh.frustumCulled = false;\n return mesh;\n }\n\n build_attribute_writter_mesh(particle_count)\n {\n const { width, height } = ParticleAttribute.calculate_resolution(particle_count);\n\n const uvs = new Float32Array(particle_count * 3);\n\n for (let i = 0; i < particle_count; i++)\n {\n const x = i % width;\n const y = Math.floor(i / width);\n uvs[i * 3 + 0] = (x + 0.5) / width;\n uvs[i * 3 + 1] = (y + 0.5) / height;\n uvs[i * 3 + 2] = i;\n }\n const geo = new BufferGeometry();\n geo.setAttribute('position', new BufferAttribute(uvs, 3, false));\n\n const points = new Points(geo);\n points.frustumCulled = false;\n return points;\n }\n\n build_uv_storage_attribute(particle_count)\n {\n const { width, height } = ParticleAttribute.calculate_resolution(particle_count);\n\n const uvs = new Float32Array(particle_count * 2);\n\n for (let i = 0; i < particle_count; i++)\n {\n const x = i % width;\n const y = Math.floor(i / width);\n uvs[i * 2 + 0] = (x + 0.5) / width;\n uvs[i * 2 + 1] = (y + 0.5) / height;\n }\n return new InstancedBufferAttribute(uvs, 2, false);\n }\n}\n\nexport { GPUParticleSystem };\n","import frag from '../../shaders/gpu_particles/generic_storage.frag';\n\nimport { ShaderMaterial } from 'three';\nimport { NoBlending } from 'three';\nimport { AlwaysDepth } from 'three';\n\nclass ParticleStorageMaterial extends ShaderMaterial\n{\n constructor()\n {\n const vert = `\n varying vec4 value;\n attribute vec4 data;\n\n void main()\n {\n gl_Position = vec4(position.xy * 2.0 - 1.0, 1.0,1.0);\n gl_PointSize = 1.0;\n\n value = data;\n }\n `;\n super({\n uniforms: {\n\n },\n vertexShader: vert,\n fragmentShader: frag,\n depthWrite: false,\n blending: NoBlending,\n depthTest: false,\n depthFunc: AlwaysDepth\n });\n }\n}\n\nexport { ParticleStorageMaterial };\n","import { BufferAttribute } from 'three';\n\nimport { ParticleAttribute } from '../gpu_particles/ParticleAttribute';\nimport { ParticleStorageMaterial } from '../materials/gpu_particles/ParticleStorageMaterial';\n\nclass ParticlePositionAttribute extends ParticleAttribute\n{\n constructor(update_material)\n {\n super('_Position', update_material);\n }\n\n store_geometry(geometry, attribute_writter_scene)\n {\n const pos_attr = geometry.getAttribute('position');\n this.read = this.build_RT(pos_attr.count);\n this.write = this.build_RT(pos_attr.count);\n\n const mat = new ParticleStorageMaterial();\n this.store_geometry_attribute_in_RT(geometry.getAttribute('position'), this.read, mat, attribute_writter_scene);\n }\n\n store_positions(positions, attribute_writter_scene)\n {\n this.read = this.build_RT(positions.length);\n this.write = this.build_RT(positions.length);\n\n const arr = new Float32Array(positions.length * 4);\n\n for (let i = 0; i < positions.length; i++)\n {\n arr[i * 4 + 0] = positions[i].x;\n arr[i * 4 + 1] = positions[i].y;\n arr[i * 4 + 2] = positions[i].z;\n arr[i * 4 + 3] = (Math.random() * 2 - 1) * 10;\n }\n const mat = new ParticleStorageMaterial();\n this.store_geometry_attribute_in_RT(new BufferAttribute(arr, 4), this.read, mat, attribute_writter_scene);\n }\n}\n\nexport { ParticlePositionAttribute };\n","import { DataTexture } from 'three';\n\nclass CustomDataTexture extends DataTexture\n{\n constructor(data, width, height, format, type)\n {\n super(data, width, height, format, type);\n this.multiplier = 1;\n }\n\n set_rgba(index, r, g, b, a)\n {\n this.data[index * 3 + 0] = r * this.multiplier;\n this.data[index * 3 + 1] = g * this.multiplier;\n this.data[index * 3 + 2] = b * this.multiplier;\n this.data[index * 3 + 3] = a * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_rgb(index, r, g, b)\n {\n this.data[index * 3 + 0] = r * this.multiplier;\n this.data[index * 3 + 1] = g * this.multiplier;\n this.data[index * 3 + 2] = b * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_r(index, value)\n {\n this.data[index * 3 + 0] = value * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_g(index, value)\n {\n this.data[index * 3 + 1] = value * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_b(index, value)\n {\n this.data[index * 3 + 2] = value * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_a(index, value)\n {\n this.data[index * 3 + 2] = value * this.multiplier;\n this.needsUpdate = true;\n }\n}\n\nexport { CustomDataTexture };\n","import { CustomDataTexture } from './CustomDataTexture';\nimport { RGBFormat } from 'three';\n\nclass RGBDataTexture extends CustomDataTexture\n{\n constructor(width, height)\n {\n const data = new Uint8Array(width * height * 3);\n super(data, width, height, RGBFormat);\n this.multiplier = 255;\n }\n}\n\nexport { RGBDataTexture };\n","import { CustomDataTexture } from './CustomDataTexture';\nimport { RGBAFormat } from 'three';\n\nclass RGBADataTexture extends CustomDataTexture\n{\n constructor(width, height)\n {\n const data = new Uint8Array(width * height * 4);\n super(data, width, height, RGBAFormat);\n this.multiplier = 255;\n }\n}\n\nexport { RGBADataTexture };\n","import { CustomDataTexture } from './CustomDataTexture';\nimport { FloatType } from 'three';\nimport { RGBFormat } from 'three';\n\nclass RGBFloatDataTexture extends CustomDataTexture\n{\n constructor(width, height)\n {\n const data = new Float32Array(width * height * 3);\n super(data, width, height, RGBFormat, FloatType);\n }\n}\n\nexport { RGBFloatDataTexture };\n","import { CustomDataTexture } from './CustomDataTexture';\nimport { FloatType } from 'three';\nimport { RGBAFormat } from 'three';\n\nclass RGBAFloatDataTexture extends CustomDataTexture\n{\n constructor(width, height)\n {\n const data = new Float32Array(width * height * 4);\n super(data, width, height, RGBAFormat, FloatType);\n }\n}\n\nexport { RGBAFloatDataTexture };\n","import { Mesh } from 'three';\nimport { RGBDataTexture } from '../data_textures/RGBDataTexture';\nimport { RGBADataTexture } from '../data_textures/RGBADataTexture';\nimport { RGBFloatDataTexture } from '../data_textures/RGBFloatDataTexture';\nimport { RGBAFloatDataTexture } from '../data_textures/RGBAFloatDataTexture';\n\nclass BatchedMesh extends Mesh\n{\n constructor(id_table, geometry, material, max_texture_width)\n {\n super(geometry, material);\n\n this.id_table = id_table;\n this.batched_count = Object.keys(id_table).length;\n this.max_texture_width = max_texture_width;\n this.batch_width = this.batched_count % max_texture_width;\n this.batch_height = Math.ceil(this.batched_count / max_texture_width);\n }\n\n attach_rgb_texture(uniform_name)\n {\n this.material.uniforms[uniform_name].value = new RGBDataTexture(this.batch_width, this.batch_height);\n }\n\n attach_rgba_texture(uniform_name)\n {\n this.material.uniforms[uniform_name].value = new RGBADataTexture(this.batch_width, this.batch_height);\n }\n\n attach_rgb_float_texture(uniform_name)\n {\n this.material.uniforms[uniform_name].value = new RGBFloatDataTexture(this.batch_width, this.batch_height);\n }\n\n attach_rgba_float_texture(uniform_name)\n {\n this.material.uniforms[uniform_name].value = new RGBAFloatDataTexture(this.batch_width, this.batch_height);\n }\n\n get_mesh_index(name)\n {\n return this.id_table[name];\n }\n\n set_rgb_value(uniform_name, mesh_name, r, g, b)\n {\n this.material.uniforms[uniform_name].set_rgb(this.get_mesh_index(mesh_name), r, g, b);\n }\n\n set_rgba_value(uniform_name, mesh_name, r, g, b, a)\n {\n this.material.uniforms[uniform_name].set_rgba(this.get_mesh_index(mesh_name), r, g, b, a);\n }\n}\n\nexport { BatchedMesh };\n","import { BatchedMesh } from './BatchedMesh';\n\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\n\nimport { BufferAttribute } from 'three';\n\nclass MeshBatcher\n{\n batch(meshes, material)\n {\n const max_texture_width = 2048;\n // let texture_width = meshes.length % max_texture_width;\n // let texture_height = Math.ceil(meshes.length / max_texture_width);\n\n // console.log(\"Store count: \" + buffer_geometries.length + \", Texture size: \" +texture_width);\n\n const geometries = [];\n const id_table = {};\n\n const attr_mesh_id = [];\n\n for (let i = 0; i < meshes.length; i++)\n {\n const mesh = meshes[i];\n const vertex_count = mesh.geometry.getAttribute('position').count;\n\n for (let count = 0; count < vertex_count; count++)\n {\n attr_mesh_id.push(i);\n }\n\n geometries.push(mesh.geometry);\n\n if (id_table[mesh.name] === undefined)\n {\n id_table[mesh.name] = i;\n }\n else\n {\n console.error('Mesh name is duplicated when trying to merge meshes. Non-unique id error.', mesh.name, id_table);\n }\n }\n\n const buffer_geometry = BufferGeometryUtils.mergeBufferGeometries(geometries);\n\n const buffer_attribute = new BufferAttribute(new Float32Array(attr_mesh_id), 1);\n buffer_geometry.setAttribute('mesh_id', buffer_attribute);\n\n return this.create_batched_mesh(id_table, buffer_geometry, material, max_texture_width);\n }\n\n create_batched_mesh(id_table, buffer_geometry, material, max_texture_width)\n {\n return new BatchedMesh(id_table, buffer_geometry, material, max_texture_width);\n }\n}\n\nexport { MeshBatcher };\n","import { Audio as TAudio } from 'three';\nimport { PositionalAudio as TPositionalAudio } from 'three';\n\nclass AudioClip\n{\n constructor(buffer, loop = true, volume = 1, positional = false)\n {\n this.buffer = buffer;\n this.loop = loop;\n this.volume = volume;\n this.positional = positional;\n\n this.audio = undefined;\n }\n\n init(audio_listener)\n {\n if (this.positional)\n {\n this.audio = new TPositionalAudio(audio_listener);\n }\n else\n {\n this.audio = new TAudio(audio_listener);\n }\n\n this.audio.setBuffer(this.buffer);\n this.audio.setLoop(this.loop);\n\n // This prevents undesired volume at the beginning of playing\n this.audio.gain.gain.value = 0;\n\n this.audio.setVolume(this.loop ? 0 : this.volume);\n }\n\n play()\n {\n this.audio.play();\n }\n\n pause()\n {\n this.audio.pause();\n }\n\n stop()\n {\n this.audio.stop();\n }\n\n get is_playing()\n {\n return this.audio.isPlaying;\n }\n}\n\nexport { AudioClip };\n","import { AudioContext } from 'three';\r\n\r\nimport { AudioClip } from '../components/AudioClip';\r\nimport { AbstractLoader } from './AbstractLoader';\r\n\r\nclass AudioLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, loop = true, volume = 0, size, positional = false)\r\n {\r\n super(resource_id, url, size);\r\n this.loop = loop;\r\n this.volume = volume;\r\n this.positional = positional;\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n // if (!window.user_interaction_for_audio)\r\n // {\r\n // setTimeout(this.on_preloaded_finished.bind(this, resource_container), 100);\r\n // }\r\n // else\r\n // {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.instantiate_audio(resource_container);\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n // }\r\n }\r\n\r\n instantiate_audio(resource_container)\r\n {\r\n const context = AudioContext.getContext();\r\n\r\n const buffer = context.createBuffer(2, 22050, 44100);\r\n\r\n fetch(this.url).then(r => r.blob()).then((response) =>\r\n {\r\n if (response.arrayBuffer)\r\n {\r\n response.arrayBuffer().then((array_buffer) =>\r\n {\r\n context.decodeAudioData(array_buffer, (audio_buffer) =>\r\n {\r\n resource_container.set_resource(\r\n this.resource_id,\r\n this.url,\r\n new AudioClip(audio_buffer, this.loop, this.volume, this.positional)\r\n );\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n });\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(\r\n this.resource_id,\r\n this.url,\r\n new AudioClip(buffer, this.loop, this.volume, this.positional)\r\n );\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport { AudioLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\n\n// import { sRGBEncoding } from 'three';\n\nclass BasisLoader extends AbstractLoader\n{\n constructor(resource_id, url, loader, size)\n {\n super(resource_id, url, size);\n\n this.loader = loader;\n }\n\n on_preloaded_finished(resource_container)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n this.loader.load(this.url, (basis) =>\n {\n // basis.encoding = sRGBEncoding;\n\n resource_container.set_resource(this.resource_id, this.url, basis);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // this.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n this.__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 this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n\nexport { BasisLoader };\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { CubeTextureLoader } from 'three';\r\n\r\nclass 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 CubeTextureLoader();\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 if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.urls, (image) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, image);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__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 // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (error) =>\r\n {\r\n this.__set_error('Image could not be loaded. Maybe wrong name or path, I don\\'t know' + '¯\\\\_(ツ)_/¯', error);\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { CubemapLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { ColladaLoader } from 'three/examples/jsm/loaders/ColladaLoader.js';\r\n\r\nclass 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 ColladaLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, gltf);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__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 // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__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 this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { DAELoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { FileLoader as TFileLoader } from 'three';\r\n\r\nclass 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 TFileLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (file) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, file);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__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 // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg);\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { FileLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\n\nimport { FontLoader as TFontLoader } from 'three/examples/jsm/loaders/FontLoader.js';\n\nclass 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 if (resource_container.resources_by_url[this.url] === undefined)\n {\n this.loader.load(this.url, (font) =>\n {\n resource_container.set_resource(this.resource_id, this.url, font);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // this.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n this.__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 this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n\nexport { FontLoader };\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { GLTFLoader as TGLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';\r\n\r\nclass 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 TGLTFLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, gltf);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__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 // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__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 this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { GLTFLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';\r\n\r\nclass GLTFDRACOLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, loader, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new GLTFLoader();\r\n\r\n this.loader.setDRACOLoader(loader);\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, gltf);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__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 // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__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 this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { GLTFDRACOLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { HDRCubeTextureLoader as THDRCubeTextureLoader } from 'three/examples/jsm/loaders/HDRCubeTextureLoader.js';\r\nimport { UnsignedByteType } from 'three';\r\n\r\nclass 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 THDRCubeTextureLoader();\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 if (resource_container.resources_by_url[this.url] === undefined)\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(this.resource_id, this.url, hdr);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__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 // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__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 this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { HDRCubeTextureLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\n\nclass JSONLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n }\n\n on_preloaded_finished(resource_container, response)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n response.json().then((json) =>\n {\n resource_container.set_resource(this.resource_id, this.url, json);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n\nexport { JSONLoader };\n","import { AbstractLoader } from './AbstractLoader';\n\nimport { OBJLoader as TOBJLoader } from 'three/examples/jsm/loaders/OBJLoader.js';\n\nclass OBJLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n this.loader = new TOBJLoader();\n }\n\n on_preloaded_finished(resource_container)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n this.loader.load(this.url, (obj) =>\n {\n resource_container.set_resource(this.resource_id, this.url, obj);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // this.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n this.__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 this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n\nexport { OBJLoader };\n","import { AbstractLoader } from './AbstractLoader';\n\nimport { Vector3 } from 'three';\nimport { FileLoader } from 'three';\n\nclass PointArrayLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n this.loader = new FileLoader();\n }\n\n on_preloaded_finished(resource_container)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n this.loader.load(this.url, (text) =>\n {\n resource_container.set_resource(this.resource_id, this.url, this.parse_path(text));\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // this.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n this.__set_error(msg);\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n\n parse_path(raw_data)\n {\n const string_array = raw_data.split('\\n');\n\n if (string_array[string_array.length - 1] === '')\n {\n string_array.pop();\n }\n\n const positions = [];\n\n for (let i = 0; i < string_array.length; i += 3)\n {\n const x = parseFloat(string_array[i + 0]);\n const y = parseFloat(string_array[i + 1]);\n const z = parseFloat(string_array[i + 2]);\n positions.push(new Vector3(x, y, z));\n }\n return positions;\n // let curve = new THREE.CatmullRomCurve3(positions);\n // return curve.getPoints(100);\n }\n}\n\nexport { PointArrayLoader };\n","import { AbstractLoader } from './AbstractLoader';\n\nimport { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js';\n\nclass RGBETextureLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n this.loader = new RGBELoader();\n }\n\n on_preloaded_finished(resource_container)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n this.loader.load(this.url, (hdr) =>\n {\n resource_container.set_resource(this.resource_id, this.url, hdr);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // this.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n this.__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 this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n\nexport { RGBETextureLoader };\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { FileLoader as TFileLoader } from 'three';\r\n\r\nclass 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 TFileLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, gltf);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__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 // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg);\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { TextLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { Texture } from 'three';\r\nimport { Browser } from '../Browser';\r\n\r\nclass AsyncTextureLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (Browser.is_safari && Browser.version < 15)\r\n {\r\n this.load_with_old_method(resource_container);\r\n }\r\n else\r\n {\r\n this.load_with_new_method(resource_container);\r\n }\r\n }\r\n\r\n load_with_old_method(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n const texture = new Texture();\r\n const image = new Image();\r\n\r\n image.src = this.url;\r\n\r\n image.onload = () =>\r\n {\r\n texture.image = image;\r\n texture.needsUpdate = true;\r\n\r\n resource_container.set_resource(this.resource_id, this.url, texture);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n };\r\n\r\n image.onerror = () =>\r\n {\r\n console.error('Error loading texture. Maybe the resource is not an image?', this.url, this.original_url);\r\n };\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n\r\n load_with_new_method(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n const fetchOptions = {};\r\n fetchOptions.credentials = 'same-origin';\r\n // fetchOptions.headers = this.requestHeader;\r\n\r\n fetch(this.url, fetchOptions).then((res) =>\r\n {\r\n return res.blob();\r\n }).then((blob) =>\r\n {\r\n return createImageBitmap(blob, { colorSpaceConversion: 'none' });\r\n }).then((imageBitmap) =>\r\n {\r\n const texture = new Texture(imageBitmap);\r\n texture.needsUpdate = true;\r\n\r\n resource_container.set_resource(this.resource_id, this.url, texture);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }).catch(function(e)\r\n {\r\n console.error(e);\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { AsyncTextureLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { Texture } from 'three';\r\n\r\nclass TextureLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n }\r\n\r\n on_preloaded_finished(resource_container, response)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n response.blob().then((blob) =>\r\n {\r\n const texture = new Texture();\r\n\r\n const url = URL.createObjectURL(blob);\r\n\r\n const image = new Image();\r\n image.src = url;\r\n\r\n image.onload = () =>\r\n {\r\n texture.image = image;\r\n texture.needsUpdate = true;\r\n\r\n resource_container.set_resource(this.resource_id, this.url, texture);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n };\r\n\r\n image.onerror = () =>\r\n {\r\n console.error('Error loading texture. Maybe the resource is not an image?', this.url);\r\n };\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { TextureLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\n\nclass VideoLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n }\n\n on_preloaded_finished(resource_container, response)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n response.blob().then((blob) =>\n {\n resource_container.set_resource(this.resource_id, this.url, URL.createObjectURL(blob));\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n\nexport { VideoLoader };\n","import { ResourceContainer } from '../ResourceContainer';\r\n\r\nclass ResourceBatch\r\n{\r\n constructor(batch_name)\r\n {\r\n this.resource_loaders = [];\r\n this.batch_name = batch_name || 'unnamed batch';\r\n }\r\n\r\n add_loader(loader)\r\n {\r\n this.resource_loaders.push(loader);\r\n }\r\n\r\n load(resource_container)\r\n {\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n this.resource_loaders[i].load(resource_container || ResourceContainer);\r\n }\r\n }\r\n\r\n get loading_finished()\r\n {\r\n let finished = true;\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n finished = finished && this.resource_loaders[i].has_finished;\r\n }\r\n return finished;\r\n }\r\n\r\n get has_errors()\r\n {\r\n let has_error = false;\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n has_error = has_error || this.resource_loaders[i].has_error;\r\n }\r\n return has_error;\r\n }\r\n\r\n print_errors()\r\n {\r\n console.error('Batch <' + this.batch_name + '> could not load successfully');\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n if (this.resource_loaders[i].has_error)\r\n {\r\n this.resource_loaders[i].print_error();\r\n }\r\n }\r\n }\r\n\r\n get_progress()\r\n {\r\n return this.get_loaded_bytes() / this.get_total_bytes();\r\n }\r\n\r\n get_loaded_bytes()\r\n {\r\n let loaded_bytes = 1;\r\n\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n loaded_bytes += this.resource_loaders[i].loaded_bytes;\r\n }\r\n\r\n return loaded_bytes;\r\n }\r\n\r\n get_total_bytes()\r\n {\r\n let total_bytes = 1;\r\n\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n total_bytes += this.resource_loaders[i].total_bytes;\r\n }\r\n\r\n return total_bytes;\r\n }\r\n}\r\n\r\nexport { ResourceBatch };\r\n"],"names":["browser","init","this","browser_name","agent","window","navigator","userAgent","toLowerCase","indexOf","opr","chrome","version","get_version","name","is_safari","is_chrome","is_edge","is_edge_chromium","has_webm","is_firefox","has_hvec","preferred_video_extension","ua","tem","M","match","test","exec","slice","join","replace","appName","appVersion","splice","split","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","undefined","resources_by_url","cache","Browser","fetch","method","mode","credentials","redirect","then","on_progress","bind","catch","__on_error","set_resource","async","response","response_clone","clone","reader","body","getReader","contentLength","headers","get","receivedLength","done","value","read","length","on_preloaded_finished","data","OMath","from_range_start_value","from_range_end_value","to_range_start_value","to_range_end_value","min","max","number","divisor","rgb","r","Math","round","toString","g","b","points","plane","projected_point","Vector3","points_on_plane","i","projectPoint","push","from","to","target","t","elements","lerp","x1","x2","abs","x","y","m","euclideanModulo","degrees","PI","radians","v","w","z","center","add","multiplyScalar","arr","col","floor","random","clamp","ActionSequencer","context","elapsed_time","playback_speed","playing","action_events","initial_context","stringify","tmp_t","channels","channel_names","Object","keys","duration","play","stop","reset","skip","get_duration","__play_clips","update","delta_time","set_progress","time","set_normalized_progress","get_progress","is_finished","add_action_event","trigger_time","action","add_action_interpolator","interpolator","use_dynamic_from_value","keyframes","attribute_name","keyframe","get_current_target_value","__get_current_keyframe","evaluate","get_current_starting_value","get_current_progress","__linear_map_01","easing_function","EPSILON","trigger","evaluate_keyframe","get_keyframes","channel_name","is_channel_redefined","initial","saturate","current","Infinity","distance","EasingFunctions","cos","sin","pow","sqrt","c4","ease_out_bounce","n1","d1","sign","ActionInterpolator","NumberInterpolator","super","view_context","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","trigger_name","trigger_method","at_time","value_data","to_value","from_time","to_time","sort","a","x_pos","ActionSequencerBuilder","default_state_data","from_animation_sheet","animation_data","current_context","tracks","initial_tracks","state_to_tracks","get_longest_time","find","element","sequencer","action_event","state","longest_time","from_draw_io","xml","transition_data","track_time","event_manager","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","EventManager","get_resource","HTMLUtilities","container","images","image","dataset","src","image_objects","image_object","videos","video","TransitionTable","transitions","from_state_name","to_state_name","add_transitions","set_transitions","set_default_state_data","delta_buffer","___time","Clock","__raw_delta_time","__elapsed_time","__allocated_time","Vector2","shader_time","__update","getDelta","getElapsedTime","shift","__calculate_delta_time","ViewState","start","show","hide","before_enter","on_enter","update_enter_transition","global_view_data","transition_progress","action_sequencer","update_transition","update_exit_transition","before_exit","on_exit","ViewStateTransitionHandler","transition_table","last_state","current_state","current_state_data","transitioning","go_to_state","__exit_last_state","__update_transitions","set_state","assign","Time","view_manager","views","transition_handler","view_change_subscribers","browser_title_suffix","__set_views_opacities","go_to_view","view_name","change_url","__change_browser_url","__change_browser_title","notify_view_change","go_to_scene","scene_name","next_view","transition_view","set_next_view","subscribe_to_view_change","subscriber","on_view_change","register_view","view","has_view","set_view","set_browser_title_suffix","title_suffix","get_current_view","get_view_by_name","get_view_by_url","get_by_url","history","pushState","title","__capitalize","document","set_opacity","string","aux_string","toUpperCase","__snake_to_whitespace","group","ApplicationView","ResourceContainer","ViewManager","classList","remove","load_html_images","load_images","load_html_videos","load_videos","style","opacity","BaseApplication","on_post_start","on_post_render","on_pre_render","on_frame_end","BaseRender","render","renderer","resize","dispose","BaseShaderMaterial","ShaderMaterial","vert","frag","uniforms","vertexShader","basic_vert","fragmentShader","basic_frag","_Color","Color","BlitMaterial","frag_shader","vert_shader","defines","_MainTex","_Resolution","_TargetResolution","depthWrite","blending","NoBlending","depthTest","depthFunc","AlwaysDepth","AddMaterial","nMips","_SecondTex","set_add_texture","tex","UnrealBloomComposeMaterial","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","set_tint_color_1","set_tint_color_2","set_tint_color_3","set_tint_color_4","camera_manager","_current","_spectator","camera","spectator","capabilities","max_anisotropy","vertex_texture_sampler_available","fp_textures_available","CanvasDrawer","uses_dynamic_font","__textHeight","canvas","createElement","ctx","getContext","getFontHeight","fontStyle","getElementsByTagName","dummy","dummyText","createTextNode","appendChild","setAttribute","offsetHeight","removeChild","get_text_size","text","font","ceil","measureText","width","draw_canvas","ctxOptions","font_color","__draw","draw_on_texture","canvas_texture","CanvasTexture","UVMapping","ClampToEdgeWrapping","NearestFilter","generateMipMaps","needsUpdate","roundRect","height","radius","fill","stroke","tl","tr","br","bl","defaultRadius","side","beginPath","moveTo","lineTo","quadraticCurveTo","closePath","configuration","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","ease_in_out_cubic","animate","AxisHelper","Object3D","scale","blue_points","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","scene_manager","Scene","add_scene","scene","traverse","child","geometry","material","children","Cube","Mesh","segments","BoxGeometry","MeshBasicMaterial","Sphere","SphereBufferGeometry","Arrow","dir","cylinder_height","cylinder_geo","CylinderBufferGeometry","translate","cone_geometry","ConeBufferGeometry","cone_height","buffer_geometry","BufferGeometryUtils","mergeBufferGeometries","rotateX","quaternion","setFromUnitVectors","_dir","oscreen","position","render_width","render_height","width_height","pixel_size","update_position","size_changed","update_size","apply_pixel_density_v2","vector2","apply_pixel_density","get_pixel_size","aspect_ratio","portrait","ScreenSpaceTextureMaterial","h","_ScreenSpacePosition","_ScreenSize","_TextureSize","set_position","set_texture","set_screen_size","PerspectiveCamera","TPerspectiveCamera","fov","aspect","near","far","clear_color","clear_alpha","copy","debug","Vector3_one","Vector3_zero","canvas_renderer","display_texture_meshes","draw_arrow","origin","arrow","normalize","SceneManager","draw_axis","axis","set_debug_RT","RT","rt_debug","draw_rectangle","position_2d","fillStyle","fillRect","clear","clearRect","draw_line_2D","strokeStyle","draw_line","line","frustumCulled","draw_cube","pos","cube","draw_oriented_cube","depth","distanceTo","sub","forward_dir","draw_plane","PlaneGeometry","Vector4","basic_color_vert","basic_color_frag","transparent","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","OScreen","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","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","xr_enabled","WebGLRenderer","xr","enabled","autoClear","setPixelRatio","Configuration","extensions","domElement","Capabilities","getMaxAnisotropy","maxVertexTextures","is_floating_point_texture_available","resize_observer","ResizeObserver","on_resize","observe","dom_element","depth_normals_RT","new_state","__update_current_camera","updateProjectionMatrix","updateMatrix","updateMatrixWorld","override_mat","__apply_override_material","render_scene","overrideMaterial","readback_RT","buffer","readRenderTargetPixels","clear_stencil","setClearColor","entries","entry","contentRect","setViewport","src_RT","take_screenshot","blob_callback","old_width","old_height","new_width","new_height","tile_width","tile_height","divisions_x","parseInt","divisions_y","old_dpr","getPixelRatio","ctx_2D","setViewOffset","drawImage","toBlob","clearViewOffset","download_screenshot","blob","link","download","href","URL","createObjectURL","click","onclick","requestAnimationFrame","revokeObjectURL","removeAttribute","minFilter","magFilter","format","RGBAFormat","encoding","LinearEncoding","type","FloatType","stencilBuffer","depthBuffer","output","Float32Array","NormalMaterial","DebugNormalsRender","Graphics","KeyboardInput","ctrlz_pressed","ctrlz_fired","keys_keys","addEventListener","on_key_down","on_key_up","keyCode","ctrlKey","key","press_key","release_key","pressed","released","key_name","fired","down","release_keys","is_key_pressed","is_key_down","is_key_released","register_key","unregister_key","removeEventListener","input","InputController","clicked","captured_NDC","current_NDC_delta","keyboard","keyboard_input_container","left_mouse_button_pressed","NDC","left_mouse_button_down","NDC_delta","left_mouse_button_released","os","operating_systems","ANDROID","IOS","LINUX","MAC","WINDOWS","is_mobile","is_ipad","maxTouchPoints","is_ios","is_android","get_os","is_linux","is_mac","is_windows","platform","reflection_plane_context","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","get_mesh","v3","v4","Uint8Array","DataTexture","RGBFormat","dst_texture","one_pixel_text","geometry_batcher","batches","batch","buffer_geometries","attr_accessor_uvs","texture_width","ceilPowerOfTwo","__init_uv_array","uv_index","vertex_count","count","buffer_attribute","BufferAttribute","uvs","ui","ui_elements","_tmp_normalized_pos","ss_scene","matrixWorldAutoUpdate","ws_scene","ss_camera","delete_element","elem","add_screen_space_element","set_screen_space_coordinate_system","add_world_space_element","set_world_space_coordinate_system","Input","update_state","current_clicked_element","camera_utilities","tmp_mat","Matrix4","Plane","ray","Ray","tmp_size","tmp_unproj","get_up_dir","tmp_vec","applyQuaternion","get_forward_dir","get_right_dir","unproject_mouse_position","v_fov","h_fov","atan","tan","distV","distH","get_plane_intersection","plane_position","plane_normal","setFromNormalAndCoplanarPoint","isPerspectiveCamera","unproject","intersectPlane","fit_points_on_camera","zoom_scale","world_space_center","camera_forward","project_points_on_plane","projected_points_center","getCenter","up","right","cross","inverse_mat","getInverse","applyMatrix4","projected_center","get_zoom_to_fit_rect","get_zoom_to_fit_box","isOrthographicCamera","obj_x","obj_y","object_aspect","get_html_screen_pos","object","getWorldPosition","project","world_pos_to_screen","update_projection","left","top","bottom","initializer","app_container","CameraUtilities","GeometryBatcher","OS","ReflectionPlaneContext","UI","Debug","render_loop","SSAOMaterial","_InverseProjMatrix","_ProjectionMatrix","_Bias","_Radius","_SampleKernel","__get_sample_kernel","_RandomRotation","__get_rotation_kernel","sample_kernel","rotation_kernel","rotation_texture","wrapS","RepeatWrapping","wrapT","SSAOComposeMaterial","_AO","DisplayNormalTextureMaterial","depth_normals_vert","BoxBlurMaterial","_SampleDir","Blurrer","RT1","RT2","box_blur_mat","blur","NormalAORender","ssao_mat","ssao_compose_mat","debug_normals","ssaa","use_ssaa","main_RT","SSAO_RT","blurrer","__check_RT_size","__update_uniforms","projectionMatrix","NormalRender","VRRender","render_spectator_camera","spectator_camera","isPresenting","xrCam","getCamera","currentRenderTarget","GaussianBlurMaterial","kernel_radius","KERNEL_RADIUS","SIGMA","texSize","direction","set_size","set_direction","LuminosityHighPassMaterial","luminosityThreshold","smoothWidth","defaultColor","defaultOpacity","GaussianBlurrer","current_width","current_height","separableBlurMaterials","renderTargetsHorizontal","renderTargetsVertical","kernelSizeArray","rt_pars","LinearFilter","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","TOrthographicCamera","view_component_manager","components","enabled_components","Set","__set_components_opacities","component","register_component","enable_component","disable_component","delete","get_component_by_name","component_name","RenderLoop","target_application","is_running","frames_passed","ViewComponentManager","setAnimationLoop","screen","SimpleTextDrawer","text_margin","text_size","globalAlpha","textBaseline","textAlign","fillText","ViewComponent","hidden","toggle_hidden","HorizontalPlane","VerticalPlane","ArrayUtilities","source","apply","array","items_left_count","closest_point","closest_distance","obj","ids","FrustumPointFitter","fit_points","camera_quaternion","vertical_fov","degToRad","up_plane_normal","get_up_plane_normal","down_plane_normal","get_down_plane_normal","left_plane_normal","get_left_plane_normal","right_plane_normal","get_right_plane_normal","camera_forward_dir","sphere_center","pull_back_distance","get_distance_to_fit_rect","far_pos","up_plane","down_plane","left_plane","right_plane","apply_center_correction_to_pos","inverse_dir","Line3","up_line_intersection","down_line_intersection","left_line_intersection","right_line_intersection","intersectLine","log","new_up_distance","new_down_distance","new_left_distance","new_right_distance","vertical_min","horizontal_min","forward_correction","target_pos","vertical_offset","get_vertical_correction","horizontal_offset","get_hozirontal_correction","closest_up_point","closest_down_point","closest_distance_to_up_plane","closest_distance_to_down_plane","up_dir","down_line","up_line","down_dist","up_dist","correction","closest_right_point","closest_left_point","closest_distance_to_right_plane","closest_distance_to_left_plane","right_dir","left_line","right_line","left_dist","right_dist","Quaternion","setFromAxisAngle","GeometryUtilities","geometry_buffer","indices","positions","vertices","getX","getY","getZ","add_barycentric_attribute","non_indexed_geometry_buffer","bar_coordinates","ImageUtilities","getImageData","imagedata","mesh_sampler","sample","sample_count","face_areas","min_area","normals","tangents","faces","index_0","index_1","index_2","v1","v2","face","c","n2","n3","normal","tangent","uv_a","uv_b","uv_c","area","get_face_area","normalized_faces_array","get_uniform_face_distribution","selected_faces","select_random_faces","sample_data_from_faces","sampled_points","sampled_normals","sampled_tangents","sampled_uvs","w1","w2","sample_point_in_face","amount","selected_face","minimum_area","extended_triangle_indices","repetitions_needed","j","vec1","vec2","w3","model_utilities","result_callback","fromGeometry","get_geometries","geometries","assign_material","clone_animated_gltf","gltf","animations","skinnedMeshes","isSkinnedMesh","cloneBones","cloneSkinnedMeshes","isBone","skeleton","cloneSkinnedMesh","orderedCloneBones","bones","cloneBone","Skeleton","boneInverses","matrixWorld","set_shadow_config","cast","receive","castShadow","receiveShadow","__find_object","get_object","get_object_by_type","object_type","ObjectUtilities","item","Array","isArray","sources","is_object","merge_deep","nodeType","attributes","attribute","nodeName","nodeValue","hasChildNodes","childNodes","xml_to_json","old","StringUtilities","hexValues","hex","words","substr","charAt","TimeUtilities","time_str_to_ms","time_str","hours","minutes","seconds","PerspectiveFrustumPointFitter","get_horizontal_correction","OrthographicFrustumPointFitter","inverse_camera_quat","inverse","inverted_points","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","current_scale","computeBoundingBox","tmp_bb_size","boundingBox","update_texture","img","screen_aligned","boolean","Text2D","is_static","simple_text_drawer","draw_settings","LinearMipMapLinearFilter","UIElementMaterial","intensity","_PixelOffset","_NDC","_PivotPoint","_DepthOffset","ScreenSpacePosition","get_pos_NDC","WorldSpacePosition","tmp_vec3","tmp_vec2","UIElementState","ui_element","normalized_mouse_position","OnIdle","is_mouse_over","_on_enter_state","OnMouseEnter","on_mouse_enter","_on_hover_state","_on_exit_state","OnMouseExit","on_mouse_exit","_on_idle_state","OnMouseHover","__trigger_on_hover","on_mouse_hover","UIElement","is_clickable","position_strategy","_position","on_hover","mouse_pos_tmp","cached_NDC_position","screen_pos_tmp","texture_size","matrixAutoUpdate","pixel_offset","set_render_order","pivot_point","set_pixel_offset","use_depth","depth_offset","clear_state","visible","get_size","normalized_mouse_pos","to_screen_position","rect","Box2","containsPoint","projected_pos","get_screen_space_position","set_screen_space_position","screen_pos","UpdatableMaterialMesh","self","onBeforeRender","TextGlyph","plane_bounds","atlas_bounds","SDFText","glyph_layout","glyphs","glyph_is_dirty","matrix_is_dirty","color_is_dirty","matrix","__opacity","__text","__generate_glyphs","update_matrix","compose","clear_glyph_dirty","clear_color_dirty","set_rotation","tilt","new_orientation","new_tilt","multiply","set_color","set_pivot","update_glyphs","op","cursor","unicode","charCodeAt","glyph","planeBounds","text_glyph","atlasBounds","advance","box2","first_glyph","union","box2_size","SDFTextMaterial","_Texture","_Boldness","_AtlasSize","set_atlas_size","set_boldness","SDFTextBatch","font_layout","atlas_texture","instanced_geometry","InstancedBufferGeometry","instanceCount","Float32BufferAttribute","transformsCol0","InstancedBufferAttribute","max_allocations","transformsCol1","transformsCol2","transformsCol3","glyph_bounds","usage","DynamicDrawUsage","text_elements","atlas","add_text","text_str","remove_text","text_elem","remove_elem","force_update","glyph_bounds_atr","plane_bounds_atr","color_atr","matrix_needs_update","glyph_needs_update","color_needs_update","glyph_count","glyph_i","buffer_i","setXYZW","VectorInterpolator","tmp","MedianFilterMaterial","kernel3x3","_SourceTex","_SourceTexSize","isVideoTexture","videoWidth","videoHeight","isTexture","MedianFilter","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","ParticleAttribute","attr_name","update_material","write","init_from_geometry","init_from_attribute","particle_attribute","build_RT","particle_count","resolution","calculate_resolution","HalfFloatType","swap_RT","attribute_writter_scene","store_geometry_attribute_in_RT","storage_material","deleteAttribute","get_texture","GPUParticleSystem","build_point_mesh","attribute_writter_mesh","build_attribute_writter_mesh","add_texture_attribute","add_update_attribute_array","item_size","add_attribute_array","instance_count","geo","instanced_geo","build_uv_storage_attribute","Points","ParticleStorageMaterial","ParticlePositionAttribute","store_geometry","pos_attr","store_positions","CustomDataTexture","multiplier","set_rgba","set_rgb","set_r","set_g","set_b","set_a","RGBDataTexture","RGBADataTexture","RGBFloatDataTexture","RGBAFloatDataTexture","BatchedMesh","id_table","max_texture_width","batched_count","batch_height","attach_rgb_texture","attach_rgba_texture","attach_rgb_float_texture","attach_rgba_float_texture","get_mesh_index","set_rgb_value","mesh_name","set_rgba_value","MeshBatcher","meshes","attr_mesh_id","create_batched_mesh","AudioClip","loop","volume","positional","audio","audio_listener","TPositionalAudio","TAudio","setBuffer","setLoop","gain","setVolume","pause","is_playing","isPlaying","AudioLoader","instantiate_audio","AudioContext","createBuffer","arrayBuffer","array_buffer","decodeAudioData","audio_buffer","BasisLoader","loader","basis","xhr","msg","CubemapLoader","CubeTextureLoader","setPath","urls","DAELoader","ColladaLoader","FileLoader","TFileLoader","file","FontLoader","TFontLoader","GLTFLoader","TGLTFLoader","GLTFDRACOLoader","setDRACOLoader","HDRCubeTextureLoader","THDRCubeTextureLoader","url_suffix","setDataType","UnsignedByteType","hdr","JSONLoader","OBJLoader","TOBJLoader","PointArrayLoader","parse_path","raw_data","string_array","pop","RGBETextureLoader","RGBELoader","TextLoader","AsyncTextureLoader","load_with_old_method","load_with_new_method","Texture","Image","onload","onerror","original_url","fetchOptions","res","createImageBitmap","colorSpaceConversion","imageBitmap","TextureLoader","VideoLoader","ResourceBatch","batch_name","resource_loaders","add_loader","loading_finished","finished","has_errors","print_errors","get_loaded_bytes","get_total_bytes"],"mappings":"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"}
1
+ {"version":3,"file":"index.module.js","sources":["../src/Browser.js","../src/utilities/Validation.js","../src/resource_loader/AbstractLoader.js","../src/utilities/OMath.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/utilities/HTMLUtilities.js","../src/view_components/transition/TransitionTable.js","../src/Time.js","../src/view_components/ViewState.js","../src/view_components/transition/ViewStateTransitionHandler.js","../src/view_components/ViewManager.js","../src/view_components/ApplicationView.js","../src/BaseApplication.js","../src/render_mode/BaseRender.js","../src/materials/BaseShaderMaterial.js","../src/materials/BlitMaterial.js","../src/materials/AddMaterial.js","../src/materials/UnrealBloomComposeMaterial.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/OScreen.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/KeyboardInput.js","../src/Input.js","../src/OS.js","../src/ReflectionPlaneContext.js","../src/static_batcher/GeometryBatch.js","../src/static_batcher/GeometryBatcher.js","../src/UI.js","../src/utilities/CameraUtilities.js","../src/Initializer.js","../src/materials/SSAOMaterial.js","../src/materials/SSAOComposeMaterial.js","../src/materials/DisplayNormalTextureMaterial.js","../src/materials/BoxBlurMaterial.js","../src/render_utilities/Blurrer.js","../src/render_mode/NormalAORender.js","../src/render_mode/NormalRender.js","../src/render_mode/VRRender.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/Screen.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/ParticleAttribute.js","../src/gpu_particles/GPUParticleSystem.js","../src/materials/gpu_particles/ParticleStorageMaterial.js","../src/gpu_particles/ParticlePositionAttribute.js","../src/data_textures/CustomDataTexture.js","../src/data_textures/RGBDataTexture.js","../src/data_textures/RGBADataTexture.js","../src/data_textures/RGBFloatDataTexture.js","../src/data_textures/RGBAFloatDataTexture.js","../src/static_batcher/BatchedMesh.js","../src/static_batcher/MeshBatcher.js","../src/components/AudioClip.js","../src/resource_loader/AudioLoader.js","../src/resource_loader/BasisLoader.js","../src/resource_loader/CubemapLoader.js","../src/resource_loader/DAELoader.js","../src/resource_loader/FileLoader.js","../src/resource_loader/FontLoader.js","../src/resource_loader/GLTFLoader.js","../src/resource_loader/GLTFDRACOLoader.js","../src/resource_loader/HDRCubeTextureLoader.js","../src/resource_loader/JSONLoader.js","../src/resource_loader/OBJLoader.js","../src/resource_loader/PointArrayLoader.js","../src/resource_loader/RGBETextureLoader.js","../src/resource_loader/TextLoader.js","../src/resource_loader/AsyncTextureLoader.js","../src/resource_loader/TextureLoader.js","../src/resource_loader/VideoLoader.js","../src/resource_loader/ResourceBatch.js"],"sourcesContent":["\nclass Browser\n{\n init()\n {\n this.browser_name = '';\n this.agent = window.navigator.userAgent.toLowerCase();\n\n switch (true)\n {\n case this.agent.indexOf('edge') > -1:\n this.browser_name = 'edge_ie';\n break;\n case this.agent.indexOf('edg') > -1:\n this.browser_name = 'edge_chromium';\n break;\n case this.agent.indexOf('opr') > -1 && !!window.opr:\n this.browser_name = 'opera';\n break;\n case this.agent.indexOf('chrome') > -1 && !!window.chrome:\n this.browser_name = 'chrome';\n break;\n case this.agent.indexOf('trident') > -1:\n this.browser_name = 'iexplorer';\n break;\n case this.agent.indexOf('firefox') > -1:\n this.browser_name = 'firefox';\n break;\n case this.agent.indexOf('safari') > -1:\n this.browser_name = 'safari';\n break;\n default:\n this.browser_name = 'other';\n break;\n }\n\n this.version = this.get_version();\n }\n\n get name()\n {\n return this.browser_name;\n }\n\n get is_safari()\n {\n return this.browser_name === 'safari';\n }\n\n get is_chrome()\n {\n return this.browser_name === 'chrome';\n }\n\n get is_edge()\n {\n return this.browser_name === 'edge_ie';\n }\n\n get is_edge_chromium()\n {\n return this.browser_name === 'edge_chromium';\n }\n\n get has_webm()\n {\n return !!(this.is_chrome || this.is_firefox || this.is_edge_chromium);\n }\n\n get has_hvec()\n {\n return this.is_safari;\n }\n\n get preferred_video_extension()\n {\n return this.has_webm ? 'webm' : this.has_hvec ? 'hvec.mp4' : 'mp4';\n }\n\n get_version()\n {\n const ua = navigator.userAgent;\n let tem = '';\n let version = 0;\n\n let M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\\/))\\/?\\s*(\\d+)/i) || [];\n if (/trident/i.test(M[1]))\n {\n tem = /\\brv[ :]+(\\d+)/g.exec(ua) || [];\n version = 'IE ' + (tem[1] || '');\n }\n if (M[1] === 'Chrome')\n {\n tem = ua.match(/\\b(OPR|Edge)\\/(\\d+)/);\n if (tem != null) version = tem.slice(1).join(' ').replace('OPR', 'Opera');\n }\n M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];\n if ((tem = ua.match(/version\\/(\\d+)/i)) != null) M.splice(1, 1, tem[1]);\n version = M.join(' ');\n\n return Number(version.split(' ')[1]);\n }\n}\n\nconst browser = new Browser();\nexport { browser as Browser };\n","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\nexport { Validation };\n","import { Browser } from '../Browser';\r\nimport { Validation } from '../utilities/Validation';\r\n\r\nclass 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 if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n const cache = Browser.is_safari ? 'no-cache' : 'default';\r\n\r\n fetch(this.url, {\r\n method: 'GET', // *GET, POST, PUT, DELETE, etc.\r\n mode: 'cors', // no-cors, *cors, same-origin\r\n cache: cache, // *default, no-cache, reload, force-cache, only-if-cached\r\n credentials: 'same-origin', // include, *same-origin, omit\r\n redirect: 'follow' // manual, *follow, error\r\n })\r\n .then(this.on_progress.bind(this, resource_container))\r\n .catch(this.__on_error.bind(this));\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n\r\n async on_progress(resource_container, response)\r\n {\r\n const response_clone = response.clone();\r\n const reader = response.body.getReader();\r\n\r\n // Step 2: get total length\r\n const contentLength = +response.headers.get('Content-Length');\r\n\r\n // Step 3: read the data\r\n let receivedLength = 0; // received that many bytes at the moment\r\n\r\n while (true)\r\n {\r\n const { done, value } = await reader.read();\r\n\r\n if (done)\r\n {\r\n break;\r\n }\r\n\r\n receivedLength += value.length;\r\n\r\n this.__update_downloaded_bytes(receivedLength, contentLength);\r\n // console.log(`Received ${receivedLength} of ${contentLength}`);\r\n }\r\n\r\n this.on_preloaded_finished(resource_container, response_clone);\r\n }\r\n\r\n on_preloaded_finished(resource_container, response)\r\n {\r\n }\r\n\r\n __on_error(data)\r\n {\r\n console.error(data);\r\n }\r\n}\r\n\r\nexport { AbstractLoader };\r\n","import { Vector3 } from 'three';\n\nclass OMath\n{\n constructor()\n {}\n\n static linear_map(value,\n from_range_start_value,\n from_range_end_value,\n to_range_start_value,\n to_range_end_value)\n {\n return ((value - from_range_start_value) / (from_range_end_value - from_range_start_value)) * (to_range_end_value - to_range_start_value) + to_range_start_value;\n }\n\n static between(value, min, max)\n {\n return (value >= min && value <= max);\n }\n\n static mod(number, divisor)\n {\n return ((number % divisor) + divisor) % divisor;\n }\n\n static rgb_to_hex(rgb)\n {\n rgb.r = Math.round(rgb.r * 255).toString(16);\n rgb.g = Math.round(rgb.g * 255).toString(16);\n rgb.b = Math.round(rgb.b * 255).toString(16);\n\n if (rgb.r.length === 1)\n {\n rgb.r = '0' + rgb.r;\n }\n if (rgb.g.length === 1)\n {\n rgb.g = '0' + rgb.g;\n }\n if (rgb.b.length === 1)\n {\n rgb.b = '0' + rgb.b;\n }\n\n return '#' + rgb.r + rgb.g + rgb.b;\n }\n\n static project_points_on_plane(points, plane)\n {\n const projected_point = new Vector3();\n const points_on_plane = [];\n for (let i = 0; i < points.length; i++)\n {\n plane.projectPoint(points[i], projected_point);\n points_on_plane.push(projected_point.clone());\n }\n\n return points_on_plane;\n }\n\n static matrix4_lerp(from, to, target, t)\n {\n for (let i = 0; i < 16; i++)\n {\n target.elements[i] = this.lerp(from.elements[i], to.elements[i], t);\n }\n }\n\n static equals(x1, x2)\n {\n return Math.abs(x1 - x2) < 0.000001;\n }\n\n static lerp(x, y, t)\n {\n return (1 - t) * x + t * y;\n }\n\n static clamp(value, min, max)\n {\n return Math.max(min, Math.min(max, value));\n }\n\n static euclideanModulo(n, m)\n {\n return ((n % m) + m) % m;\n }\n\n static pingpong(x, length = 1)\n {\n return length - Math.abs(OMath.euclideanModulo(x, length * 2) - length);\n }\n\n static degToRad(degrees)\n {\n return degrees * (Math.PI / 180);\n }\n\n static radToDeg(radians)\n {\n return radians * (180 / Math.PI);\n }\n\n static deg_to_rad(degrees)\n {\n return degrees * (Math.PI / 180);\n }\n\n static rad_to_deg(radians)\n {\n return radians * (180 / Math.PI);\n }\n\n static perspective_divide(v)\n {\n v.x /= v.w;\n v.y /= v.w;\n v.z /= v.w;\n return v;\n }\n\n static points_average(points)\n {\n const center = points[0].clone();\n for (let i = 1; i < points.length; i++)\n {\n center.add(points[i]);\n }\n center.multiplyScalar(1 / points.length);\n return center;\n }\n\n static get_random_color()\n {\n const arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'a', 'b', 'c', 'd', 'e', 'f'];\n\n let col = '#';\n col += arr[Math.floor(Math.random() * 16)];\n col += arr[Math.floor(Math.random() * 16)];\n\n col += arr[Math.floor(Math.random() * 16)];\n col += arr[Math.floor(Math.random() * 16)];\n\n col += arr[Math.floor(Math.random() * 16)];\n col += arr[Math.floor(Math.random() * 16)];\n return col;\n }\n\n static saturate(x)\n {\n return OMath.clamp(x, 0, 1);\n }\n}\n\nexport { OMath };\n","\nimport { OMath } from '../utilities/OMath';\n\nclass ActionSequencer\n{\n constructor(context)\n {\n this.elapsed_time = -0.00001;\n this.playback_speed = this.__get_playback_speed();\n this.playing = false;\n\n this.action_events = [];\n this.context = context;\n\n this.initial_context = JSON.parse(JSON.stringify(context));\n\n this.tmp_t = 0;\n\n this.channels = {};\n\n const channel_names = Object.keys(context);\n for (let i = 0; i < channel_names.length; i++)\n {\n this.channels[channel_names[i]] = [];\n }\n\n this.duration = 0;\n }\n\n play()\n {\n this.playing = true;\n }\n\n stop()\n {\n this.playing = false;\n }\n\n reset()\n {\n this.elapsed_time = -0.00001;\n }\n\n skip()\n {\n const duration = this.get_duration();\n this.__play_clips(this.elapsed_time, duration + 0.0001);\n this.elapsed_time = duration;\n }\n\n update(delta_time)\n {\n if (this.playing)\n {\n this.__play_clips(this.elapsed_time, this.elapsed_time + delta_time * this.playback_speed);\n this.elapsed_time = this.elapsed_time + delta_time * this.playback_speed;\n }\n }\n\n set_progress(time)\n {\n this.elapsed_time = OMath.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 = OMath.clamp(t, 0, 1) * this.duration;\n this.__play_clips(this.elapsed_time, this.elapsed_time);\n }\n\n get_progress()\n {\n return OMath.clamp(this.elapsed_time / this.get_duration(), 0, 1);\n }\n\n is_finished()\n {\n return this.elapsed_time > this.get_duration();\n }\n\n add_action_event(trigger_time, action)\n {\n this.action_events.push({\n trigger_time: trigger_time,\n action: action\n });\n\n this.duration = Math.max(this.duration, trigger_time);\n }\n\n add_action_interpolator(from, to, interpolator, use_dynamic_from_value = false)\n {\n if (use_dynamic_from_value)\n {\n const keyframes = this.channels[interpolator.attribute_name];\n\n if (keyframes === undefined)\n {\n console.error(`${interpolator.attribute_name} missing in initial state data.`);\n }\n\n if (keyframes.length === 0)\n {\n interpolator.from = this.initial_context[interpolator.attribute_name];\n }\n else\n {\n interpolator.from = keyframes[keyframes.length - 1].interpolator.to;\n }\n }\n\n const keyframe = {\n from: from,\n to: to,\n interpolator: interpolator\n };\n\n this.duration = Math.max(this.duration, to);\n this.channels[interpolator.attribute_name].push(keyframe);\n }\n\n get_current_target_value(name)\n {\n const keyframe = this.__get_current_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_current_starting_value(name)\n {\n const keyframe = this.__get_current_keyframe(name, this.elapsed_time);\n\n return keyframe.interpolator.evaluate(0);\n }\n\n get_current_progress(name)\n {\n const keyframe = this.__get_current_keyframe(name, this.elapsed_time);\n const t = this.__linear_map_01(this.elapsed_time, keyframe.from, keyframe.to);\n\n return keyframe.interpolator.easing_function(t);\n }\n\n get_duration()\n {\n return this.duration;\n }\n\n __play_clips(from, to)\n {\n for (let i = 0; i < this.action_events.length; i++)\n {\n if (this.action_events[i].trigger_time > from - Number.EPSILON &&\n this.action_events[i].trigger_time < to + Number.EPSILON)\n {\n // console.log(\"Play event: \" + this.action_events[i].action.constructor.name + \" at \"+ this.action_events[i].trigger_time);\n this.action_events[i].action.trigger();\n }\n }\n const channel_names = Object.keys(this.initial_context);\n\n for (let i = 0; i < channel_names.length; i++)\n {\n const name = channel_names[i];\n const keyframe = this.__get_current_keyframe(name, from);\n\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\n return keyframe.interpolator.evaluate(OMath.clamp(this.tmp_t, 0, 1));\n }\n\n get_keyframes(channel_name)\n {\n return this.channels[channel_name];\n }\n\n is_channel_redefined(channel_name)\n {\n for (let i = 0; i < this.channels[channel_name].length; i++)\n {\n const keyframe = this.channels[channel_name][i];\n\n if (keyframe.interpolator.initial)\n {\n return false;\n }\n }\n\n return true;\n }\n\n __linear_map_01(value,\n from_range_start_value,\n from_range_end_value)\n {\n return OMath.saturate(((value - from_range_start_value) / (from_range_end_value - from_range_start_value)) * (1 - 0) + 0);\n }\n\n __get_current_keyframe(channel_name, time)\n {\n let current = undefined;\n\n const keyframes = this.channels[channel_name];\n\n for (let i = 0; i < keyframes.length; i++)\n {\n const keyframe = keyframes[i];\n\n if (time >= keyframe.from && time <= keyframe.to)\n {\n current = keyframe;\n return current;\n }\n }\n\n let min = Infinity;\n\n for (let i = 0; i < keyframes.length; i++)\n {\n const keyframe = keyframes[i];\n const distance = Math.abs(keyframe.to - time);\n\n if (distance < min)\n {\n current = keyframe;\n min = distance;\n }\n }\n\n return current;\n }\n\n __get_playback_speed()\n {\n const url_params = new URLSearchParams(window.location.search);\n\n const transitions_velocity = url_params.get('transitions_velocity');\n\n if (transitions_velocity)\n {\n return Number(transitions_velocity);\n }\n else\n {\n return 1;\n }\n }\n}\n\nexport { ActionSequencer };\n","class EasingFunctions\n{\n constructor()\n {}\n\n static linear(x)\n {\n return x;\n }\n\n static triangular(x)\n {\n return 1 - Math.abs((x * 2) % (1 * 2) - 1);\n }\n\n static ease_in_sine(x)\n {\n return 1 - Math.cos(x * 3.1415926 / 2);\n }\n\n static ease_out_sine(x)\n {\n return Math.sin(x * 3.1415926 / 2);\n }\n\n static ease_in_out_sine(x)\n {\n return -(Math.cos(3.1415926 * x) - 1) / 2;\n }\n\n static ease_in_cubic(x)\n {\n return x * x * x;\n }\n\n static ease_out_cubic(x)\n {\n return 1 - Math.pow(1 - x, 3);\n }\n\n static 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 static ease_in_quad(x)\n {\n return x * x;\n }\n\n static ease_out_quad(x)\n {\n return 1 - (1 - x) * (1 - x);\n }\n\n static 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 static ease_in_quart(x)\n {\n return x * x * x * x;\n }\n\n static ease_out_quart(x)\n {\n return 1 - Math.pow(1 - x, 4);\n }\n\n static 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 static ease_in_quint(x)\n {\n return x * x * x * x * x;\n }\n\n static ease_out_quint(x)\n {\n return 1 - Math.pow(1 - x, 5);\n }\n\n static 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 static ease_in_expo(x)\n {\n return x === 0 ? 0 : Math.pow(2, 10 * x - 10);\n }\n\n static ease_out_expo(x)\n {\n return x === 1 ? 1 : 1 - Math.pow(2, -10 * x);\n }\n\n static ease_in_out_expo(x)\n {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? Math.pow(2, 20 * x - 10) / 2\n : (2 - Math.pow(2, -20 * x + 10)) / 2;\n }\n\n static ease_in_circ(x)\n {\n return 1 - Math.sqrt(1 - Math.pow(x, 2));\n }\n\n static ease_out_circ(x)\n {\n return Math.sqrt(1 - Math.pow(x - 1, 2));\n }\n\n static 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 static ease_in_back(x)\n {\n return 2.7015 * x * x * x - 1.7015 * x * x;\n }\n\n static 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 static 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 static 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 static ease_out_elastic(x)\n {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * 2.0943950) + 1;\n }\n\n static ease_in_out_elastic(x)\n {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? -(Math.pow(2, 20 * x - 10) * Math.sin((20 * x - 11.125) * 1.3962633)) / 2\n : Math.pow(2, -20 * x + 10) * Math.sin((20 * x - 11.125) * 1.3962633) / 2 + 1;\n }\n\n static ease_in_bounce(x)\n {\n return 1 - this.ease_out_bounce(1 - x);\n }\n\n static 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 static 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 static 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 { EasingFunctions };\n","import { EasingFunctions } from '../utilities/EasingFunctions';\n\nclass 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\nexport { ActionInterpolator };\n","import { ActionInterpolator } from './ActionInterpolator';\nimport { OMath } from '../utilities/OMath';\n\nclass NumberInterpolator extends ActionInterpolator\n{\n constructor(attribute_name, from = 0, to = 1, initial = false, easing_function = 'linear')\n {\n super(easing_function);\n\n this.attribute_name = attribute_name;\n this.from = from;\n this.to = to;\n this.initial = initial;\n }\n\n update(context, t)\n {\n context[this.attribute_name] = OMath.lerp(this.from, this.to, this.easing_function(t));\n }\n\n evaluate(t)\n {\n return OMath.lerp(this.from, this.to, this.easing_function(t));\n }\n}\n\nexport { NumberInterpolator };\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\nconst view_context = new ViewContext();\nexport { view_context as ViewContext };\n","import { ViewContext } from '../view_components/ViewContext';\n\nclass 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\nexport { ActionEvent };\n","class DrawIOAnimationSheet\n{\n constructor()\n {\n\n }\n\n parse(xml_document)\n {\n const doc = new DOMParser().parseFromString(xml_document, 'text/xml');\n\n const animation_nodes = doc.querySelectorAll('mxGeometry');\n\n const animation_tracks = [];\n const triggers = [];\n\n for (let i = 0; i < animation_nodes.length; i++)\n {\n const node = animation_nodes[i];\n const parent_node = node.parentElement;\n const data = parent_node.getAttribute('value');\n\n const x_pos = this.get_node_x_position(node);\n\n const from = x_pos / 100;\n const duration = parseFloat(node.getAttribute('width')) / 100;\n\n // is trigger\n if (parent_node.getAttribute('style').includes('rhombus;'))\n {\n const split_data = data.split('.');\n const trigger_name = split_data[0];\n const trigger_method = split_data[1];\n\n triggers.push({\n name: trigger_name,\n method: trigger_method,\n at_time: from + duration * 0.5\n });\n }\n\n const valid_element = parent_node.getAttribute('style').includes('rounded=0;') &&\n !parent_node.getAttribute('style').includes('text;');\n\n if (valid_element && data !== '' && !data.includes(' '))\n {\n const split_data = data.split('=');\n\n const attribute_name = split_data[0];\n\n const value_data = split_data[1].split('--');\n const to_value = parseFloat(value_data[0]);\n const easing_function = value_data[1];\n\n if (split_data.length !== 2)\n {\n console.error('DrawIO data is malformed:', data);\n }\n\n if (value_data.length !== 2)\n {\n console.error('DrawIO data is malformed:', data);\n }\n\n animation_tracks.push({\n attribute_name: attribute_name,\n from_time: from,\n to_time: from + duration,\n to_value: to_value,\n easing_function: easing_function\n });\n }\n }\n\n animation_tracks.sort((a, b) =>\n {\n return a.from_time - b.from_time;\n });\n return {\n animation_tracks: animation_tracks,\n triggers: triggers\n };\n }\n\n get_node_x_position(node)\n {\n const x_pos = node.getAttribute('x');\n return x_pos === null ? 0 : parseFloat(x_pos);\n }\n}\n\nexport { DrawIOAnimationSheet };\n","import { ActionSequencer } from '../../action_sequencer/ActionSequencer';\nimport { NumberInterpolator } from '../../action_sequencer/NumberInterpolator';\nimport { ActionEvent } from '../../action_sequencer/ActionEvent';\nimport { DrawIOAnimationSheet } from './DrawIOAnimationSheet';\n\nclass ActionSequencerBuilder\n{\n constructor(default_state_data)\n {\n this.default_state_data = default_state_data;\n }\n\n from_animation_sheet(animation_data, current_context, initial_context)\n {\n initial_context = initial_context || this.default_state_data;\n const tracks = animation_data.animation_tracks;\n const triggers = animation_data.triggers;\n\n const initial_tracks = this.state_to_tracks(this.default_state_data, this.get_longest_time(animation_data.animation_tracks));\n\n for (let i = 0; i < initial_tracks.length; i++)\n {\n if (tracks.find(element => element.attribute_name === initial_tracks[i].attribute_name) === undefined)\n {\n tracks.push(initial_tracks[i]);\n }\n }\n\n const sequencer = new ActionSequencer(current_context);\n\n for (let i = 0; i < tracks.length; i++)\n {\n const t = tracks[i];\n const interpolator = new NumberInterpolator(\n t.attribute_name,\n current_context[t.attribute_name],\n t.to_value,\n t.initial,\n t.easing_function\n );\n\n sequencer.add_action_interpolator(t.from_time, t.to_time, interpolator, true);\n }\n\n for (let i = 0; i < triggers.length; i++)\n {\n const t = triggers[i];\n const action_event = new ActionEvent(t.name, t.method);\n sequencer.add_action_event(t.at_time, action_event);\n }\n\n return sequencer;\n }\n\n state_to_tracks(state, longest_time)\n {\n const tracks = [];\n\n const keys = Object.keys(state);\n\n for (let i = 0; i < keys.length; i++)\n {\n tracks.push({\n attribute_name: keys[i],\n from_time: 0,\n to_time: longest_time < 1 ? longest_time : 1,\n to_value: state[keys[i]],\n initial: true,\n easing_function: 'ease_in_out_cubic'\n });\n }\n\n return tracks;\n }\n\n from_draw_io(xml, context)\n {\n const transition_data = (new DrawIOAnimationSheet()).parse(xml);\n const tracks = transition_data.animation_tracks;\n const triggers = transition_data.triggers;\n const sequencer = new ActionSequencer(context);\n\n for (let i = 0; i < tracks.length; i++)\n {\n const t = tracks[i];\n const interpolator = new NumberInterpolator(\n t.attribute_name,\n context[t.attribute_name],\n t.to_value,\n t.initial,\n t.easing_function\n );\n\n sequencer.add_action_interpolator(t.from_time, t.to_time, interpolator, true);\n }\n\n for (let i = 0; i < triggers.length; i++)\n {\n const t = triggers[i];\n const action_event = new ActionEvent(t.name, t.method);\n sequencer.add_action_event(t.at_time, action_event);\n }\n\n return sequencer;\n }\n\n get_longest_time(tracks)\n {\n let longest_time = -1;\n\n for (let i = 0; i < tracks.length; i++)\n {\n const track = tracks[i];\n\n const track_time = track.to_time;\n\n longest_time = track_time > longest_time ? track_time : longest_time;\n }\n\n return longest_time;\n }\n}\n\nexport { ActionSequencerBuilder };\n","class EventManager\n{\n init()\n {\n this.queue = {};\n\n this.zoom_changed_evt = 'zoom_changed';\n this.store_clickd_evt = 'store_clicked';\n this.point_selected_evt = 'point_selected';\n this.config_changed = 'config_changed';\n\n this.path_substep_completed = 'path_substep_completed';\n this.path_completed = 'path_completed';\n this.go_to_store_requested_evt = 'go_to_store_requested';\n\n this.resource_loaded_evt = 'resource_loaded';\n this.service_clicked_evt = 'service_clicked';\n this.unit_pos_updated_evt = 'unit_position_updated';\n\n this.floor_changed_evt = 'floor_changed';\n\n this.on_enter_floor_navigation = 'on_enter_floor_navigation';\n this.on_exit_floor_navigation = 'on_exit_floor_navigation';\n\n this.on_enter_floor_selection = 'on_enter_floor_selection';\n this.on_exit_floor_selection = 'on_exit_floor_selection';\n\n this.on_enter_outside_navigation = 'on_enter_outside_navigation';\n this.on_exit_outside_navigation = 'on_exit_outside_navigation';\n\n this.step_selected_evt = 'step_selected';\n }\n\n fire(event, payload)\n {\n const queue = this.queue[event];\n\n if (queue === undefined)\n {\n return;\n }\n let i = queue.length;\n while (i--)\n {\n queue[i](payload);\n }\n }\n\n on(event, callback)\n {\n if (typeof this.queue[event] === 'undefined')\n {\n this.queue[event] = [];\n }\n\n this.queue[event].push(callback);\n }\n\n fire_zoom_changed(zoom)\n {\n this.fire(this.zoom_changed_evt, zoom);\n }\n\n fire_store_selected(store_id)\n {\n this.fire(this.store_clickd_evt, store_id);\n }\n\n fire_point_selected(hit_data)\n {\n this.fire(this.point_selected_evt, hit_data);\n }\n\n fire_config_changed()\n {\n this.fire(this.config_changed);\n }\n\n fire_path_substep_completed(step_number)\n {\n this.fire(this.path_substep_completed, step_number);\n }\n\n fire_path_completed()\n {\n this.fire(this.path_completed);\n }\n\n fire_step_selected(step_index)\n {\n this.fire(this.step_selected_evt, step_index);\n }\n\n fire_go_to_store_requested(store_id)\n {\n this.fire(this.go_to_store_requested_evt, store_id);\n }\n\n fire_resource_loaded(resource)\n {\n this.fire(this.resource_loaded_evt, resource);\n }\n\n fire_service_clicked(service)\n {\n this.fire(this.service_clicked_evt, service);\n }\n\n fire_unit_position_updated(unit_data)\n {\n this.fire(this.unit_pos_updated_evt, unit_data);\n }\n\n fire_floor_switched(floor_id)\n {\n this.fire(this.floor_changed_evt, floor_id);\n }\n\n fire_on_enter_floor_navigation(state)\n {\n this.fire(this.on_enter_floor_navigation, state);\n }\n\n fire_on_exit_floor_navigation(state)\n {\n this.fire(this.on_exit_floor_navigation, state);\n }\n\n fire_on_enter_floor_selection(state)\n {\n this.fire(this.on_enter_floor_selection, state);\n }\n\n fire_on_exit_floor_selection(state)\n {\n this.fire(this.on_exit_floor_selection, state);\n }\n\n fire_on_enter_outside_navigation(state)\n {\n this.fire(this.on_enter_outside_navigation, state);\n }\n\n fire_on_exit_outside_navigation(state)\n {\n this.fire(this.on_exit_outside_navigation, state);\n }\n}\n\nconst event_manager = new EventManager();\nexport { event_manager as 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\nconst resource_container = new ResourceContainer();\nexport { resource_container as ResourceContainer };\n","class HTMLUtilities\n{\n static load_images(container)\n {\n const images = container.querySelectorAll('img');\n\n for (let i = 0; i < images.length; i++)\n {\n const image = images[i];\n\n if (image.dataset.src)\n {\n image.src = image.dataset.src;\n }\n }\n\n const image_objects = container.querySelectorAll('object');\n\n for (let i = 0; i < image_objects.length; i++)\n {\n const image_object = image_objects[i];\n\n if (image_object.dataset.src)\n {\n image_object.data = image_object.dataset.src;\n }\n }\n }\n\n static load_videos(container)\n {\n const videos = container.querySelectorAll('video');\n\n for (let i = 0; i < videos.length; i++)\n {\n const video = videos[i];\n\n if (video.dataset.src)\n {\n video.src = video.dataset.src;\n }\n }\n }\n}\n\nexport { HTMLUtilities };\n","import { ActionSequencerBuilder } from './ActionSequencerBuilder';\n\nclass TransitionTable\n{\n constructor()\n {\n this.transitions = [];\n this.default_state_data = {};\n }\n\n get(from_state_name, to_state_name, current_context)\n {\n for (let i = 0; i < this.transitions.length; i++)\n {\n if (this.transitions[i].from === from_state_name && this.transitions[i].to === to_state_name)\n {\n const action_sequencer = new ActionSequencerBuilder(this.default_state_data).from_animation_sheet(this.transitions[i].data, current_context);\n return action_sequencer;\n }\n }\n\n for (let i = 0; i < this.transitions.length; i++)\n {\n if (this.transitions[i].to === to_state_name && this.transitions[i].from === undefined)\n {\n const action_sequencer = new ActionSequencerBuilder(this.default_state_data).from_animation_sheet(this.transitions[i].data, current_context);\n return action_sequencer;\n }\n }\n\n console.error('TransitionTable.get no data found for: ', from_state_name, to_state_name);\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_default_state_data(default_state_data)\n {\n this.default_state_data = default_state_data;\n }\n}\n\nexport { TransitionTable };\n","import { Vector2 } from 'three';\nimport { Clock } from 'three';\n\nclass Time\n{\n constructor()\n {\n this.delta_buffer = [0.016, 0.016, 0.016, 0.016, 0.016, 0.016, 0.016, 0.016, 0.016, 0.016];\n }\n\n init()\n {\n this.___time = new Clock();\n this.__raw_delta_time = 0;\n this.__elapsed_time = 0;\n this.__allocated_time = new Vector2(0, 0);\n\n 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.__raw_delta_time = this.___time.getDelta();\n this.__elapsed_time = this.___time.getElapsedTime();\n\n this.delta_buffer.shift();\n this.delta_buffer.push(this.__raw_delta_time < 0.32 ? this.__raw_delta_time : 0.032);\n\n this.__calculate_delta_time();\n }\n\n __calculate_delta_time()\n {\n this.delta_time = 0;\n\n for (let i = 0; i < this.delta_buffer.length; i++)\n {\n this.delta_time += this.delta_buffer[i];\n }\n\n this.delta_time = this.delta_time / this.delta_buffer.length;\n }\n}\n\nconst time = new Time();\nexport { time as Time };\n","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\nexport { ViewState };\n","import { Time } from '../../Time';\nimport { ViewState } from '../ViewState';\n\nclass ViewStateTransitionHandler\n{\n constructor(transition_table)\n {\n this.last_state = new ViewState();\n this.current_state = new ViewState();\n\n this.default_state_data = {};\n this.current_state_data = {};\n\n this.transition_table = transition_table;\n\n this.transitioning = false;\n }\n\n go_to_state(state, skip = false)\n {\n if (this.transitioning)\n {\n this.__exit_last_state();\n }\n\n this.last_state = this.current_state;\n this.current_state = state;\n\n this.last_state.before_exit();\n this.current_state.show();\n\n this.action_sequencer = this.transition_table.get(this.last_state.name, this.current_state.name, this.current_state_data);\n this.current_state.before_enter();\n\n this.action_sequencer.play();\n\n this.transitioning = true;\n\n if (skip)\n {\n this.action_sequencer.skip();\n this.update();\n }\n }\n\n update()\n {\n if (this.transitioning)\n {\n this.__update_transitions();\n\n if (this.action_sequencer.is_finished())\n {\n this.transitioning = false;\n\n this.__update_transitions();\n\n this.__exit_last_state();\n\n this.current_state.on_enter();\n }\n }\n else\n {\n this.current_state.update();\n }\n }\n\n set_state(state)\n {\n this.current_state = state;\n }\n\n set_default_state_data(default_state_data)\n {\n Object.assign(this.default_state_data, default_state_data);\n Object.assign(this.current_state_data, default_state_data);\n }\n\n __update_transitions()\n {\n this.action_sequencer.update(Time.delta_time);\n this.last_state.update_exit_transition(this.current_state_data, this.action_sequencer.get_progress(), this.action_sequencer);\n this.current_state.update_enter_transition(this.current_state_data, this.action_sequencer.get_progress(), this.action_sequencer);\n }\n\n __exit_last_state()\n {\n if (this.last_state.name !== this.current_state.name)\n {\n this.last_state.hide();\n }\n\n this.last_state.on_exit();\n }\n}\n\nexport { ViewStateTransitionHandler };\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 this.view_change_subscribers = [];\n\n this.browser_title_suffix = '';\n }\n\n update()\n {\n this.transition_handler.update();\n\n this.__set_views_opacities();\n }\n\n go_to_view(view_name, change_url = true, skip = false)\n {\n const v = this.get(view_name);\n this.transition_handler.go_to_state(v, skip);\n\n if (change_url)\n {\n this.__change_browser_url(v.url);\n this.__change_browser_title(v.url);\n }\n\n this.notify_view_change(view_name);\n }\n\n go_to_scene(scene_name, change_url = false, skip = false)\n {\n const next_view = this.get(scene_name);\n const transition_view = this.get('transition');\n\n transition_view.set_next_view(next_view);\n this.go_to_view(transition_view.name, change_url, skip);\n }\n\n subscribe_to_view_change(subscriber)\n {\n this.view_change_subscribers.push(subscriber);\n }\n\n notify_view_change(view_name)\n {\n for (let i = 0; i < this.view_change_subscribers.length; i++)\n {\n const subscriber = this.view_change_subscribers[i];\n subscriber.on_view_change(view_name);\n }\n }\n\n register_view(view)\n {\n this.views.push(view);\n }\n\n has_view(view_name)\n {\n for (let i = 0; i < this.views.length; i++)\n {\n if (this.views[i].name === view_name)\n {\n return true;\n }\n }\n return false;\n }\n\n add_transitions(transitions)\n {\n this.transition_table.add_transitions(transitions);\n }\n\n set_transitions(transitions)\n {\n this.transition_table.set_transitions(transitions);\n }\n\n set_view(view_name)\n {\n const view = this.get(view_name);\n\n this.transition_handler.set_state(view);\n }\n\n set_browser_title_suffix(title_suffix)\n {\n this.browser_title_suffix = title_suffix;\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_default_state_data(default_state_data)\n {\n this.transition_table.set_default_state_data(default_state_data);\n this.transition_handler.set_default_state_data(default_state_data);\n }\n\n __change_browser_url(url)\n {\n window.history.pushState('', '', url);\n }\n\n __change_browser_title(name)\n {\n const title = this.__capitalize(name);\n\n document.title = title ? `${title} | ${this.browser_title_suffix}` : this.browser_title_suffix;\n }\n\n __set_views_opacities()\n {\n for (let i = 0; i < this.views.length; i++)\n {\n this.views[i].set_opacity(this.transition_handler.current_state_data);\n }\n }\n\n __capitalize(string)\n {\n let aux_string = string.toUpperCase().replace('/', '');\n aux_string = this.__snake_to_whitespace(aux_string);\n\n return aux_string;\n }\n\n __snake_to_whitespace(string)\n {\n return string.replace(\n /([-_][A-Z])/g,\n (group) => group\n .replace('-', ' ')\n .replace('_', ' ')\n );\n }\n}\n\nconst view_manager = new ViewManager();\nexport { view_manager as ViewManager };\n","import { ResourceContainer } from '../ResourceContainer';\nimport { HTMLUtilities } from '../utilities/HTMLUtilities';\nimport { ViewManager } from './ViewManager';\nimport { ViewState } from './ViewState';\n\nclass 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 = ResourceContainer.get(`${name}_data`);\n\n transition_data = transition_data || {\n animation_tracks: [],\n triggers: []\n };\n\n const transitions = [\n {\n to: name,\n data: transition_data\n }\n ];\n\n ViewManager.register_view(this);\n ViewManager.add_transitions(transitions);\n }\n\n show()\n {\n this.container.classList.add('before_enter');\n this.container.classList.remove('before_exit');\n this.container.classList.remove('hidden');\n }\n\n on_enter()\n {\n this.container.classList.remove('before_enter');\n this.container.classList.remove('before_exit');\n this.container.classList.remove('hidden');\n }\n\n before_exit()\n {\n this.container.classList.add('before_exit');\n this.container.classList.remove('before_enter');\n this.container.classList.remove('hidden');\n }\n\n hide()\n {\n this.container.classList.add('hidden');\n this.container.classList.remove('before_enter');\n this.container.classList.remove('before_exit');\n }\n\n load_html_images()\n {\n HTMLUtilities.load_images(this.container);\n }\n\n load_html_videos()\n {\n HTMLUtilities.load_videos(this.container);\n }\n\n set_opacity(current_state_data)\n {\n this.container.style.opacity = current_state_data[`${this.name}_opacity`];\n }\n}\n\nexport { ApplicationView };\n","class BaseApplication\n{\n on_post_start()\n {}\n\n on_enter()\n {}\n\n on_exit()\n {}\n\n update()\n {}\n\n on_post_render()\n {}\n\n on_pre_render()\n {}\n\n on_frame_end()\n {}\n}\n\nexport { BaseApplication };\n","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\nexport { BaseRender };\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\nclass 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\nexport { BaseShaderMaterial };\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\nclass 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\nexport { BlitMaterial };\n","import { BlitMaterial } from './BlitMaterial';\n\nimport frag from '../shaders/add/add.frag';\n\nclass 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\nexport { AddMaterial };\n","import { BlitMaterial } from './BlitMaterial';\n\nimport frag from '../shaders/gaussian_blur/unreal_bloom_compose.frag';\n\nimport { Color } from 'three';\nclass UnrealBloomComposeMaterial extends BlitMaterial\n{\n constructor(nMips)\n {\n super(frag, undefined, {\n NUM_MIPS: nMips\n });\n this.uniforms._MainTex = { value: undefined };\n this.uniforms._BlurredTex = { value: undefined };\n this.uniforms._BloomStrength = { value: 1 };\n\n this.uniforms.blurTexture1 = { value: null };\n this.uniforms.blurTexture2 = { value: null };\n this.uniforms.blurTexture3 = { value: null };\n this.uniforms.blurTexture4 = { value: null };\n this.uniforms.blurTexture5 = { value: null };\n\n this.uniforms.bloomStrength = { value: 1.0 };\n this.uniforms.bloomFactors = { value: [1.0, 0.8, 0.6, 0.4, 0.2] };\n this.uniforms.bloomRadius = { value: 0.0 };\n\n const bloomTintColors = [\n new Color('#FFFFFF'),\n new Color('#FFFFFF'),\n new Color('#FFFFFF'),\n new Color('#FFFFFF'),\n new Color('#FFFFFF')\n ];\n\n this.uniforms.bloomTintColors = { value: bloomTintColors };\n }\n\n set_RT_0(rt)\n {\n this.uniforms.blurTexture1.value = rt;\n }\n\n set_RT_1(rt)\n {\n this.uniforms.blurTexture2.value = rt;\n }\n\n set_RT_2(rt)\n {\n this.uniforms.blurTexture3.value = rt;\n }\n\n set_RT_3(rt)\n {\n this.uniforms.blurTexture4.value = rt;\n }\n\n set_RT_4(rt)\n {\n this.uniforms.blurTexture5.value = rt;\n }\n\n set_bloom_strength(value)\n {\n this.uniforms.bloomStrength.value = value;\n }\n\n set_bloom_radius(value)\n {\n this.uniforms.bloomRadius.value = value;\n }\n\n set_tint_color_0(col_string)\n {\n this.uniforms.bloomTintColors.value[0].set(col_string);\n }\n\n set_tint_color_1(col_string)\n {\n this.uniforms.bloomTintColors.value[1].set(col_string);\n }\n\n set_tint_color_2(col_string)\n {\n this.uniforms.bloomTintColors.value[2].set(col_string);\n }\n\n set_tint_color_3(col_string)\n {\n this.uniforms.bloomTintColors.value[3].set(col_string);\n }\n\n set_tint_color_4(col_string)\n {\n this.uniforms.bloomTintColors.value[4].set(col_string);\n }\n}\n\nexport { UnrealBloomComposeMaterial };\n","class CameraManager\n{\n init()\n {\n this._current = undefined;\n // VR Spectator\n this._spectator = 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 set spectator(camera)\n {\n this._spectator = camera;\n }\n\n get spectator()\n {\n return this._spectator;\n }\n}\n\nconst camera_manager = new CameraManager();\nexport { camera_manager as 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\nconst capabilities = new Capabilities();\nexport { capabilities as Capabilities };\n","import { CanvasTexture } from 'three';\nimport { Vector2 } from 'three';\nimport { UVMapping } from 'three';\nimport { ClampToEdgeWrapping } from 'three';\nimport { NearestFilter } from 'three';\n\nclass CanvasDrawer\n{\n constructor(uses_dynamic_font)\n {\n this.uses_dynamic_font = uses_dynamic_font;\n this.__textHeight = null;\n\n this.canvas = document.createElement('canvas');\n this.ctx = this.canvas.getContext('2d');\n }\n\n getFontHeight(fontStyle = 'Arial')\n {\n if (this.__textHeight == null || this.uses_dynamic_font)\n {\n const body = document.getElementsByTagName('body')[0];\n const dummy = document.createElement('div');\n const dummyText = document.createTextNode('MÉqgOLAKTAL');\n dummy.appendChild(dummyText);\n dummy.setAttribute('style', `font:${fontStyle};position:absolute;top:0;left:0`);\n body.appendChild(dummy);\n this.__textHeight = dummy.offsetHeight;\n body.removeChild(dummy);\n }\n return this.__textHeight;\n }\n\n get_text_size(text, font = '24px Arial')\n {\n const size = new Vector2();\n this.ctx.font = font;\n size.x = Math.ceil(this.ctx.measureText(text).width);\n size.y = Math.ceil(this.getFontHeight(font));\n return size;\n }\n\n draw_canvas(text, ctxOptions = {})\n {\n ctxOptions.font = ctxOptions.font || '24px Arial';\n ctxOptions.font_color = ctxOptions.font_color || '#000000';\n\n this.__draw(text, ctxOptions, this.canvas, this.ctx);\n return this.canvas;\n }\n\n draw_on_texture(text, ctxOptions)\n {\n const canvas = this.draw_canvas(text, ctxOptions);\n const canvas_texture = new CanvasTexture(canvas, UVMapping,\n ClampToEdgeWrapping,\n ClampToEdgeWrapping,\n NearestFilter,\n NearestFilter);\n canvas_texture.generateMipMaps = false;\n canvas_texture.needsUpdate = true;\n\n return canvas_texture;\n }\n\n __draw(text, ctxOptions)\n {}\n\n roundRect(ctx, x, y, width, height, radius, fill, stroke)\n {\n if (typeof stroke === 'undefined')\n {\n stroke = true;\n }\n if (typeof radius === 'undefined')\n {\n radius = 5;\n }\n if (typeof radius === 'number')\n {\n radius = { tl: radius, tr: radius, br: radius, bl: radius };\n }\n else\n {\n const defaultRadius = { tl: 0, tr: 0, br: 0, bl: 0 };\n for (const side in defaultRadius)\n {\n radius[side] = radius[side] || defaultRadius[side];\n }\n }\n ctx.beginPath();\n ctx.moveTo(x + radius.tl, y);\n ctx.lineTo(x + width - radius.tr, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + radius.tr);\n ctx.lineTo(x + width, y + height - radius.br);\n ctx.quadraticCurveTo(x + width, y + height, x + width - radius.br, y + height);\n ctx.lineTo(x + radius.bl, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - radius.bl);\n ctx.lineTo(x, y + radius.tl);\n ctx.quadraticCurveTo(x, y, x + radius.tl, y);\n ctx.closePath();\n if (fill)\n {\n ctx.fill();\n }\n if (stroke)\n {\n ctx.stroke();\n }\n }\n}\n\nexport { CanvasDrawer };\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\nconst configuration = new Configuration();\nexport { configuration as Configuration };\n","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\nexport { Idle };\n","import { Time } from '../../Time';\nimport { Idle } from './Idle';\n\nimport { OMath } from '../../utilities/OMath';\nclass 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 = OMath.clamp(this.easing_function_t, 0, 1);\n\n animator.set_property_value(OMath.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\nexport { Animating };\n","import { Animating } from './css_animator_states/Animating';\nimport { Idle } from './css_animator_states/Idle';\nimport { EasingFunctions } from '../utilities/EasingFunctions';\n\nclass 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\nexport { CSSAnimator };\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\nclass 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\nexport { AxisHelper };\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\nconst scene_manager = new SceneManager();\nexport { scene_manager as SceneManager };\n","\nimport { Vector3, Mesh } from 'three';\nimport { BoxGeometry } from 'three';\nimport { MeshBasicMaterial } from 'three';\n\nclass Cube extends Mesh\n{\n constructor(size, segments, color)\n {\n size = size || new Vector3(1, 1, 1);\n segments = segments || new Vector3(1, 1, 1);\n color = color || 0xff0000;\n const geometry = new BoxGeometry(size.x, size.y, size.z, segments.x, segments.y, segments.z);\n const material = new MeshBasicMaterial({ color: color });\n super(geometry, material);\n }\n}\n\nexport { Cube };\n","import { Mesh } from 'three';\nimport { SphereBufferGeometry } from 'three';\nimport { MeshBasicMaterial } from 'three';\n\nclass Sphere extends Mesh\n{\n constructor(radius, color)\n {\n color = color || '#FF0000';\n radius = radius || 1;\n const geometry = new SphereBufferGeometry(radius, 64, 64);\n const material = new MeshBasicMaterial({ color: color });\n super(geometry, material);\n }\n}\n\nexport { Sphere };\n","import { CylinderBufferGeometry } from 'three';\nimport { ConeBufferGeometry } from 'three';\nimport { MeshBasicMaterial } from 'three';\nimport { Vector3, Mesh } from 'three';\n\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\n\nclass Arrow extends Mesh\n{\n constructor(color, length, dir)\n {\n color = color || '#FF0000';\n length = length || 1;\n\n const cone_height = 0.4;\n const cylinder_height = length - cone_height;\n const cylinder_geo = new CylinderBufferGeometry(0.01, 0.01, cylinder_height, 32);\n cylinder_geo.translate(0, cylinder_height / 2, 0);\n\n const cone_geometry = new ConeBufferGeometry(0.1, cone_height, 32);\n cone_geometry.translate(0, cylinder_height + cone_height / 2, 0);\n\n const buffer_geometry = BufferGeometryUtils.mergeBufferGeometries([cylinder_geo, cone_geometry]);\n buffer_geometry.rotateX(3.14 / 2);\n\n const material = new MeshBasicMaterial({ color: color });\n super(buffer_geometry, material);\n\n if (dir)\n {\n this.quaternion.setFromUnitVectors(new Vector3(0, 0, 1), dir);\n }\n\n this._dir = dir;\n }\n\n set dir(dir)\n {\n this.quaternion.setFromUnitVectors(new Vector3(0, 0, 1), dir);\n this._dir = dir;\n }\n\n get dir()\n {\n return this._dir;\n }\n\n set length(value)\n {\n this.scale.z = value;\n }\n\n get length()\n {\n return this.scale.z;\n }\n}\n\nexport { Arrow };\n","import { Vector2 } from 'three';\n\nclass OScreen\n{\n init()\n {\n this.width = 1;\n this.height = 1;\n\n this.position = new Vector2();\n\n this.render_width = 1;\n this.render_height = 1;\n this.width_height = new Vector2(this.width, this.height);\n\n this.dpr = 1;\n this.pixel_size = new Vector2(1 / this.width, 1 / this.height);\n }\n\n update_position(x, y)\n {\n this.position.set(x, y);\n }\n\n update()\n {\n this.size_changed = false;\n }\n\n update_size(width, height)\n {\n this.width = width;\n this.height = height;\n\n this.pixel_size = new Vector2(1 / this.width, 1 / this.height);\n\n this.width_height.x = width;\n this.width_height.y = height;\n\n this.render_width = width * this.dpr;\n this.render_height = height * this.dpr;\n\n this.size_changed = true;\n }\n\n apply_pixel_density_v2(vector2)\n {\n vector2.multiplyScalar(1 / this.dpr);\n\n return vector2;\n }\n\n apply_pixel_density(value)\n {\n return value * (1 / this.dpr);\n }\n\n get_pixel_size()\n {\n return this.pixel_size;\n }\n\n get aspect_ratio()\n {\n return this.width / this.height;\n }\n\n get portrait()\n {\n return this.width < this.height;\n }\n}\n\nconst oscreen = new OScreen();\nexport { oscreen as OScreen };\n","import { BaseShaderMaterial } from './BaseShaderMaterial';\nimport { Vector2 } from 'three';\nclass ScreenSpaceTextureMaterial extends BaseShaderMaterial\n{\n constructor(x, y, w, h)\n {\n const vert = `\n uniform vec2 _ScreenSpacePosition;\n uniform vec2 _ScreenSize;\n uniform vec2 _TextureSize;\n varying vec2 vUv;\n void main()\n {\n vec2 pos = uv * vec2(_TextureSize.x / _ScreenSize.x, _TextureSize.y / _ScreenSize.y);\n pos += vec2(_ScreenSpacePosition.x / _ScreenSize.x, _ScreenSpacePosition.y / _ScreenSize.y);\n\n pos.x = pos.x * 2.0 - 1.0;\n pos.y = pos.y * 2.0 - 1.0;\n\n gl_Position = vec4(pos, 0.0, 1.0);\n vUv = uv;\n }\n `;\n const frag = `\n uniform sampler2D _MainTex;\n varying vec2 vUv;\n\n void main()\n {\n gl_FragColor = texture2D(_MainTex, vUv);\n }\n `;\n super(vert, frag, {\n _MainTex: { value: undefined },\n _ScreenSpacePosition: { value: new Vector2() },\n _ScreenSize: { value: new Vector2() },\n _TextureSize: { value: new Vector2() }\n });\n }\n\n set_position(x, y)\n {\n this.uniforms._ScreenSpacePosition.value.set(x, y);\n }\n\n set_texture(tex, w, h)\n {\n this.uniforms._MainTex.value = tex;\n this.uniforms._TextureSize.value.set(tex.image.width, tex.image.height);\n\n if (w !== undefined)\n {\n this.uniforms._TextureSize.value.x = w;\n }\n if (h !== undefined)\n {\n this.uniforms._TextureSize.value.y = h;\n }\n }\n\n set_screen_size(w, h)\n {\n this.uniforms._ScreenSize.value.set(w, h);\n }\n}\n\nexport { ScreenSpaceTextureMaterial };\n","import { Color } from 'three';\nimport { PerspectiveCamera as TPerspectiveCamera } from 'three';\n\nclass PerspectiveCamera extends TPerspectiveCamera\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 copy(camera)\n {\n super.copy(camera);\n this.clear_color.copy(camera.clear_color);\n this.clear_alpha = camera.clear_alpha;\n return this;\n }\n}\n\nexport { PerspectiveCamera };\n","import { AxisHelper } from './components/AxisHelper';\n\nimport { SceneManager } from './SceneManager';\nimport { Cube } from './primitives/Cube';\nimport { Sphere } from './primitives/Sphere';\nimport { Arrow } from './primitives/Arrow';\nimport { OScreen } from './OScreen';\nimport { ScreenSpaceTextureMaterial } from './materials/ScreenSpaceTextureMaterial';\nimport { PerspectiveCamera } from './PerspectiveCamera';\n\nimport { Vector3 } from 'three';\nimport { LineBasicMaterial } from 'three';\nimport { BufferGeometry } from 'three';\nimport { Line } from 'three';\nimport { PlaneGeometry } 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';\n\nimport basic_color_vert from './shaders/basic_color/basic_color.vert';\nimport basic_color_frag from './shaders/basic_color/basic_color.frag';\n\nclass Debug\n{\n init()\n {\n this.Vector3_one = new Vector3(1, 1, 1);\n this.Vector3_zero = new Vector3(0, 0, 0);\n this.canvas_renderer = undefined;\n\n this.display_texture_meshes = [];\n\n this.ctx = undefined;\n this.scene = new Scene();\n this.camera = new PerspectiveCamera();\n // this.camera.clear_alpha = 0;\n }\n\n draw_arrow(origin, dir, color = 0xff0000)\n {\n const arrow = new Arrow(color, dir.length(), dir.clone().normalize());\n arrow.position.copy(origin);\n SceneManager.current.add(arrow);\n return arrow;\n }\n\n draw_axis()\n {\n const axis = new AxisHelper();\n SceneManager.current.add(axis);\n return axis;\n }\n\n set_debug_RT(RT)\n {\n this.rt_debug = RT;\n }\n\n draw_rectangle(position_2d, width, height, color)\n {\n width = width || 100;\n height = height || 100;\n this.ctx.fillStyle = color || 'rgba(255, 0, 0, 1)';\n this.ctx.fillRect(position_2d.x - width / 2,\n (this.ctx.canvas.height - position_2d.y) - height / 2, width, height);\n }\n\n clear()\n {\n if (this.ctx)\n {\n this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);\n }\n }\n\n draw_line_2D(from, to, color)\n {\n this.ctx.strokeStyle = color || 'rgba(255, 0, 0, 1)';\n this.ctx.beginPath();\n this.ctx.moveTo(from.x, from.y);\n this.ctx.lineTo(to.x, to.y);\n this.ctx.closePath();\n this.ctx.stroke();\n }\n\n draw_line(points, color = 0xff0000)\n {\n const material = new LineBasicMaterial({\n color: color\n });\n\n const geometry = new BufferGeometry().setFromPoints(points);\n\n const line = new Line(geometry, material);\n line.frustumCulled = false;\n SceneManager.current.add(line);\n return line;\n }\n\n draw_cube(pos, size, color)\n {\n size = size || 1;\n color = color || 0xff0000;\n pos = pos || new Vector3();\n\n const cube = new Cube(new Vector3(size, size, size), undefined, color);\n cube.position.copy(pos);\n SceneManager.current.add(cube);\n return cube;\n }\n\n draw_oriented_cube(from, to, height = 1, color = '#FF0000', depth = 0.1)\n {\n const size = from.distanceTo(to);\n const cube = new Cube(new Vector3(depth, height, size), undefined, color);\n\n const center = to.clone().sub(from).multiplyScalar(0.5);\n const forward_dir = center.clone().normalize();\n center.add(from);\n\n cube.position.copy(center);\n\n // let up = new Vector3(0, 1, 0);\n // let forward = forward_dir.clone();\n // let right = forward.clone().cross(up);\n\n // cube.quaternion.setFromRotationMatrix(new Matrix4().makeBasis(right,up,forward));\n cube.quaternion.setFromUnitVectors(new Vector3(0, 0, -1), forward_dir);\n\n SceneManager.current.add(cube);\n return cube;\n }\n\n draw_plane(width, height, color)\n {\n const geometry = new PlaneGeometry(width, height);\n const material = new ShaderMaterial({\n uniforms: {\n _Color: { value: new Vector4(0, 1, 0, 0.2) }\n },\n vertexShader: basic_color_vert,\n fragmentShader: basic_color_frag,\n transparent: true,\n depthWrite: false\n });\n\n const plane = new Mesh(geometry, material);\n plane.renderOrder = -10000;\n SceneManager.current.add(plane);\n return plane;\n }\n\n draw_empty_cube(pos, size, color)\n {\n size = size || 1;\n color = color || 0xff0000;\n\n const box = new Box3().setFromCenterAndSize(new Vector3(), new Vector3(size, size, size));\n const helper = new Box3Helper(box, color);\n helper.position.copy(pos || new Vector3());\n return helper;\n }\n\n draw_sphere(pos, size, color)\n {\n size = size || 1;\n color = color || 0xff0000;\n pos = pos || new Vector3();\n\n const sphere = new Sphere(size, color);\n sphere.position.copy(pos);\n SceneManager.current.add(sphere);\n return sphere;\n }\n\n draw_point_array(input_points, open = false, color = 0xff0000)\n {\n const catmull = new CatmullRomCurve3(input_points, open);\n catmull.updateArcLengths();\n const points = catmull.getSpacedPoints(200);\n const line_helper = this.draw_line(points, 0x00ff00);\n // line_helper.position.y = 1.5;\n return line_helper;\n }\n\n draw_sphere_helper(sphere, color)\n {\n color = color || 0xff0000;\n const geometry = new SphereGeometry(sphere.radius, 32, 32);\n const material = new MeshBasicMaterial({ color: color });\n const sphere_mesh = new Mesh(geometry, material);\n sphere_mesh.position.copy(sphere.center);\n SceneManager.current.add(sphere_mesh);\n return sphere_mesh;\n }\n\n draw_math_sphere(sphere)\n {\n const geometry = new SphereGeometry(sphere.radius, 32, 32);\n const material = new ShaderMaterial({\n uniforms: {\n _Color: { value: new Vector4(1, 0, 0, 0.2) }\n },\n vertexShader: basic_color_vert,\n fragmentShader: basic_color_frag,\n transparent: true\n });\n // var material = new MeshBasicMaterial( {color: 0xff0000, transparent = true} );\n const sphere1 = new Mesh(geometry, material);\n sphere1.position.copy(sphere.center);\n SceneManager.current.add(sphere1);\n }\n\n draw_bounding_box(bb)\n {\n const helper = new Box3Helper(bb, 0xffff00);\n SceneManager.current.add(helper);\n }\n\n draw_curve(curve, options)\n {\n const offset = new Vector3(0, 0, 0);\n if (options)\n {\n offset.y = options.offset || 0;\n }\n\n for (let i = 0; i < curve.length - 1; i++)\n {\n this.draw_line(curve[i].clone().add(offset), curve[i + 1].clone().add(offset));\n }\n }\n\n draw_texture(tex, w, h)\n {\n const mesh = new Mesh(new PlaneGeometry(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(OScreen.width, OScreen.height);\n }\n if (this.scene.children.length > 0)\n {\n graphics.render(this.scene, this.camera);\n }\n }\n}\n\nconst debug = new Debug();\nexport { debug as Debug };\n","import { BlitMaterial } from '../materials/BlitMaterial';\n\nimport frag from '../shaders/clear/clear_depth_normal.frag';\n\nimport { Vector4 } from 'three';\n\nclass 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\nexport { ClearDepthNormalMaterial };\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\nclass 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\nexport { DepthNormalMaterial };\n","import { CameraManager } from '../CameraManager';\nimport { OScreen } from '../OScreen';\n\nimport { ClearDepthNormalMaterial } from '../materials/ClearDepthNormalMaterial';\nimport { DepthNormalMaterial } from '../materials/DepthNormalMaterial';\n\nimport { WebGLRenderTarget } from 'three';\nimport { Vector3 } from 'three';\n\nclass DepthAndNormalsRenderer\n{\n constructor()\n {\n this.RT = new WebGLRenderTarget(OScreen.width, OScreen.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 !== OScreen.width || this.RT.height !== OScreen.height)\n {\n this.RT.setSize(OScreen.width, OScreen.height);\n }\n }\n\n get render_target()\n {\n return this.RT;\n }\n}\n\nexport { DepthAndNormalsRenderer };\n","import { BlitMaterial } from '../materials/BlitMaterial';\n\nimport { Scene } from 'three';\nimport { Mesh } from 'three';\nimport { PlaneGeometry } from 'three';\nimport { OrthographicCamera } from 'three';\n\nclass 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 PlaneGeometry(1, 1), this._blit_material);\n this._blit_scene.add(this._blit_quad);\n this._blit_camera = new OrthographicCamera(-1, 1, 1, -1, -10000, 10000);\n }\n\n blit(src, dst)\n {\n this._blit_quad.material = this._blit_material;\n\n const src_texture = src.isWebGLRenderTarget === true ? src.texture : src;\n const src_width = src.isWebGLRenderTarget === true ? src.width : src.image.width;\n const src_height = src.isWebGLRenderTarget === true ? src.height : src.image.height;\n\n this._blit_quad.material.uniforms._MainTex.value = src_texture;\n this._blit_quad.material.uniforms._Resolution.value.set(src_width, src_height);\n\n if (dst)\n {\n this._blit_quad.material.uniforms._TargetResolution.value.set(dst.width, dst.height);\n }\n else\n {\n this.renderer.getSize(this._blit_quad.material.uniforms._TargetResolution.value);\n }\n\n this.__render(dst);\n }\n\n material_pass(mat, dst)\n {\n this._blit_quad.material = mat;\n // this._blit_quad.material.uniforms._MainTex.value = undefined;\n // this._blit_quad.material.uniforms._Resolution.value.set(1, 1);\n\n this.__render(dst);\n }\n\n blit_with_material(src, dst, mat)\n {\n const src_texture = src.isWebGLRenderTarget === true ? src.texture : src;\n const src_width = src.isWebGLRenderTarget === true ? src.width : src.image.width;\n const src_height = src.isWebGLRenderTarget === true ? src.height : src.image.height;\n\n this._blit_quad.material = mat;\n this._blit_quad.material.uniforms._MainTex.value = src_texture;\n this._blit_quad.material.uniforms._Resolution.value.set(src_width, src_height);\n\n if (dst)\n {\n this._blit_quad.material.uniforms._TargetResolution.value.set(dst.width, dst.height);\n }\n else\n {\n this.renderer.getSize(this._blit_quad.material.uniforms._TargetResolution.value);\n }\n\n this.__render(dst);\n }\n\n blit_clear_with_material(dst_RT, mat)\n {\n this._blit_quad.material = mat;\n\n this.__render(dst_RT);\n }\n\n dispose()\n {\n this._blit_quad.geometry.dispose();\n this._blit_quad.material.dispose();\n }\n\n __render(RT)\n {\n RT = RT === undefined ? null : RT;\n\n const current_rt = this.renderer.getRenderTarget();\n\n this.renderer.setRenderTarget(RT === undefined ? null : RT);\n this.renderer.render(this._blit_scene, this._blit_camera);\n\n this.renderer.setRenderTarget(current_rt);\n }\n}\n\nexport { Blitter };\n","import { Configuration } from './Configuration';\nimport { BaseRender } from './render_mode/BaseRender';\nimport { OScreen } from './OScreen';\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 {\n NearestFilter,\n RGBAFormat,\n LinearEncoding,\n FloatType,\n WebGLRenderTarget,\n ShaderMaterial,\n NoBlending,\n AlwaysDepth\n} from 'three';\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 = {\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 force_webgl2: true,\n xr_enabled: false\n };\n\n Object.assign(this.context_attributes, context_attributes);\n\n if (this.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\n if (this.context_attributes.xr_enabled)\n {\n this._renderer.xr.enabled = true;\n }\n else\n {\n this._renderer.autoClear = false;\n }\n\n this._renderer.setPixelRatio(1);\n\n OScreen.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.is_floating_point_texture_available();\n\n this.generateDepthNormalTexture = false;\n\n this.depth_and_normals_renderer = new DepthAndNormalsRenderer();\n\n this.resize_observer = new ResizeObserver(this.on_resize.bind(this));\n this.resize_observer.observe(this.canvas);\n }\n\n get dom_element()\n {\n return this._renderer.domElement;\n }\n\n get depth_normals_RT()\n {\n return this.depth_and_normals_renderer.render_target;\n }\n\n set_state(new_state)\n {\n // console.log('VIEWAPI - map render mode switch to: ' + new_state.constructor.name);\n\n this.current_render_mode.on_exit(this, this._renderer);\n this.current_render_mode = new_state;\n this.current_render_mode.on_enter(this, this._renderer);\n }\n\n update()\n {\n if (this.generateDepthNormalTexture)\n {\n this.depth_and_normals_renderer.render(this);\n }\n\n this.__update_current_camera();\n\n if (CameraManager.current)\n {\n this.current_render_mode.render();\n }\n\n OScreen.update();\n }\n\n __update_current_camera()\n {\n if (CameraManager.current)\n {\n CameraManager.current.aspect = OScreen.aspect_ratio;\n CameraManager.current.updateProjectionMatrix();\n CameraManager.current.updateMatrix();\n CameraManager.current.updateMatrixWorld(true);\n }\n }\n\n render(scene, camera, RT, override_mat)\n {\n this.__apply_override_material(scene, override_mat);\n\n this._renderer.setRenderTarget(RT === undefined ? null : RT);\n this._renderer.render(scene || SceneManager.current,\n camera || CameraManager.current);\n\n this.__apply_override_material(scene, undefined);\n }\n\n render_scene(scene)\n {\n if (scene.on_pre_render)\n {\n scene.on_pre_render();\n }\n\n if (scene.render)\n {\n scene.render();\n }\n else\n {\n this.render(scene, undefined);\n }\n\n if (scene.on_post_render)\n {\n scene.on_post_render();\n }\n }\n\n __apply_override_material(scene, mat)\n {\n mat = mat === undefined ? null : mat;\n if (scene)\n {\n scene.overrideMaterial = mat;\n }\n else\n {\n SceneManager.current.overrideMaterial = mat;\n }\n }\n\n readback_RT(RT, buffer)\n {\n this._renderer.readRenderTargetPixels(RT, 0, 0, RT.width, RT.height, buffer);\n }\n\n clear(RT, camera, clear_depth, clear_stencil)\n {\n this._renderer.setRenderTarget(RT === undefined ? null : RT);\n\n if (camera)\n {\n this._renderer.setClearColor(camera.clear_color, camera.clear_alpha);\n }\n\n this._renderer.clear(!!camera, // clear color\n !!clear_depth,\n !!clear_stencil);\n }\n\n on_resize(entries)\n {\n for (const entry of entries)\n {\n OScreen.dpr = Configuration.dpr;\n OScreen.update_position(entry.contentRect.x, entry.contentRect.y);\n OScreen.update_size(entry.contentRect.width, entry.contentRect.height);\n\n this.canvas.width = OScreen.render_width;\n this.canvas.height = OScreen.render_height;\n\n this._renderer.setViewport(0, 0, OScreen.render_width, OScreen.render_height);\n\n this.__update_current_camera();\n }\n }\n\n material_pass(mat, dst)\n {\n this.blitter.material_pass(mat, dst);\n }\n\n blit(src_RT, dst_RT, mat)\n {\n if (mat)\n {\n this.blitter.blit_with_material(src_RT, dst_RT, mat);\n }\n else\n {\n this.blitter.blit(src_RT, dst_RT);\n }\n }\n\n blit_clear_with_material(dst_RT, mat)\n {\n this.blitter.blit_clear_with_material(dst_RT, mat);\n }\n\n take_screenshot(blob_callback, width = OScreen.width, height = OScreen.height)\n {\n // const ctx = this;\n\n const old_width = OScreen.width;\n const old_height = OScreen.height;\n\n const new_width = width;\n const new_height = height;\n\n const tile_width = 1024;\n const tile_height = 1024;\n\n const divisions_x = parseInt(Math.ceil(new_width / tile_width));\n const divisions_y = parseInt(Math.ceil(new_height / tile_height));\n\n OScreen.update_size(tile_width, tile_height);\n const old_dpr = this._renderer.getPixelRatio();\n this._renderer.setPixelRatio(1);\n\n this._renderer.setSize(tile_width, tile_height, false);\n\n const canvas_2d = document.createElement('canvas');\n const ctx_2D = canvas_2d.getContext('2d');\n\n ctx_2D.canvas.width = new_width;\n ctx_2D.canvas.height = new_height;\n\n CameraManager.current.aspect = OScreen.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 OScreen.width * x, OScreen.height * y,\n OScreen.width, OScreen.height);\n this.current_render_mode.render();\n\n ctx_2D.drawImage(this._renderer.domElement, OScreen.width * x, OScreen.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 OScreen.update_size(old_width, old_height);\n this._renderer.setPixelRatio(old_dpr);\n this._renderer.setSize(old_width, old_height, false);\n\n CameraManager.current.aspect = OScreen.aspect_ratio;\n CameraManager.current.updateMatrix();\n CameraManager.current.updateMatrixWorld(true);\n }\n\n download_screenshot(blob)\n {\n const link = document.createElement('a');\n link.download = 'Snapshot.png';\n\n link.href = URL.createObjectURL(blob);\n link.click();\n\n link.onclick = function()\n {\n requestAnimationFrame(function()\n {\n URL.revokeObjectURL(link.href);\n });\n link.removeAttribute('href');\n };\n }\n\n dispose()\n {\n this._renderer.dispose();\n this.current_render_mode.dispose();\n this.blitter.dispose();\n }\n\n is_floating_point_texture_available()\n {\n const RT = new WebGLRenderTarget(1, 1, {\n minFilter: NearestFilter,\n magFilter: NearestFilter,\n format: RGBAFormat,\n encoding: LinearEncoding,\n type: FloatType,\n stencilBuffer: false,\n depthBuffer: false\n });\n\n const vert = `\n void main()\n {\n gl_Position = vec4(uv * 2.0 - 1.0, 1.0, 1.0);\n }\n `;\n const frag = `\n void main()\n {\n gl_FragColor = vec4(0.0, 4865.35, 0.0, 1.0);\n }\n `;\n\n const mat = new ShaderMaterial({\n vertexShader: vert,\n fragmentShader: frag,\n depthWrite: false,\n blending: NoBlending,\n depthTest: false,\n depthFunc: AlwaysDepth\n });\n\n this.material_pass(mat, RT);\n\n const output = new Float32Array(4);\n this._renderer.readRenderTargetPixels(RT, 0, 0, 1, 1, output);\n\n return Math.abs(output[1] - 4865.35) < 0.001;\n }\n}\n\nconst graphics = new Graphics();\nexport { graphics as Graphics };\n","import frag from '../shaders/normal/normal.frag';\nimport vert from '../shaders/normal/normal.vert';\n\nimport { ShaderMaterial } from 'three';\n\nclass NormalMaterial extends ShaderMaterial\n{\n constructor()\n {\n super({\n uniforms: {\n },\n vertexShader: vert,\n fragmentShader: frag\n });\n }\n}\n\nexport { NormalMaterial };\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\nclass 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\nexport { DebugNormalsRender };\n","class KeyboardInput\n{\n init(container)\n {\n this.ctrlz_pressed = false;\n this.ctrlz_fired = false;\n\n this.keys = {};\n this.keys_keys = [];\n this.container = container;\n\n this.container.addEventListener('keydown', this.on_key_down.bind(this), false);\n this.container.addEventListener('keyup', this.on_key_up.bind(this), false);\n }\n\n on_key_down(e)\n {\n if (e.keyCode === 90 && e.ctrlKey && !this.ctrlz_fired)\n {\n this.ctrlz_pressed = true;\n this.ctrlz_fired = true;\n }\n if (e.key)\n {\n this.press_key(e.key);\n }\n }\n\n on_key_up(e)\n {\n this.release_key(e.key);\n }\n\n clear()\n {\n this.ctrlz_pressed = false;\n\n for (let i = 0; i < this.keys_keys.length; i++)\n {\n this.keys[this.keys_keys[i]].pressed = false;\n this.keys[this.keys_keys[i]].released = false;\n }\n }\n\n release_key(key_name)\n {\n const key = this.keys[key_name];\n if (key)\n {\n key.fired = false;\n key.down = false;\n key.released = true;\n }\n }\n\n release_keys()\n {\n this.ctrlz_fired = false;\n\n for (let i = 0; i < this.keys_keys.length; i++)\n {\n this.keys[this.keys_keys[i]].fired = false;\n this.keys[this.keys_keys[i]].down = false;\n }\n }\n\n press_key(key_name)\n {\n const key = this.keys[key_name];\n if (key)\n {\n if (key.down === false)\n {\n key.pressed = true;\n }\n key.down = true;\n key.fired = true;\n }\n }\n\n is_key_pressed(key_name)\n {\n const key = this.keys[key_name];\n if (key)\n {\n return key.pressed;\n }\n return false;\n }\n\n is_key_down(key_name)\n {\n const key = this.keys[key_name];\n if (key)\n {\n return key.down;\n }\n return false;\n }\n\n is_key_released(key_name)\n {\n const key = this.keys[key_name];\n if (key)\n {\n return key.released;\n }\n\n return false;\n }\n\n register_key(key)\n {\n this.keys[key] =\n {\n key_name: key,\n pressed: false,\n down: false,\n fired: false\n };\n\n this.keys_keys = Object.keys(this.keys);\n }\n\n unregister_key(key_name)\n {\n delete this.keys[key_name];\n }\n\n dispose()\n {\n this.container.removeEventListener('keydown', this.on_key_down.bind(this), false);\n this.container.removeEventListener('keyup', this.on_key_up.bind(this), false);\n }\n}\n\nexport { KeyboardInput };\n","import { InputController } from 'pit-js';\nimport { KeyboardInput } from './KeyboardInput';\n\nclass Input extends InputController\n{\n constructor()\n {\n super();\n\n this.clicked = false;\n this.captured_NDC = { x: 0, y: 0 };\n this.current_NDC_delta = { x: 0, y: 0 };\n\n this.keyboard = new KeyboardInput();\n }\n\n init(container, keyboard_input_container)\n {\n super.init(container);\n\n this.keyboard.init(keyboard_input_container);\n }\n\n dispose()\n {\n super.dispose();\n\n this.keyboard.dispose();\n }\n\n update()\n {\n if (this.left_mouse_button_pressed)\n {\n this.captured_NDC.x = this.NDC.x;\n this.captured_NDC.y = this.NDC.y;\n }\n\n if (this.left_mouse_button_down)\n {\n this.current_NDC_delta.x += Math.abs(this.NDC_delta.x);\n this.current_NDC_delta.y += Math.abs(this.NDC_delta.y);\n }\n\n if (this.left_mouse_button_released)\n {\n if (this.current_NDC_delta.x < 0.001 || this.current_NDC_delta.y < 0.001)\n {\n this.clicked = true;\n }\n\n this.current_NDC_delta = { x: 0, y: 0 };\n }\n }\n\n clear()\n {\n super.clear();\n\n this.clicked = false;\n\n this.keyboard.clear();\n }\n}\n\nconst input = new Input();\nexport { input as Input };\n","\nclass OS\n{\n init()\n {\n this.operating_systems = {\n ANDROID: 'android',\n IOS: 'ios',\n LINUX: 'linux',\n MAC: 'mac',\n WINDOWS: 'windows'\n };\n\n this.is_mobile = !!(navigator.userAgent.match(/(iPhone|iPod|iPad|Android|playbook|silk|BlackBerry|BB10|Windows Phone|Tizen|Bada|webOS|IEMobile|Opera Mini)/));\n this.is_ipad = !!(navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints && navigator.maxTouchPoints > 2);\n this.is_ios = !!navigator.userAgent.match(/(iPhone|iPod|iPad)/) || this.is_ipad;\n\n this.is_android = this.get_os() === this.operating_systems.ANDROID;\n this.is_linux = this.get_os() === this.operating_systems.LINUX;\n this.is_mac = this.get_os() === this.operating_systems.MAC;\n this.is_windows = this.get_os() === this.operating_systems.WINDOWS;\n }\n\n get_os()\n {\n const userAgent = window.navigator.userAgent;\n const platform = window.navigator.platform;\n const macosPlatforms = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'];\n const windowsPlatforms = ['Win32', 'Win64', 'Windows', 'WinCE'];\n const iosPlatforms = ['iPhone', 'iPad', 'iPod'];\n let os = null;\n\n if (macosPlatforms.indexOf(platform) !== -1)\n {\n os = this.operating_systems.MAC;\n }\n else if (iosPlatforms.indexOf(platform) !== -1)\n {\n os = this.operating_systems.IOS;\n }\n else if (windowsPlatforms.indexOf(platform) !== -1)\n {\n os = this.operating_systems.WINDOWS;\n }\n else if (/Android/.test(userAgent))\n {\n os = this.operating_systems.ANDROID;\n }\n else if (!os && /Linux/.test(platform))\n {\n os = this.operating_systems.LINUX;\n }\n\n return os;\n }\n}\n\nconst os = new OS();\nexport { os as OS };\n","import { Vector3 } from 'three';\n\nclass ReflectionPlaneContext\n{\n init()\n {\n this.target_geometry = undefined;\n this.target_position = new Vector3();\n }\n\n set_target_geometry(geometry)\n {\n this.target_geometry = geometry;\n }\n}\n\nconst reflection_plane_context = new ReflectionPlaneContext();\nexport { reflection_plane_context as 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\nclass GeometryBatch\n{\n constructor(geometry, batch_width)\n {\n this.geometry = geometry;\n\n this.material = undefined;\n this.uniforms = {};\n this.batch_width = batch_width;\n\n this.data_textures = [];\n\n this.object_names = undefined;\n\n this.zero_offset = new Vector2();\n this.write_offset = new Vector2();\n\n this.uniform_dirty_count = 0;\n\n this.tmp_uploaded_data_count = 0;\n }\n\n init(object_names, vert_shader, frag_shader)\n {\n this.material = new ShaderMaterial({\n uniforms: this.uniforms,\n vertexShader: vert_shader,\n fragmentShader: frag_shader\n });\n this.object_names = object_names;\n }\n\n add_global_uniform(name, data)\n {\n this.uniforms[name] = { value: data };\n this.material.needsUpdate = true;\n }\n\n set_global_uniform(name, data)\n {\n this.uniforms[name].value = data;\n }\n\n add_object_uniform_v3(uniform_name, default_value_v3)\n {\n const src_tex = this.__create_rgb_texture(this.batch_width);\n const dst_tex = this.__create_rgb_texture(this.batch_width);\n const one_pixel_tex = this.__create_rgb_texture(1);\n\n const new_data_tex = this.__add_data_texture(uniform_name, src_tex, dst_tex, one_pixel_tex);\n\n if (default_value_v3)\n {\n this.__flood_data_texture_rgb(new_data_tex, default_value_v3);\n }\n }\n\n add_object_uniform_v4(uniform_name, default_value_v4)\n {\n const src_tex = this.__create_rgba_texture(this.batch_width);\n const dst_tex = this.__create_rgba_texture(this.batch_width);\n const one_pixel_tex = this.__create_rgba_texture(1);\n\n const new_data_tex = this.__add_data_texture(uniform_name, src_tex, dst_tex, one_pixel_tex);\n\n if (default_value_v4)\n {\n this.__flood_data_texture_rgba(new_data_tex, default_value_v4);\n }\n }\n\n add_object_uniform_v4_float(uniform_name, default_value_v4)\n {\n const src_tex = this.__create_rgba_float_texture(this.batch_width);\n const dst_tex = this.__create_rgba_float_texture(this.batch_width);\n const one_pixel_tex = this.__create_rgba_float_texture(1);\n\n const new_data_tex = this.__add_data_texture(uniform_name, src_tex, dst_tex, one_pixel_tex);\n\n if (default_value_v4)\n {\n this.__flood_data_texture_rgba(new_data_tex, default_value_v4);\n }\n }\n\n set_object_uniform_v3(object_name, uniform_name, vector3, use_r, use_g, use_b)\n {\n const obj_index = this.__get_object_index(object_name);\n const data_texture = this.__get_data_texture(uniform_name);\n\n this.__set_pixel_rgb(data_texture.src, obj_index, vector3, use_r, use_g, use_b);\n this.__set_pixel_rgb(data_texture.one_pixel, 0, vector3, use_r, use_g, use_b);\n\n data_texture.last_accessed_index = obj_index;\n\n data_texture.dirty_count++;\n }\n\n set_object_uniform_v4(object_name, uniform_name, vector4, use_r, use_g, use_b, use_a)\n {\n const obj_index = this.__get_object_index(object_name);\n const data_texture = this.__get_data_texture(uniform_name);\n\n this.__set_pixel_rgba(data_texture.src, obj_index, vector4, use_r, use_g, use_b, use_a);\n this.__set_pixel_rgba(data_texture.one_pixel, 0, vector4, use_r, use_g, use_b, use_a);\n data_texture.last_accessed_index = obj_index;\n\n data_texture.dirty_count++;\n }\n\n upload_texture_data(renderer, upload_budget)\n {\n for (let i = 0; i < this.data_textures.length; i++)\n {\n if (upload_budget > 0 && this.data_textures[i].dirty_count > 0)\n {\n if (this.data_textures[i].dirty_count === 1)\n {\n this.__partial_texture_data_upload(renderer, this.data_textures[i]);\n }\n if (this.data_textures[i].dirty_count > 1)\n {\n this.__full_texture_data_upload(renderer, this.data_textures[i]);\n }\n\n this.data_textures[i].dirty_count = 0;\n\n upload_budget--;\n }\n }\n }\n\n get_uniform_dirty_count()\n {\n this.uniform_dirty_count = 0;\n for (let i = 0; i < this.data_textures.length; i++)\n {\n if (this.data_textures[i].dirty_count > 0)\n {\n this.uniform_dirty_count++;\n }\n }\n return this.uniform_dirty_count;\n }\n\n __full_texture_data_upload(renderer, texture_data)\n {\n // console.log(\"full texture update of\"+ texture_data.name);\n texture_data.dst.needsUpdate = true;\n renderer.copyTextureToTexture(\n this.zero_offset,\n texture_data.src,\n texture_data.dst\n );\n }\n\n __partial_texture_data_upload(renderer, texture_data)\n {\n // console.log(\"partial texture update\"+ texture_data.name);\n const index = texture_data.last_accessed_index;\n if (index === -1)\n {\n return;\n }\n\n this.write_offset.y = Math.floor(index / this.batch_width);\n this.write_offset.x = index - this.batch_width * this.write_offset.y;\n renderer.copyTextureToTexture(\n this.write_offset,\n texture_data.one_pixel,\n texture_data.dst\n );\n }\n\n get_mesh()\n {\n return new Mesh(this.geometry, this.material);\n }\n\n __set_pixel_rgb(data_texture, index, vector3, use_r, use_g, use_b)\n {\n if (use_r)\n {\n data_texture.image.data[index * 3 + 0] = vector3.x;\n }\n if (use_g)\n {\n data_texture.image.data[index * 3 + 1] = vector3.y;\n }\n if (use_b)\n {\n data_texture.image.data[index * 3 + 2] = vector3.z;\n }\n }\n\n __set_pixel_rgba(data_texture, index, vector4, use_r, use_g, use_b, use_a)\n {\n if (use_r)\n {\n data_texture.image.data[index * 4 + 0] = vector4.x;\n }\n if (use_g)\n {\n data_texture.image.data[index * 4 + 1] = vector4.y;\n }\n if (use_b)\n {\n data_texture.image.data[index * 4 + 2] = vector4.z;\n }\n if (use_a)\n {\n data_texture.image.data[index * 4 + 3] = vector4.w;\n }\n }\n\n __flood_data_texture_rgb(data_texture, v3)\n {\n for (let i = 0; i < this.batch_width * this.batch_width; i++)\n {\n this.__set_pixel_rgb(data_texture.src, i, v3, true, true, true);\n data_texture.dirty_count++;\n }\n }\n\n __flood_data_texture_rgba(data_texture, v4)\n {\n for (let i = 0; i < this.batch_width * this.batch_width; i++)\n {\n this.__set_pixel_rgba(data_texture.src, i, v4, true, true, true, true);\n data_texture.dirty_count++;\n }\n }\n\n __create_rgb_texture(width)\n {\n const data = new Uint8Array(3 * width * width);\n return new DataTexture(data, width, width, RGBFormat);\n }\n\n __create_rgba_texture(width)\n {\n const data = new Uint8Array(4 * width * width);\n return new DataTexture(data, width, width, RGBAFormat);\n }\n\n __create_rgba_float_texture(width)\n {\n const data = new Float32Array(4 * width * width);\n return new DataTexture(data, width, width, RGBAFormat, FloatType);\n }\n\n __get_data_texture(uniform_name)\n {\n for (let i = 0; i < this.data_textures.length; i++)\n {\n if (this.data_textures[i].name === uniform_name)\n {\n return this.data_textures[i];\n }\n }\n console.error('Data texture ' + uniform_name + ' does not exist');\n return undefined;\n }\n\n __get_object_index(name)\n {\n for (let i = 0; i < this.object_names.length; i++)\n {\n if (this.object_names[i] === name)\n {\n return i;\n }\n }\n console.error('the name ' + name + ' is not contained in this batch');\n return undefined;\n }\n\n __add_data_texture(uniform_name, src_texture, dst_texture, one_pixel_text)\n {\n dst_texture.needsUpdate = true;\n\n this.data_textures.push({\n name: uniform_name,\n src: src_texture,\n dst: dst_texture,\n one_pixel: one_pixel_text,\n last_accessed_index: -1,\n dirty_count: 0\n });\n\n this.uniforms[uniform_name] = { value: dst_texture };\n return this.data_textures[this.data_textures.length - 1];\n }\n\n dispose()\n {\n for (let i = 0; i < this.data_textures.length; i++)\n {\n this.data_textures[i].src.dispose();\n this.data_textures[i].dst.dispose();\n this.data_textures[i].one_pixel.dispose();\n }\n }\n}\n\nexport { GeometryBatch };\n","import { GeometryBatch } from './GeometryBatch';\n\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\n\nimport { BufferAttribute } from 'three';\nimport { OMath } from '../utilities/OMath';\n\nclass GeometryBatcher\n{\n init()\n {\n this.batches = [];\n }\n\n batch(buffer_geometries)\n {\n const attr_accessor_uvs = [];\n const texture_width = OMath.ceilPowerOfTwo(Math.sqrt(buffer_geometries.length));\n // console.log(\"Store count: \" + buffer_geometries.length + \", Texture size: \" +texture_width);\n\n this.__init_uv_array(attr_accessor_uvs, texture_width);\n\n let uv_index = 0;\n\n for (let i = 0; i < buffer_geometries.length; i++)\n {\n const vertex_count = buffer_geometries[i].getAttribute('position').count;\n const y = Math.floor(i / texture_width);\n const x = i - texture_width * y;\n for (let count = 0; count < vertex_count; count++)\n {\n attr_accessor_uvs[uv_index] = (x / texture_width) + 0.5 / texture_width;\n attr_accessor_uvs[uv_index + 1] = (y / texture_width) + 0.5 / texture_width;\n uv_index += 2;\n }\n }\n\n const buffer_attribute = new BufferAttribute(new Float32Array(attr_accessor_uvs), 2);\n const buffer_geometry = BufferGeometryUtils.mergeBufferGeometries(buffer_geometries);\n buffer_geometry.setAttribute('attr_accessor_uv', buffer_attribute);\n\n this.batches.push(new GeometryBatch(buffer_geometry, texture_width));\n return this.batches[this.batches.length - 1];\n }\n\n upload_texture_data(renderer)\n {\n for (let i = 0; i < this.batches.length; i++)\n {\n this.batches[i].upload_texture_data(renderer, 1);\n }\n }\n\n __init_uv_array(uvs, texture_width)\n {\n for (let i = 0; i < texture_width * texture_width * 2; i++)\n {\n uvs.push(0);\n }\n }\n}\n\nconst geometry_batcher = new GeometryBatcher();\nexport { geometry_batcher as 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.matrixWorldAutoUpdate = false;\n this.ss_scene.frustumCulled = false;\n\n this.ws_scene = new Scene();\n this.ws_scene.matrixWorldAutoUpdate = false;\n this.ws_scene.frustumCulled = false;\n\n this.ss_camera = new OrthographicCamera(-1, 1, 1, -1, -100, 100);\n }\n\n delete_element(elem)\n {\n const index = this.ui_elements.indexOf(elem);\n if (index > -1)\n {\n this.ui_elements.splice(index, 1);\n }\n\n this.ss_scene.remove(elem);\n this.ws_scene.remove(elem);\n\n elem.dispose();\n }\n\n add_screen_space_element(elem)\n {\n this.ui_elements.push(elem);\n this.ss_scene.add(elem);\n\n elem.set_screen_space_coordinate_system();\n }\n\n add_world_space_element(elem)\n {\n this.ui_elements.push(elem);\n this.ws_scene.add(elem);\n\n elem.set_world_space_coordinate_system();\n }\n\n update()\n {\n // this.ss_camera.left = -OScreen.width / 2;\n // this.ss_camera.right = OScreen.width / 2;\n // this.ss_camera.top = OScreen.top / 2;\n // this.ss_camera.right = -OScreen.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\nconst ui = new UI();\nexport { ui as UI };\n","import { CameraManager } from '../CameraManager';\nimport { Input } from '../Input';\nimport { OMath } from '../utilities/OMath';\nimport { OScreen } from '../OScreen';\n\nimport { Vector3 } from 'three';\nimport { Matrix4 } from 'three';\nimport { Plane } from 'three';\nimport { Ray } from 'three';\nimport { Sphere } from 'three';\nimport { Box3 } from 'three';\n\nclass CameraUtilities\n{\n init()\n {\n this.tmp_mat = new Matrix4();\n this.plane = new Plane();\n this.ray = new Ray();\n\n this.tmp_size = new Vector3();\n this.tmp_unproj = new Vector3();\n }\n\n get_up_dir(camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n tmp_vec.set(0, 1, 0);\n tmp_vec.applyQuaternion(camera.quaternion);\n\n return tmp_vec;\n }\n\n get_forward_dir(camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n tmp_vec.set(0, 0, -1);\n tmp_vec.applyQuaternion(camera.quaternion);\n\n return tmp_vec;\n }\n\n get_right_dir(camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n tmp_vec.set(1, 0, 0);\n tmp_vec.applyQuaternion(camera.quaternion);\n return tmp_vec;\n }\n\n unproject_mouse_position(NDC, camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n const v_fov = (camera.fov / 2) * Math.PI / 180;\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * camera.aspect)) / 2;\n\n const distV = Math.tan(v_fov) * camera.far;\n const distH = Math.tan(h_fov) * camera.far;\n\n tmp_vec.set(distH * NDC.x, distV * NDC.y, -camera.far).normalize();\n\n return tmp_vec.applyQuaternion(camera.quaternion);\n }\n\n get_plane_intersection(plane_position, plane_normal, NDC, camera)\n {\n camera = camera || CameraManager.current;\n NDC = NDC || Input.NDC;\n\n const tmp_vec = new Vector3();\n\n this.plane.setFromNormalAndCoplanarPoint(plane_normal || this.get_forward_dir(camera), plane_position);\n if (camera.isPerspectiveCamera)\n {\n this.ray.set(camera.position, this.unproject_mouse_position(NDC, camera));\n }\n else\n {\n this.tmp_unproj.set(NDC.x, NDC.y, 1).unproject(camera);\n this.ray.set(camera.position, this.tmp_unproj);\n }\n\n this.ray.intersectPlane(this.plane, tmp_vec);\n return tmp_vec;\n }\n\n fit_points_on_camera(points, zoom_scale = 1)\n {\n const points_sphere = new Sphere().setFromPoints(points);\n const world_space_center = points_sphere.center;\n const camera_forward = this.get_forward_dir(CameraManager.current).clone();\n\n const plane = new Plane().setFromNormalAndCoplanarPoint(camera_forward, world_space_center);\n\n const points_on_plane = OMath.project_points_on_plane(points, plane);\n\n const projected_points_center = new Vector3();\n let box = new Box3().setFromPoints(points_on_plane);\n box.getCenter(projected_points_center);\n\n const up = new Vector3(0, 1, 0).applyQuaternion(CameraManager.current.quaternion);\n const right = up.clone().cross(camera_forward).normalize();\n const mat = new Matrix4().set(right.x, up.x, camera_forward.x, world_space_center.x,\n right.y, up.y, camera_forward.y, world_space_center.y,\n right.z, up.z, camera_forward.z, world_space_center.z,\n 0, 0, 0, 1);\n\n const inverse_mat = new Matrix4().getInverse(mat);\n for (let i = 0; i < points_on_plane.length; i++)\n {\n points_on_plane[i].applyMatrix4(inverse_mat);\n }\n\n const size = new Vector3();\n box = new Box3().setFromPoints(points_on_plane);\n box.getSize(size);\n size.multiplyScalar(zoom_scale);\n const projected_center = new Vector3();\n box.getCenter(projected_center);\n\n return {\n position: projected_points_center,\n zoom: this.get_zoom_to_fit_rect(size.x / 2, size.y / 2)\n };\n }\n\n get_zoom_to_fit_rect(width, height)\n {\n const v_fov = (CameraManager.current.fov / 2) * Math.PI / 180;\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * CameraManager.current.aspect)) / 2;\n\n const distV = height / Math.tan(v_fov);\n const distH = width / Math.tan(h_fov);\n\n return Math.max(Math.abs(distH), Math.abs(distV));\n }\n\n get_zoom_to_fit_box(bb, camera)\n {\n if (camera.isOrthographicCamera)\n {\n bb.getSize(this.tmp_size);\n\n const obj_x = this.tmp_size.x;\n const obj_y = this.tmp_size.y;\n const object_aspect = obj_x / obj_y;\n if (OScreen.aspect_ratio / object_aspect > 1)\n {\n return OScreen.height / obj_y;\n }\n else\n {\n return OScreen.width / obj_x;\n }\n }\n else\n {\n // return this.fit_points_on_camera([bb.min, bb.max], 1).zoom;\n const size = new Vector3();\n bb.getSize(size);\n return this.get_zoom_to_fit_rect(size.x, size.y);\n }\n }\n\n get_html_screen_pos(object, camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n object.getWorldPosition(tmp_vec);\n tmp_vec.project(camera);\n\n tmp_vec.x = (tmp_vec.x * 0.5 + 0.5) * (OScreen.width);\n tmp_vec.y = (1 - (tmp_vec.y * 0.5 + 0.5)) * OScreen.height;\n return tmp_vec;\n }\n\n world_pos_to_screen(pos, camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n tmp_vec.copy(pos);\n tmp_vec.project(camera);\n\n tmp_vec.x = (tmp_vec.x * 0.5 + 0.5) * (OScreen.width);\n tmp_vec.y = (1 - (tmp_vec.y * 0.5 + 0.5)) * OScreen.height;\n return tmp_vec;\n }\n\n update_projection(camera)\n {\n camera.left = -OScreen.width / 2;\n camera.right = OScreen.width / 2;\n camera.top = OScreen.height / 2;\n camera.bottom = -OScreen.height / 2;\n camera.aspect = OScreen.aspect_ratio;\n camera.updateProjectionMatrix(true);\n }\n}\n\nconst camera_utilities = new CameraUtilities();\nexport { camera_utilities as CameraUtilities };\n","import { Browser } from './Browser';\nimport { CameraManager } from './CameraManager';\nimport { Capabilities } from './Capabilities';\nimport { Configuration } from './Configuration';\nimport { Debug } from './Debug';\nimport { EventManager } from './EventManager';\nimport { Graphics } from './Graphics';\nimport { Input } from './Input';\nimport { OS } from './OS';\nimport { OScreen } from './OScreen';\nimport { ReflectionPlaneContext } from './ReflectionPlaneContext';\nimport { ResourceContainer } from './ResourceContainer';\nimport { SceneManager } from './SceneManager';\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, keyboard_input_container = document)\n {\n CameraManager.init();\n CameraUtilities.init();\n Capabilities.init();\n Configuration.init();\n EventManager.init();\n GeometryBatcher.init();\n Input.init(app_container, keyboard_input_container);\n OS.init();\n Browser.init();\n ReflectionPlaneContext.init();\n ResourceContainer.init();\n SceneManager.init();\n OScreen.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\nconst initializer = new Initializer();\nexport { initializer as Initializer };\n","import { BlitMaterial } from '../materials/BlitMaterial';\n\nimport frag from '../shaders/ssao/ssao.frag';\nimport vert from '../shaders/ssao/ssao.vert';\n\nimport { Matrix4 } from 'three';\nimport { Vector3 } from 'three';\nimport { DataTexture } from 'three';\nimport { RGBFormat } from 'three';\nimport { RepeatWrapping } from 'three';\n\nimport { OMath } from '../utilities/OMath';\nclass SSAOMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag, vert);\n\n this.uniforms._InverseProjMatrix = { value: new Matrix4() };\n this.uniforms._ProjectionMatrix = { value: new Matrix4() };\n\n this.uniforms._Bias = { value: 0.0125 };\n this.uniforms._Radius = { value: 0.3 };\n this.uniforms._FarPlane = { value: 100 };\n\n this.uniforms._SampleKernel = { value: this.__get_sample_kernel() };\n this.uniforms._RandomRotation = { value: this.__get_rotation_kernel() };\n }\n\n __get_sample_kernel()\n {\n const sample_kernel = [];\n const kernel_size = 64;\n\n for (let i = 0; i < kernel_size; i++)\n {\n const dir = new Vector3(Math.random() * 2 - 1,\n Math.random() * 2 - 1,\n Math.random());\n dir.normalize();\n let scale = i / kernel_size;\n scale = OMath.lerp(0.1, 1.0, scale * scale);\n dir.multiplyScalar(scale);\n\n sample_kernel.push(dir);\n }\n return sample_kernel;\n }\n\n __get_rotation_kernel()\n {\n const rotation_kernel = new Uint8Array(3 * 16);\n for (let i = 0; i < 16; i++)\n {\n rotation_kernel[i * 3 + 1] = Math.floor(Math.random() * 255);\n rotation_kernel[i * 3 + 2] = Math.floor(Math.random() * 255);\n rotation_kernel[i * 3 + 3] = 0;\n }\n\n const rotation_texture = new DataTexture(rotation_kernel, 4, 4, RGBFormat);\n rotation_texture.wrapS = RepeatWrapping;\n rotation_texture.wrapT = RepeatWrapping;\n\n rotation_texture.needsUpdate = true;\n return rotation_texture;\n }\n}\n\nexport { SSAOMaterial };\n","import { BlitMaterial } from '../materials/BlitMaterial';\n\nimport frag from '../shaders/ssao/ssao_compose.frag';\n\nclass SSAOComposeMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag);\n this.uniforms._AO = { value: undefined };\n }\n}\n\nexport { SSAOComposeMaterial };\n","import { BlitMaterial } from '../materials/BlitMaterial';\n\nimport frag from '../shaders/depth_normals/debug_normals.frag';\nimport depth_normals_vert from '../shaders/ssao/ssao.vert';\n\nimport { Matrix4 } from 'three';\n\nclass 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\nexport { DisplayNormalTextureMaterial };\n","import { BlitMaterial } from '../materials/BlitMaterial';\n\nimport frag from '../shaders/box_blur/box_blur.frag';\n\nimport { Vector2 } from 'three';\n\nclass BoxBlurMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag);\n this.uniforms._SampleDir = { value: new Vector2() };\n }\n}\n\nexport { BoxBlurMaterial };\n","import { BoxBlurMaterial } from '../materials/BoxBlurMaterial';\nimport { Graphics } from '../Graphics';\n\nimport { WebGLRenderTarget } from 'three';\n\nclass 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\nexport { Blurrer };\n","import { CameraManager } from '../CameraManager';\nimport { SceneManager } from '../SceneManager';\nimport { OScreen } from '../OScreen';\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\nclass 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(OScreen.width * this.ssaa, OScreen.height * this.ssaa);\n\n this.SSAO_RT = new WebGLRenderTarget(OScreen.width, OScreen.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 !== OScreen.width * this.ssaa || this.main_RT.height !== OScreen.height * this.ssaa)\n {\n this.main_RT.setSize(OScreen.width * this.ssaa, OScreen.height * this.ssaa);\n this.SSAO_RT.setSize(OScreen.width, OScreen.height);\n }\n }\n}\n\nexport { NormalAORender };\n","import { CameraManager } from '../CameraManager';\nimport { SceneManager } from '../SceneManager';\nimport { BaseRender } from '../render_mode/BaseRender';\nimport { Graphics } from '../Graphics';\n\nclass 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\nexport { NormalRender };\n","import { CameraManager } from '../CameraManager';\nimport { SceneManager } from '../SceneManager';\nimport { BaseRender } from '../render_mode/BaseRender';\nimport { Graphics } from '../Graphics';\n\nclass VRRender 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, Graphics._renderer.getRenderTarget());\n }\n\n this.render_spectator_camera();\n\n if (SceneManager.current.on_post_render)\n {\n SceneManager.current.on_post_render();\n }\n }\n\n render_spectator_camera()\n {\n const spectator_camera = CameraManager.spectator;\n\n if (spectator_camera && Graphics._renderer.xr.isPresenting)\n {\n // Copy the XR Camera's position and rotation, but use your\n // main camera's projection matrix\n const xrCam = Graphics._renderer.xr.getCamera(CameraManager.current);\n\n spectator_camera.projectionMatrix.copy(CameraManager.current.projectionMatrix);\n\n spectator_camera.position.copy(xrCam.position);\n spectator_camera.quaternion.copy(xrCam.quaternion);\n\n // we'll restore this later\n const currentRenderTarget = Graphics._renderer.getRenderTarget();\n\n // turn off the WebXR rendering\n Graphics._renderer.xr.isPresenting = false;\n\n // render to the canvas on our main display\n Graphics._renderer.setRenderTarget(null);\n Graphics._renderer.render(SceneManager.current, spectator_camera);\n\n // reset back to enable WebXR\n Graphics._renderer.setRenderTarget(currentRenderTarget);\n Graphics._renderer.xr.isPresenting = true;\n }\n }\n}\n\nexport { VRRender };\n","import { BlitMaterial } from './BlitMaterial';\n\nimport frag from '../shaders/gaussian_blur/gaussian_blur.frag';\n\nimport { Vector2 } from 'three';\n\nclass 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\nexport { GaussianBlurMaterial };\n","import { BlitMaterial } from './BlitMaterial';\n\nimport frag from '../shaders/luminosity_high_pass/luminosity_high_pass.frag';\n\nimport { Color } from 'three';\nclass 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\nexport { LuminosityHighPassMaterial };\n","import { GaussianBlurMaterial } from '../materials/GaussianBlurMaterial';\nimport { LuminosityHighPassMaterial } from '../materials/LuminosityHighPassMaterial';\nimport { Graphics } from '../Graphics';\n\nimport { WebGLRenderTarget, LinearFilter, RGBAFormat } from 'three';\n\nclass GaussianBlurrer\n{\n constructor(nMips = 5)\n {\n this.current_width = 1;\n this.current_height = 1;\n\n this.separableBlurMaterials = [];\n this.renderTargetsHorizontal = [];\n this.renderTargetsVertical = [];\n\n this.nMips = nMips;\n this.kernelSizeArray = [3, 5, 7, 9, 11];\n this.rt_pars = { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat };\n\n this.renderTargetBright = new WebGLRenderTarget(1, 1, this.rt_pars);\n this.renderTargetBright.texture.generateMipmaps = false;\n\n this.init_materials();\n this.init_RT();\n\n this.luminosity_high_pass_mat = new LuminosityHighPassMaterial();\n }\n\n blur(RT, use_luminosity_high_pass)\n {\n this.resize_RT(RT.width, RT.height);\n\n if (use_luminosity_high_pass)\n {\n Graphics.blit(RT, this.renderTargetBright, this.luminosity_high_pass_mat);\n }\n else\n {\n Graphics.blit(RT, this.renderTargetBright);\n }\n\n let inputRenderTarget = this.renderTargetBright;\n\n for (let i = 0; i < this.nMips; i++)\n {\n const mat = this.separableBlurMaterials[i];\n\n mat.set_direction(1, 0);\n Graphics.blit(inputRenderTarget, this.renderTargetsHorizontal[i], mat);\n\n mat.set_direction(0, 1);\n Graphics.blit(this.renderTargetsHorizontal[i], this.renderTargetsVertical[i], mat);\n\n inputRenderTarget = this.renderTargetsVertical[i];\n }\n }\n\n get_blurred_texture()\n {\n return this.renderTargetsHorizontal[0].texture;\n }\n\n get_blurred_RT()\n {\n return this.renderTargetsHorizontal[0];\n }\n\n init_RT()\n {\n this.dispose_RT();\n\n this.renderTargetBright.setSize(1, 1);\n\n for (let i = 0; i < this.nMips; i++)\n {\n const hor = new WebGLRenderTarget(1, 1, this.rt_pars);\n const ver = new WebGLRenderTarget(1, 1, this.rt_pars);\n\n hor.texture.generateMipmaps = false;\n ver.texture.generateMipmaps = false;\n\n this.renderTargetsHorizontal.push(hor);\n this.renderTargetsVertical.push(ver);\n }\n }\n\n resize_RT(texture_width, texture_height)\n {\n if (this.current_width === texture_width && this.current_height === texture_height)\n {\n return;\n }\n\n this.current_width = texture_width;\n this.current_height = texture_height;\n\n let width = Math.round(texture_width / 2);\n let height = Math.round(texture_height / 2);\n\n this.renderTargetBright.setSize(width, height);\n\n for (let i = 0; i < this.nMips; i++)\n {\n this.renderTargetsVertical[i].setSize(width, height);\n this.renderTargetsHorizontal[i].setSize(width, height);\n this.separableBlurMaterials[i].set_size(width, height);\n\n width = Math.round(width / 2);\n height = Math.round(height / 2);\n }\n }\n\n init_materials(texture_width, texture_height)\n {\n this.dispose_materials();\n\n for (let i = 0; i < this.nMips; i++)\n {\n this.separableBlurMaterials.push(new GaussianBlurMaterial(this.kernelSizeArray[i]));\n }\n }\n\n dispose_materials()\n {\n for (let i = 0; i < this.separableBlurMaterials.length; i++)\n {\n this.separableBlurMaterials[i].dispose();\n }\n this.separableBlurMaterials.length = 0;\n }\n\n dispose_RT()\n {\n for (let i = 0; i < this.renderTargetsVertical.length; i++)\n {\n this.renderTargetsHorizontal[i].dispose();\n this.renderTargetsVertical[i].dispose();\n }\n this.renderTargetBright.dispose();\n\n this.renderTargetsHorizontal.length = 0;\n this.renderTargetsVertical.length = 0;\n }\n}\n\nexport { GaussianBlurrer };\n","import { OScreen } from '../OScreen';\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\nclass 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(OScreen.render_width, OScreen.render_height);\n this.blur_RT = new WebGLRenderTarget(OScreen.render_width, OScreen.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 !== OScreen.render_width || this.main_RT.height !== OScreen.render_height)\n {\n this.main_RT.setSize(OScreen.render_width, OScreen.render_height);\n this.blur_RT.setSize(OScreen.render_width, OScreen.render_height);\n }\n }\n}\n\nexport { UnrealBloomRender };\n","import { Color } from 'three';\nimport { OrthographicCamera as TOrthographicCamera } from 'three';\n\nclass OrthographicCamera extends TOrthographicCamera\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 copy(camera)\n {\n super.copy(camera);\n this.clear_color.copy(camera.clear_color);\n this.clear_alpha = camera.clear_alpha;\n return this;\n }\n}\n\nexport { OrthographicCamera };\n","import { ViewManager } from './ViewManager';\n\nclass ViewComponentManager\n{\n constructor()\n {\n this.components = [];\n this.enabled_components = new Set();\n }\n\n update()\n {\n this.__set_components_opacities();\n\n for (const component of this.enabled_components)\n {\n component.update(ViewManager.transition_handler.current_state_data);\n }\n }\n\n register_component(component)\n {\n this.components.push(component);\n }\n\n enable_component(component)\n {\n // const component_to_enable = this.get_component_by_name(component_name);\n\n this.enabled_components.add(component);\n }\n\n disable_component(component)\n {\n // const component_to_disable = this.get_component_by_name(component_name);\n\n this.enabled_components.delete(component);\n }\n\n get_component_by_name(component_name)\n {\n console.warn('DEPRECATED. Use ViewComponentManager.get instead');\n this.get(component_name);\n }\n\n get(component_name)\n {\n for (let i = 0; i < this.components.length; i++)\n {\n if (this.components[i].name === component_name)\n {\n return this.components[i];\n }\n }\n console.error('[ViewComponentManager.get] no component found for: ', component_name);\n return undefined;\n }\n\n __set_components_opacities()\n {\n for (let i = 0; i < this.components.length; i++)\n {\n this.components[i].set_opacity(ViewManager.transition_handler.current_state_data);\n }\n }\n}\n\nconst view_component_manager = new ViewComponentManager();\nexport { view_component_manager as 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\nclass RenderLoop\n{\n constructor(target_application, graphics)\n {\n target_application = target_application || new BaseApplication();\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 Input.update();\n\n this.target_application.update();\n ViewManager.update();\n ViewComponentManager.update();\n\n this.target_application.on_pre_render();\n\n this.graphics.update(); // render scene\n UI.update(); // update after new camera matrix has been calculated\n UI.render(this.graphics); // render ui layer on top\n this.target_application.on_post_render();\n\n Debug.render(this.graphics); // render debug layer\n\n // ###### END CYCLE #######\n\n this.target_application.on_frame_end();\n this.frames_passed++;\n\n Input.clear();\n UI.clear();\n Debug.clear();\n }\n\n start()\n {\n if (this.is_running) return; // sanity check\n\n if (this.frames_passed === 0)\n {\n this.target_application.on_enter();\n }\n\n this.is_running = true;\n\n this.graphics._renderer.setAnimationLoop(this.update.bind(this));\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 this.graphics._renderer.setAnimationLoop(null);\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\nexport { RenderLoop };\n","import { OScreen } from './OScreen';\n\nclass Screen\n{\n init()\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n OScreen.init();\n }\n\n update_position(x, y)\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n OScreen.update_position(x, y);\n }\n\n update()\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n OScreen.update();\n }\n\n update_size(width, height)\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n OScreen.update_size(width, height);\n }\n\n apply_pixel_density_v2(vector2)\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n return OScreen.apply_pixel_density_v2(vector2);\n }\n\n apply_pixel_density(value)\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n return OScreen.apply_pixel_density(value);\n }\n\n get_pixel_size()\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n return OScreen.get_pixel_size();\n }\n\n get aspect_ratio()\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n return OScreen.aspect_ratio;\n }\n}\n\nconst screen = new Screen();\nexport { screen as Screen };\n","\nimport { CanvasDrawer } from './CanvasDrawer';\n\nimport { Vector2 } from 'three';\n\nclass SimpleTextDrawer extends CanvasDrawer\n{\n constructor()\n {\n super();\n this.text_margin = new Vector2(2, 0);\n }\n\n __draw(text, ctxOptions, canvas, ctx)\n {\n ctx.font = ctxOptions.font;\n\n const text_size = this.get_text_size(text, ctxOptions.font);\n // canvas.width = Math.ceilPowerOfTwo(text_size.x+this.text_margin.x*2);\n // canvas.height = Math.ceilPowerOfTwo(text_size.y+ this.text_margin.y*2);\n canvas.width = Math.ceil(text_size.x + this.text_margin.x * 2);\n canvas.height = Math.ceil(text_size.y + this.text_margin.y * 2);\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n // turn this on for debugging\n ctx.globalAlpha = 0.0;\n ctx.fillStyle = ctxOptions.font_color || '#000000';\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.globalAlpha = 1;\n\n ctx.globalAlpha = 1;\n\n ctx.font = ctxOptions.font;\n ctx.fillStyle = ctxOptions.font_color || '#000000';\n ctx.textBaseline = 'middle';\n\n ctx.textAlign = ctxOptions.textAlign || 'center';\n if (ctx.textAlign === 'center')\n {\n ctx.fillText(text, canvas.width / 2, canvas.height / 2);\n }\n else\n {\n ctx.fillText(text, 0, canvas.height / 2);\n }\n }\n}\n\nexport { SimpleTextDrawer };\n","import { HTMLUtilities } from '../utilities/HTMLUtilities';\nimport { ViewComponentManager } from './ViewComponentManager';\n\nclass ViewComponent\n{\n constructor({ name, container })\n {\n this.name = name;\n this.container = container;\n this.hidden = true;\n\n ViewComponentManager.register_component(this);\n }\n\n start()\n {\n }\n\n on_enter()\n {\n this.container.classList.remove('hidden');\n ViewComponentManager.enable_component(this);\n\n this.hidden = false;\n }\n\n update()\n {\n }\n\n on_exit()\n {\n this.container.classList.add('hidden');\n ViewComponentManager.disable_component(this);\n\n this.hidden = true;\n }\n\n set_opacity(current_state_data)\n {\n this.container.style.opacity = current_state_data[`${this.name}_opacity`];\n this.toggle_hidden();\n }\n\n toggle_hidden()\n {\n if (this.container.style.opacity > 0.001)\n {\n if (this.hidden)\n {\n this.on_enter();\n }\n }\n else\n {\n if (!this.hidden)\n {\n this.on_exit();\n }\n }\n }\n\n load_html_images()\n {\n HTMLUtilities.load_images(this.container);\n }\n\n load_html_videos()\n {\n HTMLUtilities.load_videos(this.container);\n }\n}\n\nexport { ViewComponent };\n","import { Mesh } from 'three';\nimport { MeshBasicMaterial } from 'three';\nimport { PlaneGeometry } from 'three';\n\nclass HorizontalPlane extends Mesh\n{\n constructor(width, height, color, material)\n {\n width = width || 1;\n height = height || 1;\n color = color || '#FF0000';\n material = material || new MeshBasicMaterial({ color: color });\n\n const geometry = new PlaneGeometry(width, height);\n geometry.rotateX(-3.14 / 2);\n super(geometry, material);\n }\n}\n\nexport { HorizontalPlane };\n","import { Mesh } from 'three';\nimport { PlaneGeometry } from 'three';\nimport { MeshBasicMaterial } from 'three';\n\nclass VerticalPlane extends Mesh\n{\n constructor(width, height, color, material)\n {\n width = width || 1;\n height = height || 1;\n color = color || '#FF0000';\n material = material || new MeshBasicMaterial({ color: color });\n\n const geometry = new PlaneGeometry(width, height);\n super(geometry, material);\n }\n}\n\nexport { VerticalPlane };\n","class ArrayUtilities\n{\n constructor()\n {}\n\n static merge_from_to(source, target)\n {\n target.push.apply(target, source);\n }\n\n static expand_vec3_array(array, size)\n {\n const items_left_count = size - array.length;\n\n for (let i = 0; i < items_left_count; i++)\n {\n array.push(array[i].clone());\n }\n }\n\n static remove_elem(array, elem)\n {\n const index = array.indexOf(elem);\n if (index > -1)\n {\n array.splice(index, 1);\n }\n }\n\n static get_closest_point(points, target)\n {\n let closest_point = points[0];\n let closest_distance = closest_point.distanceTo(target);\n for (let i = 1; i < points.length; i++)\n {\n if (points[i].distanceTo(target) < closest_distance)\n {\n closest_point = points[i];\n closest_distance = points[i].distanceTo(target);\n }\n }\n return closest_point;\n }\n\n static object_values_to_array(obj)\n {\n const ids = Object.keys(obj);\n const arr = [];\n for (let i = 0; i < ids.length; i++)\n {\n arr.push(obj[ids[i]]);\n }\n return arr;\n }\n}\n\nexport { ArrayUtilities };\n","import { Line3, Plane, Quaternion, Sphere, Vector3 } from 'three';\n\nclass FrustumPointFitter\n{\n constructor()\n {\n this.sphere = new Sphere();\n }\n\n fit_points(points, camera_quaternion, vertical_fov, aspect)\n {\n this.sphere.setFromPoints(points);\n\n const v_fov = Math.degToRad(vertical_fov / 2);\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\n\n const up_plane_normal = this.get_up_plane_normal(camera_quaternion, v_fov);\n const down_plane_normal = this.get_down_plane_normal(camera_quaternion, v_fov);\n const left_plane_normal = this.get_left_plane_normal(camera_quaternion, h_fov);\n const right_plane_normal = this.get_right_plane_normal(camera_quaternion, h_fov);\n\n const camera_forward_dir = new Vector3(0, 0, -1).applyQuaternion(camera_quaternion);\n\n const sphere_center = this.sphere.center.clone();\n\n const pull_back_distance = this.get_distance_to_fit_rect(this.sphere.radius * 2, this.sphere.radius * 2, vertical_fov, aspect);\n const far_pos = sphere_center.clone().add(camera_forward_dir.clone().multiplyScalar(pull_back_distance * -1));\n\n const up_plane = new Plane().setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\n const down_plane = new Plane().setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\n\n const left_plane = new Plane().setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\n const right_plane = new Plane().setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\n\n this.apply_center_correction_to_pos(far_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane);\n\n up_plane.setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\n down_plane.setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\n\n left_plane.setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\n right_plane.setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\n\n let closest_distance = Infinity;\n\n const inverse_dir = camera_forward_dir.clone().multiplyScalar(pull_back_distance * -2);\n for (let i = 0; i < points.length; i++)\n {\n const line = new Line3(points[i].clone(), points[i].clone().add(inverse_dir));\n\n const up_line_intersection = new Vector3();\n const down_line_intersection = new Vector3();\n\n const left_line_intersection = new Vector3();\n const right_line_intersection = new Vector3();\n\n up_plane.intersectLine(line, up_line_intersection);\n down_plane.intersectLine(line, down_line_intersection);\n\n left_plane.intersectLine(line, left_line_intersection);\n right_plane.intersectLine(line, right_line_intersection);\n\n if (up_line_intersection.length() < 0.0001)\n {\n console.log('up intersection not found', i);\n }\n if (down_line_intersection.length() < 0.0001)\n {\n console.log('down intersection not found', i);\n }\n if (left_line_intersection.length() < 0.0001)\n {\n console.log('left intersection not found', i);\n }\n if (right_line_intersection.length() < 0.0001)\n {\n console.log('right intersection not found', i);\n }\n\n const new_up_distance = points[i].clone().sub(up_line_intersection).length();\n const new_down_distance = points[i].clone().sub(down_line_intersection).length();\n\n const new_left_distance = points[i].clone().sub(left_line_intersection).length();\n const new_right_distance = points[i].clone().sub(right_line_intersection).length();\n\n const vertical_min = Math.min(new_up_distance, new_down_distance);\n const horizontal_min = Math.min(new_left_distance, new_right_distance);\n\n const min = Math.min(vertical_min, horizontal_min);\n\n if (min < closest_distance)\n {\n closest_distance = min;\n }\n }\n\n const forward_correction = camera_forward_dir.clone().multiplyScalar(closest_distance);\n const closest_position = far_pos.clone().add(forward_correction);\n\n return closest_position;\n }\n\n apply_center_correction_to_pos(target_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane)\n {\n const vertical_offset = this.get_vertical_correction(points, down_plane, up_plane, camera_quaternion);\n const horizontal_offset = this.get_hozirontal_correction(points, left_plane, right_plane, camera_quaternion);\n\n target_pos.add(vertical_offset);\n target_pos.add(horizontal_offset);\n }\n\n get_vertical_correction(points, down_plane, up_plane, camera_quaternion)\n {\n let closest_distance_to_up_plane = Infinity;\n let closest_distance_to_down_plane = Infinity;\n let closest_up_point = undefined;\n let closest_down_point = undefined;\n\n const up_dir = new Vector3(0, 1, 0).applyQuaternion(camera_quaternion);\n for (let i = 0; i < points.length; i++)\n {\n const down_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(-5000000)));\n const up_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(5000000)));\n\n const down_line_intersection = new Vector3();\n const up_line_intersection = new Vector3();\n\n down_plane.intersectLine(down_line, down_line_intersection);\n up_plane.intersectLine(up_line, up_line_intersection);\n\n const down_dist = down_line_intersection.distanceTo(points[i]);\n const up_dist = up_line_intersection.distanceTo(points[i]);\n\n if (up_line_intersection.length() < 0.0001)\n {\n console.log('vertical up intersection not found', i);\n }\n if (down_line_intersection.length() < 0.0001)\n {\n console.log('vertical down intersection not found', i);\n }\n\n if (down_dist < closest_distance_to_down_plane)\n {\n closest_distance_to_down_plane = down_dist;\n closest_down_point = points[i];\n }\n if (up_dist < closest_distance_to_up_plane)\n {\n closest_distance_to_up_plane = up_dist;\n closest_up_point = points[i];\n }\n }\n\n console.log(closest_up_point, closest_down_point);\n\n const correction = (closest_distance_to_up_plane - closest_distance_to_down_plane) / 2;\n\n // console.log(\"vertical_correction\", correction)\n return up_dir.clone().multiplyScalar(-correction);\n }\n\n get_hozirontal_correction(points, left_plane, right_plane, camera_quaternion)\n {\n let closest_distance_to_right_plane = Infinity;\n let closest_distance_to_left_plane = Infinity;\n let closest_right_point = undefined;\n let closest_left_point = undefined;\n\n const right_dir = new Vector3(1, 0, 0).applyQuaternion(camera_quaternion);\n\n for (let i = 0; i < points.length; i++)\n {\n const left_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(-5000000)));\n const right_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(5000000)));\n\n const left_line_intersection = new Vector3();\n const right_line_intersection = new Vector3();\n\n left_plane.intersectLine(left_line, left_line_intersection);\n right_plane.intersectLine(right_line, right_line_intersection);\n\n const left_dist = left_line_intersection.distanceTo(points[i]);\n const right_dist = right_line_intersection.distanceTo(points[i]);\n\n if (left_line_intersection.length() < 0.0001)\n {\n console.log('left intersection not found', i);\n }\n if (right_line_intersection.length() < 0.0001)\n {\n console.log('right intersection not found', i);\n }\n\n if (left_dist < closest_distance_to_left_plane)\n {\n closest_distance_to_left_plane = left_dist;\n closest_left_point = points[i];\n }\n if (right_dist < closest_distance_to_right_plane)\n {\n closest_distance_to_right_plane = right_dist;\n closest_right_point = points[i];\n }\n }\n\n const correction = (closest_distance_to_right_plane - closest_distance_to_left_plane) / 2;\n // console.log(\"horizontal_correction\", correction)\n\n console.log(closest_right_point, closest_left_point);\n\n return right_dir.clone().multiplyScalar(-correction);\n }\n\n get_up_plane_normal(camera_quaternion, v_fov)\n {\n const up_plane_normal = new Vector3(0, -1, 0);\n up_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), v_fov));\n up_plane_normal.applyQuaternion(camera_quaternion);\n return up_plane_normal;\n }\n\n get_down_plane_normal(camera_quaternion, v_fov)\n {\n const down_plane_normal = new Vector3(0, 1, 0);\n down_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), -v_fov));\n down_plane_normal.applyQuaternion(camera_quaternion);\n return down_plane_normal;\n }\n\n get_left_plane_normal(camera_quaternion, h_fov)\n {\n const left_plane_normal = new Vector3(1, 0, 0);\n left_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), h_fov));\n left_plane_normal.applyQuaternion(camera_quaternion);\n return left_plane_normal;\n }\n\n get_right_plane_normal(camera_quaternion, h_fov)\n {\n const right_plane_normal = new Vector3(-1, 0, 0);\n right_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), -h_fov));\n right_plane_normal.applyQuaternion(camera_quaternion);\n return right_plane_normal;\n }\n\n get_distance_to_fit_rect(width, height, vertical_fov, aspect)\n {\n const v_fov = (vertical_fov / 2) * Math.PI / 180;\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\n\n const distV = height / Math.tan(v_fov);\n const distH = width / Math.tan(h_fov);\n return Math.max(Math.abs(distH), Math.abs(distV));\n }\n}\n\nexport { FrustumPointFitter };\n","import { BufferAttribute } from 'three';\nimport { BufferGeometry } from 'three';\n\nclass GeometryUtilities\n{\n static convert_to_non_indexed_geometry(geometry_buffer)\n {\n const indices = geometry_buffer.index;\n const positions = geometry_buffer.getAttribute('position');\n\n const bar_coordinates = [];\n const vertices = [];\n\n for (let i = 0; i < indices.count; i += 3)\n {\n // VERTEX 1\n vertices.push(positions.getX(indices.array[i + 0]));\n vertices.push(positions.getY(indices.array[i + 0]));\n vertices.push(positions.getZ(indices.array[i + 0]));\n\n bar_coordinates.push(1);\n bar_coordinates.push(0);\n bar_coordinates.push(0);\n\n // VERTEX 2\n\n vertices.push(positions.getX(indices.array[i + 1]));\n vertices.push(positions.getY(indices.array[i + 1]));\n vertices.push(positions.getZ(indices.array[i + 1]));\n\n bar_coordinates.push(0);\n bar_coordinates.push(1);\n bar_coordinates.push(0);\n\n // VERTEX 3\n\n vertices.push(positions.getX(indices.array[i + 2]));\n vertices.push(positions.getY(indices.array[i + 2]));\n vertices.push(positions.getZ(indices.array[i + 2]));\n\n bar_coordinates.push(0);\n bar_coordinates.push(0);\n bar_coordinates.push(1);\n }\n\n const geometry = new BufferGeometry();\n // geometry.setAttribute('barycentric', new BufferAttribute( new Float32Array(bar_coordinates), 3 ));\n geometry.setAttribute('position', new BufferAttribute(new Float32Array(vertices), 3));\n GeometryUtilities.add_barycentric_attribute(geometry);\n return geometry;\n }\n\n static add_barycentric_attribute(non_indexed_geometry_buffer)\n {\n const bar_coordinates = [];\n const positions = non_indexed_geometry_buffer.getAttribute('position');\n\n for (let i = 0; i < positions.count; i += 3)\n {\n bar_coordinates.push(1);\n bar_coordinates.push(0);\n bar_coordinates.push(0);\n\n bar_coordinates.push(0);\n bar_coordinates.push(1);\n bar_coordinates.push(0);\n\n bar_coordinates.push(0);\n bar_coordinates.push(0);\n bar_coordinates.push(1);\n }\n non_indexed_geometry_buffer.setAttribute('barycentric', new BufferAttribute(new Float32Array(bar_coordinates), 3));\n }\n}\n\nexport { GeometryUtilities };\n","import { Vector4 } from 'three';\n\nclass ImageUtilities\n{\n constructor()\n { }\n\n static get_image_data(image)\n {\n const canvas = document.createElement('canvas');\n canvas.width = image.width;\n canvas.height = image.height;\n\n const context = canvas.getContext('2d');\n context.drawImage(image, 0, 0);\n\n return context.getImageData(0, 0, image.width, image.height);\n }\n\n static get_pixel(imagedata, x, y)\n {\n const position = (x + imagedata.width * y) * 4;\n const data = imagedata.data;\n return new Vector4(data[position + 0], data[position + 1], data[position + 2], data[position + 3]);\n }\n}\n\nexport { ImageUtilities };\n","import { Vector3 } from 'three';\nimport { Vector2 } from 'three';\nclass MeshSampler\n{\n constructor()\n {\n\n }\n\n sample(buffer_geometry, sample_count)\n {\n const face_areas = [];\n\n let min_area = 99999999;\n\n const vertices = buffer_geometry.getAttribute('position');\n const normals = buffer_geometry.getAttribute('normal');\n const tangents = buffer_geometry.getAttribute('tangent');\n const uvs = buffer_geometry.getAttribute('uv');\n const indices = buffer_geometry.index;\n\n const faces = [];\n\n for (let i = 0; i < indices.count; i += 3)\n {\n const index_0 = indices.array[i + 0];\n const index_1 = indices.array[i + 1];\n const index_2 = indices.array[i + 2];\n\n const v1 = new Vector3();\n v1.x = vertices.getX(index_0);\n v1.y = vertices.getY(index_0);\n v1.z = vertices.getZ(index_0);\n\n const v2 = new Vector3();\n v2.x = vertices.getX(index_1);\n v2.y = vertices.getY(index_1);\n v2.z = vertices.getZ(index_1);\n\n const v3 = new Vector3();\n v3.x = vertices.getX(index_2);\n v3.y = vertices.getY(index_2);\n v3.z = vertices.getZ(index_2);\n\n const face = {\n a: v1,\n b: v2,\n c: v3\n };\n\n if (normals)\n {\n const n1 = new Vector3();\n n1.x = normals.getX(index_0);\n n1.y = normals.getY(index_0);\n n1.z = normals.getZ(index_0);\n\n const n2 = new Vector3();\n n2.x = normals.getX(index_1);\n n2.y = normals.getY(index_1);\n n2.z = normals.getZ(index_1);\n\n const n3 = new Vector3();\n n3.x = normals.getX(index_2);\n n3.y = normals.getY(index_2);\n n3.z = normals.getZ(index_2);\n\n const normal = n1.clone().add(n2).add(n3).normalize();\n face.normal = normal;\n }\n\n if (tangents)\n {\n const n1 = new Vector3();\n n1.x = tangents.getX(index_0);\n n1.y = tangents.getY(index_0);\n n1.z = tangents.getZ(index_0);\n\n const n2 = new Vector3();\n n2.x = tangents.getX(index_1);\n n2.y = tangents.getY(index_1);\n n2.z = tangents.getZ(index_1);\n\n const n3 = new Vector3();\n n3.x = tangents.getX(index_2);\n n3.y = tangents.getY(index_2);\n n3.z = tangents.getZ(index_2);\n\n const tangent = n1.clone().add(n2).add(n3).normalize();\n face.tangent = tangent;\n }\n if (uvs)\n {\n const uv_a = new Vector2();\n uv_a.x = uvs.getX(index_0);\n uv_a.y = uvs.getY(index_0);\n\n const uv_b = new Vector2();\n uv_b.x = uvs.getX(index_1);\n uv_b.y = uvs.getY(index_1);\n\n const uv_c = new Vector2();\n uv_c.x = uvs.getX(index_2);\n uv_c.y = uvs.getY(index_2);\n\n face.uv_a = uv_a;\n face.uv_b = uv_b;\n face.uv_c = uv_c;\n }\n\n faces.push(face);\n\n const area = this.get_face_area(face);\n min_area = Math.min(area, min_area);\n face_areas.push(area);\n }\n\n const normalized_faces_array = this.get_uniform_face_distribution(face_areas, min_area, faces);\n const selected_faces = this.select_random_faces(normalized_faces_array, sample_count);\n const sampled_data = this.sample_data_from_faces(selected_faces);\n return sampled_data;\n }\n\n sample_data_from_faces(faces)\n {\n const sampled_points = [];\n const sampled_normals = [];\n const sampled_tangents = [];\n const sampled_uvs = [];\n\n for (let i = 0; i < faces.length; i++)\n {\n const face = faces[i];\n\n const w1 = Math.random();\n const w2 = Math.random();\n\n sampled_points.push(this.sample_point_in_face(w1, w2, face.a, face.b, face.c).clone());\n if (face.normal)\n {\n sampled_normals.push(face.normal.clone());\n }\n if (face.tangent)\n {\n sampled_tangents.push(face.tangent.clone());\n }\n if (face.uv_a)\n {\n sampled_uvs.push(this.sample_point_in_face(w1, w2, face.uv_a, face.uv_b, face.uv_c).clone());\n }\n }\n return { points: sampled_points, normals: sampled_normals, tangents: sampled_tangents, uvs: sampled_uvs };\n }\n\n select_random_faces(faces, amount)\n {\n const selected_faces = [];\n for (let i = 0; i < amount; i++)\n {\n const random = Math.floor(Math.random() * faces.length);\n const selected_face = faces[random];\n\n selected_faces.push(selected_face);\n }\n\n return selected_faces;\n }\n\n get_uniform_face_distribution(face_areas, minimum_area, faces)\n {\n const extended_triangle_indices = [];\n for (let i = 0; i < face_areas.length; i++)\n {\n face_areas[i] /= minimum_area;\n const repetitions_needed = Math.floor(Math.round(face_areas[i]));\n for (let j = 0; j < repetitions_needed; j++)\n {\n extended_triangle_indices.push(faces[i]);\n }\n }\n return extended_triangle_indices;\n }\n\n get_face_area(face)\n {\n const vec1 = face.b.clone().sub(face.a);\n const vec2 = face.c.clone().sub(face.a);\n return vec1.cross(vec2).length() / 2;\n }\n\n sample_point_in_face(w1, w2, v1, v2, v3)\n {\n if (w1 + w2 > 1)\n {\n w1 = 1.0 - w1;\n w2 = 1.0 - w2;\n }\n\n const w3 = 1.0 - (w1 + w2);\n\n return v1.clone().multiplyScalar(w1).add(v2.clone().multiplyScalar(w2)).add(v3.clone().multiplyScalar(w3));\n }\n}\n\nconst mesh_sampler = new MeshSampler();\nexport { mesh_sampler as MeshSampler };\n","import { Mesh } from 'three';\nimport { BufferGeometry } from 'three';\nimport { Skeleton } from 'three';\n\nclass ModelUtilities\n{\n get_mesh(scene, result_callback)\n {\n scene.traverse((child) =>\n {\n if (child instanceof Mesh)\n {\n if (child.geometry)\n {\n child.geometry = new BufferGeometry().fromGeometry(child.geometry);\n }\n result_callback(child);\n }\n });\n }\n\n get_geometries(scene)\n {\n const geometries = [];\n\n this.get_mesh(scene, (child) =>\n {\n geometries.push(child.geometry);\n });\n return geometries;\n }\n\n assign_material(scene, material, name)\n {\n scene.traverse((child) =>\n {\n if (child instanceof Mesh)\n {\n // assign to all if no name is given\n if (name === undefined)\n {\n child.material = material;\n }\n else\n {\n // if name is given, assign only to that\n if (child.name === name)\n {\n child.material = material;\n }\n }\n }\n });\n }\n\n clone_animated_gltf(gltf)\n {\n const clone = {\n animations: gltf.animations,\n scene: gltf.scene.clone(true)\n };\n\n const skinnedMeshes = {};\n\n gltf.scene.traverse(node =>\n {\n if (node.isSkinnedMesh)\n {\n skinnedMeshes[node.name] = node;\n }\n });\n\n const cloneBones = {};\n const cloneSkinnedMeshes = {};\n\n clone.scene.traverse(node =>\n {\n if (node.isBone)\n {\n cloneBones[node.name] = node;\n }\n\n if (node.isSkinnedMesh)\n {\n cloneSkinnedMeshes[node.name] = node;\n }\n });\n\n for (const name in skinnedMeshes)\n {\n const skinnedMesh = skinnedMeshes[name];\n const skeleton = skinnedMesh.skeleton;\n const cloneSkinnedMesh = cloneSkinnedMeshes[name];\n\n const orderedCloneBones = [];\n\n for (let i = 0; i < skeleton.bones.length; ++i)\n {\n const cloneBone = cloneBones[skeleton.bones[i].name];\n orderedCloneBones.push(cloneBone);\n }\n\n cloneSkinnedMesh.bind(\n new Skeleton(orderedCloneBones, skeleton.boneInverses),\n cloneSkinnedMesh.matrixWorld);\n }\n\n return clone;\n }\n\n set_shadow_config(scene, cast, receive)\n {\n scene.traverse((child) =>\n {\n if (child instanceof Mesh)\n {\n child.castShadow = cast;\n child.receiveShadow = receive;\n }\n });\n }\n\n __find_object(scene, object_name, result_callback)\n {\n scene.traverse((obj) =>\n {\n if (obj.name === object_name)\n {\n result_callback(obj);\n }\n });\n }\n\n get_object(scene, object_name)\n {\n let object = undefined;\n scene.traverse((obj) =>\n {\n if (obj.name === object_name)\n {\n object = obj;\n }\n });\n return object;\n }\n\n get_object_by_type(scene, object_type)\n {\n let object = undefined;\n scene.traverse((obj) =>\n {\n if (obj.constructor.name === object_type)\n {\n object = obj;\n }\n });\n return object;\n }\n}\n\nconst model_utilities = new ModelUtilities();\nexport { model_utilities as ModelUtilities };\n","class ObjectUtilities\r\n{\r\n static is_object(item)\r\n {\r\n return (item && typeof item === 'object' && !Array.isArray(item));\r\n }\r\n\r\n static merge_deep(target, ...sources)\r\n {\r\n if (!sources.length) return target;\r\n const source = sources.shift();\r\n\r\n if (ObjectUtilities.is_object(target) && ObjectUtilities.is_object(source))\r\n {\r\n for (const key in source)\r\n {\r\n if (ObjectUtilities.is_object(source[key]))\r\n {\r\n if (!target[key]) Object.assign(target, { [key]: {} });\r\n ObjectUtilities.merge_deep(target[key], source[key]);\r\n }\r\n else\r\n {\r\n Object.assign(target, { [key]: source[key] });\r\n }\r\n }\r\n }\r\n\r\n return ObjectUtilities.merge_deep(target, ...sources);\r\n }\r\n\r\n static xml_to_json(xml)\r\n {\r\n // Create the return object\r\n let obj = {};\r\n\r\n if (xml.nodeType === 1)\r\n { // element\r\n // do attributes\r\n if (xml.attributes.length > 0)\r\n {\r\n obj['@attributes'] = {};\r\n for (let j = 0; j < xml.attributes.length; j++)\r\n {\r\n const attribute = xml.attributes.item(j);\r\n obj['@attributes'][attribute.nodeName] = attribute.nodeValue;\r\n }\r\n }\r\n }\r\n else if (xml.nodeType === 3)\r\n { // text\r\n obj = xml.nodeValue;\r\n }\r\n\r\n // do children\r\n if (xml.hasChildNodes())\r\n {\r\n for (let i = 0; i < xml.childNodes.length; i++)\r\n {\r\n const item = xml.childNodes.item(i);\r\n const nodeName = item.nodeName;\r\n if (typeof (obj[nodeName]) === 'undefined')\r\n {\r\n obj[nodeName] = this.xml_to_json(item);\r\n }\r\n else\r\n {\r\n if (typeof (obj[nodeName].push) === 'undefined')\r\n {\r\n const old = obj[nodeName];\r\n obj[nodeName] = [];\r\n obj[nodeName].push(old);\r\n }\r\n obj[nodeName].push(this.xml_to_json(item));\r\n }\r\n }\r\n }\r\n return obj;\r\n }\r\n}\r\n\r\nexport { ObjectUtilities };\r\n","class StringUtilities\n{\n constructor()\n {}\n\n static get_random_color()\n {\n const hexValues = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'A', 'B', 'C', 'D', 'E', 'F'];\n let hex = '#';\n\n for (let i = 0; i < 6; i++)\n {\n const index = Math.floor(Math.random() * hexValues.length);\n hex += hexValues[index];\n }\n\n return hex;\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\nexport { StringUtilities };\n","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\nexport { TimeUtilities };\n","import { Vector3, Plane, Quaternion, Sphere, Line3 } from 'three';\nimport { OMath } from './OMath';\n\nclass PerspectiveFrustumPointFitter\n{\n constructor()\n {\n this.sphere = new Sphere();\n }\n\n fit_points(points, camera_quaternion, vertical_fov, aspect)\n {\n this.sphere.setFromPoints(points);\n\n const v_fov = OMath.degToRad(vertical_fov / 2);\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\n\n const up_plane_normal = this.get_up_plane_normal(camera_quaternion, v_fov);\n const down_plane_normal = this.get_down_plane_normal(camera_quaternion, v_fov);\n const left_plane_normal = this.get_left_plane_normal(camera_quaternion, h_fov);\n const right_plane_normal = this.get_right_plane_normal(camera_quaternion, h_fov);\n\n const camera_forward_dir = new Vector3(0, 0, -1).applyQuaternion(camera_quaternion);\n\n const sphere_center = this.sphere.center.clone();\n\n const pull_back_distance = this.get_distance_to_fit_rect(this.sphere.radius * 2, this.sphere.radius * 2, vertical_fov, aspect);\n const far_pos = sphere_center.clone().add(camera_forward_dir.clone().multiplyScalar(pull_back_distance * -1));\n\n const up_plane = new Plane().setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\n const down_plane = new Plane().setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\n\n const left_plane = new Plane().setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\n const right_plane = new Plane().setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\n\n this.apply_center_correction_to_pos(far_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane);\n\n up_plane.setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\n down_plane.setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\n\n left_plane.setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\n right_plane.setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\n\n let closest_distance = Infinity;\n\n const inverse_dir = camera_forward_dir.clone().multiplyScalar(pull_back_distance * -2);\n for (let i = 0; i < points.length; i++)\n {\n const line = new Line3(points[i].clone(), points[i].clone().add(inverse_dir));\n\n const up_line_intersection = new Vector3();\n const down_line_intersection = new Vector3();\n\n const left_line_intersection = new Vector3();\n const right_line_intersection = new Vector3();\n\n up_plane.intersectLine(line, up_line_intersection);\n down_plane.intersectLine(line, down_line_intersection);\n\n left_plane.intersectLine(line, left_line_intersection);\n right_plane.intersectLine(line, right_line_intersection);\n\n if (up_line_intersection.length() < 0.0001)\n {\n console.log('up intersection not found', i);\n }\n if (down_line_intersection.length() < 0.0001)\n {\n console.log('down intersection not found', i);\n }\n if (left_line_intersection.length() < 0.0001)\n {\n console.log('left intersection not found', i);\n }\n if (right_line_intersection.length() < 0.0001)\n {\n console.log('right intersection not found', i);\n }\n\n const new_up_distance = points[i].clone().sub(up_line_intersection).length();\n const new_down_distance = points[i].clone().sub(down_line_intersection).length();\n\n const new_left_distance = points[i].clone().sub(left_line_intersection).length();\n const new_right_distance = points[i].clone().sub(right_line_intersection).length();\n\n const vertical_min = Math.min(new_up_distance, new_down_distance);\n const horizontal_min = Math.min(new_left_distance, new_right_distance);\n\n const min = Math.min(vertical_min, horizontal_min);\n\n if (min < closest_distance)\n {\n closest_distance = min;\n }\n }\n\n const forward_correction = camera_forward_dir.clone().multiplyScalar(closest_distance);\n const closest_position = far_pos.clone().add(forward_correction);\n\n return closest_position;\n }\n\n apply_center_correction_to_pos(target_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane)\n {\n const vertical_offset = this.get_vertical_correction(points, down_plane, up_plane, camera_quaternion);\n const horizontal_offset = this.get_horizontal_correction(points, left_plane, right_plane, camera_quaternion);\n\n target_pos.add(vertical_offset);\n target_pos.add(horizontal_offset);\n }\n\n get_vertical_correction(points, down_plane, up_plane, camera_quaternion)\n {\n let closest_distance_to_up_plane = Infinity;\n let closest_distance_to_down_plane = Infinity;\n // let closest_up_point = undefined;\n // let closest_down_point = undefined;\n\n const up_dir = new Vector3(0, 1, 0).applyQuaternion(camera_quaternion);\n for (let i = 0; i < points.length; i++)\n {\n const down_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(-5000000)));\n const up_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(5000000)));\n\n const down_line_intersection = new Vector3();\n const up_line_intersection = new Vector3();\n\n down_plane.intersectLine(down_line, down_line_intersection);\n up_plane.intersectLine(up_line, up_line_intersection);\n\n const down_dist = down_line_intersection.distanceTo(points[i]);\n const up_dist = up_line_intersection.distanceTo(points[i]);\n\n if (up_line_intersection.length() < 0.0001)\n {\n console.log('vertical up intersection not found', i);\n }\n if (down_line_intersection.length() < 0.0001)\n {\n console.log('vertical down intersection not found', i);\n }\n\n if (down_dist < closest_distance_to_down_plane)\n {\n closest_distance_to_down_plane = down_dist;\n // closest_down_point = points[i];\n }\n if (up_dist < closest_distance_to_up_plane)\n {\n closest_distance_to_up_plane = up_dist;\n // closest_up_point = points[i];\n }\n }\n\n const correction = (closest_distance_to_up_plane - closest_distance_to_down_plane) / 2;\n\n // console.log(\"vertical_correction\", correction)\n return up_dir.clone().multiplyScalar(-correction);\n }\n\n get_horizontal_correction(points, left_plane, right_plane, camera_quaternion)\n {\n let closest_distance_to_right_plane = Infinity;\n let closest_distance_to_left_plane = Infinity;\n // let closest_right_point = undefined;\n // let closest_left_point = undefined;\n\n const right_dir = new Vector3(1, 0, 0).applyQuaternion(camera_quaternion);\n\n for (let i = 0; i < points.length; i++)\n {\n const left_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(-5000000)));\n const right_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(5000000)));\n\n const left_line_intersection = new Vector3();\n const right_line_intersection = new Vector3();\n\n left_plane.intersectLine(left_line, left_line_intersection);\n right_plane.intersectLine(right_line, right_line_intersection);\n\n const left_dist = left_line_intersection.distanceTo(points[i]);\n const right_dist = right_line_intersection.distanceTo(points[i]);\n\n if (left_line_intersection.length() < 0.0001)\n {\n console.log('left intersection not found', i);\n }\n if (right_line_intersection.length() < 0.0001)\n {\n console.log('right intersection not found', i);\n }\n\n if (left_dist < closest_distance_to_left_plane)\n {\n closest_distance_to_left_plane = left_dist;\n // closest_left_point = points[i];\n }\n if (right_dist < closest_distance_to_right_plane)\n {\n closest_distance_to_right_plane = right_dist;\n // closest_right_point = points[i];\n }\n }\n\n const correction = (closest_distance_to_right_plane - closest_distance_to_left_plane) / 2;\n // console.log(\"horizontal_correction\", correction)\n\n return right_dir.clone().multiplyScalar(-correction);\n }\n\n get_up_plane_normal(camera_quaternion, v_fov)\n {\n const up_plane_normal = new Vector3(0, -1, 0);\n up_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), v_fov));\n up_plane_normal.applyQuaternion(camera_quaternion);\n return up_plane_normal;\n }\n\n get_down_plane_normal(camera_quaternion, v_fov)\n {\n const down_plane_normal = new Vector3(0, 1, 0);\n down_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), -v_fov));\n down_plane_normal.applyQuaternion(camera_quaternion);\n return down_plane_normal;\n }\n\n get_left_plane_normal(camera_quaternion, h_fov)\n {\n const left_plane_normal = new Vector3(1, 0, 0);\n left_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), h_fov));\n left_plane_normal.applyQuaternion(camera_quaternion);\n return left_plane_normal;\n }\n\n get_right_plane_normal(camera_quaternion, h_fov)\n {\n const right_plane_normal = new Vector3(-1, 0, 0);\n right_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), -h_fov));\n right_plane_normal.applyQuaternion(camera_quaternion);\n return right_plane_normal;\n }\n\n get_distance_to_fit_rect(width, height, vertical_fov, aspect)\n {\n const v_fov = (vertical_fov / 2) * Math.PI / 180;\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\n\n const distV = height / Math.tan(v_fov);\n const distH = width / Math.tan(h_fov);\n return Math.max(Math.abs(distH), Math.abs(distV));\n }\n}\n\nexport { PerspectiveFrustumPointFitter };\n","import { Vector3, Box3 } from 'three';\n\nclass OrthographicFrustumPointFitter\n{\n constructor()\n {\n\n }\n\n fit_points(points, camera_quaternion, vertical_fov, aspect)\n {\n const inverse_camera_quat = camera_quaternion.clone().inverse();\n\n const inverted_points = [];\n\n for (let i = 0; i < points.length; i++)\n {\n inverted_points.push(points[i].clone().applyQuaternion(inverse_camera_quat));\n }\n\n const box = new Box3().setFromPoints(inverted_points);\n const size = new Vector3();\n box.getSize(size);\n\n const distance = this.get_distance_to_fit_rect(size.x / 2, size.y / 2, vertical_fov, aspect);\n\n const center = new Vector3();\n box.getCenter(center);\n\n center.applyQuaternion(camera_quaternion);\n\n return {\n center: center,\n distance_to_center: distance\n };\n }\n\n get_distance_to_fit_rect(width, height, vertical_fov, aspect)\n {\n const v_fov = (vertical_fov / 2) * Math.PI / 180;\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\n\n const distV = height / Math.tan(v_fov);\n const distH = width / Math.tan(h_fov);\n return Math.max(Math.abs(distH), Math.abs(distV));\n }\n}\n\nexport { OrthographicFrustumPointFitter };\n","import grid_frag from '../shaders/grid/grid.frag';\nimport grid_vert from '../shaders/grid/grid.vert';\n\nimport { GeometryUtilities } from '../utilities/GeometryUtilities';\n\nimport { Mesh } from 'three';\nimport { ShaderMaterial } from 'three';\nimport { Color } from 'three';\nimport { PlaneGeometry } from 'three';\n\nclass Grid extends Mesh\n{\n constructor()\n {\n const material = new ShaderMaterial({\n uniforms: {\n _Color: { value: new Color('#919191') }\n },\n vertexShader: grid_vert,\n fragmentShader: grid_frag,\n extensions: { derivatives: true },\n transparent: true,\n depthWrite: false\n });\n\n const plane_geometry = new PlaneGeometry(100, 100, 100, 100);\n\n const non_indexed_geometry = GeometryUtilities.convert_to_non_indexed_geometry(plane_geometry);\n\n super(non_indexed_geometry, material);\n\n this.rotation.x = -3.14 / 2;\n }\n}\n\nexport { Grid };\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\nclass Line extends Mesh\n{\n constructor(points)\n {\n const geometry = new BufferGeometry();\n geometry.setAttribute('position', new BufferAttribute(new Float32Array([]), 3));\n geometry.setAttribute('next_position', new BufferAttribute(new Float32Array([]), 3));\n geometry.setAttribute('previous_position', new BufferAttribute(new Float32Array([]), 3));\n geometry.setAttribute('orientation', new BufferAttribute(new Float32Array([]), 1));\n geometry.setAttribute('coverage', new BufferAttribute(new Float32Array([]), 1));\n\n const material = new ShaderMaterial({\n uniforms: {\n _Thickness: { value: 0.2 },\n _Length: { value: 0 },\n _ElapsedTime: { value: 0 },\n _Color: { value: new Color('#FF0000') }\n },\n vertexShader: line_vs,\n fragmentShader: line_fs,\n transparent: true,\n depthWrite: false,\n extensions: { derivatives: true }\n\n });\n\n super(geometry, material);\n\n if (points)\n {\n this.setup(points);\n }\n }\n\n setup(points)\n {\n const vertices = [];\n const next_position = [];\n const previous_position = [];\n const orientation = [];\n const coverage = [];\n let accumulated_length = 0;\n\n for (let i = 0; i < points.length; i++)\n {\n vertices.push(points[i].x);\n vertices.push(points[i].y);\n vertices.push(points[i].z);\n orientation.push(1);\n\n vertices.push(points[i].x);\n vertices.push(points[i].y);\n vertices.push(points[i].z);\n orientation.push(-1);\n\n const next_point = this.__get_next_position(points, i);\n next_position.push(next_point.x);\n next_position.push(next_point.y);\n next_position.push(next_point.z);\n\n next_position.push(next_point.x);\n next_position.push(next_point.y);\n next_position.push(next_point.z);\n\n const previous_point = this.__get_previous_position(points, i);\n previous_position.push(previous_point.x);\n previous_position.push(previous_point.y);\n previous_position.push(previous_point.z);\n\n previous_position.push(previous_point.x);\n previous_position.push(previous_point.y);\n previous_position.push(previous_point.z);\n\n coverage.push(accumulated_length);\n coverage.push(accumulated_length);\n\n if (i < points.length - 1)\n {\n accumulated_length += points[i].distanceTo(next_point);\n }\n }\n const vertexList = new Float32Array(vertices);\n const nextPositionList = new Float32Array(next_position);\n const previousPositionList = new Float32Array(previous_position);\n const orientationList = new Float32Array(orientation);\n const coverageList = new Float32Array(coverage);\n\n const indices = [];\n for (let i = 0; i < ((vertexList.length / 3) - 2) / 2; i++)\n {\n const index = (i * 2) + 1;\n indices.push(index);\n indices.push(index + 1);\n indices.push(index - 1);\n\n indices.push(index);\n indices.push(index + 2);\n indices.push(index + 1);\n }\n\n this.geometry.setIndex(indices);\n this.geometry.getAttribute('position').copy(new BufferAttribute(vertexList, 3));\n this.geometry.getAttribute('next_position').copy(new BufferAttribute(nextPositionList, 3));\n this.geometry.getAttribute('previous_position').copy(new BufferAttribute(previousPositionList, 3));\n this.geometry.getAttribute('orientation').copy(new BufferAttribute(orientationList, 1));\n this.geometry.getAttribute('coverage').copy(new BufferAttribute(coverageList, 1));\n\n this.geometry.getAttribute('position').needsUpdate = true;\n this.geometry.getAttribute('next_position').needsUpdate = true;\n this.geometry.getAttribute('previous_position').needsUpdate = true;\n this.geometry.getAttribute('orientation').needsUpdate = true;\n this.geometry.getAttribute('coverage').needsUpdate = true;\n\n this.material.uniforms._Length.value = accumulated_length;\n this._length = accumulated_length;\n }\n\n set thickness(value)\n {\n this.material.uniforms._Thickness.value = value;\n }\n\n get thickness()\n {\n return this.material.uniforms._Thickness.value;\n }\n\n __get_previous_position(points, i)\n {\n if (i === 0)\n {\n return points[1].clone().sub(points[0]).multiplyScalar(-1).add(points[0]);\n }\n else\n {\n return points[i - 1];\n }\n }\n\n __get_next_position(points, i)\n {\n if (i === points.length - 1)\n {\n return points[points.length - 2].clone().sub(points[points.length - 1]).multiplyScalar(-1).add(points[points.length - 1]);\n }\n else\n {\n return points[i + 1];\n }\n }\n\n update()\n {\n }\n\n distance()\n {\n return this.accumulated_length;\n }\n\n total_length()\n {\n return this.accumulated_length;\n }\n\n dispose()\n {\n this.geometry.dispose();\n this.material.dispose();\n if (this.parent)\n {\n this.parent.remove(this);\n }\n }\n\n set color(col)\n {\n this.material.uniforms._Color.value.set(col);\n }\n\n get color()\n {\n return this.material.uniforms._Color.value;\n }\n\n copy_color(col)\n {\n this.material.uniforms._Color.value.copy(col);\n }\n}\n\nexport { Line };\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\nclass WorldImage extends Mesh\n{\n constructor(texture, pivot)\n {\n pivot = pivot || new Vector2(0, 0);\n const material = new ShaderMaterial({\n uniforms: {\n _MainTex: { value: texture },\n _ScreenAligned: { value: 0 },\n _Scale: { value: 1 },\n _Opacity: { value: 1 }\n },\n vertexShader: basic_texture_vert,\n fragmentShader: basic_texture_frag,\n transparent: true,\n depthWrite: false,\n side: DoubleSide\n });\n const geometry = new PlaneGeometry(1, 1, 1);\n geometry.translate(-pivot.x / 2, -pivot.y / 2, 0);\n const current_scale = texture.image.width / texture.image.height;\n geometry.scale(current_scale, 1, 1);\n super(geometry, material);\n this.current_scale = current_scale;\n this.geometry.computeBoundingBox();\n\n this.tmp_bb_size = new Vector3();\n this.geometry.boundingBox.getSize(this.tmp_bb_size);\n }\n\n update_texture()\n {\n this.material.uniforms._MainTex.value.needsUpdate = true;\n const img = this.material.uniforms._MainTex.value.image;\n\n this.geometry.scale(1 / this.current_scale, 1, 1);\n this.current_scale = img.width / img.height;\n this.geometry.scale(this.current_scale, 1, 1);\n this.geometry.computeBoundingBox();\n this.geometry.boundingBox.getSize(this.tmp_bb_size);\n }\n\n get size()\n {\n return this.tmp_bb_size.clone().multiplyScalar(this.scale.x);\n }\n\n set size(value)\n {\n this.scale.set(value, value, value);\n this.material.uniforms._Scale.value = value;\n }\n\n set screen_aligned(boolean)\n {\n this.material.uniforms._ScreenAligned.value = boolean === true ? 1 : 0;\n }\n\n get screen_aligned()\n {\n return this.material.uniforms._ScreenAligned.value === 1;\n }\n\n set opacity(opacity)\n {\n this.material.uniforms._Opacity.value = opacity;\n }\n\n get opacity()\n {\n return this.material.uniforms._Opacity.value;\n }\n\n dispose()\n {\n this.geometry.dispose();\n this.parent.remove(this);\n this.material.uniforms._MainTex.value.dispose();\n this.material.dispose();\n }\n}\n\nexport { WorldImage };\n","import { WorldImage } from './WorldImage';\nimport { SimpleTextDrawer } from '../canvas_drawer/SimpleTextDrawer';\n\nimport { LinearMipMapLinearFilter } from 'three';\nimport { LinearFilter } from 'three';\n\nclass Text2D extends WorldImage\n{\n constructor(text, font, color, pivot, is_static)\n {\n const simple_text_drawer = new SimpleTextDrawer(is_static);\n\n const draw_settings = {\n font: font,\n font_color: color || '#000000'\n };\n const canvas_texture = simple_text_drawer.draw_on_texture(text, draw_settings);\n\n canvas_texture.minFilter = LinearMipMapLinearFilter;\n canvas_texture.minFilter = LinearFilter;\n canvas_texture.needsUpdate = true;\n super(canvas_texture, pivot);\n\n this.simple_text_drawer = simple_text_drawer;\n this.canvas_texture = canvas_texture;\n this.draw_settings = draw_settings;\n }\n\n set text(value)\n {\n this.simple_text_drawer.draw_canvas(value, this.draw_settings);\n this.update_texture();\n }\n\n get text()\n {\n return 'not implemented';\n }\n}\n\nexport { Text2D };\n","import vert from '../shaders/ui_element/ui_element.vert';\nimport frag from '../shaders/ui_element/ui_element.frag';\n\nimport { BaseShaderMaterial } from '../materials/BaseShaderMaterial';\n\nimport { Vector2 } from 'three';\nimport { Vector3 } from 'three';\n\nimport { OScreen } from '../OScreen';\n\nclass UIElementMaterial extends BaseShaderMaterial\n{\n constructor(intensity = 1)\n {\n super(vert, frag, {\n _MainTex: { value: undefined },\n _ScreenSize: { value: new Vector2(OScreen.width, OScreen.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\nexport { UIElementMaterial };\n","import { Vector2 } from 'three';\n\nclass 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\nexport { ScreenSpacePosition };\n","import { CameraManager } from '../../CameraManager';\n\nimport { Vector2 } from 'three';\nimport { Vector3 } from 'three';\n\nclass 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\nexport { WorldSpacePosition };\n","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\nexport { UIElementState };\n","import { UIElementState } from './UIElementState';\n\nclass 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\nexport { OnIdle };\n","import { UIElementState } from './UIElementState';\n\nclass 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\nexport { OnMouseEnter };\n","import { UIElementState } from './UIElementState';\n\nclass 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\nexport { OnMouseExit };\n","import { UIElementState } from './UIElementState';\n\nclass 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\nexport { OnMouseHover };\n","\nimport { OScreen } from '../OScreen';\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\nclass 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(OScreen.width, OScreen.height);\n this.get_size(this.material.uniforms._TextureSize.value);\n\n this.cached_NDC_position.copy(this.position_strategy.get_pos_NDC(this.position));\n this.material.uniforms._NDC.value.copy(this.position);\n this.current_state.update(this, normalized_mouse_pos);\n }\n\n is_mouse_over(normalized_mouse_pos)\n {\n this.screen_pos_tmp.copy(this.cached_NDC_position);\n this.to_screen_position(this.screen_pos_tmp);\n this.screen_pos_tmp.x += this.pixel_offset.x;\n this.screen_pos_tmp.y += this.pixel_offset.y;\n\n const rect = new Box2().setFromCenterAndSize(this.screen_pos_tmp, this.get_size());\n\n this.mouse_pos_tmp.copy(normalized_mouse_pos);\n this.to_screen_position(this.mouse_pos_tmp);\n\n return rect.containsPoint(this.mouse_pos_tmp);\n }\n\n to_screen_position(projected_pos)\n {\n projected_pos.x = (projected_pos.x * 0.5 + 0.5) * OScreen.width + this.pixel_offset.x;\n projected_pos.y = (projected_pos.y * 0.5 + 0.5) * OScreen.height + this.pixel_offset.y;\n }\n\n get_screen_space_position()\n {\n const pos = this.cached_NDC_position.clone();\n this.to_screen_position(pos);\n return pos;\n }\n\n set_screen_space_position(screen_pos)\n {\n this.position.x = (screen_pos.x / OScreen.width) * 2 - 1;\n this.position.y = (screen_pos.y / OScreen.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 // OScreen.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 / OScreen.dpr);\n }\n else\n {\n return new Vector2().copy(this.texture_size).multiplyScalar(this.size / OScreen.dpr);\n }\n }\n\n on_mouse_enter()\n {}\n\n on_mouse_exit()\n {}\n\n on_mouse_hover()\n {}\n}\n\nexport { UIElement };\n","import { Mesh } from 'three';\n\nclass UpdatableMaterialMesh extends Mesh\n{\n constructor(geometry, material)\n {\n super(geometry, material);\n\n const self = this;\n\n this.onBeforeRender = () =>\n {\n self.material.update();\n };\n }\n}\n\nexport { UpdatableMaterialMesh };\n","import { Vector2, Vector4 } from 'three';\n\nclass TextGlyph\n{\n constructor(offset, plane_bounds, atlas_bounds)\n {\n const width = plane_bounds.right - plane_bounds.left;\n const height = plane_bounds.top - plane_bounds.bottom;\n\n this.scale = new Vector2(width, height);\n this.position = new Vector2(offset + plane_bounds.left, plane_bounds.bottom);\n\n this.atlas_bounds = new Vector4(atlas_bounds.left, atlas_bounds.right, atlas_bounds.top, atlas_bounds.bottom);\n }\n}\n\nexport { TextGlyph };\n","import { Vector3, Quaternion, Matrix4, Color, Box2, Vector2 } from 'three';\nimport { TextGlyph } from './TextGlyph';\n\nclass SDFText\n{\n constructor(glyph_layout, text = '')\n {\n this.glyph_layout = glyph_layout;\n\n this.glyphs = [];\n\n this.glyph_is_dirty = true;\n this.matrix_is_dirty = true;\n this.color_is_dirty = true;\n\n this.position = new Vector3();\n this.quaternion = new Quaternion();\n this.scale = new Vector3(1, 1, 1);\n this.matrix = new Matrix4();\n\n this.color = new Color('#FFFFFF');\n\n this.pivot_point = new Vector2();\n this.__opacity = 1;\n\n this.__text = text;\n\n this.__generate_glyphs(text);\n }\n\n set text(value)\n {\n this.__text = value;\n this.__generate_glyphs(value);\n this.matrix_is_dirty = true;\n }\n\n get text()\n {\n return this.__text;\n }\n\n update_matrix()\n {\n this.matrix.compose(this.position, this.quaternion, this.scale);\n this.matrix_is_dirty = false;\n this.glyph_is_dirty = true;\n }\n\n clear_glyph_dirty()\n {\n this.glyph_is_dirty = false;\n }\n\n clear_color_dirty()\n {\n this.color_is_dirty = false;\n }\n\n set_rotation(orientation = 0, tilt = 0) // 0..360, -90..0..90\n {\n const new_orientation = new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), (orientation / 360) * Math.PI * 2);\n const new_tilt = new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), (-tilt / 360) * Math.PI * 2);\n\n this.quaternion.copy(new_orientation.multiply(new_tilt));\n this.matrix_is_dirty = true;\n }\n\n set_position(pos)\n {\n this.position.copy(pos);\n this.matrix_is_dirty = true;\n }\n\n set_size(size)\n {\n this.scale.set(size, size, size);\n this.matrix_is_dirty = true;\n }\n\n set_color(col)\n {\n this.color.set(col);\n this.color_is_dirty = true;\n }\n\n set_pivot(pivot)\n {\n this.pivot_point.copy(pivot);\n this.update_glyphs();\n }\n\n set opacity(op)\n {\n this.__opacity = op;\n this.color_is_dirty = true;\n }\n\n get opacity()\n {\n return this.__opacity;\n }\n\n update_glyphs()\n {\n this.__generate_glyphs(this.text);\n }\n\n __generate_glyphs(text)\n {\n let cursor = 0;\n\n this.glyphs.length = 0;\n\n for (let i = 0; i < text.length; i++)\n {\n const unicode = text.charCodeAt(i);\n const glyph = this.glyph_layout.find(element => element.unicode === unicode);\n if (glyph)\n {\n if (glyph.planeBounds)\n {\n const text_glyph = new TextGlyph(cursor, glyph.planeBounds, glyph.atlasBounds);\n this.glyphs.push(text_glyph);\n }\n cursor += glyph.advance;\n }\n }\n\n const box2 = new Box2();\n const first_glyph = this.glyphs[0];\n box2.setFromCenterAndSize(first_glyph.position.clone().add(new Vector2(first_glyph.scale.x / 2, first_glyph.scale.y / 2)), first_glyph.scale);\n\n for (let i = 1; i < this.glyphs.length; i++)\n {\n const g = this.glyphs[i];\n const box = new Box2().setFromCenterAndSize(g.position.clone().add(new Vector2(g.scale.x / 2, g.scale.y / 2)), g.scale);\n box2.union(box);\n }\n\n const box2_size = new Vector2();\n box2.getSize(box2_size);\n for (let i = 0; i < this.glyphs.length; i++)\n {\n this.glyphs[i].position.x -= box2_size.x / 2;\n this.glyphs[i].position.y -= box2_size.y / 2;\n\n this.glyphs[i].position.x += (box2_size.x / 2) * this.pivot_point.x;\n this.glyphs[i].position.y += (box2_size.y / 2) * this.pivot_point.y;\n }\n\n this.glyph_is_dirty = true;\n }\n}\n\nexport { SDFText };\n","import { BaseShaderMaterial } from './BaseShaderMaterial';\n\nimport frag from '../shaders/sdf_text/sdf_text.frag';\nimport vert from '../shaders/sdf_text/sdf_text.vert';\n\nimport { Vector2, DoubleSide, LinearFilter } from 'three';\nimport { OMath } from '../utilities/OMath';\n\nclass 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 = OMath.lerp(0.5, 0.2, value);\n }\n}\n\nexport { SDFTextMaterial };\n","import { SDFText } from './SDFText';\nimport { SDFTextMaterial } from '../../materials/SDFTextMaterial';\nimport { ArrayUtilities } from '../../utilities/ArrayUtilities';\n\nimport {\n PlaneGeometry,\n Mesh,\n Vector2,\n InstancedBufferGeometry,\n InstancedBufferAttribute,\n Float32BufferAttribute,\n DynamicDrawUsage\n} from 'three';\n\nclass SDFTextBatch extends Mesh\n{\n constructor(font_layout, atlas_texture)\n {\n const max_allocations = 2000;\n\n const instanced_geometry = new InstancedBufferGeometry();\n instanced_geometry.instanceCount = 0;\n\n const geometry = new PlaneGeometry(1, 1);\n geometry.translate(0.5, 0.5, 0);\n instanced_geometry.setAttribute('position', new Float32BufferAttribute(geometry.getAttribute('position').array, 3));\n instanced_geometry.setAttribute('uv', new Float32BufferAttribute(geometry.getAttribute('uv').array, 2));\n instanced_geometry.index = geometry.index;\n\n const transformsCol0 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n const transformsCol1 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n const transformsCol2 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n const transformsCol3 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n\n const glyph_bounds = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n const plane_bounds = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n\n const color = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n\n transformsCol0.usage = DynamicDrawUsage;\n transformsCol1.usage = DynamicDrawUsage;\n transformsCol2.usage = DynamicDrawUsage;\n transformsCol3.usage = DynamicDrawUsage;\n glyph_bounds.usage = DynamicDrawUsage;\n plane_bounds.usage = DynamicDrawUsage;\n color.usage = DynamicDrawUsage;\n\n instanced_geometry.setAttribute('transformsCol0', transformsCol0);\n instanced_geometry.setAttribute('transformsCol1', transformsCol1);\n instanced_geometry.setAttribute('transformsCol2', transformsCol2);\n instanced_geometry.setAttribute('transformsCol3', transformsCol3);\n\n instanced_geometry.setAttribute('glyph_bounds', glyph_bounds);\n instanced_geometry.setAttribute('plane_bounds', plane_bounds);\n instanced_geometry.setAttribute('color', color);\n\n super(instanced_geometry, new SDFTextMaterial(atlas_texture));\n\n this.text_elements = [];\n this.font_layout = font_layout;\n\n this.material.set_atlas_size(new Vector2(font_layout.atlas.width, font_layout.atlas.height));\n\n this.frustumCulled = false;\n }\n\n set_boldness(value)\n {\n this.material.set_boldness(value);\n }\n\n add_text(text_str)\n {\n const elem = new SDFText(this.font_layout.glyphs, text_str);\n this.text_elements.push(elem);\n return elem;\n }\n\n remove_text(text_elem)\n {\n ArrayUtilities.remove_elem(this.text_elements, text_elem);\n this.update(true);\n }\n\n update(force_update)\n {\n const glyph_bounds_atr = this.geometry.getAttribute('glyph_bounds');\n const plane_bounds_atr = this.geometry.getAttribute('plane_bounds');\n\n const transformsCol0 = this.geometry.getAttribute('transformsCol0');\n const transformsCol1 = this.geometry.getAttribute('transformsCol1');\n const transformsCol2 = this.geometry.getAttribute('transformsCol2');\n const transformsCol3 = this.geometry.getAttribute('transformsCol3');\n\n const color_atr = this.geometry.getAttribute('color');\n\n let matrix_needs_update = force_update === true;\n let glyph_needs_update = force_update === true;\n let color_needs_update = force_update === true;\n\n let glyph_count = 0;\n for (let i = 0; i < this.text_elements.length; i++)\n {\n const text = this.text_elements[i];\n\n if (text.matrix_is_dirty)\n {\n matrix_needs_update = true;\n text.update_matrix();\n }\n\n if (text.glyph_is_dirty)\n {\n glyph_needs_update = true;\n text.clear_glyph_dirty();\n }\n\n if (text.color_is_dirty)\n {\n color_needs_update = true;\n text.clear_color_dirty();\n }\n\n const matrix = text.matrix;\n const color = text.color;\n const opacity = text.opacity;\n\n for (let glyph_i = 0; glyph_i < text.glyphs.length; glyph_i++)\n {\n const glyph = text.glyphs[glyph_i];\n\n const buffer_i = glyph_count;\n\n glyph_bounds_atr.setXYZW(buffer_i, glyph.atlas_bounds.x, glyph.atlas_bounds.y, glyph.atlas_bounds.z, glyph.atlas_bounds.w);\n plane_bounds_atr.setXYZW(buffer_i, glyph.position.x, glyph.position.y, glyph.scale.x, glyph.scale.y);\n\n transformsCol0.setXYZW(buffer_i, matrix.elements[0],\n matrix.elements[1],\n matrix.elements[2],\n matrix.elements[3]);\n\n transformsCol1.setXYZW(buffer_i, matrix.elements[4],\n matrix.elements[5],\n matrix.elements[6],\n matrix.elements[7]);\n\n transformsCol2.setXYZW(buffer_i, matrix.elements[8],\n matrix.elements[9],\n matrix.elements[10],\n matrix.elements[11]);\n\n transformsCol3.setXYZW(buffer_i, matrix.elements[12],\n matrix.elements[13],\n matrix.elements[14],\n matrix.elements[15]);\n\n color_atr.setXYZW(buffer_i, color.r, color.g, color.b, opacity);\n\n glyph_count++;\n }\n }\n\n this.geometry.instanceCount = glyph_count;\n\n if (glyph_count > this.max_allocations)\n {\n console.error('SDFTextBatch exceeded maximum glyph allocations(max/current): ', this.max_allocations, glyph_count, this);\n }\n\n if (matrix_needs_update)\n {\n transformsCol0.needsUpdate = true;\n transformsCol1.needsUpdate = true;\n transformsCol2.needsUpdate = true;\n transformsCol3.needsUpdate = true;\n }\n if (glyph_needs_update)\n {\n glyph_bounds_atr.needsUpdate = true;\n plane_bounds_atr.needsUpdate = true;\n }\n if (color_needs_update)\n {\n color_atr.needsUpdate = true;\n }\n }\n\n dispose()\n {\n this.geometry.dispose();\n this.material.dispose();\n }\n}\n\nexport { SDFTextBatch };\n","import { ActionInterpolator } from './ActionInterpolator';\n\nclass VectorInterpolator extends ActionInterpolator\n{\n constructor(attribute_name, from = 0, to = 1, easing_function = 'linear')\n {\n super(easing_function);\n\n this.attribute_name = attribute_name;\n this.from = from;\n this.to = to;\n }\n\n update(context, t)\n {\n const tmp = this.from.clone();\n tmp.lerp(this.to, this.easing_function(t));\n context[this.attribute_name].copy(tmp);\n }\n}\n\nexport { VectorInterpolator };\n","import { BlitMaterial } from '../materials/BlitMaterial';\n\nimport frag from '../shaders/median_filter/median_filter.frag';\n\nimport { Vector2 } from 'three';\n\nclass MedianFilterMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag, undefined, {\n kernel3x3: true\n });\n\n this.uniforms._SourceTex = { value: undefined };\n this.uniforms._SourceTexSize = { value: new Vector2(1, 1) };\n }\n\n set_texture(tex)\n {\n this.uniforms._SourceTex.value = tex;\n\n const size = this.get_size(tex);\n this.uniforms._SourceTexSize.value.copy(size);\n }\n\n get_size(tex)\n {\n if (tex.isVideoTexture)\n {\n return new Vector2(Math.max(1, tex.image.videoWidth), Math.max(1, tex.image.videoHeight));\n }\n if (tex.isWebGLRenderTarget)\n {\n return new Vector2(tex.width, tex.height);\n }\n if (tex.isTexture)\n {\n return new Vector2(tex.image.width, tex.image.height);\n }\n return new Vector2(1, 1);\n }\n}\n\nexport { MedianFilterMaterial };\n","import { MedianFilterMaterial } from '../materials/MedianFilterMaterial';\nimport { Graphics } from '../Graphics';\n\nimport { WebGLRenderTarget, Vector2, RGBAFormat, FloatType, NearestFilter } from 'three';\n\nclass MedianFilter\n{\n constructor(renderer)\n {\n this.RT = new WebGLRenderTarget(1, 1, {\n type: FloatType,\n format: RGBAFormat,\n minFilter: NearestFilter,\n magFilter: NearestFilter\n });\n this.RT1 = new WebGLRenderTarget(1, 1, {\n type: FloatType,\n format: RGBAFormat,\n minFilter: NearestFilter,\n magFilter: NearestFilter\n });\n\n this.median_filter_mat = new MedianFilterMaterial();\n }\n\n filter(texture)\n {\n const tex_size = this.get_size(texture);\n if (tex_size.x !== this.RT.width || tex_size.y !== this.RT.height)\n {\n this.RT.setSize(tex_size.x, tex_size.y);\n this.RT1.setSize(tex_size.x, tex_size.y);\n }\n\n this.median_filter_mat.set_texture(texture);\n Graphics.material_pass(this.median_filter_mat, this.RT);\n\n for (let i = 0; i < 0; i++)\n {\n this.median_filter_mat.set_texture(this.RT.texture);\n Graphics.material_pass(this.median_filter_mat, this.RT1);\n\n this.median_filter_mat.set_texture(this.RT1.texture);\n Graphics.material_pass(this.median_filter_mat, this.RT);\n }\n\n return this.RT;\n }\n\n get_size(tex)\n {\n if (tex.isVideoTexture)\n {\n return new Vector2(Math.max(1, tex.image.videoWidth), Math.max(1, tex.image.videoHeight));\n }\n if (tex.isWebGLRenderTarget)\n {\n return new Vector2(tex.width, tex.height);\n }\n if (tex.isTexture)\n {\n return new Vector2(tex.image.width, tex.image.height);\n }\n return new Vector2(1, 1);\n }\n}\n\nexport { MedianFilter };\n","import { BlitMaterial } from './BlitMaterial';\n\nimport downsample_frag from '../shaders/dual_filter_blur/downsample.frag';\nimport upsample_frag from '../shaders/dual_filter_blur/upsample.frag';\n\nclass DualFilteringBlurMaterial extends BlitMaterial\n{\n constructor(upsample)\n {\n super(upsample ? upsample_frag : downsample_frag);\n }\n}\n\nexport { DualFilteringBlurMaterial };\n","import { BlitMaterial } from './BlitMaterial';\n\nimport frag from '../shaders/dual_filter_blur/alpha_filter.frag';\n\nclass 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\nexport { AlphaFilterMaterial };\n","import { DualFilteringBlurMaterial } from '../materials/DualFilteringBlurMaterial';\nimport { AlphaFilterMaterial } from '../materials/AlphaFilterMaterial';\nimport { Graphics } from '../Graphics';\nimport { WebGLRenderTarget } from 'three';\nclass 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\nexport { DualFilteringBlurrer };\n","import { Graphics } from '../Graphics';\n\nimport { NearestFilter } from 'three';\nimport { RGBAFormat } from 'three';\nimport { LinearEncoding } from 'three';\nimport { HalfFloatType } from 'three';\nimport { FloatType } from 'three';\nimport { WebGLRenderTarget } from 'three';\nimport { Capabilities } from '../Capabilities';\n\nclass ParticleAttribute\n{\n constructor(attr_name, update_material)\n {\n this.read = undefined;\n this.write = undefined;\n\n this.name = attr_name;\n\n this.update_material = update_material;\n }\n\n init_from_geometry(geometry)\n {\n // overrided by inheritance\n }\n\n init_from_attribute(particle_attribute)\n {\n\n }\n\n build_RT(particle_count)\n {\n const resolution = ParticleAttribute.calculate_resolution(particle_count);\n const options = {\n minFilter: NearestFilter,\n magFilter: NearestFilter,\n format: RGBAFormat,\n encoding: LinearEncoding,\n type: Capabilities.fp_textures_available ? FloatType : HalfFloatType,\n stencilBuffer: false,\n depthBuffer: false\n };\n\n return new WebGLRenderTarget(resolution.width, resolution.height, options);\n }\n\n static calculate_resolution(particle_count)\n {\n const width = Math.min(particle_count, 512);\n const height = Math.max(1, Math.ceil(particle_count / width));\n return { width, height };\n }\n\n swap_RT()\n {\n const tmp = this.read;\n this.read = this.write;\n this.write = tmp;\n }\n\n update(attribute_writter_scene)\n {\n if (this.update_material)\n {\n this.update_material.update();\n attribute_writter_scene.children[0].material = this.update_material;\n this.update_material.uniforms._MainTex.value = this.read.texture;\n Graphics.render(attribute_writter_scene, undefined, this.write);\n attribute_writter_scene.children[0].material = undefined;\n\n this.swap_RT();\n }\n }\n\n store_geometry_attribute_in_RT(attribute, RT, storage_material, attribute_writter_scene)\n {\n attribute_writter_scene.children[0].geometry.setAttribute('data', attribute);\n attribute_writter_scene.children[0].material = storage_material;\n\n Graphics.render(attribute_writter_scene, undefined, RT);\n\n attribute_writter_scene.children[0].geometry.deleteAttribute('data');\n attribute_writter_scene.children[0].material = undefined;\n }\n\n get_texture()\n {\n return this.read.texture;\n }\n}\n\nexport { ParticleAttribute };\n","import { Object3D } from 'three';\nimport { BufferAttribute } from 'three';\nimport { PlaneGeometry } from 'three';\nimport { Mesh } from 'three';\nimport { BufferGeometry } from 'three';\nimport { Scene } from 'three';\nimport { Points } from 'three';\nimport { InstancedBufferGeometry } from 'three';\nimport { InstancedBufferAttribute } from 'three';\nimport { ParticleAttribute } from './ParticleAttribute';\n\nclass GPUParticleSystem extends Object3D\n{\n constructor(particle_count, material)\n {\n super();\n this.attributes = [];\n\n this.mesh = this.build_point_mesh(particle_count, material);\n this.add(this.mesh);\n\n this.attribute_writter_mesh = this.build_attribute_writter_mesh(particle_count);\n this.attribute_writter_scene = new Scene();\n this.attribute_writter_scene.add(this.attribute_writter_mesh);\n }\n\n add_texture_attribute(buffer_attribute)\n {\n this.attributes.push(buffer_attribute);\n }\n\n add_update_attribute_array(name, array, item_size)\n {\n this.attribute_writter_mesh.geometry.setAttribute(name, new BufferAttribute(array, item_size, false));\n }\n\n add_attribute_array(name, array, item_size)\n {\n this.mesh.geometry.setAttribute(name, new InstancedBufferAttribute(array, item_size, false));\n }\n\n update()\n {\n this.mesh.material.update();\n for (let i = 0; i < this.attributes.length; i++)\n {\n this.attributes[i].update(this.attribute_writter_scene);\n }\n }\n\n dispose()\n {\n this.mesh.geometry.dispose();\n this.mesh.material.dispose();\n }\n\n build_point_mesh(instance_count = 1, material)\n {\n const geo = new PlaneGeometry();\n\n const instanced_geo = new InstancedBufferGeometry();\n instanced_geo.setAttribute('position', geo.getAttribute('position'));\n instanced_geo.index = geo.index;\n\n instanced_geo.setAttribute('storage_uv', this.build_uv_storage_attribute(instance_count));\n instanced_geo.instanceCount = instance_count;\n const mesh = new Mesh(instanced_geo, material);\n mesh.frustumCulled = false;\n return mesh;\n }\n\n build_attribute_writter_mesh(particle_count)\n {\n const { width, height } = ParticleAttribute.calculate_resolution(particle_count);\n\n const uvs = new Float32Array(particle_count * 3);\n\n for (let i = 0; i < particle_count; i++)\n {\n const x = i % width;\n const y = Math.floor(i / width);\n uvs[i * 3 + 0] = (x + 0.5) / width;\n uvs[i * 3 + 1] = (y + 0.5) / height;\n uvs[i * 3 + 2] = i;\n }\n const geo = new BufferGeometry();\n geo.setAttribute('position', new BufferAttribute(uvs, 3, false));\n\n const points = new Points(geo);\n points.frustumCulled = false;\n return points;\n }\n\n build_uv_storage_attribute(particle_count)\n {\n const { width, height } = ParticleAttribute.calculate_resolution(particle_count);\n\n const uvs = new Float32Array(particle_count * 2);\n\n for (let i = 0; i < particle_count; i++)\n {\n const x = i % width;\n const y = Math.floor(i / width);\n uvs[i * 2 + 0] = (x + 0.5) / width;\n uvs[i * 2 + 1] = (y + 0.5) / height;\n }\n return new InstancedBufferAttribute(uvs, 2, false);\n }\n}\n\nexport { GPUParticleSystem };\n","import frag from '../../shaders/gpu_particles/generic_storage.frag';\n\nimport { ShaderMaterial } from 'three';\nimport { NoBlending } from 'three';\nimport { AlwaysDepth } from 'three';\n\nclass ParticleStorageMaterial extends ShaderMaterial\n{\n constructor()\n {\n const vert = `\n varying vec4 value;\n attribute vec4 data;\n\n void main()\n {\n gl_Position = vec4(position.xy * 2.0 - 1.0, 1.0,1.0);\n gl_PointSize = 1.0;\n\n value = data;\n }\n `;\n super({\n uniforms: {\n\n },\n vertexShader: vert,\n fragmentShader: frag,\n depthWrite: false,\n blending: NoBlending,\n depthTest: false,\n depthFunc: AlwaysDepth\n });\n }\n}\n\nexport { ParticleStorageMaterial };\n","import { BufferAttribute } from 'three';\n\nimport { ParticleAttribute } from '../gpu_particles/ParticleAttribute';\nimport { ParticleStorageMaterial } from '../materials/gpu_particles/ParticleStorageMaterial';\n\nclass ParticlePositionAttribute extends ParticleAttribute\n{\n constructor(update_material)\n {\n super('_Position', update_material);\n }\n\n store_geometry(geometry, attribute_writter_scene)\n {\n const pos_attr = geometry.getAttribute('position');\n this.read = this.build_RT(pos_attr.count);\n this.write = this.build_RT(pos_attr.count);\n\n const mat = new ParticleStorageMaterial();\n this.store_geometry_attribute_in_RT(geometry.getAttribute('position'), this.read, mat, attribute_writter_scene);\n }\n\n store_positions(positions, attribute_writter_scene)\n {\n this.read = this.build_RT(positions.length);\n this.write = this.build_RT(positions.length);\n\n const arr = new Float32Array(positions.length * 4);\n\n for (let i = 0; i < positions.length; i++)\n {\n arr[i * 4 + 0] = positions[i].x;\n arr[i * 4 + 1] = positions[i].y;\n arr[i * 4 + 2] = positions[i].z;\n arr[i * 4 + 3] = (Math.random() * 2 - 1) * 10;\n }\n const mat = new ParticleStorageMaterial();\n this.store_geometry_attribute_in_RT(new BufferAttribute(arr, 4), this.read, mat, attribute_writter_scene);\n }\n}\n\nexport { ParticlePositionAttribute };\n","import { DataTexture } from 'three';\n\nclass CustomDataTexture extends DataTexture\n{\n constructor(data, width, height, format, type)\n {\n super(data, width, height, format, type);\n this.multiplier = 1;\n }\n\n set_rgba(index, r, g, b, a)\n {\n this.data[index * 3 + 0] = r * this.multiplier;\n this.data[index * 3 + 1] = g * this.multiplier;\n this.data[index * 3 + 2] = b * this.multiplier;\n this.data[index * 3 + 3] = a * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_rgb(index, r, g, b)\n {\n this.data[index * 3 + 0] = r * this.multiplier;\n this.data[index * 3 + 1] = g * this.multiplier;\n this.data[index * 3 + 2] = b * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_r(index, value)\n {\n this.data[index * 3 + 0] = value * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_g(index, value)\n {\n this.data[index * 3 + 1] = value * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_b(index, value)\n {\n this.data[index * 3 + 2] = value * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_a(index, value)\n {\n this.data[index * 3 + 2] = value * this.multiplier;\n this.needsUpdate = true;\n }\n}\n\nexport { CustomDataTexture };\n","import { CustomDataTexture } from './CustomDataTexture';\nimport { RGBFormat } from 'three';\n\nclass RGBDataTexture extends CustomDataTexture\n{\n constructor(width, height)\n {\n const data = new Uint8Array(width * height * 3);\n super(data, width, height, RGBFormat);\n this.multiplier = 255;\n }\n}\n\nexport { RGBDataTexture };\n","import { CustomDataTexture } from './CustomDataTexture';\nimport { RGBAFormat } from 'three';\n\nclass RGBADataTexture extends CustomDataTexture\n{\n constructor(width, height)\n {\n const data = new Uint8Array(width * height * 4);\n super(data, width, height, RGBAFormat);\n this.multiplier = 255;\n }\n}\n\nexport { RGBADataTexture };\n","import { CustomDataTexture } from './CustomDataTexture';\nimport { FloatType } from 'three';\nimport { RGBFormat } from 'three';\n\nclass RGBFloatDataTexture extends CustomDataTexture\n{\n constructor(width, height)\n {\n const data = new Float32Array(width * height * 3);\n super(data, width, height, RGBFormat, FloatType);\n }\n}\n\nexport { RGBFloatDataTexture };\n","import { CustomDataTexture } from './CustomDataTexture';\nimport { FloatType } from 'three';\nimport { RGBAFormat } from 'three';\n\nclass RGBAFloatDataTexture extends CustomDataTexture\n{\n constructor(width, height)\n {\n const data = new Float32Array(width * height * 4);\n super(data, width, height, RGBAFormat, FloatType);\n }\n}\n\nexport { RGBAFloatDataTexture };\n","import { Mesh } from 'three';\nimport { RGBDataTexture } from '../data_textures/RGBDataTexture';\nimport { RGBADataTexture } from '../data_textures/RGBADataTexture';\nimport { RGBFloatDataTexture } from '../data_textures/RGBFloatDataTexture';\nimport { RGBAFloatDataTexture } from '../data_textures/RGBAFloatDataTexture';\n\nclass BatchedMesh extends Mesh\n{\n constructor(id_table, geometry, material, max_texture_width)\n {\n super(geometry, material);\n\n this.id_table = id_table;\n this.batched_count = Object.keys(id_table).length;\n this.max_texture_width = max_texture_width;\n this.batch_width = this.batched_count % max_texture_width;\n this.batch_height = Math.ceil(this.batched_count / max_texture_width);\n }\n\n attach_rgb_texture(uniform_name)\n {\n this.material.uniforms[uniform_name].value = new RGBDataTexture(this.batch_width, this.batch_height);\n }\n\n attach_rgba_texture(uniform_name)\n {\n this.material.uniforms[uniform_name].value = new RGBADataTexture(this.batch_width, this.batch_height);\n }\n\n attach_rgb_float_texture(uniform_name)\n {\n this.material.uniforms[uniform_name].value = new RGBFloatDataTexture(this.batch_width, this.batch_height);\n }\n\n attach_rgba_float_texture(uniform_name)\n {\n this.material.uniforms[uniform_name].value = new RGBAFloatDataTexture(this.batch_width, this.batch_height);\n }\n\n get_mesh_index(name)\n {\n return this.id_table[name];\n }\n\n set_rgb_value(uniform_name, mesh_name, r, g, b)\n {\n this.material.uniforms[uniform_name].set_rgb(this.get_mesh_index(mesh_name), r, g, b);\n }\n\n set_rgba_value(uniform_name, mesh_name, r, g, b, a)\n {\n this.material.uniforms[uniform_name].set_rgba(this.get_mesh_index(mesh_name), r, g, b, a);\n }\n}\n\nexport { BatchedMesh };\n","import { BatchedMesh } from './BatchedMesh';\n\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\n\nimport { BufferAttribute } from 'three';\n\nclass MeshBatcher\n{\n batch(meshes, material)\n {\n const max_texture_width = 2048;\n // let texture_width = meshes.length % max_texture_width;\n // let texture_height = Math.ceil(meshes.length / max_texture_width);\n\n // console.log(\"Store count: \" + buffer_geometries.length + \", Texture size: \" +texture_width);\n\n const geometries = [];\n const id_table = {};\n\n const attr_mesh_id = [];\n\n for (let i = 0; i < meshes.length; i++)\n {\n const mesh = meshes[i];\n const vertex_count = mesh.geometry.getAttribute('position').count;\n\n for (let count = 0; count < vertex_count; count++)\n {\n attr_mesh_id.push(i);\n }\n\n geometries.push(mesh.geometry);\n\n if (id_table[mesh.name] === undefined)\n {\n id_table[mesh.name] = i;\n }\n else\n {\n console.error('Mesh name is duplicated when trying to merge meshes. Non-unique id error.', mesh.name, id_table);\n }\n }\n\n const buffer_geometry = BufferGeometryUtils.mergeBufferGeometries(geometries);\n\n const buffer_attribute = new BufferAttribute(new Float32Array(attr_mesh_id), 1);\n buffer_geometry.setAttribute('mesh_id', buffer_attribute);\n\n return this.create_batched_mesh(id_table, buffer_geometry, material, max_texture_width);\n }\n\n create_batched_mesh(id_table, buffer_geometry, material, max_texture_width)\n {\n return new BatchedMesh(id_table, buffer_geometry, material, max_texture_width);\n }\n}\n\nexport { MeshBatcher };\n","import { Audio as TAudio } from 'three';\nimport { PositionalAudio as TPositionalAudio } from 'three';\n\nclass AudioClip\n{\n constructor(buffer, loop = true, volume = 1, positional = false)\n {\n this.buffer = buffer;\n this.loop = loop;\n this.volume = volume;\n this.positional = positional;\n\n this.audio = undefined;\n }\n\n init(audio_listener)\n {\n if (this.positional)\n {\n this.audio = new TPositionalAudio(audio_listener);\n }\n else\n {\n this.audio = new TAudio(audio_listener);\n }\n\n this.audio.setBuffer(this.buffer);\n this.audio.setLoop(this.loop);\n\n // This prevents undesired volume at the beginning of playing\n this.audio.gain.gain.value = 0;\n\n this.audio.setVolume(this.loop ? 0 : this.volume);\n }\n\n play()\n {\n this.audio.play();\n }\n\n pause()\n {\n this.audio.pause();\n }\n\n stop()\n {\n this.audio.stop();\n }\n\n get is_playing()\n {\n return this.audio.isPlaying;\n }\n}\n\nexport { AudioClip };\n","import { AudioContext } from 'three';\r\n\r\nimport { AudioClip } from '../components/AudioClip';\r\nimport { AbstractLoader } from './AbstractLoader';\r\n\r\nclass AudioLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, loop = true, volume = 0, size, positional = false)\r\n {\r\n super(resource_id, url, size);\r\n this.loop = loop;\r\n this.volume = volume;\r\n this.positional = positional;\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n // if (!window.user_interaction_for_audio)\r\n // {\r\n // setTimeout(this.on_preloaded_finished.bind(this, resource_container), 100);\r\n // }\r\n // else\r\n // {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.instantiate_audio(resource_container);\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n // }\r\n }\r\n\r\n instantiate_audio(resource_container)\r\n {\r\n const context = AudioContext.getContext();\r\n\r\n const buffer = context.createBuffer(2, 22050, 44100);\r\n\r\n fetch(this.url).then(r => r.blob()).then((response) =>\r\n {\r\n if (response.arrayBuffer)\r\n {\r\n response.arrayBuffer().then((array_buffer) =>\r\n {\r\n context.decodeAudioData(array_buffer, (audio_buffer) =>\r\n {\r\n resource_container.set_resource(\r\n this.resource_id,\r\n this.url,\r\n new AudioClip(audio_buffer, this.loop, this.volume, this.positional)\r\n );\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n });\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(\r\n this.resource_id,\r\n this.url,\r\n new AudioClip(buffer, this.loop, this.volume, this.positional)\r\n );\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport { AudioLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\n\n// import { sRGBEncoding } from 'three';\n\nclass BasisLoader extends AbstractLoader\n{\n constructor(resource_id, url, loader, size)\n {\n super(resource_id, url, size);\n\n this.loader = loader;\n }\n\n on_preloaded_finished(resource_container)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n this.loader.load(this.url, (basis) =>\n {\n // basis.encoding = sRGBEncoding;\n\n resource_container.set_resource(this.resource_id, this.url, basis);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // this.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n this.__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 this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n\nexport { BasisLoader };\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { CubeTextureLoader } from 'three';\r\n\r\nclass CubemapLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, extension, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new CubeTextureLoader();\r\n this.loader.setPath(url + '/');\r\n this.urls = [\r\n `px.${extension}`,\r\n `nx.${extension}`,\r\n `py.${extension}`,\r\n `ny.${extension}`,\r\n `pz.${extension}`,\r\n `nz.${extension}`\r\n ];\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.urls, (image) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, image);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__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 // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (error) =>\r\n {\r\n this.__set_error('Image could not be loaded. Maybe wrong name or path, I don\\'t know' + '¯\\\\_(ツ)_/¯', error);\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { CubemapLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { ColladaLoader } from 'three/examples/jsm/loaders/ColladaLoader.js';\r\n\r\nclass 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 ColladaLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, gltf);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__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 // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__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 this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { DAELoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { FileLoader as TFileLoader } from 'three';\r\n\r\nclass 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 TFileLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (file) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, file);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__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 // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg);\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { FileLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\n\nimport { FontLoader as TFontLoader } from 'three/examples/jsm/loaders/FontLoader.js';\n\nclass 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 if (resource_container.resources_by_url[this.url] === undefined)\n {\n this.loader.load(this.url, (font) =>\n {\n resource_container.set_resource(this.resource_id, this.url, font);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // this.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n this.__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 this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n\nexport { FontLoader };\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { GLTFLoader as TGLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';\r\n\r\nclass 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 TGLTFLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, gltf);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__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 // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__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 this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { GLTFLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';\r\n\r\nclass GLTFDRACOLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, loader, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new GLTFLoader();\r\n\r\n this.loader.setDRACOLoader(loader);\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, gltf);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__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 // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__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 this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { GLTFDRACOLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { HDRCubeTextureLoader as THDRCubeTextureLoader } from 'three/examples/jsm/loaders/HDRCubeTextureLoader.js';\r\nimport { UnsignedByteType } from 'three';\r\n\r\nclass 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 THDRCubeTextureLoader();\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 if (resource_container.resources_by_url[this.url] === undefined)\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(this.resource_id, this.url, hdr);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__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 // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__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 this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { HDRCubeTextureLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\n\nclass JSONLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n }\n\n on_preloaded_finished(resource_container, response)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n response.json().then((json) =>\n {\n resource_container.set_resource(this.resource_id, this.url, json);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n\nexport { JSONLoader };\n","import { AbstractLoader } from './AbstractLoader';\n\nimport { OBJLoader as TOBJLoader } from 'three/examples/jsm/loaders/OBJLoader.js';\n\nclass OBJLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n this.loader = new TOBJLoader();\n }\n\n on_preloaded_finished(resource_container)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n this.loader.load(this.url, (obj) =>\n {\n resource_container.set_resource(this.resource_id, this.url, obj);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // this.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n this.__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 this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n\nexport { OBJLoader };\n","import { AbstractLoader } from './AbstractLoader';\n\nimport { Vector3 } from 'three';\nimport { FileLoader } from 'three';\n\nclass PointArrayLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n this.loader = new FileLoader();\n }\n\n on_preloaded_finished(resource_container)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n this.loader.load(this.url, (text) =>\n {\n resource_container.set_resource(this.resource_id, this.url, this.parse_path(text));\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // this.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n this.__set_error(msg);\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n\n parse_path(raw_data)\n {\n const string_array = raw_data.split('\\n');\n\n if (string_array[string_array.length - 1] === '')\n {\n string_array.pop();\n }\n\n const positions = [];\n\n for (let i = 0; i < string_array.length; i += 3)\n {\n const x = parseFloat(string_array[i + 0]);\n const y = parseFloat(string_array[i + 1]);\n const z = parseFloat(string_array[i + 2]);\n positions.push(new Vector3(x, y, z));\n }\n return positions;\n // let curve = new THREE.CatmullRomCurve3(positions);\n // return curve.getPoints(100);\n }\n}\n\nexport { PointArrayLoader };\n","import { AbstractLoader } from './AbstractLoader';\n\nimport { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js';\n\nclass RGBETextureLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n this.loader = new RGBELoader();\n }\n\n on_preloaded_finished(resource_container)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n this.loader.load(this.url, (hdr) =>\n {\n resource_container.set_resource(this.resource_id, this.url, hdr);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // this.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n this.__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 this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n\nexport { RGBETextureLoader };\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { FileLoader as TFileLoader } from 'three';\r\n\r\nclass 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 TFileLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, gltf);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__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 // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg);\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { TextLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { Texture } from 'three';\r\nimport { Browser } from '../Browser';\r\n\r\nclass AsyncTextureLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (Browser.is_safari && Browser.version < 15)\r\n {\r\n this.load_with_old_method(resource_container);\r\n }\r\n else\r\n {\r\n this.load_with_new_method(resource_container);\r\n }\r\n }\r\n\r\n load_with_old_method(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n const texture = new Texture();\r\n const image = new Image();\r\n\r\n image.src = this.url;\r\n\r\n image.onload = () =>\r\n {\r\n texture.image = image;\r\n texture.needsUpdate = true;\r\n\r\n resource_container.set_resource(this.resource_id, this.url, texture);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n };\r\n\r\n image.onerror = () =>\r\n {\r\n console.error('Error loading texture. Maybe the resource is not an image?', this.url, this.original_url);\r\n };\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n\r\n load_with_new_method(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n const fetchOptions = {};\r\n fetchOptions.credentials = 'same-origin';\r\n // fetchOptions.headers = this.requestHeader;\r\n\r\n fetch(this.url, fetchOptions).then((res) =>\r\n {\r\n return res.blob();\r\n }).then((blob) =>\r\n {\r\n return createImageBitmap(blob, { colorSpaceConversion: 'none' });\r\n }).then((imageBitmap) =>\r\n {\r\n const texture = new Texture(imageBitmap);\r\n texture.needsUpdate = true;\r\n\r\n resource_container.set_resource(this.resource_id, this.url, texture);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }).catch(function(e)\r\n {\r\n console.error(e);\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { AsyncTextureLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { Texture } from 'three';\r\n\r\nclass TextureLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n }\r\n\r\n on_preloaded_finished(resource_container, response)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n response.blob().then((blob) =>\r\n {\r\n const texture = new Texture();\r\n\r\n const url = URL.createObjectURL(blob);\r\n\r\n const image = new Image();\r\n image.src = url;\r\n\r\n image.onload = () =>\r\n {\r\n texture.image = image;\r\n texture.needsUpdate = true;\r\n\r\n resource_container.set_resource(this.resource_id, this.url, texture);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n };\r\n\r\n image.onerror = () =>\r\n {\r\n console.error('Error loading texture. Maybe the resource is not an image?', this.url);\r\n };\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { TextureLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\n\nclass VideoLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n }\n\n on_preloaded_finished(resource_container, response)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n response.blob().then((blob) =>\n {\n resource_container.set_resource(this.resource_id, this.url, URL.createObjectURL(blob));\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n\nexport { VideoLoader };\n","import { ResourceContainer } from '../ResourceContainer';\r\n\r\nclass ResourceBatch\r\n{\r\n constructor(batch_name)\r\n {\r\n this.resource_loaders = [];\r\n this.batch_name = batch_name || 'unnamed batch';\r\n }\r\n\r\n add_loader(loader)\r\n {\r\n this.resource_loaders.push(loader);\r\n }\r\n\r\n load(resource_container)\r\n {\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n this.resource_loaders[i].load(resource_container || ResourceContainer);\r\n }\r\n }\r\n\r\n get loading_finished()\r\n {\r\n let finished = true;\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n finished = finished && this.resource_loaders[i].has_finished;\r\n }\r\n return finished;\r\n }\r\n\r\n get has_errors()\r\n {\r\n let has_error = false;\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n has_error = has_error || this.resource_loaders[i].has_error;\r\n }\r\n return has_error;\r\n }\r\n\r\n print_errors()\r\n {\r\n console.error('Batch <' + this.batch_name + '> could not load successfully');\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n if (this.resource_loaders[i].has_error)\r\n {\r\n this.resource_loaders[i].print_error();\r\n }\r\n }\r\n }\r\n\r\n get_progress()\r\n {\r\n return this.get_loaded_bytes() / this.get_total_bytes();\r\n }\r\n\r\n get_loaded_bytes()\r\n {\r\n let loaded_bytes = 1;\r\n\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n loaded_bytes += this.resource_loaders[i].loaded_bytes;\r\n }\r\n\r\n return loaded_bytes;\r\n }\r\n\r\n get_total_bytes()\r\n {\r\n let total_bytes = 1;\r\n\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n total_bytes += this.resource_loaders[i].total_bytes;\r\n }\r\n\r\n return total_bytes;\r\n }\r\n}\r\n\r\nexport { ResourceBatch };\r\n"],"names":["browser","init","this","browser_name","agent","window","navigator","userAgent","toLowerCase","indexOf","opr","chrome","version","get_version","name","is_safari","is_chrome","is_edge","is_edge_chromium","has_webm","is_firefox","has_hvec","preferred_video_extension","ua","tem","M","match","test","exec","slice","join","replace","appName","appVersion","splice","Number","split","Validation","constructor","static","n","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","undefined","resources_by_url","cache","Browser","fetch","method","mode","credentials","redirect","then","on_progress","bind","catch","__on_error","set_resource","async","response","response_clone","clone","reader","body","getReader","contentLength","headers","get","receivedLength","done","value","read","length","on_preloaded_finished","data","OMath","from_range_start_value","from_range_end_value","to_range_start_value","to_range_end_value","min","max","number","divisor","rgb","r","Math","round","toString","g","b","points","plane","projected_point","Vector3","points_on_plane","i","projectPoint","push","from","to","target","t","elements","lerp","x1","x2","abs","x","y","m","euclideanModulo","degrees","PI","radians","v","w","z","center","add","multiplyScalar","arr","col","floor","random","clamp","ActionSequencer","context","elapsed_time","playback_speed","__get_playback_speed","playing","action_events","initial_context","stringify","tmp_t","channels","channel_names","Object","keys","duration","play","stop","reset","skip","get_duration","__play_clips","update","delta_time","set_progress","time","set_normalized_progress","get_progress","is_finished","add_action_event","trigger_time","action","add_action_interpolator","interpolator","use_dynamic_from_value","keyframes","attribute_name","keyframe","get_current_target_value","__get_current_keyframe","evaluate","get_current_starting_value","get_current_progress","__linear_map_01","easing_function","EPSILON","trigger","evaluate_keyframe","get_keyframes","channel_name","is_channel_redefined","initial","saturate","current","Infinity","distance","transitions_velocity","URLSearchParams","location","search","EasingFunctions","cos","sin","pow","sqrt","c4","ease_out_bounce","n1","d1","sign","ActionInterpolator","NumberInterpolator","super","view_context","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","trigger_name","trigger_method","at_time","value_data","to_value","from_time","to_time","sort","a","x_pos","ActionSequencerBuilder","default_state_data","from_animation_sheet","animation_data","current_context","tracks","initial_tracks","state_to_tracks","get_longest_time","find","element","sequencer","action_event","state","longest_time","from_draw_io","xml","transition_data","track_time","event_manager","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","EventManager","get_resource","HTMLUtilities","container","images","image","dataset","src","image_objects","image_object","videos","video","TransitionTable","transitions","from_state_name","to_state_name","add_transitions","set_transitions","set_default_state_data","delta_buffer","___time","Clock","__raw_delta_time","__elapsed_time","__allocated_time","Vector2","shader_time","__update","getDelta","getElapsedTime","shift","__calculate_delta_time","ViewState","start","show","hide","before_enter","on_enter","update_enter_transition","global_view_data","transition_progress","action_sequencer","update_transition","update_exit_transition","before_exit","on_exit","ViewStateTransitionHandler","transition_table","last_state","current_state","current_state_data","transitioning","go_to_state","__exit_last_state","__update_transitions","set_state","assign","Time","view_manager","views","transition_handler","view_change_subscribers","browser_title_suffix","__set_views_opacities","go_to_view","view_name","change_url","__change_browser_url","__change_browser_title","notify_view_change","go_to_scene","scene_name","next_view","transition_view","set_next_view","subscribe_to_view_change","subscriber","on_view_change","register_view","view","has_view","set_view","set_browser_title_suffix","title_suffix","get_current_view","get_view_by_name","get_view_by_url","get_by_url","history","pushState","title","__capitalize","document","set_opacity","string","aux_string","toUpperCase","__snake_to_whitespace","group","ApplicationView","ResourceContainer","ViewManager","classList","remove","load_html_images","load_images","load_html_videos","load_videos","style","opacity","BaseApplication","on_post_start","on_post_render","on_pre_render","on_frame_end","BaseRender","render","renderer","resize","dispose","BaseShaderMaterial","ShaderMaterial","vert","frag","uniforms","vertexShader","basic_vert","fragmentShader","basic_frag","_Color","Color","BlitMaterial","frag_shader","vert_shader","defines","_MainTex","_Resolution","_TargetResolution","depthWrite","blending","NoBlending","depthTest","depthFunc","AlwaysDepth","AddMaterial","nMips","_SecondTex","set_add_texture","tex","UnrealBloomComposeMaterial","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","set_tint_color_1","set_tint_color_2","set_tint_color_3","set_tint_color_4","camera_manager","_current","_spectator","camera","spectator","capabilities","max_anisotropy","vertex_texture_sampler_available","fp_textures_available","CanvasDrawer","uses_dynamic_font","__textHeight","canvas","createElement","ctx","getContext","getFontHeight","fontStyle","getElementsByTagName","dummy","dummyText","createTextNode","appendChild","setAttribute","offsetHeight","removeChild","get_text_size","text","font","ceil","measureText","width","draw_canvas","ctxOptions","font_color","__draw","draw_on_texture","canvas_texture","CanvasTexture","UVMapping","ClampToEdgeWrapping","NearestFilter","generateMipMaps","needsUpdate","roundRect","height","radius","fill","stroke","tl","tr","br","bl","defaultRadius","side","beginPath","moveTo","lineTo","quadraticCurveTo","closePath","configuration","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","ease_in_out_cubic","animate","AxisHelper","Object3D","scale","blue_points","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","scene_manager","Scene","add_scene","scene","traverse","child","geometry","material","children","Cube","Mesh","segments","BoxGeometry","MeshBasicMaterial","Sphere","SphereBufferGeometry","Arrow","dir","cylinder_height","cylinder_geo","CylinderBufferGeometry","translate","cone_geometry","ConeBufferGeometry","cone_height","buffer_geometry","BufferGeometryUtils","mergeBufferGeometries","rotateX","quaternion","setFromUnitVectors","_dir","oscreen","position","render_width","render_height","width_height","pixel_size","update_position","size_changed","update_size","apply_pixel_density_v2","vector2","apply_pixel_density","get_pixel_size","aspect_ratio","portrait","ScreenSpaceTextureMaterial","h","_ScreenSpacePosition","_ScreenSize","_TextureSize","set_position","set_texture","set_screen_size","PerspectiveCamera","TPerspectiveCamera","fov","aspect","near","far","clear_color","clear_alpha","copy","debug","Vector3_one","Vector3_zero","canvas_renderer","display_texture_meshes","draw_arrow","origin","arrow","normalize","SceneManager","draw_axis","axis","set_debug_RT","RT","rt_debug","draw_rectangle","position_2d","fillStyle","fillRect","clear","clearRect","draw_line_2D","strokeStyle","draw_line","line","frustumCulled","draw_cube","pos","cube","draw_oriented_cube","depth","distanceTo","sub","forward_dir","draw_plane","PlaneGeometry","Vector4","basic_color_vert","basic_color_frag","transparent","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","OScreen","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","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","xr_enabled","WebGLRenderer","xr","enabled","autoClear","setPixelRatio","Configuration","extensions","domElement","Capabilities","getMaxAnisotropy","maxVertexTextures","is_floating_point_texture_available","resize_observer","ResizeObserver","on_resize","observe","dom_element","depth_normals_RT","new_state","__update_current_camera","updateProjectionMatrix","updateMatrix","updateMatrixWorld","override_mat","__apply_override_material","render_scene","overrideMaterial","readback_RT","buffer","readRenderTargetPixels","clear_stencil","setClearColor","entries","entry","contentRect","setViewport","src_RT","take_screenshot","blob_callback","old_width","old_height","new_width","new_height","tile_width","tile_height","divisions_x","parseInt","divisions_y","old_dpr","getPixelRatio","ctx_2D","setViewOffset","drawImage","toBlob","clearViewOffset","download_screenshot","blob","link","download","href","URL","createObjectURL","click","onclick","requestAnimationFrame","revokeObjectURL","removeAttribute","minFilter","magFilter","format","RGBAFormat","encoding","LinearEncoding","type","FloatType","stencilBuffer","depthBuffer","output","Float32Array","NormalMaterial","DebugNormalsRender","Graphics","KeyboardInput","ctrlz_pressed","ctrlz_fired","keys_keys","addEventListener","on_key_down","on_key_up","keyCode","ctrlKey","key","press_key","release_key","pressed","released","key_name","fired","down","release_keys","is_key_pressed","is_key_down","is_key_released","register_key","unregister_key","removeEventListener","input","InputController","clicked","captured_NDC","current_NDC_delta","keyboard","keyboard_input_container","left_mouse_button_pressed","NDC","left_mouse_button_down","NDC_delta","left_mouse_button_released","os","operating_systems","ANDROID","IOS","LINUX","MAC","WINDOWS","is_mobile","is_ipad","maxTouchPoints","is_ios","is_android","get_os","is_linux","is_mac","is_windows","platform","reflection_plane_context","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","get_mesh","v3","v4","Uint8Array","DataTexture","RGBFormat","dst_texture","one_pixel_text","geometry_batcher","batches","batch","buffer_geometries","attr_accessor_uvs","texture_width","ceilPowerOfTwo","__init_uv_array","uv_index","vertex_count","count","buffer_attribute","BufferAttribute","uvs","ui","ui_elements","_tmp_normalized_pos","ss_scene","matrixWorldAutoUpdate","ws_scene","ss_camera","delete_element","elem","add_screen_space_element","set_screen_space_coordinate_system","add_world_space_element","set_world_space_coordinate_system","Input","update_state","current_clicked_element","camera_utilities","tmp_mat","Matrix4","Plane","ray","Ray","tmp_size","tmp_unproj","get_up_dir","tmp_vec","applyQuaternion","get_forward_dir","get_right_dir","unproject_mouse_position","v_fov","h_fov","atan","tan","distV","distH","get_plane_intersection","plane_position","plane_normal","setFromNormalAndCoplanarPoint","isPerspectiveCamera","unproject","intersectPlane","fit_points_on_camera","zoom_scale","world_space_center","camera_forward","project_points_on_plane","projected_points_center","getCenter","up","right","cross","inverse_mat","getInverse","applyMatrix4","projected_center","get_zoom_to_fit_rect","get_zoom_to_fit_box","isOrthographicCamera","obj_x","obj_y","object_aspect","get_html_screen_pos","object","getWorldPosition","project","world_pos_to_screen","update_projection","left","top","bottom","initializer","app_container","CameraUtilities","GeometryBatcher","OS","ReflectionPlaneContext","UI","Debug","render_loop","SSAOMaterial","_InverseProjMatrix","_ProjectionMatrix","_Bias","_Radius","_SampleKernel","__get_sample_kernel","_RandomRotation","__get_rotation_kernel","sample_kernel","rotation_kernel","rotation_texture","wrapS","RepeatWrapping","wrapT","SSAOComposeMaterial","_AO","DisplayNormalTextureMaterial","depth_normals_vert","BoxBlurMaterial","_SampleDir","Blurrer","RT1","RT2","box_blur_mat","blur","NormalAORender","ssao_mat","ssao_compose_mat","debug_normals","ssaa","use_ssaa","main_RT","SSAO_RT","blurrer","__check_RT_size","__update_uniforms","projectionMatrix","NormalRender","VRRender","render_spectator_camera","spectator_camera","isPresenting","xrCam","getCamera","currentRenderTarget","GaussianBlurMaterial","kernel_radius","KERNEL_RADIUS","SIGMA","texSize","direction","set_size","set_direction","LuminosityHighPassMaterial","luminosityThreshold","smoothWidth","defaultColor","defaultOpacity","GaussianBlurrer","current_width","current_height","separableBlurMaterials","renderTargetsHorizontal","renderTargetsVertical","kernelSizeArray","rt_pars","LinearFilter","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","TOrthographicCamera","view_component_manager","components","enabled_components","Set","__set_components_opacities","component","register_component","enable_component","disable_component","delete","get_component_by_name","component_name","RenderLoop","target_application","is_running","frames_passed","ViewComponentManager","setAnimationLoop","screen","SimpleTextDrawer","text_margin","text_size","globalAlpha","textBaseline","textAlign","fillText","ViewComponent","hidden","toggle_hidden","HorizontalPlane","VerticalPlane","ArrayUtilities","source","apply","array","items_left_count","closest_point","closest_distance","obj","ids","FrustumPointFitter","fit_points","camera_quaternion","vertical_fov","degToRad","up_plane_normal","get_up_plane_normal","down_plane_normal","get_down_plane_normal","left_plane_normal","get_left_plane_normal","right_plane_normal","get_right_plane_normal","camera_forward_dir","sphere_center","pull_back_distance","get_distance_to_fit_rect","far_pos","up_plane","down_plane","left_plane","right_plane","apply_center_correction_to_pos","inverse_dir","Line3","up_line_intersection","down_line_intersection","left_line_intersection","right_line_intersection","intersectLine","log","new_up_distance","new_down_distance","new_left_distance","new_right_distance","vertical_min","horizontal_min","forward_correction","target_pos","vertical_offset","get_vertical_correction","horizontal_offset","get_hozirontal_correction","closest_up_point","closest_down_point","closest_distance_to_up_plane","closest_distance_to_down_plane","up_dir","down_line","up_line","down_dist","up_dist","correction","closest_right_point","closest_left_point","closest_distance_to_right_plane","closest_distance_to_left_plane","right_dir","left_line","right_line","left_dist","right_dist","Quaternion","setFromAxisAngle","GeometryUtilities","geometry_buffer","indices","positions","vertices","getX","getY","getZ","add_barycentric_attribute","non_indexed_geometry_buffer","bar_coordinates","ImageUtilities","getImageData","imagedata","mesh_sampler","sample","sample_count","face_areas","min_area","normals","tangents","faces","index_0","index_1","index_2","v1","v2","face","c","n2","n3","normal","tangent","uv_a","uv_b","uv_c","area","get_face_area","normalized_faces_array","get_uniform_face_distribution","selected_faces","select_random_faces","sample_data_from_faces","sampled_points","sampled_normals","sampled_tangents","sampled_uvs","w1","w2","sample_point_in_face","amount","selected_face","minimum_area","extended_triangle_indices","repetitions_needed","j","vec1","vec2","w3","model_utilities","result_callback","fromGeometry","get_geometries","geometries","assign_material","clone_animated_gltf","gltf","animations","skinnedMeshes","isSkinnedMesh","cloneBones","cloneSkinnedMeshes","isBone","skeleton","cloneSkinnedMesh","orderedCloneBones","bones","cloneBone","Skeleton","boneInverses","matrixWorld","set_shadow_config","cast","receive","castShadow","receiveShadow","__find_object","get_object","get_object_by_type","object_type","ObjectUtilities","item","Array","isArray","sources","is_object","merge_deep","nodeType","attributes","attribute","nodeName","nodeValue","hasChildNodes","childNodes","xml_to_json","old","StringUtilities","hexValues","hex","words","substr","charAt","TimeUtilities","time_str_to_ms","time_str","hours","minutes","seconds","PerspectiveFrustumPointFitter","get_horizontal_correction","OrthographicFrustumPointFitter","inverse_camera_quat","inverse","inverted_points","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","current_scale","computeBoundingBox","tmp_bb_size","boundingBox","update_texture","img","screen_aligned","boolean","Text2D","is_static","simple_text_drawer","draw_settings","LinearMipMapLinearFilter","UIElementMaterial","intensity","_PixelOffset","_NDC","_PivotPoint","_DepthOffset","ScreenSpacePosition","get_pos_NDC","WorldSpacePosition","tmp_vec3","tmp_vec2","UIElementState","ui_element","normalized_mouse_position","OnIdle","is_mouse_over","_on_enter_state","OnMouseEnter","on_mouse_enter","_on_hover_state","_on_exit_state","OnMouseExit","on_mouse_exit","_on_idle_state","OnMouseHover","__trigger_on_hover","on_mouse_hover","UIElement","is_clickable","position_strategy","_position","on_hover","mouse_pos_tmp","cached_NDC_position","screen_pos_tmp","texture_size","matrixAutoUpdate","pixel_offset","set_render_order","pivot_point","set_pixel_offset","use_depth","depth_offset","clear_state","visible","get_size","normalized_mouse_pos","to_screen_position","rect","Box2","containsPoint","projected_pos","get_screen_space_position","set_screen_space_position","screen_pos","UpdatableMaterialMesh","self","onBeforeRender","TextGlyph","plane_bounds","atlas_bounds","SDFText","glyph_layout","glyphs","glyph_is_dirty","matrix_is_dirty","color_is_dirty","matrix","__opacity","__text","__generate_glyphs","update_matrix","compose","clear_glyph_dirty","clear_color_dirty","set_rotation","tilt","new_orientation","new_tilt","multiply","set_color","set_pivot","update_glyphs","op","cursor","unicode","charCodeAt","glyph","planeBounds","text_glyph","atlasBounds","advance","box2","first_glyph","union","box2_size","SDFTextMaterial","_Texture","_Boldness","_AtlasSize","set_atlas_size","set_boldness","SDFTextBatch","font_layout","atlas_texture","instanced_geometry","InstancedBufferGeometry","instanceCount","Float32BufferAttribute","transformsCol0","InstancedBufferAttribute","max_allocations","transformsCol1","transformsCol2","transformsCol3","glyph_bounds","usage","DynamicDrawUsage","text_elements","atlas","add_text","text_str","remove_text","text_elem","remove_elem","force_update","glyph_bounds_atr","plane_bounds_atr","color_atr","matrix_needs_update","glyph_needs_update","color_needs_update","glyph_count","glyph_i","buffer_i","setXYZW","VectorInterpolator","tmp","MedianFilterMaterial","kernel3x3","_SourceTex","_SourceTexSize","isVideoTexture","videoWidth","videoHeight","isTexture","MedianFilter","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","ParticleAttribute","attr_name","update_material","write","init_from_geometry","init_from_attribute","particle_attribute","build_RT","particle_count","resolution","calculate_resolution","HalfFloatType","swap_RT","attribute_writter_scene","store_geometry_attribute_in_RT","storage_material","deleteAttribute","get_texture","GPUParticleSystem","build_point_mesh","attribute_writter_mesh","build_attribute_writter_mesh","add_texture_attribute","add_update_attribute_array","item_size","add_attribute_array","instance_count","geo","instanced_geo","build_uv_storage_attribute","Points","ParticleStorageMaterial","ParticlePositionAttribute","store_geometry","pos_attr","store_positions","CustomDataTexture","multiplier","set_rgba","set_rgb","set_r","set_g","set_b","set_a","RGBDataTexture","RGBADataTexture","RGBFloatDataTexture","RGBAFloatDataTexture","BatchedMesh","id_table","max_texture_width","batched_count","batch_height","attach_rgb_texture","attach_rgba_texture","attach_rgb_float_texture","attach_rgba_float_texture","get_mesh_index","set_rgb_value","mesh_name","set_rgba_value","MeshBatcher","meshes","attr_mesh_id","create_batched_mesh","AudioClip","loop","volume","positional","audio","audio_listener","TPositionalAudio","TAudio","setBuffer","setLoop","gain","setVolume","pause","is_playing","isPlaying","AudioLoader","instantiate_audio","AudioContext","createBuffer","arrayBuffer","array_buffer","decodeAudioData","audio_buffer","BasisLoader","loader","basis","xhr","msg","CubemapLoader","extension","CubeTextureLoader","setPath","urls","DAELoader","ColladaLoader","FileLoader","TFileLoader","file","FontLoader","TFontLoader","GLTFLoader","TGLTFLoader","GLTFDRACOLoader","setDRACOLoader","HDRCubeTextureLoader","THDRCubeTextureLoader","url_suffix","setDataType","UnsignedByteType","hdr","JSONLoader","OBJLoader","TOBJLoader","PointArrayLoader","parse_path","raw_data","string_array","pop","RGBETextureLoader","RGBELoader","TextLoader","AsyncTextureLoader","load_with_old_method","load_with_new_method","Texture","Image","onload","onerror","original_url","fetchOptions","res","createImageBitmap","colorSpaceConversion","imageBitmap","TextureLoader","VideoLoader","ResourceBatch","batch_name","resource_loaders","add_loader","loading_finished","finished","has_errors","print_errors","get_loaded_bytes","get_total_bytes"],"mappings":"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"}