ohzi-core 9.1.0 → 9.3.0
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/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/UnrealBloomComposeMaterial.js","../src/materials/AddMaterial.js","../src/materials/GaussianBlurMaterial.js","../src/materials/LuminosityHighPassMaterial.js","../src/render_utilities/GaussianBlurrer.js","../src/render_mode/UnrealBloomRender.js","../src/OrthographicCamera.js","../src/view_components/ViewComponentManager.js","../src/RenderLoop.js","../src/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\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\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","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/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","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/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 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\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 (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\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","[object Object]","this","browser_name","agent","window","navigator","userAgent","toLowerCase","indexOf","opr","chrome","name","is_safari","is_chrome","is_edge","is_edge_chromium","has_webm","is_firefox","has_hvec","preferred_video_extension","Validation","n","Number","is_int","is_float","str","JSON","parse","e","AbstractLoader","resource_id","url","size","loaded_bytes","total_bytes","has_finished","has_error","error_message","loaded","total","is_number","console","warn","message","error","resource_container","undefined","resources_by_url","cache","Browser","fetch","method","mode","credentials","redirect","then","on_progress","bind","catch","__on_error","set_resource","__update_downloaded_bytes","__loading_ended","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","get_duration","__play_clips","delta_time","time","trigger_time","action","interpolator","use_dynamic_from_value","keyframes","attribute_name","keyframe","__get_current_keyframe","evaluate","__linear_map_01","easing_function","EPSILON","trigger","evaluate_keyframe","channel_name","initial","saturate","current","Infinity","distance","EasingFunctions","cos","sin","pow","sqrt","c4","ease_out_bounce","n1","d1","sign","ActionInterpolator","NumberInterpolator","super","view_context","app","ActionEvent","ViewContext","DrawIOAnimationSheet","xml_document","animation_nodes","DOMParser","parseFromString","querySelectorAll","animation_tracks","triggers","node","parent_node","parentElement","getAttribute","get_node_x_position","parseFloat","includes","split_data","split","trigger_name","trigger_method","at_time","value_data","to_value","from_time","to_time","sort","a","x_pos","ActionSequencerBuilder","default_state_data","animation_data","current_context","tracks","initial_tracks","state_to_tracks","get_longest_time","find","element","sequencer","add_action_interpolator","action_event","add_action_event","state","longest_time","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","event","payload","callback","zoom","fire","store_id","hit_data","step_number","step_index","resource","service","unit_data","floor_id","resources","EventManager","fire_resource_loaded","HTMLUtilities","container","images","image","dataset","src","image_objects","image_object","videos","video","TransitionTable","transitions","from_state_name","to_state_name","from_animation_sheet","delta_buffer","___time","Clock","__raw_delta_time","__elapsed_time","__allocated_time","Vector2","shader_time","getDelta","getElapsedTime","shift","__calculate_delta_time","ViewState","global_view_data","transition_progress","action_sequencer","update_transition","ViewStateTransitionHandler","transition_table","last_state","current_state","current_state_data","transitioning","skip","__exit_last_state","before_exit","show","before_enter","play","update","__update_transitions","is_finished","on_enter","assign","Time","update_exit_transition","get_progress","update_enter_transition","hide","on_exit","view_manager","views","transition_handler","view_change_subscribers","browser_title_suffix","__set_views_opacities","view_name","change_url","go_to_state","__change_browser_url","__change_browser_title","notify_view_change","scene_name","next_view","transition_view","set_next_view","go_to_view","subscriber","on_view_change","view","add_transitions","set_transitions","set_state","title_suffix","get_by_url","set_default_state_data","history","pushState","title","__capitalize","document","set_opacity","string","aux_string","toUpperCase","replace","__snake_to_whitespace","group","ApplicationView","ResourceContainer","ViewManager","register_view","classList","remove","load_images","load_videos","style","opacity","BaseApplication","BaseRender","renderer","BaseShaderMaterial","ShaderMaterial","vert","frag","uniforms","vertexShader","basic_vert","fragmentShader","basic_frag","_Color","Color","BlitMaterial","frag_shader","vert_shader","defines","_MainTex","_Resolution","_TargetResolution","depthWrite","blending","NoBlending","depthTest","depthFunc","AlwaysDepth","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","fontStyle","getElementsByTagName","dummy","dummyText","createTextNode","appendChild","setAttribute","offsetHeight","removeChild","text","font","ceil","measureText","width","getFontHeight","ctxOptions","font_color","__draw","draw_canvas","canvas_texture","CanvasTexture","UVMapping","ClampToEdgeWrapping","NearestFilter","generateMipMaps","needsUpdate","height","radius","fill","stroke","tl","tr","br","bl","defaultRadius","side","beginPath","moveTo","lineTo","quadraticCurveTo","closePath","configuration","parameters","dpr","json","Idle","is_animating","Animating","easing_function_t","animator","set_property_value","set_current_state","finished_callback","CSSAnimator","css_property","value_prefix","value_suffix","ease_in_out_cubic","AxisHelper","Object3D","scale","blue_points","blue_axis_mat","LineBasicMaterial","color","blue_axis_geo","BufferGeometry","setFromPoints","blue_axis_line","Line","renderOrder","green_points","green_axis_mat","green_axis_geo","green_axis_line","red_points","red_axis_mat","red_axis_geo","red_axis_line","set","scene_manager","Scene","scene","traverse","child","geometry","dispose","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","size_changed","vector2","aspect_ratio","portrait","ScreenSpaceTextureMaterial","h","_ScreenSpacePosition","_ScreenSize","_TextureSize","tex","PerspectiveCamera","TPerspectiveCamera","fov","aspect","near","far","clear_color","clear_alpha","copy","debug","Vector3_one","Vector3_zero","canvas_renderer","display_texture_meshes","origin","arrow","normalize","SceneManager","axis","RT","rt_debug","position_2d","fillStyle","fillRect","clearRect","strokeStyle","line","frustumCulled","pos","cube","depth","distanceTo","sub","forward_dir","PlaneGeometry","Vector4","basic_color_vert","basic_color_frag","transparent","box","Box3","setFromCenterAndSize","helper","Box3Helper","sphere","input_points","open","catmull","CatmullRomCurve3","updateArcLengths","getSpacedPoints","draw_line","SphereGeometry","sphere_mesh","sphere1","bb","curve","options","offset","mesh","set_texture","graphics","set_screen_size","OScreen","render","ClearDepthNormalMaterial","clear_depth","clear_normal","_DepthNormal","DepthNormalMaterial","_FarPlane","far_plane","DepthAndNormalsRenderer","WebGLRenderTarget","clear_depth_normal_mat","depth_normal_material","__resize_RT_if_necessary","clear","blit_clear_with_material","CameraManager","setSize","render_target","Blitter","_blit_scene","_blit_material","_blit_quad","_blit_camera","OrthographicCamera","dst","src_texture","isWebGLRenderTarget","texture","src_width","src_height","getSize","__render","mat","dst_RT","current_rt","getRenderTarget","setRenderTarget","context_attributes","_renderer","blitter","no_render","current_render_mode","generateDepthNormalTexture","depth_and_normals_renderer","is_webgl2","canvas_context","alpha","desynchronized","stencil","antialias","premultipliedAlpha","preserveDrawingBuffer","powerPreference","logarithmicDepthBuffer","force_webgl2","xr_enabled","constructor","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","on_pre_render","on_post_render","overrideMaterial","buffer","readRenderTargetPixels","clear_stencil","setClearColor","entries","entry","update_position","contentRect","update_size","setViewport","material_pass","src_RT","blit_with_material","blit","blob_callback","old_width","old_height","new_width","new_height","tile_width","tile_height","divisions_x","parseInt","divisions_y","old_dpr","getPixelRatio","ctx_2D","setViewOffset","drawImage","toBlob","clearViewOffset","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","removeEventListener","input","InputController","clicked","captured_NDC","current_NDC_delta","keyboard","keyboard_input_container","init","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","match","is_ipad","maxTouchPoints","is_ios","is_android","get_os","is_linux","is_mac","is_windows","platform","test","reflection_plane_context","target_geometry","target_position","GeometryBatch","batch_width","data_textures","object_names","zero_offset","write_offset","uniform_dirty_count","tmp_uploaded_data_count","uniform_name","default_value_v3","src_tex","__create_rgb_texture","dst_tex","one_pixel_tex","new_data_tex","__add_data_texture","__flood_data_texture_rgb","default_value_v4","__create_rgba_texture","__flood_data_texture_rgba","__create_rgba_float_texture","object_name","vector3","use_r","use_g","use_b","obj_index","__get_object_index","data_texture","__get_data_texture","__set_pixel_rgb","one_pixel","last_accessed_index","dirty_count","vector4","use_a","__set_pixel_rgba","upload_budget","__partial_texture_data_upload","__full_texture_data_upload","texture_data","copyTextureToTexture","index","v3","v4","Uint8Array","DataTexture","RGBFormat","dst_texture","one_pixel_text","geometry_batcher","batches","buffer_geometries","attr_accessor_uvs","texture_width","ceilPowerOfTwo","__init_uv_array","uv_index","vertex_count","count","buffer_attribute","BufferAttribute","upload_texture_data","uvs","ui","ui_elements","_tmp_normalized_pos","ss_scene","matrixWorldAutoUpdate","ws_scene","ss_camera","elem","splice","set_screen_space_coordinate_system","set_world_space_coordinate_system","Input","update_state","current_clicked_element","camera_utilities","tmp_mat","Matrix4","Plane","ray","Ray","tmp_size","tmp_unproj","tmp_vec","applyQuaternion","v_fov","h_fov","atan","tan","distV","distH","plane_position","plane_normal","setFromNormalAndCoplanarPoint","get_forward_dir","isPerspectiveCamera","unproject_mouse_position","unproject","intersectPlane","zoom_scale","world_space_center","camera_forward","project_points_on_plane","projected_points_center","getCenter","up","right","cross","inverse_mat","getInverse","applyMatrix4","projected_center","get_zoom_to_fit_rect","isOrthographicCamera","obj_x","obj_y","object_aspect","object","getWorldPosition","project","left","top","bottom","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","NormalAORender","ssao_mat","ssao_compose_mat","debug_normals","ssaa","use_ssaa","main_RT","SSAO_RT","blurrer","__check_RT_size","__update_uniforms","blur","projectionMatrix","NormalRender","VRRender","render_spectator_camera","spectator_camera","isPresenting","xrCam","getCamera","currentRenderTarget","UnrealBloomComposeMaterial","nMips","NUM_MIPS","_BlurredTex","_BloomStrength","blurTexture1","blurTexture2","blurTexture3","blurTexture4","blurTexture5","bloomStrength","bloomFactors","bloomRadius","bloomTintColors","rt","col_string","AddMaterial","_SecondTex","GaussianBlurMaterial","kernel_radius","KERNEL_RADIUS","SIGMA","texSize","direction","LuminosityHighPassMaterial","luminosityThreshold","smoothWidth","defaultColor","defaultOpacity","GaussianBlurrer","current_width","current_height","separableBlurMaterials","renderTargetsHorizontal","renderTargetsVertical","kernelSizeArray","rt_pars","LinearFilter","renderTargetBright","generateMipmaps","init_materials","init_RT","luminosity_high_pass_mat","use_luminosity_high_pass","resize_RT","inputRenderTarget","set_direction","dispose_RT","hor","ver","texture_height","set_size","dispose_materials","UnrealBloomRender","bloom_compose_mat","blur_RT","add_mat","set_RT_0","set_RT_1","set_RT_2","set_RT_3","set_RT_4","set_bloom_strength","set_bloom_radius","set_add_texture","val","set_tint_color_0","set_tint_color_1","set_tint_color_2","set_tint_color_3","set_tint_color_4","TOrthographicCamera","view_component_manager","components","enabled_components","Set","__set_components_opacities","component","delete","component_name","RenderLoop","target_application","is_running","frames_passed","__update","on_post_start","ViewComponentManager","on_frame_end","setAnimationLoop","stop","screen","apply_pixel_density_v2","apply_pixel_density","get_pixel_size","SimpleTextDrawer","text_margin","text_size","get_text_size","globalAlpha","textBaseline","textAlign","fillText","ViewComponent","hidden","register_component","enable_component","disable_component","toggle_hidden","HorizontalPlane","VerticalPlane","ArrayUtilities","source","apply","array","items_left_count","closest_point","closest_distance","obj","ids","FrustumPointFitter","camera_quaternion","vertical_fov","degToRad","up_plane_normal","get_up_plane_normal","down_plane_normal","get_down_plane_normal","left_plane_normal","get_left_plane_normal","right_plane_normal","get_right_plane_normal","camera_forward_dir","sphere_center","pull_back_distance","get_distance_to_fit_rect","far_pos","up_plane","down_plane","left_plane","right_plane","apply_center_correction_to_pos","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_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","geometries","get_mesh","gltf","animations","skinnedMeshes","isSkinnedMesh","cloneBones","cloneSkinnedMeshes","isBone","skeleton","cloneSkinnedMesh","orderedCloneBones","bones","cloneBone","Skeleton","boneInverses","matrixWorld","cast","receive","castShadow","receiveShadow","object_type","ObjectUtilities","item","Array","isArray","sources","is_object","merge_deep","nodeType","attributes","attribute","nodeName","nodeValue","hasChildNodes","childNodes","xml_to_json","old","StringUtilities","words","substr","join","charAt","slice","TimeUtilities","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","parent","WorldImage","pivot","_ScreenAligned","_Scale","_Opacity","DoubleSide","current_scale","computeBoundingBox","tmp_bb_size","boundingBox","img","screen_aligned","boolean","Text2D","is_static","simple_text_drawer","draw_settings","draw_on_texture","LinearMipMapLinearFilter","update_texture","UIElementMaterial","intensity","_PixelOffset","_NDC","_PivotPoint","_DepthOffset","ScreenSpacePosition","WorldSpacePosition","tmp_vec3","tmp_vec2","UIElementState","ui_element","normalized_mouse_position","OnIdle","is_mouse_over","_on_enter_state","OnMouseEnter","on_mouse_enter","_on_hover_state","_on_exit_state","OnMouseExit","on_mouse_exit","_on_idle_state","OnMouseHover","__trigger_on_hover","on_mouse_hover","UIElement","is_clickable","position_strategy","_position","on_hover","mouse_pos_tmp","cached_NDC_position","screen_pos_tmp","texture_size","matrixAutoUpdate","pixel_offset","pivot_point","use_depth","depth_offset","visible","get_size","normalized_mouse_pos","get_pos_NDC","to_screen_position","rect","Box2","containsPoint","projected_pos","screen_pos","UpdatableMaterialMesh","self","onBeforeRender","TextGlyph","plane_bounds","atlas_bounds","SDFText","glyph_layout","glyphs","glyph_is_dirty","matrix_is_dirty","color_is_dirty","matrix","__opacity","__text","__generate_glyphs","compose","tilt","new_orientation","new_tilt","multiply","update_glyphs","op","cursor","unicode","charCodeAt","glyph","planeBounds","text_glyph","atlasBounds","advance","box2","first_glyph","union","box2_size","SDFTextMaterial","_Texture","_Boldness","_AtlasSize","SDFTextBatch","font_layout","atlas_texture","instanced_geometry","InstancedBufferGeometry","instanceCount","Float32BufferAttribute","transformsCol0","InstancedBufferAttribute","max_allocations","transformsCol1","transformsCol2","transformsCol3","glyph_bounds","usage","DynamicDrawUsage","text_elements","set_atlas_size","atlas","set_boldness","text_str","text_elem","remove_elem","force_update","glyph_bounds_atr","plane_bounds_atr","color_atr","matrix_needs_update","glyph_needs_update","color_needs_update","glyph_count","update_matrix","clear_glyph_dirty","clear_color_dirty","glyph_i","buffer_i","setXYZW","VectorInterpolator","tmp","MedianFilterMaterial","kernel3x3","_SourceTex","_SourceTexSize","isVideoTexture","videoWidth","videoHeight","isTexture","MedianFilter","median_filter_mat","tex_size","DualFilteringBlurMaterial","upsample","AlphaFilterMaterial","use_alpha_mask","_Offset","DualFilteringBlurrer","RT0","RT3","RT4","upscale_blur_mat","downscale_blur_mat","alpha_filter_mat","check_RT_resize","ParticleAttribute","attr_name","update_material","write","particle_attribute","particle_count","resolution","calculate_resolution","HalfFloatType","attribute_writter_scene","swap_RT","storage_material","deleteAttribute","GPUParticleSystem","build_point_mesh","attribute_writter_mesh","build_attribute_writter_mesh","item_size","instance_count","geo","instanced_geo","build_uv_storage_attribute","Points","ParticleStorageMaterial","ParticlePositionAttribute","pos_attr","build_RT","store_geometry_attribute_in_RT","CustomDataTexture","multiplier","RGBDataTexture","RGBADataTexture","RGBFloatDataTexture","RGBAFloatDataTexture","BatchedMesh","id_table","max_texture_width","batched_count","batch_height","mesh_name","set_rgb","get_mesh_index","set_rgba","MeshBatcher","meshes","attr_mesh_id","create_batched_mesh","AudioClip","loop","volume","positional","audio","audio_listener","TPositionalAudio","TAudio","setBuffer","setLoop","gain","setVolume","pause","is_playing","isPlaying","AudioLoader","instantiate_audio","AudioContext","createBuffer","arrayBuffer","array_buffer","decodeAudioData","audio_buffer","BasisLoader","loader","load","basis","xhr","msg","__set_error","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","Texture","Image","onload","onerror","original_url","TextureLoader","VideoLoader","ResourceBatch","batch_name","resource_loaders","loading_finished","finished","has_errors","print_error","get_loaded_bytes","get_total_bytes"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.module.js","sources":["../src/Browser.js","../src/utilities/Validation.js","../src/resource_loader/AbstractLoader.js","../src/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\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\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\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 (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\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","name","is_safari","is_chrome","is_edge","is_edge_chromium","has_webm","is_firefox","has_hvec","preferred_video_extension","Validation","constructor","static","n","Number","is_int","is_float","str","JSON","parse","e","AbstractLoader","resource_id","url","size","loaded_bytes","total_bytes","has_finished","has_error","error_message","__update_downloaded_bytes","loaded","total","is_number","console","warn","__loading_ended","__set_error","message","print_error","error","load","resource_container","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","split","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","replace","__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","match","is_ipad","maxTouchPoints","is_ios","is_android","get_os","is_linux","is_mac","is_windows","platform","test","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","splice","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","join","charAt","slice","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","Texture","Image","onload","onerror","original_url","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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"}
|