ohzi-core 10.3.2 → 10.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.module.js","sources":["../src/Browser.js","../src/utilities/Validation.js","../src/resource_loader/AbstractLoader.js","../src/utilities/OMath.js","../src/action_sequencer/ActionSequencer.js","../src/utilities/EasingFunctions.js","../src/action_sequencer/ActionInterpolator.js","../src/action_sequencer/NumberInterpolator.js","../src/view_components/ViewContext.js","../src/action_sequencer/ActionEvent.js","../src/view_components/transition/DrawIOAnimationSheet.js","../src/view_components/transition/ActionSequencerBuilder.js","../src/EventManager.js","../src/ResourceContainer.js","../src/utilities/HTMLUtilities.js","../src/view_components/transition/TransitionTable.js","../src/Time.js","../src/view_components/ViewState.js","../src/view_components/transition/ViewStateTransitionHandler.js","../src/view_components/ViewManager.js","../src/view_components/ApplicationView.js","../src/BaseApplication.js","../src/render_mode/BaseRender.js","../src/materials/BaseShaderMaterial.js","../src/materials/BlitMaterial.js","../src/materials/AddMaterial.js","../src/materials/UnrealBloomComposeMaterial.js","../src/CameraManager.js","../src/Capabilities.js","../src/canvas_drawer/CanvasDrawer.js","../src/Configuration.js","../src/html_utilities/css_animator_states/Idle.js","../src/html_utilities/css_animator_states/Animating.js","../src/html_utilities/CSSAnimator.js","../src/components/AxisHelper.js","../src/SceneManager.js","../src/primitives/Cube.js","../src/primitives/Sphere.js","../src/primitives/Arrow.js","../src/OScreen.js","../src/materials/ScreenSpaceTextureMaterial.js","../src/PerspectiveCamera.js","../src/Debug.js","../src/materials/ClearDepthNormalMaterial.js","../src/materials/DepthNormalMaterial.js","../src/render_utilities/DepthAndNormalsRenderer.js","../src/render_utilities/Blitter.js","../src/Graphics.js","../src/materials/NormalMaterial.js","../src/render_mode/DebugNormalsRender.js","../src/KeyboardInput.js","../src/OS.js","../src/ReflectionPlaneContext.js","../src/static_batcher/GeometryBatch.js","../src/static_batcher/GeometryBatcher.js","../src/UI.js","../src/utilities/PerspectiveFrustumPointFitter.js","../src/utilities/OrthographicFrustumPointFitter.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/components/Grid.js","../src/components/Line.js","../src/components/WorldImage.js","../src/components/Text2D.js","../src/materials/UIElementMaterial.js","../src/ui/ui_element_position/ScreenSpacePosition.js","../src/ui/ui_element_position/WorldSpacePosition.js","../src/ui/ui_element_state/UIElementState.js","../src/ui/ui_element_state/OnIdle.js","../src/ui/ui_element_state/OnMouseEnter.js","../src/ui/ui_element_state/OnMouseExit.js","../src/ui/ui_element_state/OnMouseHover.js","../src/components/UIElement.js","../src/components/UpdatableMaterialMesh.js","../src/components/sdf_text/TextGlyph.js","../src/components/sdf_text/SDFText.js","../src/materials/SDFTextMaterial.js","../src/components/sdf_text/SDFTextBatch.js","../src/action_sequencer/VectorInterpolator.js","../src/materials/MedianFilterMaterial.js","../src/render_utilities/MedianFilter.js","../src/materials/DualFilteringBlurMaterial.js","../src/materials/AlphaFilterMaterial.js","../src/render_utilities/DualFilteringBlurrer.js","../src/gpu_particles/ParticleAttribute.js","../src/gpu_particles/GPUParticleSystem.js","../src/materials/gpu_particles/ParticleStorageMaterial.js","../src/gpu_particles/ParticlePositionAttribute.js","../src/data_textures/CustomDataTexture.js","../src/data_textures/RGBDataTexture.js","../src/data_textures/RGBADataTexture.js","../src/data_textures/RGBFloatDataTexture.js","../src/data_textures/RGBAFloatDataTexture.js","../src/static_batcher/BatchedMesh.js","../src/static_batcher/MeshBatcher.js","../src/components/AudioClip.js","../src/resource_loader/AudioLoader.js","../src/resource_loader/BasisLoader.js","../src/resource_loader/CubemapLoader.js","../src/resource_loader/DAELoader.js","../src/resource_loader/FileLoader.js","../src/resource_loader/FontLoader.js","../src/resource_loader/GLTFLoader.js","../src/resource_loader/GLTFDRACOLoader.js","../src/resource_loader/HDRCubeTextureLoader.js","../src/resource_loader/JSONLoader.js","../src/resource_loader/OBJLoader.js","../src/resource_loader/PointArrayLoader.js","../src/resource_loader/RGBETextureLoader.js","../src/resource_loader/TextLoader.js","../src/resource_loader/AsyncTextureLoader.js","../src/resource_loader/TextureLoader.js","../src/resource_loader/VideoLoader.js","../src/resource_loader/ResourceBatch.js"],"sourcesContent":["\nclass Browser\n{\n init()\n {\n this.browser_name = '';\n this.agent = window.navigator.userAgent.toLowerCase();\n\n switch (true)\n {\n case this.agent.indexOf('edge') > -1:\n this.browser_name = 'edge_ie';\n break;\n case this.agent.indexOf('edg') > -1:\n this.browser_name = 'edge_chromium';\n break;\n case this.agent.indexOf('opr') > -1 && !!window.opr:\n this.browser_name = 'opera';\n break;\n case this.agent.indexOf('chrome') > -1 && !!window.chrome:\n this.browser_name = 'chrome';\n break;\n case this.agent.indexOf('trident') > -1:\n this.browser_name = 'iexplorer';\n break;\n case this.agent.indexOf('firefox') > -1:\n this.browser_name = 'firefox';\n break;\n case this.agent.indexOf('safari') > -1:\n this.browser_name = 'safari';\n break;\n default:\n this.browser_name = 'other';\n break;\n }\n\n this.version = this.get_version();\n }\n\n get name()\n {\n return this.browser_name;\n }\n\n get is_safari()\n {\n return this.browser_name === 'safari';\n }\n\n get is_chrome()\n {\n return this.browser_name === 'chrome';\n }\n\n get is_edge()\n {\n return this.browser_name === 'edge_ie';\n }\n\n get is_edge_chromium()\n {\n return this.browser_name === 'edge_chromium';\n }\n\n get has_webm()\n {\n return !!(this.is_chrome || this.is_firefox || this.is_edge_chromium);\n }\n\n get has_hvec()\n {\n return this.is_safari;\n }\n\n get preferred_video_extension()\n {\n return this.has_webm ? 'webm' : this.has_hvec ? 'hvec.mp4' : 'mp4';\n }\n\n get_version()\n {\n const ua = navigator.userAgent;\n let tem = '';\n let version = 0;\n\n let M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\\/))\\/?\\s*(\\d+)/i) || [];\n\n if (/trident/i.test(M[1]))\n {\n tem = /\\brv[ :]+(\\d+)/g.exec(ua) || [];\n version = 'IE ' + (tem[1] || '');\n }\n if (M[1] === 'Chrome')\n {\n tem = ua.match(/\\b(OPR|Edge)\\/(\\d+)/);\n if (tem != null) version = tem.slice(1).join(' ').replace('OPR', 'Opera');\n }\n\n M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];\n if ((tem = ua.match(/version\\/(\\d+(\\.\\d+)?)/i)) != null) M.splice(1, 1, tem[1]);\n\n version = M.join(' ');\n\n return Number(version.split(' ')[1]);\n }\n}\n\nconst browser = new Browser();\nexport { browser as Browser };\n","class Validation\n{\n constructor()\n {}\n\n static is_int(n)\n {\n return Number(n) === n && n % 1 === 0;\n }\n\n static is_float(n)\n {\n return Number(n) === n && n % 1 !== 0;\n }\n\n static is_number(n)\n {\n return this.is_int(n) || this.is_float(n);\n }\n\n static is_json(str)\n {\n try\n {\n JSON.parse(str);\n }\n catch (e)\n {\n return false;\n }\n\n return true;\n }\n}\n\nexport { Validation };\n","import { Browser } from '../Browser';\r\nimport { Validation } from '../utilities/Validation';\r\n\r\nclass AbstractLoader\r\n{\r\n constructor(resource_id, url, size = 1)\r\n {\r\n this.resource_id = resource_id;\r\n this.url = url;\r\n this.loaded_bytes = 0;\r\n this.total_bytes = size;\r\n\r\n this.has_finished = false;\r\n this.has_error = false;\r\n this.error_message = 'none';\r\n }\r\n\r\n __update_downloaded_bytes(loaded, total)\r\n {\r\n loaded = Validation.is_number(loaded) ? loaded : 1;\r\n total = Validation.is_number(total) ? total : 1;\r\n\r\n this.loaded_bytes = loaded;\r\n\r\n if (total > 0)\r\n {\r\n this.total_bytes = total;\r\n }\r\n\r\n if (this.loaded_bytes > this.total_bytes)\r\n {\r\n console.warn('Total bytes is smaller than loaded ones. Please set total bytes by hand to:', this.url);\r\n }\r\n }\r\n\r\n __loading_ended()\r\n {\r\n this.has_finished = true;\r\n }\r\n\r\n __set_error(message)\r\n {\r\n this.has_error = true;\r\n this.error_message = message;\r\n }\r\n\r\n print_error()\r\n {\r\n console.error('Error while loading ' + this.resource_id + '\\n\\t path: ' + this.url + '\\n\\t\\t' + this.error_message);\r\n }\r\n\r\n load(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n const cache = Browser.is_safari ? 'no-cache' : 'default';\r\n\r\n fetch(this.url, {\r\n method: 'GET', // *GET, POST, PUT, DELETE, etc.\r\n mode: 'cors', // no-cors, *cors, same-origin\r\n cache: cache, // *default, no-cache, reload, force-cache, only-if-cached\r\n credentials: 'same-origin', // include, *same-origin, omit\r\n redirect: 'follow' // manual, *follow, error\r\n })\r\n .then(this.on_progress.bind(this, resource_container))\r\n .catch(this.__on_error.bind(this));\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n\r\n async on_progress(resource_container, response)\r\n {\r\n const response_clone = response.clone();\r\n const reader = response.body.getReader();\r\n\r\n // Step 2: get total length\r\n const contentLength = +response.headers.get('Content-Length');\r\n\r\n // Step 3: read the data\r\n let receivedLength = 0; // received that many bytes at the moment\r\n\r\n while (true)\r\n {\r\n const { done, value } = await reader.read();\r\n\r\n if (done)\r\n {\r\n break;\r\n }\r\n\r\n receivedLength += value.length;\r\n\r\n this.__update_downloaded_bytes(receivedLength, contentLength);\r\n // console.log(`Received ${receivedLength} of ${contentLength}`);\r\n }\r\n\r\n this.on_preloaded_finished(resource_container, response_clone);\r\n }\r\n\r\n on_preloaded_finished(resource_container, response)\r\n {\r\n }\r\n\r\n __on_error(data)\r\n {\r\n console.error(data);\r\n }\r\n}\r\n\r\nexport { AbstractLoader };\r\n","import { Vector3 } from 'three';\n\nclass OMath\n{\n constructor()\n {}\n\n static linear_map(value,\n from_range_start_value,\n from_range_end_value,\n to_range_start_value,\n to_range_end_value)\n {\n return ((value - from_range_start_value) / (from_range_end_value - from_range_start_value)) * (to_range_end_value - to_range_start_value) + to_range_start_value;\n }\n\n static between(value, min, max)\n {\n return (value >= min && value <= max);\n }\n\n static mod(number, divisor)\n {\n return ((number % divisor) + divisor) % divisor;\n }\n\n static rgb_to_hex(rgb)\n {\n rgb.r = Math.round(rgb.r * 255).toString(16);\n rgb.g = Math.round(rgb.g * 255).toString(16);\n rgb.b = Math.round(rgb.b * 255).toString(16);\n\n if (rgb.r.length === 1)\n {\n rgb.r = '0' + rgb.r;\n }\n if (rgb.g.length === 1)\n {\n rgb.g = '0' + rgb.g;\n }\n if (rgb.b.length === 1)\n {\n rgb.b = '0' + rgb.b;\n }\n\n return '#' + rgb.r + rgb.g + rgb.b;\n }\n\n static project_points_on_plane(points, plane)\n {\n const projected_point = new Vector3();\n const points_on_plane = [];\n for (let i = 0; i < points.length; i++)\n {\n plane.projectPoint(points[i], projected_point);\n points_on_plane.push(projected_point.clone());\n }\n\n return points_on_plane;\n }\n\n static matrix4_lerp(from, to, target, t)\n {\n for (let i = 0; i < 16; i++)\n {\n target.elements[i] = this.lerp(from.elements[i], to.elements[i], t);\n }\n }\n\n static equals(x1, x2)\n {\n return Math.abs(x1 - x2) < 0.000001;\n }\n\n static lerp(x, y, t)\n {\n return (1 - t) * x + t * y;\n }\n\n static clamp(value, min, max)\n {\n return Math.max(min, Math.min(max, value));\n }\n\n static euclideanModulo(n, m)\n {\n return ((n % m) + m) % m;\n }\n\n static pingpong(x, length = 1)\n {\n return length - Math.abs(OMath.euclideanModulo(x, length * 2) - length);\n }\n\n static degToRad(degrees)\n {\n return degrees * (Math.PI / 180);\n }\n\n static radToDeg(radians)\n {\n return radians * (180 / Math.PI);\n }\n\n static deg_to_rad(degrees)\n {\n return degrees * (Math.PI / 180);\n }\n\n static rad_to_deg(radians)\n {\n return radians * (180 / Math.PI);\n }\n\n static perspective_divide(v)\n {\n v.x /= v.w;\n v.y /= v.w;\n v.z /= v.w;\n return v;\n }\n\n static points_average(points)\n {\n const center = points[0].clone();\n for (let i = 1; i < points.length; i++)\n {\n center.add(points[i]);\n }\n center.multiplyScalar(1 / points.length);\n return center;\n }\n\n static get_random_color()\n {\n const arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'a', 'b', 'c', 'd', 'e', 'f'];\n\n let col = '#';\n col += arr[Math.floor(Math.random() * 16)];\n col += arr[Math.floor(Math.random() * 16)];\n\n col += arr[Math.floor(Math.random() * 16)];\n col += arr[Math.floor(Math.random() * 16)];\n\n col += arr[Math.floor(Math.random() * 16)];\n col += arr[Math.floor(Math.random() * 16)];\n return col;\n }\n\n static saturate(x)\n {\n return OMath.clamp(x, 0, 1);\n }\n}\n\nexport { OMath };\n","\nimport { OMath } from '../utilities/OMath';\n\nclass ActionSequencer\n{\n constructor(context)\n {\n this.elapsed_time = -0.00001;\n this.playback_speed = this.__get_playback_speed();\n this.playing = false;\n\n this.action_events = [];\n this.context = context;\n\n this.initial_context = JSON.parse(JSON.stringify(context));\n\n this.tmp_t = 0;\n\n this.channels = {};\n\n const channel_names = Object.keys(context);\n for (let i = 0; i < channel_names.length; i++)\n {\n this.channels[channel_names[i]] = [];\n }\n\n this.duration = 0;\n }\n\n play()\n {\n this.playing = true;\n }\n\n stop()\n {\n this.playing = false;\n }\n\n reset()\n {\n this.elapsed_time = -0.00001;\n }\n\n skip()\n {\n const duration = this.get_duration();\n this.__play_clips(this.elapsed_time, duration + 0.0001);\n this.elapsed_time = duration;\n }\n\n update(delta_time)\n {\n if (this.playing)\n {\n this.__play_clips(this.elapsed_time, this.elapsed_time + delta_time * this.playback_speed);\n this.elapsed_time = this.elapsed_time + delta_time * this.playback_speed;\n }\n }\n\n set_progress(time)\n {\n this.elapsed_time = OMath.clamp(time, 0, this.duration);\n this.__play_clips(this.elapsed_time, this.elapsed_time);\n }\n\n set_normalized_progress(t)\n {\n this.elapsed_time = OMath.clamp(t, 0, 1) * this.duration;\n this.__play_clips(this.elapsed_time, this.elapsed_time);\n }\n\n get_progress()\n {\n return OMath.clamp(this.elapsed_time / this.get_duration(), 0, 1);\n }\n\n is_finished()\n {\n return this.elapsed_time > this.get_duration();\n }\n\n add_action_event(trigger_time, action)\n {\n this.action_events.push({\n trigger_time: trigger_time,\n action: action\n });\n\n this.duration = Math.max(this.duration, trigger_time);\n }\n\n add_action_interpolator(from, to, interpolator, use_dynamic_from_value = false)\n {\n if (use_dynamic_from_value)\n {\n const keyframes = this.channels[interpolator.attribute_name];\n\n if (keyframes === undefined)\n {\n console.error(`${interpolator.attribute_name} missing in initial state data.`);\n }\n\n if (keyframes.length === 0)\n {\n interpolator.from = this.initial_context[interpolator.attribute_name];\n }\n else\n {\n interpolator.from = keyframes[keyframes.length - 1].interpolator.to;\n }\n }\n\n const keyframe = {\n from: from,\n to: to,\n interpolator: interpolator\n };\n\n this.duration = Math.max(this.duration, to);\n this.channels[interpolator.attribute_name].push(keyframe);\n }\n\n get_current_target_value(name)\n {\n const keyframe = this.__get_current_keyframe(name, this.elapsed_time);\n\n if (this.elapsed_time < keyframe.from)\n {\n return keyframe.interpolator.evaluate(0);\n }\n\n return keyframe.interpolator.evaluate(1);\n }\n\n get_current_starting_value(name)\n {\n const keyframe = this.__get_current_keyframe(name, this.elapsed_time);\n\n return keyframe.interpolator.evaluate(0);\n }\n\n get_current_progress(name)\n {\n const keyframe = this.__get_current_keyframe(name, this.elapsed_time);\n const t = this.__linear_map_01(this.elapsed_time, keyframe.from, keyframe.to);\n\n return keyframe.interpolator.easing_function(t);\n }\n\n get_duration()\n {\n return this.duration;\n }\n\n __play_clips(from, to)\n {\n for (let i = 0; i < this.action_events.length; i++)\n {\n if (this.action_events[i].trigger_time > from - Number.EPSILON &&\n this.action_events[i].trigger_time < to + Number.EPSILON)\n {\n // console.log(\"Play event: \" + this.action_events[i].action.constructor.name + \" at \"+ this.action_events[i].trigger_time);\n this.action_events[i].action.trigger();\n }\n }\n const channel_names = Object.keys(this.initial_context);\n\n for (let i = 0; i < channel_names.length; i++)\n {\n const name = channel_names[i];\n const keyframe = this.__get_current_keyframe(name, from);\n\n this.context[name] = this.evaluate_keyframe(keyframe, from);\n }\n }\n\n evaluate_keyframe(keyframe, time)\n {\n this.tmp_t = this.__linear_map_01(time, keyframe.from, keyframe.to);\n\n return keyframe.interpolator.evaluate(OMath.clamp(this.tmp_t, 0, 1));\n }\n\n get_keyframes(channel_name)\n {\n return this.channels[channel_name];\n }\n\n is_channel_redefined(channel_name)\n {\n for (let i = 0; i < this.channels[channel_name].length; i++)\n {\n const keyframe = this.channels[channel_name][i];\n\n if (keyframe.interpolator.initial)\n {\n return false;\n }\n }\n\n return true;\n }\n\n __linear_map_01(value,\n from_range_start_value,\n from_range_end_value)\n {\n return OMath.saturate(((value - from_range_start_value) / (from_range_end_value - from_range_start_value)) * (1 - 0) + 0);\n }\n\n __get_current_keyframe(channel_name, time)\n {\n let current = undefined;\n\n const keyframes = this.channels[channel_name];\n\n for (let i = 0; i < keyframes.length; i++)\n {\n const keyframe = keyframes[i];\n\n if (time >= keyframe.from && time <= keyframe.to)\n {\n current = keyframe;\n return current;\n }\n }\n\n let min = Infinity;\n\n for (let i = 0; i < keyframes.length; i++)\n {\n const keyframe = keyframes[i];\n const distance = Math.abs(keyframe.to - time);\n\n if (distance < min)\n {\n current = keyframe;\n min = distance;\n }\n }\n\n return current;\n }\n\n __get_playback_speed()\n {\n const url_params = new URLSearchParams(window.location.search);\n\n const transitions_velocity = url_params.get('transitions_velocity');\n\n if (transitions_velocity)\n {\n return Number(transitions_velocity);\n }\n else\n {\n return 1;\n }\n }\n}\n\nexport { ActionSequencer };\n","class EasingFunctions\n{\n constructor()\n {}\n\n static linear(x)\n {\n return x;\n }\n\n static triangular(x)\n {\n return 1 - Math.abs((x * 2) % (1 * 2) - 1);\n }\n\n static ease_in_sine(x)\n {\n return 1 - Math.cos(x * 3.1415926 / 2);\n }\n\n static ease_out_sine(x)\n {\n return Math.sin(x * 3.1415926 / 2);\n }\n\n static ease_in_out_sine(x)\n {\n return -(Math.cos(3.1415926 * x) - 1) / 2;\n }\n\n static ease_in_cubic(x)\n {\n return x * x * x;\n }\n\n static ease_out_cubic(x)\n {\n return 1 - Math.pow(1 - x, 3);\n }\n\n static ease_in_out_cubic(x)\n {\n return x < 0.5\n ? 4 * x * x * x\n : 1 - Math.pow(-2 * x + 2, 3) / 2;\n }\n\n static ease_in_quad(x)\n {\n return x * x;\n }\n\n static ease_out_quad(x)\n {\n return 1 - (1 - x) * (1 - x);\n }\n\n static ease_in_out_quad(x)\n {\n return x < 0.5\n ? 2 * x * x\n : 1 - Math.pow(-2 * x + 2, 2) / 2;\n }\n\n static ease_in_quart(x)\n {\n return x * x * x * x;\n }\n\n static ease_out_quart(x)\n {\n return 1 - Math.pow(1 - x, 4);\n }\n\n static ease_in_out_quart(x)\n {\n return x < 0.5\n ? 8 * x * x * x * x\n : 1 - Math.pow(-2 * x + 2, 4) / 2;\n }\n\n static ease_in_quint(x)\n {\n return x * x * x * x * x;\n }\n\n static ease_out_quint(x)\n {\n return 1 - Math.pow(1 - x, 5);\n }\n\n static ease_in_out_quint(x)\n {\n return x < 0.5\n ? 16 * x * x * x * x * x\n : 1 - Math.pow(-2 * x + 2, 5) / 2;\n }\n\n static ease_in_expo(x)\n {\n return x === 0 ? 0 : Math.pow(2, 10 * x - 10);\n }\n\n static ease_out_expo(x)\n {\n return x === 1 ? 1 : 1 - Math.pow(2, -10 * x);\n }\n\n static ease_in_out_expo(x)\n {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? Math.pow(2, 20 * x - 10) / 2\n : (2 - Math.pow(2, -20 * x + 10)) / 2;\n }\n\n static ease_in_circ(x)\n {\n return 1 - Math.sqrt(1 - Math.pow(x, 2));\n }\n\n static ease_out_circ(x)\n {\n return Math.sqrt(1 - Math.pow(x - 1, 2));\n }\n\n static ease_in_out_circ(x)\n {\n return x < 0.5\n ? (1 - Math.sqrt(1 - Math.pow(2 * x, 2))) / 2\n : (Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2;\n }\n\n static ease_in_back(x)\n {\n return 2.7015 * x * x * x - 1.7015 * x * x;\n }\n\n static ease_out_back(x)\n {\n return 1 + 2.7015 * Math.pow(x - 1, 3) + 1.7015 * Math.pow(x - 1, 2);\n }\n\n static ease_in_out_back(x)\n {\n return x < 0.5\n ? (Math.pow(2 * x, 2) * ((2.5949095 + 1) * 2 * x - 2.5949095)) / 2\n : (Math.pow(2 * x - 2, 2) * ((2.5949095 + 1) * (x * 2 - 2) + 2.5949095) + 2) / 2;\n }\n\n static ease_in_elastic(x)\n {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : -Math.pow(2, 10 * x - 10) * Math.sin((x * 10 - 10.75) * c4);\n }\n\n static ease_out_elastic(x)\n {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * 2.0943950) + 1;\n }\n\n static ease_in_out_elastic(x)\n {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? -(Math.pow(2, 20 * x - 10) * Math.sin((20 * x - 11.125) * 1.3962633)) / 2\n : Math.pow(2, -20 * x + 10) * Math.sin((20 * x - 11.125) * 1.3962633) / 2 + 1;\n }\n\n static ease_in_bounce(x)\n {\n return 1 - this.ease_out_bounce(1 - x);\n }\n\n static ease_out_bounce(x)\n {\n const n1 = 7.5625;\n const d1 = 2.75;\n\n if (x < 1 / d1)\n {\n return n1 * x * x;\n }\n else if (x < 2 / d1)\n {\n return n1 * (x -= 1.5 / d1) * x + 0.75;\n }\n else if (x < 2.5 / d1)\n {\n return n1 * (x -= 2.25 / d1) * x + 0.9375;\n }\n else\n {\n return n1 * (x -= 2.625 / d1) * x + 0.984375;\n }\n }\n\n static ease_in_out_bounce(x)\n {\n return x < 0.5\n ? (1 - this.ease_out_bounce(1 - 2 * x)) / 2\n : (1 + this.ease_out_bounce(2 * x - 1)) / 2;\n }\n\n static heartbeat(t)\n {\n return 1.0 - Math.pow(Math.abs(Math.sin(t + 1.0)), 63.0) * Math.sign(Math.sin(t)) * Math.sin(t + 1.5 + 1.0) * 0.8;\n }\n}\n\nexport { EasingFunctions };\n","import { EasingFunctions } from '../utilities/EasingFunctions';\n\nclass ActionInterpolator\n{\n constructor(easing_function = 'linear')\n {\n this.easing_function = undefined;\n\n if (typeof easing_function === 'string')\n {\n this.easing_function = EasingFunctions[easing_function];\n }\n else\n {\n this.easing_function = easing_function;\n }\n }\n\n update(context, t)\n {\n\n }\n}\n\nexport { ActionInterpolator };\n","import { ActionInterpolator } from './ActionInterpolator';\nimport { OMath } from '../utilities/OMath';\n\nclass NumberInterpolator extends ActionInterpolator\n{\n constructor(attribute_name, from = 0, to = 1, initial = false, easing_function = 'linear')\n {\n super(easing_function);\n\n this.attribute_name = attribute_name;\n this.from = from;\n this.to = to;\n this.initial = initial;\n }\n\n update(context, t)\n {\n context[this.attribute_name] = OMath.lerp(this.from, this.to, this.easing_function(t));\n }\n\n evaluate(t)\n {\n return OMath.lerp(this.from, this.to, this.easing_function(t));\n }\n}\n\nexport { NumberInterpolator };\n","class ViewContext\n{\n constructor()\n {\n this.app = undefined;\n }\n\n set_app(app)\n {\n this.app = app;\n }\n}\n\nconst view_context = new ViewContext();\nexport { view_context as ViewContext };\n","import { ViewContext } from '../view_components/ViewContext';\n\nclass ActionEvent\n{\n constructor(name, method, args)\n {\n this.name = name;\n this.method = method;\n this.args = args;\n }\n\n trigger()\n {\n ViewContext.app[this.name][this.method](...this.args.split(','));\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, t.args);\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, core_attributes, context_attributes, threejs_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.core_attributes = {\n force_webgl2: true,\n xr_enabled: false\n };\n\n this.context_attributes = {\n alpha: true,\n antialias: false,\n depth: true,\n desynchronized: false,\n failIfMajorPerformanceCaveat: false,\n powerPreference: 'high-performance',\n premultipliedAlpha: true,\n preserveDrawingBuffer: true,\n stencil: false\n };\n\n this.threejs_attributes = {\n logarithmicDepthBuffer: false\n };\n\n Object.assign(this.core_attributes, core_attributes);\n Object.assign(this.context_attributes, context_attributes);\n\n Object.assign(this.threejs_attributes, this.context_attributes);\n Object.assign(this.threejs_attributes, threejs_attributes);\n\n if (this.core_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.threejs_attributes.canvas = canvas;\n this.threejs_attributes.context = this.canvas_context;\n\n this._renderer = new WebGLRenderer(this.threejs_attributes);\n\n if (this.core_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\n if (e.code)\n {\n this.press_key(e.code);\n }\n }\n\n on_key_up(e)\n {\n this.release_key(e.code);\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","\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 { 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(input)\n {\n this.input = input;\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(this.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 { 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 { CameraManager } from '../CameraManager';\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';\nimport { PerspectiveFrustumPointFitter } from './PerspectiveFrustumPointFitter';\nimport { OrthographicFrustumPointFitter } from './OrthographicFrustumPointFitter';\n\nclass CameraUtilities\n{\n init(input)\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 this.input = input;\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 || this.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 fit_bounding_box_points(camera, bb, scale = 1)\n {\n const dir = new Vector3();\n dir.copy(bb.max).sub(bb.min);\n\n const p1 = bb.min.clone();\n\n const p2 = p1.clone().add(new Vector3(dir.x, 0, 0));\n const p3 = p1.clone().add(new Vector3(0, dir.y, 0));\n const p4 = p1.clone().add(new Vector3(0, 0, dir.z));\n\n const p5 = p1.clone().add(new Vector3(dir.x, 0, dir.z));\n const p6 = p1.clone().add(new Vector3(0, dir.y, dir.z));\n const p7 = bb.max.clone();\n const p8 = p1.clone().add(new Vector3(dir.x, dir.y, 0));\n return this.fit_points(camera, [p1, p2, p3, p4, p5, p6, p7, p8], scale);\n }\n\n fit_points(camera, points, zoom_scale = 1)\n {\n if (camera.isPerspectiveCamera)\n {\n const camera_forward_dir = new Vector3(0, 0, -1).applyQuaternion(camera.quaternion);\n const camera_backward_dir = camera_forward_dir.clone().multiplyScalar(-1);\n\n const fitter = new PerspectiveFrustumPointFitter();\n\n const aspect_ratio = OScreen.aspect_ratio;\n\n const camera_pos = fitter.fit_points(points, camera.quaternion, camera.fov * zoom_scale, aspect_ratio);\n const box = new Box3().setFromPoints(points);\n const center = new Vector3();\n box.getCenter(center);\n\n const reference_position_plane = new Plane().setFromNormalAndCoplanarPoint(camera_backward_dir, center);\n\n const camera_ray = new Ray(camera_pos, camera_forward_dir);\n\n const reference_position = new Vector3();\n camera_ray.intersectPlane(reference_position_plane, reference_position);\n\n const zoom = camera_pos.distanceTo(reference_position);\n\n return {\n zoom: zoom,\n reference_position: reference_position,\n camera_position: camera_pos\n };\n }\n else\n {\n const fitter = new OrthographicFrustumPointFitter();\n const result = fitter.fit_points(points, this.reference_rotation, camera.fov * zoom_scale, OScreen.aspect_ratio);\n\n this.reference_position.copy(result.center);\n this.reference_zoom = result.distance_to_center;\n\n const forward = new Vector3(0, 0, 1).applyQuaternion(camera.quaternion);\n return {\n zoom: result.distance_to_center,\n reference_position: result.center,\n camera_position: forward.multiplyScalar(result.distance_to_center)\n };\n }\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 { 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(input)\n {\n CameraManager.init();\n CameraUtilities.init(input);\n Capabilities.init();\n Configuration.init();\n EventManager.init();\n GeometryBatcher.init();\n\n OS.init();\n Browser.init();\n ReflectionPlaneContext.init();\n ResourceContainer.init();\n SceneManager.init();\n OScreen.init();\n Time.init();\n UI.init(input);\n\n Debug.init();\n }\n\n dispose(render_loop)\n {\n Graphics.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 { 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, input)\n {\n target_application = target_application || new BaseApplication();\n\n this.target_application = target_application;\n this.graphics = graphics;\n this.input = input;\n\n this.is_running = false;\n this.frames_passed = 0;\n }\n\n update()\n {\n if (!this.is_running)\n {\n return;\n }\n Time.__update();\n\n // ###### START CYCLE ######\n if (this.frames_passed === 1)\n {\n this.target_application.on_post_start();\n }\n\n this.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 this.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.toLowerCase().replace(/[-_][a-z0-9]/g, (group) => group.slice(-1).toUpperCase());\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 grid_frag from '../shaders/grid/grid.frag';\nimport grid_vert from '../shaders/grid/grid.vert';\n\nimport { GeometryUtilities } from '../utilities/GeometryUtilities';\n\nimport { Mesh } from 'three';\nimport { ShaderMaterial } from 'three';\nimport { Color } from 'three';\nimport { PlaneGeometry } from 'three';\n\nclass Grid extends Mesh\n{\n constructor()\n {\n const material = new ShaderMaterial({\n uniforms: {\n _Color: { value: new Color('#919191') }\n },\n vertexShader: grid_vert,\n fragmentShader: grid_frag,\n extensions: { derivatives: true },\n transparent: true,\n depthWrite: false\n });\n\n const plane_geometry = new PlaneGeometry(100, 100, 100, 100);\n\n const non_indexed_geometry = GeometryUtilities.convert_to_non_indexed_geometry(plane_geometry);\n\n super(non_indexed_geometry, material);\n\n this.rotation.x = -3.14 / 2;\n }\n}\n\nexport { Grid };\n","import line_vs from '../shaders/basic_line/basic_line.vert';\nimport line_fs from '../shaders/basic_line/basic_line.frag';\n\nimport { Mesh } from 'three';\nimport { BufferAttribute } from 'three';\nimport { BufferGeometry } from 'three';\nimport { ShaderMaterial } from 'three';\nimport { Color } from 'three';\n\nclass Line extends Mesh\n{\n constructor(points)\n {\n const geometry = new BufferGeometry();\n geometry.setAttribute('position', new BufferAttribute(new Float32Array([]), 3));\n geometry.setAttribute('next_position', new BufferAttribute(new Float32Array([]), 3));\n geometry.setAttribute('previous_position', new BufferAttribute(new Float32Array([]), 3));\n geometry.setAttribute('orientation', new BufferAttribute(new Float32Array([]), 1));\n geometry.setAttribute('coverage', new BufferAttribute(new Float32Array([]), 1));\n\n const material = new ShaderMaterial({\n uniforms: {\n _Thickness: { value: 0.2 },\n _Length: { value: 0 },\n _ElapsedTime: { value: 0 },\n _Color: { value: new Color('#FF0000') }\n },\n vertexShader: line_vs,\n fragmentShader: line_fs,\n transparent: true,\n depthWrite: false,\n extensions: { derivatives: true }\n\n });\n\n super(geometry, material);\n\n if (points)\n {\n this.setup(points);\n }\n }\n\n setup(points)\n {\n const vertices = [];\n const next_position = [];\n const previous_position = [];\n const orientation = [];\n const coverage = [];\n let accumulated_length = 0;\n\n for (let i = 0; i < points.length; i++)\n {\n vertices.push(points[i].x);\n vertices.push(points[i].y);\n vertices.push(points[i].z);\n orientation.push(1);\n\n vertices.push(points[i].x);\n vertices.push(points[i].y);\n vertices.push(points[i].z);\n orientation.push(-1);\n\n const next_point = this.__get_next_position(points, i);\n next_position.push(next_point.x);\n next_position.push(next_point.y);\n next_position.push(next_point.z);\n\n next_position.push(next_point.x);\n next_position.push(next_point.y);\n next_position.push(next_point.z);\n\n const previous_point = this.__get_previous_position(points, i);\n previous_position.push(previous_point.x);\n previous_position.push(previous_point.y);\n previous_position.push(previous_point.z);\n\n previous_position.push(previous_point.x);\n previous_position.push(previous_point.y);\n previous_position.push(previous_point.z);\n\n coverage.push(accumulated_length);\n coverage.push(accumulated_length);\n\n if (i < points.length - 1)\n {\n accumulated_length += points[i].distanceTo(next_point);\n }\n }\n const vertexList = new Float32Array(vertices);\n const nextPositionList = new Float32Array(next_position);\n const previousPositionList = new Float32Array(previous_position);\n const orientationList = new Float32Array(orientation);\n const coverageList = new Float32Array(coverage);\n\n const indices = [];\n for (let i = 0; i < ((vertexList.length / 3) - 2) / 2; i++)\n {\n const index = (i * 2) + 1;\n indices.push(index);\n indices.push(index + 1);\n indices.push(index - 1);\n\n indices.push(index);\n indices.push(index + 2);\n indices.push(index + 1);\n }\n\n this.geometry.setIndex(indices);\n this.geometry.getAttribute('position').copy(new BufferAttribute(vertexList, 3));\n this.geometry.getAttribute('next_position').copy(new BufferAttribute(nextPositionList, 3));\n this.geometry.getAttribute('previous_position').copy(new BufferAttribute(previousPositionList, 3));\n this.geometry.getAttribute('orientation').copy(new BufferAttribute(orientationList, 1));\n this.geometry.getAttribute('coverage').copy(new BufferAttribute(coverageList, 1));\n\n this.geometry.getAttribute('position').needsUpdate = true;\n this.geometry.getAttribute('next_position').needsUpdate = true;\n this.geometry.getAttribute('previous_position').needsUpdate = true;\n this.geometry.getAttribute('orientation').needsUpdate = true;\n this.geometry.getAttribute('coverage').needsUpdate = true;\n\n this.material.uniforms._Length.value = accumulated_length;\n this._length = accumulated_length;\n }\n\n set thickness(value)\n {\n this.material.uniforms._Thickness.value = value;\n }\n\n get thickness()\n {\n return this.material.uniforms._Thickness.value;\n }\n\n __get_previous_position(points, i)\n {\n if (i === 0)\n {\n return points[1].clone().sub(points[0]).multiplyScalar(-1).add(points[0]);\n }\n else\n {\n return points[i - 1];\n }\n }\n\n __get_next_position(points, i)\n {\n if (i === points.length - 1)\n {\n return points[points.length - 2].clone().sub(points[points.length - 1]).multiplyScalar(-1).add(points[points.length - 1]);\n }\n else\n {\n return points[i + 1];\n }\n }\n\n update()\n {\n }\n\n distance()\n {\n return this.accumulated_length;\n }\n\n total_length()\n {\n return this.accumulated_length;\n }\n\n dispose()\n {\n this.geometry.dispose();\n this.material.dispose();\n if (this.parent)\n {\n this.parent.remove(this);\n }\n }\n\n set color(col)\n {\n this.material.uniforms._Color.value.set(col);\n }\n\n get color()\n {\n return this.material.uniforms._Color.value;\n }\n\n copy_color(col)\n {\n this.material.uniforms._Color.value.copy(col);\n }\n}\n\nexport { Line };\n","import basic_texture_vert from '../shaders/basic_texture/basic_texture.vert';\nimport basic_texture_frag from '../shaders/basic_texture/basic_texture.frag';\n\nimport { Mesh } from 'three';\nimport { Vector2 } from 'three';\nimport { ShaderMaterial } from 'three';\nimport { DoubleSide } from 'three';\nimport { PlaneGeometry } from 'three';\nimport { Vector3 } from 'three';\n\nclass WorldImage extends Mesh\n{\n constructor(texture, pivot)\n {\n pivot = pivot || new Vector2(0, 0);\n const material = new ShaderMaterial({\n uniforms: {\n _MainTex: { value: texture },\n _ScreenAligned: { value: 0 },\n _Scale: { value: 1 },\n _Opacity: { value: 1 }\n },\n vertexShader: basic_texture_vert,\n fragmentShader: basic_texture_frag,\n transparent: true,\n depthWrite: false,\n side: DoubleSide\n });\n const geometry = new PlaneGeometry(1, 1, 1);\n geometry.translate(-pivot.x / 2, -pivot.y / 2, 0);\n const current_scale = texture.image.width / texture.image.height;\n geometry.scale(current_scale, 1, 1);\n super(geometry, material);\n this.current_scale = current_scale;\n this.geometry.computeBoundingBox();\n\n this.tmp_bb_size = new Vector3();\n this.geometry.boundingBox.getSize(this.tmp_bb_size);\n }\n\n update_texture()\n {\n this.material.uniforms._MainTex.value.needsUpdate = true;\n const img = this.material.uniforms._MainTex.value.image;\n\n this.geometry.scale(1 / this.current_scale, 1, 1);\n this.current_scale = img.width / img.height;\n this.geometry.scale(this.current_scale, 1, 1);\n this.geometry.computeBoundingBox();\n this.geometry.boundingBox.getSize(this.tmp_bb_size);\n }\n\n get size()\n {\n return this.tmp_bb_size.clone().multiplyScalar(this.scale.x);\n }\n\n set size(value)\n {\n this.scale.set(value, value, value);\n this.material.uniforms._Scale.value = value;\n }\n\n set screen_aligned(boolean)\n {\n this.material.uniforms._ScreenAligned.value = boolean === true ? 1 : 0;\n }\n\n get screen_aligned()\n {\n return this.material.uniforms._ScreenAligned.value === 1;\n }\n\n set opacity(opacity)\n {\n this.material.uniforms._Opacity.value = opacity;\n }\n\n get opacity()\n {\n return this.material.uniforms._Opacity.value;\n }\n\n dispose()\n {\n this.geometry.dispose();\n this.parent.remove(this);\n this.material.uniforms._MainTex.value.dispose();\n this.material.dispose();\n }\n}\n\nexport { WorldImage };\n","import { WorldImage } from './WorldImage';\nimport { SimpleTextDrawer } from '../canvas_drawer/SimpleTextDrawer';\n\nimport { LinearMipMapLinearFilter } from 'three';\nimport { LinearFilter } from 'three';\n\nclass Text2D extends WorldImage\n{\n constructor(text, font, color, pivot, is_static)\n {\n const simple_text_drawer = new SimpleTextDrawer(is_static);\n\n const draw_settings = {\n font: font,\n font_color: color || '#000000'\n };\n const canvas_texture = simple_text_drawer.draw_on_texture(text, draw_settings);\n\n canvas_texture.minFilter = LinearMipMapLinearFilter;\n canvas_texture.minFilter = LinearFilter;\n canvas_texture.needsUpdate = true;\n super(canvas_texture, pivot);\n\n this.simple_text_drawer = simple_text_drawer;\n this.canvas_texture = canvas_texture;\n this.draw_settings = draw_settings;\n }\n\n set text(value)\n {\n this.simple_text_drawer.draw_canvas(value, this.draw_settings);\n this.update_texture();\n }\n\n get text()\n {\n return 'not implemented';\n }\n}\n\nexport { Text2D };\n","import vert from '../shaders/ui_element/ui_element.vert';\nimport frag from '../shaders/ui_element/ui_element.frag';\n\nimport { BaseShaderMaterial } from '../materials/BaseShaderMaterial';\n\nimport { Vector2 } from 'three';\nimport { Vector3 } from 'three';\n\nimport { OScreen } from '../OScreen';\n\nclass UIElementMaterial extends BaseShaderMaterial\n{\n constructor(intensity = 1)\n {\n super(vert, frag, {\n _MainTex: { value: undefined },\n _ScreenSize: { value: new Vector2(OScreen.width, OScreen.height) },\n _TextureSize: { value: new Vector2() },\n _PixelOffset: { value: new Vector2(0, 0) },\n _NDC: { value: new Vector3() },\n _PivotPoint: { value: new Vector2() },\n _DepthOffset: { value: 0 }\n });\n this.transparent = true;\n this.depthWrite = false;\n this.depthTest = false;\n }\n}\n\nexport { UIElementMaterial };\n","import { Vector2 } from 'three';\n\nclass ScreenSpacePosition\n{\n constructor()\n {\n this.tmp_vec = new Vector2();\n }\n\n get_pos_NDC(position)\n {\n return this.tmp_vec.set(position.x, position.y);\n }\n}\n\nexport { ScreenSpacePosition };\n","import { CameraManager } from '../../CameraManager';\n\nimport { Vector2 } from 'three';\nimport { Vector3 } from 'three';\n\nclass WorldSpacePosition\n{\n constructor()\n {\n this.tmp_vec3 = new Vector3();\n this.tmp_vec2 = new Vector2();\n }\n\n get_pos_NDC(position)\n {\n this.tmp_vec3.copy(position);\n this.tmp_vec3.project(CameraManager.current);\n\n return this.tmp_vec2.set(this.tmp_vec3.x, this.tmp_vec3.y);\n }\n}\n\nexport { WorldSpacePosition };\n","class UIElementState\n{\n constructor()\n {\n\n }\n\n update(ui_element, normalized_mouse_position)\n {\n\n }\n\n on_enter(ui_element)\n {}\n\n on_exit(ui_element)\n {}\n}\n\nexport { UIElementState };\n","import { UIElementState } from './UIElementState';\n\nclass OnIdle extends UIElementState\n{\n constructor()\n {\n super();\n }\n\n update(ui_element, normalized_mouse_position)\n {\n if (ui_element.is_mouse_over(normalized_mouse_position))\n {\n ui_element.set_state(ui_element._on_enter_state);\n }\n }\n}\n\nexport { OnIdle };\n","import { UIElementState } from './UIElementState';\n\nclass OnMouseEnter extends UIElementState\n{\n constructor()\n {\n super();\n }\n\n on_enter(ui_element)\n {\n ui_element.on_mouse_enter();\n }\n\n update(ui_element, normalized_mouse_position)\n {\n if (ui_element.is_mouse_over(normalized_mouse_position))\n {\n ui_element.set_state(ui_element._on_hover_state);\n }\n else\n {\n ui_element.set_state(ui_element._on_exit_state);\n }\n }\n}\n\nexport { OnMouseEnter };\n","import { UIElementState } from './UIElementState';\n\nclass OnMouseExit extends UIElementState\n{\n constructor()\n {\n super();\n }\n\n on_enter(ui_element)\n {\n ui_element.on_mouse_exit();\n ui_element.set_state(ui_element._on_idle_state);\n }\n}\n\nexport { OnMouseExit };\n","import { UIElementState } from './UIElementState';\n\nclass OnMouseHover extends UIElementState\n{\n constructor()\n {\n super();\n }\n\n on_enter(ui_element)\n {\n this.__trigger_on_hover(ui_element);\n }\n\n update(ui_element, normalized_mouse_position)\n {\n if (ui_element.is_mouse_over(normalized_mouse_position))\n {\n this.__trigger_on_hover(ui_element);\n }\n else\n {\n ui_element.set_state(ui_element._on_exit_state);\n }\n }\n\n __trigger_on_hover(ui_element)\n {\n ui_element.on_mouse_hover();\n }\n}\n\nexport { OnMouseHover };\n","\nimport { OScreen } from '../OScreen';\n\nimport { UIElementMaterial } from '../materials/UIElementMaterial';\n\nimport { ScreenSpacePosition } from '../ui/ui_element_position/ScreenSpacePosition';\nimport { WorldSpacePosition } from '../ui/ui_element_position/WorldSpacePosition';\n\nimport { OnIdle } from '../ui/ui_element_state/OnIdle';\nimport { OnMouseEnter } from '../ui/ui_element_state/OnMouseEnter';\nimport { OnMouseExit } from '../ui/ui_element_state/OnMouseExit';\nimport { OnMouseHover } from '../ui/ui_element_state/OnMouseHover';\n\nimport { Mesh } from 'three';\nimport { PlaneGeometry } from 'three';\nimport { Vector2 } from 'three';\nimport { Vector3 } from 'three';\nimport { NearestFilter } from 'three';\nimport { Box2 } from 'three';\n\nclass UIElement extends Mesh\n{\n constructor(vert, frag)\n {\n super(new PlaneGeometry(1, 1), new UIElementMaterial());\n\n this.is_clickable = false;\n\n this.position_strategy = new WorldSpacePosition();\n this.current_state = new OnIdle();\n\n this._position = new Vector3();\n\n this._on_idle_state = new OnIdle();\n this._on_enter_state = new OnMouseEnter();\n this._on_exit_state = new OnMouseExit();\n this._on_hover_state = new OnMouseHover();\n\n this.on_enter = undefined;\n this.on_exit = undefined;\n this.on_hover = undefined;\n\n this.mouse_pos_tmp = new Vector2();\n this.cached_NDC_position = new Vector2();\n this.screen_pos_tmp = new Vector2();\n\n this.texture_size = new Vector2(1, 1);\n\n this.frustumCulled = false;\n this.matrixAutoUpdate = false;\n this.renderOrder = 0;\n\n this.size = 1;\n this.pixel_offset = new Vector2();\n }\n\n set_render_order(value)\n {\n this.renderOrder = value;\n }\n\n get pivot_point()\n {\n return this.material.uniforms._PivotPoint.value;\n }\n\n set_pixel_offset(offset)\n {\n this.pixel_offset.copy(offset);\n this.material.uniforms._PixelOffset.value.copy(offset);\n }\n\n set_state(new_state)\n {\n this.current_state.on_exit(this);\n this.current_state = new_state;\n this.current_state.on_enter(this);\n }\n\n get position()\n {\n return this._position;\n }\n\n set use_depth(boolean)\n {\n this.material.depthTest = boolean;\n }\n\n get use_depth()\n {\n return this.material.depthTest;\n }\n\n set depth_offset(value)\n {\n this.material.uniforms._DepthOffset.value = value;\n }\n\n get depth_offset()\n {\n return this.material.uniforms._DepthOffset.value;\n }\n\n clear_state()\n {\n this.visible = false;\n }\n\n set_world_space_coordinate_system()\n {\n this.position_strategy = new WorldSpacePosition();\n }\n\n set_screen_space_coordinate_system()\n {\n this.position_strategy = new ScreenSpacePosition();\n }\n\n set_texture(texture)\n {\n texture.minFilter = NearestFilter;\n texture.magFilter = NearestFilter;\n texture.needsUpdate = true;\n\n this.texture_size.set(texture.image.width, texture.image.height);\n\n this.material.uniforms._MainTex.value = texture;\n this.get_size(this.material.uniforms._TextureSize.value);\n this.visible = true;\n }\n\n update_state(normalized_mouse_pos)\n {\n this.material.uniforms._ScreenSize.value.set(OScreen.width, OScreen.height);\n this.get_size(this.material.uniforms._TextureSize.value);\n\n this.cached_NDC_position.copy(this.position_strategy.get_pos_NDC(this.position));\n this.material.uniforms._NDC.value.copy(this.position);\n this.current_state.update(this, normalized_mouse_pos);\n }\n\n is_mouse_over(normalized_mouse_pos)\n {\n this.screen_pos_tmp.copy(this.cached_NDC_position);\n this.to_screen_position(this.screen_pos_tmp);\n this.screen_pos_tmp.x += this.pixel_offset.x;\n this.screen_pos_tmp.y += this.pixel_offset.y;\n\n const rect = new Box2().setFromCenterAndSize(this.screen_pos_tmp, this.get_size());\n\n this.mouse_pos_tmp.copy(normalized_mouse_pos);\n this.to_screen_position(this.mouse_pos_tmp);\n\n return rect.containsPoint(this.mouse_pos_tmp);\n }\n\n to_screen_position(projected_pos)\n {\n projected_pos.x = (projected_pos.x * 0.5 + 0.5) * OScreen.width + this.pixel_offset.x;\n projected_pos.y = (projected_pos.y * 0.5 + 0.5) * OScreen.height + this.pixel_offset.y;\n }\n\n get_screen_space_position()\n {\n const pos = this.cached_NDC_position.clone();\n this.to_screen_position(pos);\n return pos;\n }\n\n set_screen_space_position(screen_pos)\n {\n this.position.x = (screen_pos.x / OScreen.width) * 2 - 1;\n this.position.y = (screen_pos.y / OScreen.height) * 2 - 1;\n }\n\n dispose()\n {\n if (this.material.uniforms._MainTex.value)\n {\n this.material.uniforms._MainTex.value.dispose();\n }\n // OScreen.remove_screen_material(this.material);\n this.geometry.dispose();\n this.material.dispose();\n }\n\n get_size(vector2)\n {\n if (vector2)\n {\n return vector2.copy(this.texture_size).multiplyScalar(this.size / OScreen.dpr);\n }\n else\n {\n return new Vector2().copy(this.texture_size).multiplyScalar(this.size / OScreen.dpr);\n }\n }\n\n on_mouse_enter()\n {}\n\n on_mouse_exit()\n {}\n\n on_mouse_hover()\n {}\n}\n\nexport { UIElement };\n","import { Mesh } from 'three';\n\nclass UpdatableMaterialMesh extends Mesh\n{\n constructor(geometry, material)\n {\n super(geometry, material);\n\n const self = this;\n\n this.onBeforeRender = () =>\n {\n self.material.update();\n };\n }\n}\n\nexport { UpdatableMaterialMesh };\n","import { Vector2, Vector4 } from 'three';\n\nclass TextGlyph\n{\n constructor(offset, plane_bounds, atlas_bounds)\n {\n const width = plane_bounds.right - plane_bounds.left;\n const height = plane_bounds.top - plane_bounds.bottom;\n\n this.scale = new Vector2(width, height);\n this.position = new Vector2(offset + plane_bounds.left, plane_bounds.bottom);\n\n this.atlas_bounds = new Vector4(atlas_bounds.left, atlas_bounds.right, atlas_bounds.top, atlas_bounds.bottom);\n }\n}\n\nexport { TextGlyph };\n","import { Vector3, Quaternion, Matrix4, Color, Box2, Vector2 } from 'three';\nimport { TextGlyph } from './TextGlyph';\n\nclass SDFText\n{\n constructor(glyph_layout, text = '')\n {\n this.glyph_layout = glyph_layout;\n\n this.glyphs = [];\n\n this.glyph_is_dirty = true;\n this.matrix_is_dirty = true;\n this.color_is_dirty = true;\n\n this.position = new Vector3();\n this.quaternion = new Quaternion();\n this.scale = new Vector3(1, 1, 1);\n this.matrix = new Matrix4();\n\n this.color = new Color('#FFFFFF');\n\n this.pivot_point = new Vector2();\n this.__opacity = 1;\n\n this.__text = text;\n\n this.__generate_glyphs(text);\n }\n\n set text(value)\n {\n this.__text = value;\n this.__generate_glyphs(value);\n this.matrix_is_dirty = true;\n }\n\n get text()\n {\n return this.__text;\n }\n\n update_matrix()\n {\n this.matrix.compose(this.position, this.quaternion, this.scale);\n this.matrix_is_dirty = false;\n this.glyph_is_dirty = true;\n }\n\n clear_glyph_dirty()\n {\n this.glyph_is_dirty = false;\n }\n\n clear_color_dirty()\n {\n this.color_is_dirty = false;\n }\n\n set_rotation(orientation = 0, tilt = 0) // 0..360, -90..0..90\n {\n const new_orientation = new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), (orientation / 360) * Math.PI * 2);\n const new_tilt = new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), (-tilt / 360) * Math.PI * 2);\n\n this.quaternion.copy(new_orientation.multiply(new_tilt));\n this.matrix_is_dirty = true;\n }\n\n set_position(pos)\n {\n this.position.copy(pos);\n this.matrix_is_dirty = true;\n }\n\n set_size(size)\n {\n this.scale.set(size, size, size);\n this.matrix_is_dirty = true;\n }\n\n set_color(col)\n {\n this.color.set(col);\n this.color_is_dirty = true;\n }\n\n set_pivot(pivot)\n {\n this.pivot_point.copy(pivot);\n this.update_glyphs();\n }\n\n set opacity(op)\n {\n this.__opacity = op;\n this.color_is_dirty = true;\n }\n\n get opacity()\n {\n return this.__opacity;\n }\n\n update_glyphs()\n {\n this.__generate_glyphs(this.text);\n }\n\n __generate_glyphs(text)\n {\n let cursor = 0;\n\n this.glyphs.length = 0;\n\n for (let i = 0; i < text.length; i++)\n {\n const unicode = text.charCodeAt(i);\n const glyph = this.glyph_layout.find(element => element.unicode === unicode);\n if (glyph)\n {\n if (glyph.planeBounds)\n {\n const text_glyph = new TextGlyph(cursor, glyph.planeBounds, glyph.atlasBounds);\n this.glyphs.push(text_glyph);\n }\n cursor += glyph.advance;\n }\n }\n\n const box2 = new Box2();\n const first_glyph = this.glyphs[0];\n box2.setFromCenterAndSize(first_glyph.position.clone().add(new Vector2(first_glyph.scale.x / 2, first_glyph.scale.y / 2)), first_glyph.scale);\n\n for (let i = 1; i < this.glyphs.length; i++)\n {\n const g = this.glyphs[i];\n const box = new Box2().setFromCenterAndSize(g.position.clone().add(new Vector2(g.scale.x / 2, g.scale.y / 2)), g.scale);\n box2.union(box);\n }\n\n const box2_size = new Vector2();\n box2.getSize(box2_size);\n for (let i = 0; i < this.glyphs.length; i++)\n {\n this.glyphs[i].position.x -= box2_size.x / 2;\n this.glyphs[i].position.y -= box2_size.y / 2;\n\n this.glyphs[i].position.x += (box2_size.x / 2) * this.pivot_point.x;\n this.glyphs[i].position.y += (box2_size.y / 2) * this.pivot_point.y;\n }\n\n this.glyph_is_dirty = true;\n }\n}\n\nexport { SDFText };\n","import { BaseShaderMaterial } from './BaseShaderMaterial';\n\nimport frag from '../shaders/sdf_text/sdf_text.frag';\nimport vert from '../shaders/sdf_text/sdf_text.vert';\n\nimport { Vector2, DoubleSide, LinearFilter } from 'three';\nimport { OMath } from '../utilities/OMath';\n\nclass SDFTextMaterial extends BaseShaderMaterial\n{\n constructor(texture)\n {\n super(vert, frag, {\n _Texture: { value: texture },\n _Boldness: { value: 0.5 },\n _AtlasSize: { value: new Vector2(1, 1) }\n });\n\n this.transparent = true;\n this.extensions = {\n derivatives: true\n };\n this.depthWrite = false;\n this.side = DoubleSide;\n texture.minFilter = LinearFilter;\n texture.magFilter = LinearFilter;\n texture.generateMipMaps = false;\n }\n\n set_atlas_size(size)\n {\n this.uniforms._AtlasSize.value.copy(size);\n }\n\n set_boldness(value)\n {\n this.uniforms._Boldness.value = OMath.lerp(0.5, 0.2, value);\n }\n}\n\nexport { SDFTextMaterial };\n","import { SDFText } from './SDFText';\nimport { SDFTextMaterial } from '../../materials/SDFTextMaterial';\nimport { ArrayUtilities } from '../../utilities/ArrayUtilities';\n\nimport {\n PlaneGeometry,\n Mesh,\n Vector2,\n InstancedBufferGeometry,\n InstancedBufferAttribute,\n Float32BufferAttribute,\n DynamicDrawUsage\n} from 'three';\n\nclass SDFTextBatch extends Mesh\n{\n constructor(font_layout, atlas_texture)\n {\n const max_allocations = 2000;\n\n const instanced_geometry = new InstancedBufferGeometry();\n instanced_geometry.instanceCount = 0;\n\n const geometry = new PlaneGeometry(1, 1);\n geometry.translate(0.5, 0.5, 0);\n instanced_geometry.setAttribute('position', new Float32BufferAttribute(geometry.getAttribute('position').array, 3));\n instanced_geometry.setAttribute('uv', new Float32BufferAttribute(geometry.getAttribute('uv').array, 2));\n instanced_geometry.index = geometry.index;\n\n const transformsCol0 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n const transformsCol1 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n const transformsCol2 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n const transformsCol3 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n\n const glyph_bounds = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n const plane_bounds = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n\n const color = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n\n transformsCol0.usage = DynamicDrawUsage;\n transformsCol1.usage = DynamicDrawUsage;\n transformsCol2.usage = DynamicDrawUsage;\n transformsCol3.usage = DynamicDrawUsage;\n glyph_bounds.usage = DynamicDrawUsage;\n plane_bounds.usage = DynamicDrawUsage;\n color.usage = DynamicDrawUsage;\n\n instanced_geometry.setAttribute('transformsCol0', transformsCol0);\n instanced_geometry.setAttribute('transformsCol1', transformsCol1);\n instanced_geometry.setAttribute('transformsCol2', transformsCol2);\n instanced_geometry.setAttribute('transformsCol3', transformsCol3);\n\n instanced_geometry.setAttribute('glyph_bounds', glyph_bounds);\n instanced_geometry.setAttribute('plane_bounds', plane_bounds);\n instanced_geometry.setAttribute('color', color);\n\n super(instanced_geometry, new SDFTextMaterial(atlas_texture));\n\n this.text_elements = [];\n this.font_layout = font_layout;\n\n this.material.set_atlas_size(new Vector2(font_layout.atlas.width, font_layout.atlas.height));\n\n this.frustumCulled = false;\n }\n\n set_boldness(value)\n {\n this.material.set_boldness(value);\n }\n\n add_text(text_str)\n {\n const elem = new SDFText(this.font_layout.glyphs, text_str);\n this.text_elements.push(elem);\n return elem;\n }\n\n remove_text(text_elem)\n {\n ArrayUtilities.remove_elem(this.text_elements, text_elem);\n this.update(true);\n }\n\n update(force_update)\n {\n const glyph_bounds_atr = this.geometry.getAttribute('glyph_bounds');\n const plane_bounds_atr = this.geometry.getAttribute('plane_bounds');\n\n const transformsCol0 = this.geometry.getAttribute('transformsCol0');\n const transformsCol1 = this.geometry.getAttribute('transformsCol1');\n const transformsCol2 = this.geometry.getAttribute('transformsCol2');\n const transformsCol3 = this.geometry.getAttribute('transformsCol3');\n\n const color_atr = this.geometry.getAttribute('color');\n\n let matrix_needs_update = force_update === true;\n let glyph_needs_update = force_update === true;\n let color_needs_update = force_update === true;\n\n let glyph_count = 0;\n for (let i = 0; i < this.text_elements.length; i++)\n {\n const text = this.text_elements[i];\n\n if (text.matrix_is_dirty)\n {\n matrix_needs_update = true;\n text.update_matrix();\n }\n\n if (text.glyph_is_dirty)\n {\n glyph_needs_update = true;\n text.clear_glyph_dirty();\n }\n\n if (text.color_is_dirty)\n {\n color_needs_update = true;\n text.clear_color_dirty();\n }\n\n const matrix = text.matrix;\n const color = text.color;\n const opacity = text.opacity;\n\n for (let glyph_i = 0; glyph_i < text.glyphs.length; glyph_i++)\n {\n const glyph = text.glyphs[glyph_i];\n\n const buffer_i = glyph_count;\n\n glyph_bounds_atr.setXYZW(buffer_i, glyph.atlas_bounds.x, glyph.atlas_bounds.y, glyph.atlas_bounds.z, glyph.atlas_bounds.w);\n plane_bounds_atr.setXYZW(buffer_i, glyph.position.x, glyph.position.y, glyph.scale.x, glyph.scale.y);\n\n transformsCol0.setXYZW(buffer_i, matrix.elements[0],\n matrix.elements[1],\n matrix.elements[2],\n matrix.elements[3]);\n\n transformsCol1.setXYZW(buffer_i, matrix.elements[4],\n matrix.elements[5],\n matrix.elements[6],\n matrix.elements[7]);\n\n transformsCol2.setXYZW(buffer_i, matrix.elements[8],\n matrix.elements[9],\n matrix.elements[10],\n matrix.elements[11]);\n\n transformsCol3.setXYZW(buffer_i, matrix.elements[12],\n matrix.elements[13],\n matrix.elements[14],\n matrix.elements[15]);\n\n color_atr.setXYZW(buffer_i, color.r, color.g, color.b, opacity);\n\n glyph_count++;\n }\n }\n\n this.geometry.instanceCount = glyph_count;\n\n if (glyph_count > this.max_allocations)\n {\n console.error('SDFTextBatch exceeded maximum glyph allocations(max/current): ', this.max_allocations, glyph_count, this);\n }\n\n if (matrix_needs_update)\n {\n transformsCol0.needsUpdate = true;\n transformsCol1.needsUpdate = true;\n transformsCol2.needsUpdate = true;\n transformsCol3.needsUpdate = true;\n }\n if (glyph_needs_update)\n {\n glyph_bounds_atr.needsUpdate = true;\n plane_bounds_atr.needsUpdate = true;\n }\n if (color_needs_update)\n {\n color_atr.needsUpdate = true;\n }\n }\n\n dispose()\n {\n this.geometry.dispose();\n this.material.dispose();\n }\n}\n\nexport { SDFTextBatch };\n","import { ActionInterpolator } from './ActionInterpolator';\n\nclass VectorInterpolator extends ActionInterpolator\n{\n constructor(attribute_name, from = 0, to = 1, easing_function = 'linear')\n {\n super(easing_function);\n\n this.attribute_name = attribute_name;\n this.from = from;\n this.to = to;\n }\n\n update(context, t)\n {\n const tmp = this.from.clone();\n tmp.lerp(this.to, this.easing_function(t));\n context[this.attribute_name].copy(tmp);\n }\n}\n\nexport { VectorInterpolator };\n","import { BlitMaterial } from '../materials/BlitMaterial';\n\nimport frag from '../shaders/median_filter/median_filter.frag';\n\nimport { Vector2 } from 'three';\n\nclass MedianFilterMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag, undefined, {\n kernel3x3: true\n });\n\n this.uniforms._SourceTex = { value: undefined };\n this.uniforms._SourceTexSize = { value: new Vector2(1, 1) };\n }\n\n set_texture(tex)\n {\n this.uniforms._SourceTex.value = tex;\n\n const size = this.get_size(tex);\n this.uniforms._SourceTexSize.value.copy(size);\n }\n\n get_size(tex)\n {\n if (tex.isVideoTexture)\n {\n return new Vector2(Math.max(1, tex.image.videoWidth), Math.max(1, tex.image.videoHeight));\n }\n if (tex.isWebGLRenderTarget)\n {\n return new Vector2(tex.width, tex.height);\n }\n if (tex.isTexture)\n {\n return new Vector2(tex.image.width, tex.image.height);\n }\n return new Vector2(1, 1);\n }\n}\n\nexport { MedianFilterMaterial };\n","import { MedianFilterMaterial } from '../materials/MedianFilterMaterial';\nimport { Graphics } from '../Graphics';\n\nimport { WebGLRenderTarget, Vector2, RGBAFormat, FloatType, NearestFilter } from 'three';\n\nclass MedianFilter\n{\n constructor(renderer)\n {\n this.RT = new WebGLRenderTarget(1, 1, {\n type: FloatType,\n format: RGBAFormat,\n minFilter: NearestFilter,\n magFilter: NearestFilter\n });\n this.RT1 = new WebGLRenderTarget(1, 1, {\n type: FloatType,\n format: RGBAFormat,\n minFilter: NearestFilter,\n magFilter: NearestFilter\n });\n\n this.median_filter_mat = new MedianFilterMaterial();\n }\n\n filter(texture)\n {\n const tex_size = this.get_size(texture);\n if (tex_size.x !== this.RT.width || tex_size.y !== this.RT.height)\n {\n this.RT.setSize(tex_size.x, tex_size.y);\n this.RT1.setSize(tex_size.x, tex_size.y);\n }\n\n this.median_filter_mat.set_texture(texture);\n Graphics.material_pass(this.median_filter_mat, this.RT);\n\n for (let i = 0; i < 0; i++)\n {\n this.median_filter_mat.set_texture(this.RT.texture);\n Graphics.material_pass(this.median_filter_mat, this.RT1);\n\n this.median_filter_mat.set_texture(this.RT1.texture);\n Graphics.material_pass(this.median_filter_mat, this.RT);\n }\n\n return this.RT;\n }\n\n get_size(tex)\n {\n if (tex.isVideoTexture)\n {\n return new Vector2(Math.max(1, tex.image.videoWidth), Math.max(1, tex.image.videoHeight));\n }\n if (tex.isWebGLRenderTarget)\n {\n return new Vector2(tex.width, tex.height);\n }\n if (tex.isTexture)\n {\n return new Vector2(tex.image.width, tex.image.height);\n }\n return new Vector2(1, 1);\n }\n}\n\nexport { MedianFilter };\n","import { BlitMaterial } from './BlitMaterial';\n\nimport downsample_frag from '../shaders/dual_filter_blur/downsample.frag';\nimport upsample_frag from '../shaders/dual_filter_blur/upsample.frag';\n\nclass DualFilteringBlurMaterial extends BlitMaterial\n{\n constructor(upsample)\n {\n super(upsample ? upsample_frag : downsample_frag);\n }\n}\n\nexport { DualFilteringBlurMaterial };\n","import { BlitMaterial } from './BlitMaterial';\n\nimport frag from '../shaders/dual_filter_blur/alpha_filter.frag';\n\nclass AlphaFilterMaterial extends BlitMaterial\n{\n constructor(use_alpha_mask, upsample)\n {\n super(frag);\n }\n\n set offset(value)\n {\n this.uniforms._Offset.value = value;\n }\n\n get offset()\n {\n return this.uniforms._Offset.value;\n }\n}\n\nexport { AlphaFilterMaterial };\n","import { DualFilteringBlurMaterial } from '../materials/DualFilteringBlurMaterial';\nimport { AlphaFilterMaterial } from '../materials/AlphaFilterMaterial';\nimport { Graphics } from '../Graphics';\nimport { WebGLRenderTarget } from 'three';\nclass DualFilteringBlurrer\n{\n constructor(use_alpha_mask)\n {\n this.current_width = 1;\n this.current_height = 1;\n this.RT0 = new WebGLRenderTarget(1, 1);\n this.RT1 = new WebGLRenderTarget(1, 1);\n this.RT2 = new WebGLRenderTarget(1, 1);\n this.RT3 = new WebGLRenderTarget(1, 1);\n this.RT4 = new WebGLRenderTarget(1, 1);\n\n this.upscale_blur_mat = new DualFilteringBlurMaterial(true);\n this.downscale_blur_mat = new DualFilteringBlurMaterial(false);\n\n this.alpha_filter_mat = new AlphaFilterMaterial();\n }\n\n blur(RT)\n {\n this.check_RT_resize(RT.width, RT.height);\n Graphics.blit(RT, this.RT1, this.alpha_filter_mat);\n\n // Graphics.blit(this.RT0, this.RT1, this.downscale_blur_mat);\n Graphics.blit(this.RT1, this.RT2, this.downscale_blur_mat);\n Graphics.blit(this.RT2, this.RT3, this.downscale_blur_mat);\n Graphics.blit(this.RT3, this.RT4, this.downscale_blur_mat);\n\n // Graphics.blit(this.RT4, this.RT3, this.upscale_blur_mat);\n // Graphics.blit(this.RT3, this.RT4, this.upscale_blur_mat);\n Graphics.blit(this.RT4, this.RT3, this.upscale_blur_mat);\n Graphics.blit(this.RT3, this.RT2, this.upscale_blur_mat);\n Graphics.blit(this.RT2, RT, this.upscale_blur_mat);\n // Graphics.blit(this.RT1, RT, this.upscale_blur_mat);\n\n // return this.RT2;\n }\n\n check_RT_resize(width, height)\n {\n if (this.current_width !== width || this.current_height !== height)\n {\n this.current_width = width;\n this.current_height = height;\n this.RT0.setSize(this.current_width / 2, this.current_height / 2);\n this.RT1.setSize(this.current_width / 2, this.current_height / 2);\n this.RT2.setSize(this.current_width / 4, this.current_height / 4);\n this.RT3.setSize(this.current_width / 8, this.current_height / 8);\n this.RT4.setSize(this.current_width / 16, this.current_height / 16);\n }\n }\n}\n\nexport { DualFilteringBlurrer };\n","import { Graphics } from '../Graphics';\n\nimport { NearestFilter } from 'three';\nimport { RGBAFormat } from 'three';\nimport { LinearEncoding } from 'three';\nimport { HalfFloatType } from 'three';\nimport { FloatType } from 'three';\nimport { WebGLRenderTarget } from 'three';\nimport { Capabilities } from '../Capabilities';\n\nclass ParticleAttribute\n{\n constructor(attr_name, update_material)\n {\n this.read = undefined;\n this.write = undefined;\n\n this.name = attr_name;\n\n this.update_material = update_material;\n }\n\n init_from_geometry(geometry)\n {\n // overrided by inheritance\n }\n\n init_from_attribute(particle_attribute)\n {\n\n }\n\n build_RT(particle_count)\n {\n const resolution = ParticleAttribute.calculate_resolution(particle_count);\n const options = {\n minFilter: NearestFilter,\n magFilter: NearestFilter,\n format: RGBAFormat,\n encoding: LinearEncoding,\n type: Capabilities.fp_textures_available ? FloatType : HalfFloatType,\n stencilBuffer: false,\n depthBuffer: false\n };\n\n return new WebGLRenderTarget(resolution.width, resolution.height, options);\n }\n\n static calculate_resolution(particle_count)\n {\n const width = Math.min(particle_count, 512);\n const height = Math.max(1, Math.ceil(particle_count / width));\n return { width, height };\n }\n\n swap_RT()\n {\n const tmp = this.read;\n this.read = this.write;\n this.write = tmp;\n }\n\n update(attribute_writter_scene)\n {\n if (this.update_material)\n {\n this.update_material.update();\n attribute_writter_scene.children[0].material = this.update_material;\n this.update_material.uniforms._MainTex.value = this.read.texture;\n Graphics.render(attribute_writter_scene, undefined, this.write);\n attribute_writter_scene.children[0].material = undefined;\n\n this.swap_RT();\n }\n }\n\n store_geometry_attribute_in_RT(attribute, RT, storage_material, attribute_writter_scene)\n {\n attribute_writter_scene.children[0].geometry.setAttribute('data', attribute);\n attribute_writter_scene.children[0].material = storage_material;\n\n Graphics.render(attribute_writter_scene, undefined, RT);\n\n attribute_writter_scene.children[0].geometry.deleteAttribute('data');\n attribute_writter_scene.children[0].material = undefined;\n }\n\n get_texture()\n {\n return this.read.texture;\n }\n}\n\nexport { ParticleAttribute };\n","import { Object3D } from 'three';\nimport { BufferAttribute } from 'three';\nimport { PlaneGeometry } from 'three';\nimport { Mesh } from 'three';\nimport { BufferGeometry } from 'three';\nimport { Scene } from 'three';\nimport { Points } from 'three';\nimport { InstancedBufferGeometry } from 'three';\nimport { InstancedBufferAttribute } from 'three';\nimport { ParticleAttribute } from './ParticleAttribute';\n\nclass GPUParticleSystem extends Object3D\n{\n constructor(particle_count, material)\n {\n super();\n this.attributes = [];\n\n this.mesh = this.build_point_mesh(particle_count, material);\n this.add(this.mesh);\n\n this.attribute_writter_mesh = this.build_attribute_writter_mesh(particle_count);\n this.attribute_writter_scene = new Scene();\n this.attribute_writter_scene.add(this.attribute_writter_mesh);\n }\n\n add_texture_attribute(buffer_attribute)\n {\n this.attributes.push(buffer_attribute);\n }\n\n add_update_attribute_array(name, array, item_size)\n {\n this.attribute_writter_mesh.geometry.setAttribute(name, new BufferAttribute(array, item_size, false));\n }\n\n add_attribute_array(name, array, item_size)\n {\n this.mesh.geometry.setAttribute(name, new InstancedBufferAttribute(array, item_size, false));\n }\n\n update()\n {\n this.mesh.material.update();\n for (let i = 0; i < this.attributes.length; i++)\n {\n this.attributes[i].update(this.attribute_writter_scene);\n }\n }\n\n dispose()\n {\n this.mesh.geometry.dispose();\n this.mesh.material.dispose();\n }\n\n build_point_mesh(instance_count = 1, material)\n {\n const geo = new PlaneGeometry();\n\n const instanced_geo = new InstancedBufferGeometry();\n instanced_geo.setAttribute('position', geo.getAttribute('position'));\n instanced_geo.index = geo.index;\n\n instanced_geo.setAttribute('storage_uv', this.build_uv_storage_attribute(instance_count));\n instanced_geo.instanceCount = instance_count;\n const mesh = new Mesh(instanced_geo, material);\n mesh.frustumCulled = false;\n return mesh;\n }\n\n build_attribute_writter_mesh(particle_count)\n {\n const { width, height } = ParticleAttribute.calculate_resolution(particle_count);\n\n const uvs = new Float32Array(particle_count * 3);\n\n for (let i = 0; i < particle_count; i++)\n {\n const x = i % width;\n const y = Math.floor(i / width);\n uvs[i * 3 + 0] = (x + 0.5) / width;\n uvs[i * 3 + 1] = (y + 0.5) / height;\n uvs[i * 3 + 2] = i;\n }\n const geo = new BufferGeometry();\n geo.setAttribute('position', new BufferAttribute(uvs, 3, false));\n\n const points = new Points(geo);\n points.frustumCulled = false;\n return points;\n }\n\n build_uv_storage_attribute(particle_count)\n {\n const { width, height } = ParticleAttribute.calculate_resolution(particle_count);\n\n const uvs = new Float32Array(particle_count * 2);\n\n for (let i = 0; i < particle_count; i++)\n {\n const x = i % width;\n const y = Math.floor(i / width);\n uvs[i * 2 + 0] = (x + 0.5) / width;\n uvs[i * 2 + 1] = (y + 0.5) / height;\n }\n return new InstancedBufferAttribute(uvs, 2, false);\n }\n}\n\nexport { GPUParticleSystem };\n","import frag from '../../shaders/gpu_particles/generic_storage.frag';\n\nimport { ShaderMaterial } from 'three';\nimport { NoBlending } from 'three';\nimport { AlwaysDepth } from 'three';\n\nclass ParticleStorageMaterial extends ShaderMaterial\n{\n constructor()\n {\n const vert = `\n varying vec4 value;\n attribute vec4 data;\n\n void main()\n {\n gl_Position = vec4(position.xy * 2.0 - 1.0, 1.0,1.0);\n gl_PointSize = 1.0;\n\n value = data;\n }\n `;\n super({\n uniforms: {\n\n },\n vertexShader: vert,\n fragmentShader: frag,\n depthWrite: false,\n blending: NoBlending,\n depthTest: false,\n depthFunc: AlwaysDepth\n });\n }\n}\n\nexport { ParticleStorageMaterial };\n","import { BufferAttribute } from 'three';\n\nimport { ParticleAttribute } from '../gpu_particles/ParticleAttribute';\nimport { ParticleStorageMaterial } from '../materials/gpu_particles/ParticleStorageMaterial';\n\nclass ParticlePositionAttribute extends ParticleAttribute\n{\n constructor(update_material)\n {\n super('_Position', update_material);\n }\n\n store_geometry(geometry, attribute_writter_scene)\n {\n const pos_attr = geometry.getAttribute('position');\n this.read = this.build_RT(pos_attr.count);\n this.write = this.build_RT(pos_attr.count);\n\n const mat = new ParticleStorageMaterial();\n this.store_geometry_attribute_in_RT(geometry.getAttribute('position'), this.read, mat, attribute_writter_scene);\n }\n\n store_positions(positions, attribute_writter_scene)\n {\n this.read = this.build_RT(positions.length);\n this.write = this.build_RT(positions.length);\n\n const arr = new Float32Array(positions.length * 4);\n\n for (let i = 0; i < positions.length; i++)\n {\n arr[i * 4 + 0] = positions[i].x;\n arr[i * 4 + 1] = positions[i].y;\n arr[i * 4 + 2] = positions[i].z;\n arr[i * 4 + 3] = (Math.random() * 2 - 1) * 10;\n }\n const mat = new ParticleStorageMaterial();\n this.store_geometry_attribute_in_RT(new BufferAttribute(arr, 4), this.read, mat, attribute_writter_scene);\n }\n}\n\nexport { ParticlePositionAttribute };\n","import { DataTexture } from 'three';\n\nclass CustomDataTexture extends DataTexture\n{\n constructor(data, width, height, format, type)\n {\n super(data, width, height, format, type);\n this.multiplier = 1;\n }\n\n set_rgba(index, r, g, b, a)\n {\n this.data[index * 3 + 0] = r * this.multiplier;\n this.data[index * 3 + 1] = g * this.multiplier;\n this.data[index * 3 + 2] = b * this.multiplier;\n this.data[index * 3 + 3] = a * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_rgb(index, r, g, b)\n {\n this.data[index * 3 + 0] = r * this.multiplier;\n this.data[index * 3 + 1] = g * this.multiplier;\n this.data[index * 3 + 2] = b * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_r(index, value)\n {\n this.data[index * 3 + 0] = value * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_g(index, value)\n {\n this.data[index * 3 + 1] = value * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_b(index, value)\n {\n this.data[index * 3 + 2] = value * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_a(index, value)\n {\n this.data[index * 3 + 2] = value * this.multiplier;\n this.needsUpdate = true;\n }\n}\n\nexport { CustomDataTexture };\n","import { CustomDataTexture } from './CustomDataTexture';\nimport { RGBFormat } from 'three';\n\nclass RGBDataTexture extends CustomDataTexture\n{\n constructor(width, height)\n {\n const data = new Uint8Array(width * height * 3);\n super(data, width, height, RGBFormat);\n this.multiplier = 255;\n }\n}\n\nexport { RGBDataTexture };\n","import { CustomDataTexture } from './CustomDataTexture';\nimport { RGBAFormat } from 'three';\n\nclass RGBADataTexture extends CustomDataTexture\n{\n constructor(width, height)\n {\n const data = new Uint8Array(width * height * 4);\n super(data, width, height, RGBAFormat);\n this.multiplier = 255;\n }\n}\n\nexport { RGBADataTexture };\n","import { CustomDataTexture } from './CustomDataTexture';\nimport { FloatType } from 'three';\nimport { RGBFormat } from 'three';\n\nclass RGBFloatDataTexture extends CustomDataTexture\n{\n constructor(width, height)\n {\n const data = new Float32Array(width * height * 3);\n super(data, width, height, RGBFormat, FloatType);\n }\n}\n\nexport { RGBFloatDataTexture };\n","import { CustomDataTexture } from './CustomDataTexture';\nimport { FloatType } from 'three';\nimport { RGBAFormat } from 'three';\n\nclass RGBAFloatDataTexture extends CustomDataTexture\n{\n constructor(width, height)\n {\n const data = new Float32Array(width * height * 4);\n super(data, width, height, RGBAFormat, FloatType);\n }\n}\n\nexport { RGBAFloatDataTexture };\n","import { Mesh } from 'three';\nimport { RGBDataTexture } from '../data_textures/RGBDataTexture';\nimport { RGBADataTexture } from '../data_textures/RGBADataTexture';\nimport { RGBFloatDataTexture } from '../data_textures/RGBFloatDataTexture';\nimport { RGBAFloatDataTexture } from '../data_textures/RGBAFloatDataTexture';\n\nclass BatchedMesh extends Mesh\n{\n constructor(id_table, geometry, material, max_texture_width)\n {\n super(geometry, material);\n\n this.id_table = id_table;\n this.batched_count = Object.keys(id_table).length;\n this.max_texture_width = max_texture_width;\n this.batch_width = this.batched_count % max_texture_width;\n this.batch_height = Math.ceil(this.batched_count / max_texture_width);\n }\n\n attach_rgb_texture(uniform_name)\n {\n this.material.uniforms[uniform_name].value = new RGBDataTexture(this.batch_width, this.batch_height);\n }\n\n attach_rgba_texture(uniform_name)\n {\n this.material.uniforms[uniform_name].value = new RGBADataTexture(this.batch_width, this.batch_height);\n }\n\n attach_rgb_float_texture(uniform_name)\n {\n this.material.uniforms[uniform_name].value = new RGBFloatDataTexture(this.batch_width, this.batch_height);\n }\n\n attach_rgba_float_texture(uniform_name)\n {\n this.material.uniforms[uniform_name].value = new RGBAFloatDataTexture(this.batch_width, this.batch_height);\n }\n\n get_mesh_index(name)\n {\n return this.id_table[name];\n }\n\n set_rgb_value(uniform_name, mesh_name, r, g, b)\n {\n this.material.uniforms[uniform_name].set_rgb(this.get_mesh_index(mesh_name), r, g, b);\n }\n\n set_rgba_value(uniform_name, mesh_name, r, g, b, a)\n {\n this.material.uniforms[uniform_name].set_rgba(this.get_mesh_index(mesh_name), r, g, b, a);\n }\n}\n\nexport { BatchedMesh };\n","import { BatchedMesh } from './BatchedMesh';\n\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\n\nimport { BufferAttribute } from 'three';\n\nclass MeshBatcher\n{\n batch(meshes, material)\n {\n const max_texture_width = 2048;\n // let texture_width = meshes.length % max_texture_width;\n // let texture_height = Math.ceil(meshes.length / max_texture_width);\n\n // console.log(\"Store count: \" + buffer_geometries.length + \", Texture size: \" +texture_width);\n\n const geometries = [];\n const id_table = {};\n\n const attr_mesh_id = [];\n\n for (let i = 0; i < meshes.length; i++)\n {\n const mesh = meshes[i];\n const vertex_count = mesh.geometry.getAttribute('position').count;\n\n for (let count = 0; count < vertex_count; count++)\n {\n attr_mesh_id.push(i);\n }\n\n geometries.push(mesh.geometry);\n\n if (id_table[mesh.name] === undefined)\n {\n id_table[mesh.name] = i;\n }\n else\n {\n console.error('Mesh name is duplicated when trying to merge meshes. Non-unique id error.', mesh.name, id_table);\n }\n }\n\n const buffer_geometry = BufferGeometryUtils.mergeBufferGeometries(geometries);\n\n const buffer_attribute = new BufferAttribute(new Float32Array(attr_mesh_id), 1);\n buffer_geometry.setAttribute('mesh_id', buffer_attribute);\n\n return this.create_batched_mesh(id_table, buffer_geometry, material, max_texture_width);\n }\n\n create_batched_mesh(id_table, buffer_geometry, material, max_texture_width)\n {\n return new BatchedMesh(id_table, buffer_geometry, material, max_texture_width);\n }\n}\n\nexport { MeshBatcher };\n","import { Audio as TAudio } from 'three';\nimport { PositionalAudio as TPositionalAudio } from 'three';\n\nclass AudioClip\n{\n constructor(buffer, loop = true, volume = 1, positional = false)\n {\n this.buffer = buffer;\n this.loop = loop;\n this.volume = volume;\n this.positional = positional;\n\n this.audio = undefined;\n }\n\n init(audio_listener)\n {\n if (this.positional)\n {\n this.audio = new TPositionalAudio(audio_listener);\n }\n else\n {\n this.audio = new TAudio(audio_listener);\n }\n\n this.audio.setBuffer(this.buffer);\n this.audio.setLoop(this.loop);\n\n // This prevents undesired volume at the beginning of playing\n this.audio.gain.gain.value = 0;\n\n this.audio.setVolume(this.loop ? 0 : this.volume);\n }\n\n play()\n {\n this.audio.play();\n }\n\n pause()\n {\n this.audio.pause();\n }\n\n stop()\n {\n this.audio.stop();\n }\n\n get is_playing()\n {\n return this.audio.isPlaying;\n }\n}\n\nexport { AudioClip };\n","import { AudioContext } from 'three';\r\n\r\nimport { AudioClip } from '../components/AudioClip';\r\nimport { AbstractLoader } from './AbstractLoader';\r\n\r\nclass AudioLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, loop = true, volume = 0, size, positional = false)\r\n {\r\n super(resource_id, url, size);\r\n this.loop = loop;\r\n this.volume = volume;\r\n this.positional = positional;\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n // if (!window.user_interaction_for_audio)\r\n // {\r\n // setTimeout(this.on_preloaded_finished.bind(this, resource_container), 100);\r\n // }\r\n // else\r\n // {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.instantiate_audio(resource_container);\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n // }\r\n }\r\n\r\n instantiate_audio(resource_container)\r\n {\r\n const context = AudioContext.getContext();\r\n\r\n const buffer = context.createBuffer(2, 22050, 44100);\r\n\r\n fetch(this.url).then(r => r.blob()).then((response) =>\r\n {\r\n if (response.arrayBuffer)\r\n {\r\n response.arrayBuffer().then((array_buffer) =>\r\n {\r\n context.decodeAudioData(array_buffer, (audio_buffer) =>\r\n {\r\n resource_container.set_resource(\r\n this.resource_id,\r\n this.url,\r\n new AudioClip(audio_buffer, this.loop, this.volume, this.positional)\r\n );\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n });\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(\r\n this.resource_id,\r\n this.url,\r\n new AudioClip(buffer, this.loop, this.volume, this.positional)\r\n );\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport { AudioLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\n\n// import { sRGBEncoding } from 'three';\n\nclass BasisLoader extends AbstractLoader\n{\n constructor(resource_id, url, loader, size)\n {\n super(resource_id, url, size);\n\n this.loader = loader;\n }\n\n on_preloaded_finished(resource_container)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n this.loader.load(this.url, (basis) =>\n {\n // basis.encoding = sRGBEncoding;\n\n resource_container.set_resource(this.resource_id, this.url, basis);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // this.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n\nexport { BasisLoader };\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { CubeTextureLoader } from 'three';\r\n\r\nclass CubemapLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, extension, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new CubeTextureLoader();\r\n this.loader.setPath(url + '/');\r\n this.urls = [\r\n `px.${extension}`,\r\n `nx.${extension}`,\r\n `py.${extension}`,\r\n `ny.${extension}`,\r\n `pz.${extension}`,\r\n `nz.${extension}`\r\n ];\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.urls, (image) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, image);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (error) =>\r\n {\r\n this.__set_error('Image could not be loaded. Maybe wrong name or path, I don\\'t know' + '¯\\\\_(ツ)_/¯', error);\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { CubemapLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { ColladaLoader } from 'three/examples/jsm/loaders/ColladaLoader.js';\r\n\r\nclass DAELoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new ColladaLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, gltf);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { DAELoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { FileLoader as TFileLoader } from 'three';\r\n\r\nclass FileLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new TFileLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (file) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, file);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg);\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { FileLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\n\nimport { FontLoader as TFontLoader } from 'three/examples/jsm/loaders/FontLoader.js';\n\nclass FontLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n this.loader = new TFontLoader();\n }\n\n on_preloaded_finished(resource_container)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n this.loader.load(this.url, (font) =>\n {\n resource_container.set_resource(this.resource_id, this.url, font);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // this.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then probably the problem is related to the file not being found. Check the name and path of the resource');\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n\nexport { FontLoader };\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { GLTFLoader as TGLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';\r\n\r\nclass GLTFLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new TGLTFLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, gltf);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { GLTFLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';\r\n\r\nclass GLTFDRACOLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, loader, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new GLTFLoader();\r\n\r\n this.loader.setDRACOLoader(loader);\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, gltf);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { GLTFDRACOLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { HDRCubeTextureLoader as THDRCubeTextureLoader } from 'three/examples/jsm/loaders/HDRCubeTextureLoader.js';\r\nimport { UnsignedByteType } from 'three';\r\n\r\nclass HDRCubeTextureLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THDRCubeTextureLoader();\r\n this.url_suffix = ['/px.hdr', '/nx.hdr', '/py.hdr', '/ny.hdr', '/pz.hdr', '/nz.hdr'];\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.setPath(this.url)\r\n .setDataType(UnsignedByteType)\r\n .load(this.url_suffix, (hdr) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, hdr);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { HDRCubeTextureLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\n\nclass JSONLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n }\n\n on_preloaded_finished(resource_container, response)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n response.json().then((json) =>\n {\n resource_container.set_resource(this.resource_id, this.url, json);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n\nexport { JSONLoader };\n","import { AbstractLoader } from './AbstractLoader';\n\nimport { OBJLoader as TOBJLoader } from 'three/examples/jsm/loaders/OBJLoader.js';\n\nclass OBJLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n this.loader = new TOBJLoader();\n }\n\n on_preloaded_finished(resource_container)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n this.loader.load(this.url, (obj) =>\n {\n resource_container.set_resource(this.resource_id, this.url, obj);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // this.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then probably the problem is related to the file not being found. Check the name and path of the resource');\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n\nexport { OBJLoader };\n","import { AbstractLoader } from './AbstractLoader';\n\nimport { Vector3 } from 'three';\nimport { FileLoader } from 'three';\n\nclass PointArrayLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n this.loader = new FileLoader();\n }\n\n on_preloaded_finished(resource_container)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n this.loader.load(this.url, (text) =>\n {\n resource_container.set_resource(this.resource_id, this.url, this.parse_path(text));\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // this.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n this.__set_error(msg);\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n\n parse_path(raw_data)\n {\n const string_array = raw_data.split('\\n');\n\n if (string_array[string_array.length - 1] === '')\n {\n string_array.pop();\n }\n\n const positions = [];\n\n for (let i = 0; i < string_array.length; i += 3)\n {\n const x = parseFloat(string_array[i + 0]);\n const y = parseFloat(string_array[i + 1]);\n const z = parseFloat(string_array[i + 2]);\n positions.push(new Vector3(x, y, z));\n }\n return positions;\n // let curve = new THREE.CatmullRomCurve3(positions);\n // return curve.getPoints(100);\n }\n}\n\nexport { PointArrayLoader };\n","import { AbstractLoader } from './AbstractLoader';\n\nimport { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js';\n\nclass RGBETextureLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n this.loader = new RGBELoader();\n }\n\n on_preloaded_finished(resource_container)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n this.loader.load(this.url, (hdr) =>\n {\n resource_container.set_resource(this.resource_id, this.url, hdr);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // this.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n\nexport { RGBETextureLoader };\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { FileLoader as TFileLoader } from 'three';\r\n\r\nclass TextLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new TFileLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, gltf);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg);\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { TextLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { Texture } from 'three';\r\nimport { Browser } from '../Browser';\r\n\r\nclass AsyncTextureLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (Browser.is_safari && Browser.version < 15)\r\n {\r\n this.load_with_old_method(resource_container);\r\n }\r\n else\r\n {\r\n this.load_with_new_method(resource_container);\r\n }\r\n }\r\n\r\n load_with_old_method(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n const texture = new Texture();\r\n const image = new Image();\r\n\r\n image.src = this.url;\r\n\r\n image.onload = () =>\r\n {\r\n texture.image = image;\r\n texture.needsUpdate = true;\r\n\r\n resource_container.set_resource(this.resource_id, this.url, texture);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n };\r\n\r\n image.onerror = () =>\r\n {\r\n console.error('Error loading texture. Maybe the resource is not an image?', this.url, this.original_url);\r\n };\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n\r\n load_with_new_method(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n const fetchOptions = {};\r\n fetchOptions.credentials = 'same-origin';\r\n // fetchOptions.headers = this.requestHeader;\r\n\r\n fetch(this.url, fetchOptions).then((res) =>\r\n {\r\n return res.blob();\r\n }).then((blob) =>\r\n {\r\n return createImageBitmap(blob, { colorSpaceConversion: 'none' });\r\n }).then((imageBitmap) =>\r\n {\r\n const texture = new Texture(imageBitmap);\r\n texture.needsUpdate = true;\r\n\r\n resource_container.set_resource(this.resource_id, this.url, texture);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }).catch(function(e)\r\n {\r\n console.error(e);\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { AsyncTextureLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { Texture } from 'three';\r\n\r\nclass TextureLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n }\r\n\r\n on_preloaded_finished(resource_container, response)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n response.blob().then((blob) =>\r\n {\r\n const texture = new Texture();\r\n\r\n const url = URL.createObjectURL(blob);\r\n\r\n const image = new Image();\r\n image.src = url;\r\n\r\n image.onload = () =>\r\n {\r\n texture.image = image;\r\n texture.needsUpdate = true;\r\n\r\n resource_container.set_resource(this.resource_id, this.url, texture);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n };\r\n\r\n image.onerror = () =>\r\n {\r\n console.error('Error loading texture. Maybe the resource is not an image?', this.url);\r\n };\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { TextureLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\n\nclass VideoLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n }\n\n on_preloaded_finished(resource_container, response)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n response.blob().then((blob) =>\n {\n resource_container.set_resource(this.resource_id, this.url, URL.createObjectURL(blob));\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n\nexport { VideoLoader };\n","import { ResourceContainer } from '../ResourceContainer';\r\n\r\nclass ResourceBatch\r\n{\r\n constructor(batch_name)\r\n {\r\n this.resource_loaders = [];\r\n this.batch_name = batch_name || 'unnamed batch';\r\n }\r\n\r\n add_loader(loader)\r\n {\r\n this.resource_loaders.push(loader);\r\n }\r\n\r\n load(resource_container)\r\n {\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n this.resource_loaders[i].load(resource_container || ResourceContainer);\r\n }\r\n }\r\n\r\n get loading_finished()\r\n {\r\n let finished = true;\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n finished = finished && this.resource_loaders[i].has_finished;\r\n }\r\n return finished;\r\n }\r\n\r\n get has_errors()\r\n {\r\n let has_error = false;\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n has_error = has_error || this.resource_loaders[i].has_error;\r\n }\r\n return has_error;\r\n }\r\n\r\n print_errors()\r\n {\r\n console.error('Batch <' + this.batch_name + '> could not load successfully');\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n if (this.resource_loaders[i].has_error)\r\n {\r\n this.resource_loaders[i].print_error();\r\n }\r\n }\r\n }\r\n\r\n get_progress()\r\n {\r\n return this.get_loaded_bytes() / this.get_total_bytes();\r\n }\r\n\r\n get_loaded_bytes()\r\n {\r\n let loaded_bytes = 1;\r\n\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n loaded_bytes += this.resource_loaders[i].loaded_bytes;\r\n }\r\n\r\n return loaded_bytes;\r\n }\r\n\r\n get_total_bytes()\r\n {\r\n let total_bytes = 1;\r\n\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n total_bytes += this.resource_loaders[i].total_bytes;\r\n }\r\n\r\n return total_bytes;\r\n }\r\n}\r\n\r\nexport { ResourceBatch };\r\n"],"names":["browser","init","this","browser_name","agent","window","navigator","userAgent","toLowerCase","indexOf","opr","chrome","version","get_version","name","is_safari","is_chrome","is_edge","is_edge_chromium","has_webm","is_firefox","has_hvec","preferred_video_extension","ua","tem","M","match","test","exec","slice","join","replace","appName","appVersion","splice","Number","split","Validation","constructor","static","n","is_int","is_float","str","JSON","parse","e","AbstractLoader","resource_id","url","size","loaded_bytes","total_bytes","has_finished","has_error","error_message","__update_downloaded_bytes","loaded","total","is_number","console","warn","__loading_ended","__set_error","message","print_error","error","load","resource_container","undefined","resources_by_url","cache","Browser","fetch","method","mode","credentials","redirect","then","on_progress","bind","catch","__on_error","set_resource","async","response","response_clone","clone","reader","body","getReader","contentLength","headers","get","receivedLength","done","value","read","length","on_preloaded_finished","data","OMath","from_range_start_value","from_range_end_value","to_range_start_value","to_range_end_value","min","max","number","divisor","rgb","r","Math","round","toString","g","b","points","plane","projected_point","Vector3","points_on_plane","i","projectPoint","push","from","to","target","t","elements","lerp","x1","x2","abs","x","y","m","euclideanModulo","degrees","PI","radians","v","w","z","center","add","multiplyScalar","arr","col","floor","random","clamp","ActionSequencer","context","elapsed_time","playback_speed","__get_playback_speed","playing","action_events","initial_context","stringify","tmp_t","channels","channel_names","Object","keys","duration","play","stop","reset","skip","get_duration","__play_clips","update","delta_time","set_progress","time","set_normalized_progress","get_progress","is_finished","add_action_event","trigger_time","action","add_action_interpolator","interpolator","use_dynamic_from_value","keyframes","attribute_name","keyframe","get_current_target_value","__get_current_keyframe","evaluate","get_current_starting_value","get_current_progress","__linear_map_01","easing_function","EPSILON","trigger","evaluate_keyframe","get_keyframes","channel_name","is_channel_redefined","initial","saturate","current","Infinity","distance","transitions_velocity","URLSearchParams","location","search","EasingFunctions","cos","sin","pow","sqrt","c4","ease_out_bounce","n1","d1","sign","ActionInterpolator","NumberInterpolator","super","view_context","app","set_app","ActionEvent","args","ViewContext","DrawIOAnimationSheet","xml_document","animation_nodes","DOMParser","parseFromString","querySelectorAll","animation_tracks","triggers","node","parent_node","parentElement","getAttribute","get_node_x_position","parseFloat","includes","split_data","trigger_name","trigger_method","at_time","value_data","to_value","from_time","to_time","sort","a","x_pos","ActionSequencerBuilder","default_state_data","from_animation_sheet","animation_data","current_context","tracks","initial_tracks","state_to_tracks","get_longest_time","find","element","sequencer","action_event","state","longest_time","from_draw_io","xml","transition_data","track_time","event_manager","queue","zoom_changed_evt","store_clickd_evt","point_selected_evt","config_changed","path_substep_completed","path_completed","go_to_store_requested_evt","resource_loaded_evt","service_clicked_evt","unit_pos_updated_evt","floor_changed_evt","on_enter_floor_navigation","on_exit_floor_navigation","on_enter_floor_selection","on_exit_floor_selection","on_enter_outside_navigation","on_exit_outside_navigation","step_selected_evt","fire","event","payload","on","callback","fire_zoom_changed","zoom","fire_store_selected","store_id","fire_point_selected","hit_data","fire_config_changed","fire_path_substep_completed","step_number","fire_path_completed","fire_step_selected","step_index","fire_go_to_store_requested","fire_resource_loaded","resource","fire_service_clicked","service","fire_unit_position_updated","unit_data","fire_floor_switched","floor_id","fire_on_enter_floor_navigation","fire_on_exit_floor_navigation","fire_on_enter_floor_selection","fire_on_exit_floor_selection","fire_on_enter_outside_navigation","fire_on_exit_outside_navigation","resources","EventManager","get_resource","HTMLUtilities","container","images","image","dataset","src","image_objects","image_object","videos","video","TransitionTable","transitions","from_state_name","to_state_name","add_transitions","set_transitions","set_default_state_data","delta_buffer","___time","Clock","__raw_delta_time","__elapsed_time","__allocated_time","Vector2","shader_time","__update","getDelta","getElapsedTime","shift","__calculate_delta_time","ViewState","start","show","hide","before_enter","on_enter","update_enter_transition","global_view_data","transition_progress","action_sequencer","update_transition","update_exit_transition","before_exit","on_exit","ViewStateTransitionHandler","transition_table","last_state","current_state","current_state_data","transitioning","go_to_state","__exit_last_state","__update_transitions","set_state","assign","Time","view_manager","views","transition_handler","view_change_subscribers","browser_title_suffix","__set_views_opacities","go_to_view","view_name","change_url","__change_browser_url","__change_browser_title","notify_view_change","go_to_scene","scene_name","next_view","transition_view","set_next_view","subscribe_to_view_change","subscriber","on_view_change","register_view","view","has_view","set_view","set_browser_title_suffix","title_suffix","get_current_view","get_view_by_name","get_view_by_url","get_by_url","history","pushState","title","__capitalize","document","set_opacity","string","aux_string","toUpperCase","__snake_to_whitespace","group","ApplicationView","ResourceContainer","ViewManager","classList","remove","load_html_images","load_images","load_html_videos","load_videos","style","opacity","BaseApplication","on_post_start","on_post_render","on_pre_render","on_frame_end","BaseRender","render","renderer","resize","dispose","BaseShaderMaterial","ShaderMaterial","vert","frag","uniforms","vertexShader","basic_vert","fragmentShader","basic_frag","_Color","Color","BlitMaterial","frag_shader","vert_shader","defines","_MainTex","_Resolution","_TargetResolution","depthWrite","blending","NoBlending","depthTest","depthFunc","AlwaysDepth","AddMaterial","nMips","_SecondTex","set_add_texture","tex","UnrealBloomComposeMaterial","NUM_MIPS","_BlurredTex","_BloomStrength","blurTexture1","blurTexture2","blurTexture3","blurTexture4","blurTexture5","bloomStrength","bloomFactors","bloomRadius","bloomTintColors","set_RT_0","rt","set_RT_1","set_RT_2","set_RT_3","set_RT_4","set_bloom_strength","set_bloom_radius","set_tint_color_0","col_string","set","set_tint_color_1","set_tint_color_2","set_tint_color_3","set_tint_color_4","camera_manager","_current","_spectator","camera","spectator","capabilities","max_anisotropy","vertex_texture_sampler_available","fp_textures_available","CanvasDrawer","uses_dynamic_font","__textHeight","canvas","createElement","ctx","getContext","getFontHeight","fontStyle","getElementsByTagName","dummy","dummyText","createTextNode","appendChild","setAttribute","offsetHeight","removeChild","get_text_size","text","font","ceil","measureText","width","draw_canvas","ctxOptions","font_color","__draw","draw_on_texture","canvas_texture","CanvasTexture","UVMapping","ClampToEdgeWrapping","NearestFilter","generateMipMaps","needsUpdate","roundRect","height","radius","fill","stroke","tl","tr","br","bl","defaultRadius","side","beginPath","moveTo","lineTo","quadraticCurveTo","closePath","configuration","parameters","dpr","from_json","json","Idle","is_animating","Animating","easing_function_t","animator","set_property_value","set_current_state","finished_callback","CSSAnimator","css_property","value_prefix","value_suffix","ease_in_out_cubic","animate","AxisHelper","Object3D","scale","blue_points","blue_axis_mat","LineBasicMaterial","color","blue_axis_geo","BufferGeometry","setFromPoints","blue_axis_line","Line","renderOrder","green_points","green_axis_mat","green_axis_geo","green_axis_line","red_points","red_axis_mat","red_axis_geo","red_axis_line","scene_manager","Scene","add_scene","scene","traverse","child","geometry","material","children","Cube","Mesh","segments","BoxGeometry","MeshBasicMaterial","Sphere","SphereBufferGeometry","Arrow","dir","cylinder_height","cylinder_geo","CylinderBufferGeometry","translate","cone_geometry","ConeBufferGeometry","cone_height","buffer_geometry","BufferGeometryUtils","mergeBufferGeometries","rotateX","quaternion","setFromUnitVectors","_dir","oscreen","position","render_width","render_height","width_height","pixel_size","update_position","size_changed","update_size","apply_pixel_density_v2","vector2","apply_pixel_density","get_pixel_size","aspect_ratio","portrait","ScreenSpaceTextureMaterial","h","_ScreenSpacePosition","_ScreenSize","_TextureSize","set_position","set_texture","set_screen_size","PerspectiveCamera","TPerspectiveCamera","fov","aspect","near","far","clear_color","clear_alpha","copy","debug","Vector3_one","Vector3_zero","canvas_renderer","display_texture_meshes","draw_arrow","origin","arrow","normalize","SceneManager","draw_axis","axis","set_debug_RT","RT","rt_debug","draw_rectangle","position_2d","fillStyle","fillRect","clear","clearRect","draw_line_2D","strokeStyle","draw_line","line","frustumCulled","draw_cube","pos","cube","draw_oriented_cube","depth","distanceTo","sub","forward_dir","draw_plane","PlaneGeometry","Vector4","basic_color_vert","basic_color_frag","transparent","draw_empty_cube","box","Box3","setFromCenterAndSize","helper","Box3Helper","draw_sphere","sphere","draw_point_array","input_points","open","catmull","CatmullRomCurve3","updateArcLengths","getSpacedPoints","draw_sphere_helper","SphereGeometry","sphere_mesh","draw_math_sphere","sphere1","draw_bounding_box","bb","draw_curve","curve","options","offset","draw_texture","mesh","graphics","OScreen","ClearDepthNormalMaterial","clear_depth","clear_normal","_DepthNormal","DepthNormalMaterial","_FarPlane","far_plane","DepthAndNormalsRenderer","WebGLRenderTarget","clear_depth_normal_mat","depth_normal_material","__resize_RT_if_necessary","blit_clear_with_material","CameraManager","setSize","render_target","Blitter","_blit_scene","_blit_material","_blit_quad","_blit_camera","OrthographicCamera","blit","dst","src_texture","isWebGLRenderTarget","texture","src_width","src_height","getSize","__render","material_pass","mat","blit_with_material","dst_RT","current_rt","getRenderTarget","setRenderTarget","core_attributes","context_attributes","threejs_attributes","_renderer","blitter","no_render","current_render_mode","generateDepthNormalTexture","depth_and_normals_renderer","is_webgl2","canvas_context","force_webgl2","xr_enabled","alpha","antialias","desynchronized","failIfMajorPerformanceCaveat","powerPreference","premultipliedAlpha","preserveDrawingBuffer","stencil","logarithmicDepthBuffer","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","code","press_key","release_key","pressed","released","key_name","key","fired","down","release_keys","is_key_pressed","is_key_down","is_key_released","register_key","unregister_key","removeEventListener","os","operating_systems","ANDROID","IOS","LINUX","MAC","WINDOWS","is_mobile","is_ipad","maxTouchPoints","is_ios","is_android","get_os","is_linux","is_mac","is_windows","platform","reflection_plane_context","target_geometry","target_position","set_target_geometry","GeometryBatch","batch_width","data_textures","object_names","zero_offset","write_offset","uniform_dirty_count","tmp_uploaded_data_count","add_global_uniform","set_global_uniform","add_object_uniform_v3","uniform_name","default_value_v3","src_tex","__create_rgb_texture","dst_tex","one_pixel_tex","new_data_tex","__add_data_texture","__flood_data_texture_rgb","add_object_uniform_v4","default_value_v4","__create_rgba_texture","__flood_data_texture_rgba","add_object_uniform_v4_float","__create_rgba_float_texture","set_object_uniform_v3","object_name","vector3","use_r","use_g","use_b","obj_index","__get_object_index","data_texture","__get_data_texture","__set_pixel_rgb","one_pixel","last_accessed_index","dirty_count","set_object_uniform_v4","vector4","use_a","__set_pixel_rgba","upload_texture_data","upload_budget","__partial_texture_data_upload","__full_texture_data_upload","get_uniform_dirty_count","texture_data","copyTextureToTexture","index","get_mesh","v3","v4","Uint8Array","DataTexture","RGBFormat","dst_texture","one_pixel_text","geometry_batcher","batches","batch","buffer_geometries","attr_accessor_uvs","texture_width","ceilPowerOfTwo","__init_uv_array","uv_index","vertex_count","count","buffer_attribute","BufferAttribute","uvs","ui","input","ui_elements","_tmp_normalized_pos","ss_scene","matrixWorldAutoUpdate","ws_scene","ss_camera","delete_element","elem","add_screen_space_element","set_screen_space_coordinate_system","add_world_space_element","set_world_space_coordinate_system","NDC","update_state","current_clicked_element","PerspectiveFrustumPointFitter","fit_points","camera_quaternion","vertical_fov","v_fov","degToRad","h_fov","atan","tan","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","applyQuaternion","sphere_center","pull_back_distance","get_distance_to_fit_rect","far_pos","up_plane","Plane","setFromNormalAndCoplanarPoint","down_plane","left_plane","right_plane","apply_center_correction_to_pos","closest_distance","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_horizontal_correction","closest_distance_to_up_plane","closest_distance_to_down_plane","up_dir","down_line","up_line","down_dist","up_dist","correction","closest_distance_to_right_plane","closest_distance_to_left_plane","right_dir","left_line","right_line","left_dist","right_dist","Quaternion","setFromAxisAngle","distV","distH","OrthographicFrustumPointFitter","inverse_camera_quat","inverse","inverted_points","getCenter","distance_to_center","camera_utilities","tmp_mat","Matrix4","ray","Ray","tmp_size","tmp_unproj","get_up_dir","tmp_vec","get_forward_dir","get_right_dir","unproject_mouse_position","get_plane_intersection","plane_position","plane_normal","isPerspectiveCamera","unproject","intersectPlane","fit_points_on_camera","zoom_scale","world_space_center","camera_forward","project_points_on_plane","projected_points_center","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","fit_bounding_box_points","p1","p2","p3","p4","p5","p6","p7","p8","camera_backward_dir","fitter","camera_pos","reference_position_plane","camera_ray","reference_position","camera_position","result","reference_rotation","reference_zoom","forward","initializer","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","obj","ids","FrustumPointFitter","get_hozirontal_correction","closest_up_point","closest_down_point","closest_right_point","closest_left_point","GeometryUtilities","geometry_buffer","indices","positions","vertices","getX","getY","getZ","add_barycentric_attribute","non_indexed_geometry_buffer","bar_coordinates","ImageUtilities","getImageData","imagedata","mesh_sampler","sample","sample_count","face_areas","min_area","normals","tangents","faces","index_0","index_1","index_2","v1","v2","face","c","n2","n3","normal","tangent","uv_a","uv_b","uv_c","area","get_face_area","normalized_faces_array","get_uniform_face_distribution","selected_faces","select_random_faces","sample_data_from_faces","sampled_points","sampled_normals","sampled_tangents","sampled_uvs","w1","w2","sample_point_in_face","amount","selected_face","minimum_area","extended_triangle_indices","repetitions_needed","j","vec1","vec2","w3","model_utilities","result_callback","fromGeometry","get_geometries","geometries","assign_material","clone_animated_gltf","gltf","animations","skinnedMeshes","isSkinnedMesh","cloneBones","cloneSkinnedMeshes","isBone","skeleton","cloneSkinnedMesh","orderedCloneBones","bones","cloneBone","Skeleton","boneInverses","matrixWorld","set_shadow_config","cast","receive","castShadow","receiveShadow","__find_object","get_object","get_object_by_type","object_type","ObjectUtilities","item","Array","isArray","sources","is_object","merge_deep","nodeType","attributes","attribute","nodeName","nodeValue","hasChildNodes","childNodes","xml_to_json","old","StringUtilities","hexValues","hex","words","substr","charAt","TimeUtilities","time_str_to_ms","time_str","hours","minutes","seconds","Grid","derivatives","plane_geometry","convert_to_non_indexed_geometry","rotation","_Thickness","_Length","_ElapsedTime","setup","next_position","previous_position","orientation","coverage","accumulated_length","next_point","__get_next_position","previous_point","__get_previous_position","vertexList","nextPositionList","previousPositionList","orientationList","coverageList","setIndex","_length","thickness","total_length","parent","copy_color","WorldImage","pivot","_ScreenAligned","_Scale","_Opacity","DoubleSide","current_scale","computeBoundingBox","tmp_bb_size","boundingBox","update_texture","img","screen_aligned","boolean","Text2D","is_static","simple_text_drawer","draw_settings","LinearMipMapLinearFilter","UIElementMaterial","intensity","_PixelOffset","_NDC","_PivotPoint","_DepthOffset","ScreenSpacePosition","get_pos_NDC","WorldSpacePosition","tmp_vec3","tmp_vec2","UIElementState","ui_element","normalized_mouse_position","OnIdle","is_mouse_over","_on_enter_state","OnMouseEnter","on_mouse_enter","_on_hover_state","_on_exit_state","OnMouseExit","on_mouse_exit","_on_idle_state","OnMouseHover","__trigger_on_hover","on_mouse_hover","UIElement","is_clickable","position_strategy","_position","on_hover","mouse_pos_tmp","cached_NDC_position","screen_pos_tmp","texture_size","matrixAutoUpdate","pixel_offset","set_render_order","pivot_point","set_pixel_offset","use_depth","depth_offset","clear_state","visible","get_size","normalized_mouse_pos","to_screen_position","rect","Box2","containsPoint","projected_pos","get_screen_space_position","set_screen_space_position","screen_pos","UpdatableMaterialMesh","self","onBeforeRender","TextGlyph","plane_bounds","atlas_bounds","SDFText","glyph_layout","glyphs","glyph_is_dirty","matrix_is_dirty","color_is_dirty","matrix","__opacity","__text","__generate_glyphs","update_matrix","compose","clear_glyph_dirty","clear_color_dirty","set_rotation","tilt","new_orientation","new_tilt","multiply","set_color","set_pivot","update_glyphs","op","cursor","unicode","charCodeAt","glyph","planeBounds","text_glyph","atlasBounds","advance","box2","first_glyph","union","box2_size","SDFTextMaterial","_Texture","_Boldness","_AtlasSize","set_atlas_size","set_boldness","SDFTextBatch","font_layout","atlas_texture","instanced_geometry","InstancedBufferGeometry","instanceCount","Float32BufferAttribute","transformsCol0","InstancedBufferAttribute","max_allocations","transformsCol1","transformsCol2","transformsCol3","glyph_bounds","usage","DynamicDrawUsage","text_elements","atlas","add_text","text_str","remove_text","text_elem","remove_elem","force_update","glyph_bounds_atr","plane_bounds_atr","color_atr","matrix_needs_update","glyph_needs_update","color_needs_update","glyph_count","glyph_i","buffer_i","setXYZW","VectorInterpolator","tmp","MedianFilterMaterial","kernel3x3","_SourceTex","_SourceTexSize","isVideoTexture","videoWidth","videoHeight","isTexture","MedianFilter","median_filter_mat","filter","tex_size","DualFilteringBlurMaterial","upsample","AlphaFilterMaterial","use_alpha_mask","_Offset","DualFilteringBlurrer","RT0","RT3","RT4","upscale_blur_mat","downscale_blur_mat","alpha_filter_mat","check_RT_resize","ParticleAttribute","attr_name","update_material","write","init_from_geometry","init_from_attribute","particle_attribute","build_RT","particle_count","resolution","calculate_resolution","HalfFloatType","swap_RT","attribute_writter_scene","store_geometry_attribute_in_RT","storage_material","deleteAttribute","get_texture","GPUParticleSystem","build_point_mesh","attribute_writter_mesh","build_attribute_writter_mesh","add_texture_attribute","add_update_attribute_array","item_size","add_attribute_array","instance_count","geo","instanced_geo","build_uv_storage_attribute","Points","ParticleStorageMaterial","ParticlePositionAttribute","store_geometry","pos_attr","store_positions","CustomDataTexture","multiplier","set_rgba","set_rgb","set_r","set_g","set_b","set_a","RGBDataTexture","RGBADataTexture","RGBFloatDataTexture","RGBAFloatDataTexture","BatchedMesh","id_table","max_texture_width","batched_count","batch_height","attach_rgb_texture","attach_rgba_texture","attach_rgb_float_texture","attach_rgba_float_texture","get_mesh_index","set_rgb_value","mesh_name","set_rgba_value","MeshBatcher","meshes","attr_mesh_id","create_batched_mesh","AudioClip","loop","volume","positional","audio","audio_listener","TPositionalAudio","TAudio","setBuffer","setLoop","gain","setVolume","pause","is_playing","isPlaying","AudioLoader","instantiate_audio","AudioContext","createBuffer","arrayBuffer","array_buffer","decodeAudioData","audio_buffer","BasisLoader","loader","basis","xhr","msg","CubemapLoader","extension","CubeTextureLoader","setPath","urls","DAELoader","ColladaLoader","FileLoader","TFileLoader","file","FontLoader","TFontLoader","GLTFLoader","TGLTFLoader","GLTFDRACOLoader","setDRACOLoader","HDRCubeTextureLoader","THDRCubeTextureLoader","url_suffix","setDataType","UnsignedByteType","hdr","JSONLoader","OBJLoader","TOBJLoader","PointArrayLoader","parse_path","raw_data","string_array","pop","RGBETextureLoader","RGBELoader","TextLoader","AsyncTextureLoader","load_with_old_method","load_with_new_method","Texture","Image","onload","onerror","original_url","fetchOptions","res","createImageBitmap","colorSpaceConversion","imageBitmap","TextureLoader","VideoLoader","ResourceBatch","batch_name","resource_loaders","add_loader","loading_finished","finished","has_errors","print_errors","get_loaded_bytes","get_total_bytes"],"mappings":"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"}
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/OS.js","../src/ReflectionPlaneContext.js","../src/static_batcher/GeometryBatch.js","../src/static_batcher/GeometryBatcher.js","../src/UI.js","../src/utilities/PerspectiveFrustumPointFitter.js","../src/utilities/OrthographicFrustumPointFitter.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/components/Grid.js","../src/components/Line.js","../src/components/WorldImage.js","../src/components/Text2D.js","../src/materials/UIElementMaterial.js","../src/ui/ui_element_position/ScreenSpacePosition.js","../src/ui/ui_element_position/WorldSpacePosition.js","../src/ui/ui_element_state/UIElementState.js","../src/ui/ui_element_state/OnIdle.js","../src/ui/ui_element_state/OnMouseEnter.js","../src/ui/ui_element_state/OnMouseExit.js","../src/ui/ui_element_state/OnMouseHover.js","../src/components/UIElement.js","../src/components/UpdatableMaterialMesh.js","../src/components/sdf_text/TextGlyph.js","../src/components/sdf_text/SDFText.js","../src/materials/SDFTextMaterial.js","../src/components/sdf_text/SDFTextBatch.js","../src/action_sequencer/VectorInterpolator.js","../src/materials/MedianFilterMaterial.js","../src/render_utilities/MedianFilter.js","../src/materials/DualFilteringBlurMaterial.js","../src/materials/AlphaFilterMaterial.js","../src/render_utilities/DualFilteringBlurrer.js","../src/gpu_particles/ParticleAttribute.js","../src/gpu_particles/GPUParticleSystem.js","../src/materials/gpu_particles/ParticleStorageMaterial.js","../src/gpu_particles/ParticlePositionAttribute.js","../src/data_textures/CustomDataTexture.js","../src/data_textures/RGBDataTexture.js","../src/data_textures/RGBADataTexture.js","../src/data_textures/RGBFloatDataTexture.js","../src/data_textures/RGBAFloatDataTexture.js","../src/static_batcher/BatchedMesh.js","../src/static_batcher/MeshBatcher.js","../src/components/AudioClip.js","../src/resource_loader/AudioLoader.js","../src/resource_loader/BasisLoader.js","../src/resource_loader/CubemapLoader.js","../src/resource_loader/DAELoader.js","../src/resource_loader/FileLoader.js","../src/resource_loader/FontLoader.js","../src/resource_loader/GLTFLoader.js","../src/resource_loader/GLTFDRACOLoader.js","../src/resource_loader/HDRCubeTextureLoader.js","../src/resource_loader/JSONLoader.js","../src/resource_loader/OBJLoader.js","../src/resource_loader/PointArrayLoader.js","../src/resource_loader/RGBETextureLoader.js","../src/resource_loader/TextLoader.js","../src/resource_loader/AsyncTextureLoader.js","../src/resource_loader/TextureLoader.js","../src/resource_loader/VideoLoader.js","../src/resource_loader/ResourceBatch.js"],"sourcesContent":["\nclass Browser\n{\n init()\n {\n this.browser_name = '';\n this.agent = window.navigator.userAgent.toLowerCase();\n\n switch (true)\n {\n case this.agent.indexOf('edge') > -1:\n this.browser_name = 'edge_ie';\n break;\n case this.agent.indexOf('edg') > -1:\n this.browser_name = 'edge_chromium';\n break;\n case this.agent.indexOf('opr') > -1 && !!window.opr:\n this.browser_name = 'opera';\n break;\n case this.agent.indexOf('chrome') > -1 && !!window.chrome:\n this.browser_name = 'chrome';\n break;\n case this.agent.indexOf('trident') > -1:\n this.browser_name = 'iexplorer';\n break;\n case this.agent.indexOf('firefox') > -1:\n this.browser_name = 'firefox';\n break;\n case this.agent.indexOf('safari') > -1:\n this.browser_name = 'safari';\n break;\n default:\n this.browser_name = 'other';\n break;\n }\n\n this.version = this.get_version();\n }\n\n get name()\n {\n return this.browser_name;\n }\n\n get is_safari()\n {\n return this.browser_name === 'safari';\n }\n\n get is_chrome()\n {\n return this.browser_name === 'chrome';\n }\n\n get is_edge()\n {\n return this.browser_name === 'edge_ie';\n }\n\n get is_edge_chromium()\n {\n return this.browser_name === 'edge_chromium';\n }\n\n get has_webm()\n {\n return !!(this.is_chrome || this.is_firefox || this.is_edge_chromium);\n }\n\n get has_hvec()\n {\n return this.is_safari;\n }\n\n get preferred_video_extension()\n {\n return this.has_webm ? 'webm' : this.has_hvec ? 'hvec.mp4' : 'mp4';\n }\n\n get_version()\n {\n const ua = navigator.userAgent;\n let tem = '';\n let version = 0;\n\n let M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\\/))\\/?\\s*(\\d+)/i) || [];\n\n if (/trident/i.test(M[1]))\n {\n tem = /\\brv[ :]+(\\d+)/g.exec(ua) || [];\n version = 'IE ' + (tem[1] || '');\n }\n if (M[1] === 'Chrome')\n {\n tem = ua.match(/\\b(OPR|Edge)\\/(\\d+)/);\n if (tem != null) version = tem.slice(1).join(' ').replace('OPR', 'Opera');\n }\n\n M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];\n if ((tem = ua.match(/version\\/(\\d+(\\.\\d+)?)/i)) != null) M.splice(1, 1, tem[1]);\n\n version = M.join(' ');\n\n return Number(version.split(' ')[1]);\n }\n}\n\nconst browser = new Browser();\nexport { browser as Browser };\n","class Validation\n{\n constructor()\n {}\n\n static is_int(n)\n {\n return Number(n) === n && n % 1 === 0;\n }\n\n static is_float(n)\n {\n return Number(n) === n && n % 1 !== 0;\n }\n\n static is_number(n)\n {\n return this.is_int(n) || this.is_float(n);\n }\n\n static is_json(str)\n {\n try\n {\n JSON.parse(str);\n }\n catch (e)\n {\n return false;\n }\n\n return true;\n }\n}\n\nexport { Validation };\n","import { Browser } from '../Browser';\r\nimport { Validation } from '../utilities/Validation';\r\n\r\nclass AbstractLoader\r\n{\r\n constructor(resource_id, url, size = 1)\r\n {\r\n this.resource_id = resource_id;\r\n this.url = url;\r\n this.loaded_bytes = 0;\r\n this.total_bytes = size;\r\n\r\n this.has_finished = false;\r\n this.has_error = false;\r\n this.error_message = 'none';\r\n }\r\n\r\n __update_downloaded_bytes(loaded, total)\r\n {\r\n loaded = Validation.is_number(loaded) ? loaded : 1;\r\n total = Validation.is_number(total) ? total : 1;\r\n\r\n this.loaded_bytes = loaded;\r\n\r\n if (total > 0)\r\n {\r\n this.total_bytes = total;\r\n }\r\n\r\n if (this.loaded_bytes > this.total_bytes)\r\n {\r\n console.warn('Total bytes is smaller than loaded ones. Please set total bytes by hand to:', this.url);\r\n }\r\n }\r\n\r\n __loading_ended()\r\n {\r\n this.has_finished = true;\r\n }\r\n\r\n __set_error(message)\r\n {\r\n this.has_error = true;\r\n this.error_message = message;\r\n }\r\n\r\n print_error()\r\n {\r\n console.error('Error while loading ' + this.resource_id + '\\n\\t path: ' + this.url + '\\n\\t\\t' + this.error_message);\r\n }\r\n\r\n load(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n const cache = Browser.is_safari ? 'no-cache' : 'default';\r\n\r\n fetch(this.url, {\r\n method: 'GET', // *GET, POST, PUT, DELETE, etc.\r\n mode: 'cors', // no-cors, *cors, same-origin\r\n cache: cache, // *default, no-cache, reload, force-cache, only-if-cached\r\n credentials: 'same-origin', // include, *same-origin, omit\r\n redirect: 'follow' // manual, *follow, error\r\n })\r\n .then(this.on_progress.bind(this, resource_container))\r\n .catch(this.__on_error.bind(this));\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n\r\n async on_progress(resource_container, response)\r\n {\r\n const response_clone = response.clone();\r\n const reader = response.body.getReader();\r\n\r\n // Step 2: get total length\r\n const contentLength = +response.headers.get('Content-Length');\r\n\r\n // Step 3: read the data\r\n let receivedLength = 0; // received that many bytes at the moment\r\n\r\n while (true)\r\n {\r\n const { done, value } = await reader.read();\r\n\r\n if (done)\r\n {\r\n break;\r\n }\r\n\r\n receivedLength += value.length;\r\n\r\n this.__update_downloaded_bytes(receivedLength, contentLength);\r\n // console.log(`Received ${receivedLength} of ${contentLength}`);\r\n }\r\n\r\n this.on_preloaded_finished(resource_container, response_clone);\r\n }\r\n\r\n on_preloaded_finished(resource_container, response)\r\n {\r\n }\r\n\r\n __on_error(data)\r\n {\r\n console.error(data);\r\n }\r\n}\r\n\r\nexport { AbstractLoader };\r\n","import { Vector3 } from 'three';\n\nclass OMath\n{\n constructor()\n {}\n\n static linear_map(value,\n from_range_start_value,\n from_range_end_value,\n to_range_start_value,\n to_range_end_value)\n {\n return ((value - from_range_start_value) / (from_range_end_value - from_range_start_value)) * (to_range_end_value - to_range_start_value) + to_range_start_value;\n }\n\n static between(value, min, max)\n {\n return (value >= min && value <= max);\n }\n\n static mod(number, divisor)\n {\n return ((number % divisor) + divisor) % divisor;\n }\n\n static rgb_to_hex(rgb)\n {\n rgb.r = Math.round(rgb.r * 255).toString(16);\n rgb.g = Math.round(rgb.g * 255).toString(16);\n rgb.b = Math.round(rgb.b * 255).toString(16);\n\n if (rgb.r.length === 1)\n {\n rgb.r = '0' + rgb.r;\n }\n if (rgb.g.length === 1)\n {\n rgb.g = '0' + rgb.g;\n }\n if (rgb.b.length === 1)\n {\n rgb.b = '0' + rgb.b;\n }\n\n return '#' + rgb.r + rgb.g + rgb.b;\n }\n\n static project_points_on_plane(points, plane)\n {\n const projected_point = new Vector3();\n const points_on_plane = [];\n for (let i = 0; i < points.length; i++)\n {\n plane.projectPoint(points[i], projected_point);\n points_on_plane.push(projected_point.clone());\n }\n\n return points_on_plane;\n }\n\n static matrix4_lerp(from, to, target, t)\n {\n for (let i = 0; i < 16; i++)\n {\n target.elements[i] = this.lerp(from.elements[i], to.elements[i], t);\n }\n }\n\n static equals(x1, x2)\n {\n return Math.abs(x1 - x2) < 0.000001;\n }\n\n static lerp(x, y, t)\n {\n return (1 - t) * x + t * y;\n }\n\n static clamp(value, min, max)\n {\n return Math.max(min, Math.min(max, value));\n }\n\n static euclideanModulo(n, m)\n {\n return ((n % m) + m) % m;\n }\n\n static pingpong(x, length = 1)\n {\n return length - Math.abs(OMath.euclideanModulo(x, length * 2) - length);\n }\n\n static degToRad(degrees)\n {\n return degrees * (Math.PI / 180);\n }\n\n static radToDeg(radians)\n {\n return radians * (180 / Math.PI);\n }\n\n static deg_to_rad(degrees)\n {\n return degrees * (Math.PI / 180);\n }\n\n static rad_to_deg(radians)\n {\n return radians * (180 / Math.PI);\n }\n\n static perspective_divide(v)\n {\n v.x /= v.w;\n v.y /= v.w;\n v.z /= v.w;\n return v;\n }\n\n static points_average(points)\n {\n const center = points[0].clone();\n for (let i = 1; i < points.length; i++)\n {\n center.add(points[i]);\n }\n center.multiplyScalar(1 / points.length);\n return center;\n }\n\n static get_random_color()\n {\n const arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'a', 'b', 'c', 'd', 'e', 'f'];\n\n let col = '#';\n col += arr[Math.floor(Math.random() * 16)];\n col += arr[Math.floor(Math.random() * 16)];\n\n col += arr[Math.floor(Math.random() * 16)];\n col += arr[Math.floor(Math.random() * 16)];\n\n col += arr[Math.floor(Math.random() * 16)];\n col += arr[Math.floor(Math.random() * 16)];\n return col;\n }\n\n static saturate(x)\n {\n return OMath.clamp(x, 0, 1);\n }\n}\n\nexport { OMath };\n","\nimport { OMath } from '../utilities/OMath';\n\nclass ActionSequencer\n{\n constructor(context)\n {\n this.elapsed_time = -0.00001;\n this.playback_speed = this.__get_playback_speed();\n this.playing = false;\n\n this.action_events = [];\n this.context = context;\n\n this.initial_context = JSON.parse(JSON.stringify(context));\n\n this.tmp_t = 0;\n\n this.channels = {};\n\n const channel_names = Object.keys(context);\n for (let i = 0; i < channel_names.length; i++)\n {\n this.channels[channel_names[i]] = [];\n }\n\n this.duration = 0;\n }\n\n play()\n {\n this.playing = true;\n }\n\n stop()\n {\n this.playing = false;\n }\n\n reset()\n {\n this.elapsed_time = -0.00001;\n }\n\n skip()\n {\n const duration = this.get_duration();\n this.__play_clips(this.elapsed_time, duration + 0.0001);\n this.elapsed_time = duration;\n }\n\n update(delta_time)\n {\n if (this.playing)\n {\n this.__play_clips(this.elapsed_time, this.elapsed_time + delta_time * this.playback_speed);\n this.elapsed_time = this.elapsed_time + delta_time * this.playback_speed;\n }\n }\n\n set_progress(time)\n {\n this.elapsed_time = OMath.clamp(time, 0, this.duration);\n this.__play_clips(this.elapsed_time, this.elapsed_time);\n }\n\n set_normalized_progress(t)\n {\n this.elapsed_time = OMath.clamp(t, 0, 1) * this.duration;\n this.__play_clips(this.elapsed_time, this.elapsed_time);\n }\n\n get_progress()\n {\n return OMath.clamp(this.elapsed_time / this.get_duration(), 0, 1);\n }\n\n is_finished()\n {\n return this.elapsed_time > this.get_duration();\n }\n\n add_action_event(trigger_time, action)\n {\n this.action_events.push({\n trigger_time: trigger_time,\n action: action\n });\n\n this.duration = Math.max(this.duration, trigger_time);\n }\n\n add_action_interpolator(from, to, interpolator, use_dynamic_from_value = false)\n {\n if (use_dynamic_from_value)\n {\n const keyframes = this.channels[interpolator.attribute_name];\n\n if (keyframes === undefined)\n {\n console.error(`${interpolator.attribute_name} missing in initial state data.`);\n }\n\n if (keyframes.length === 0)\n {\n interpolator.from = this.initial_context[interpolator.attribute_name];\n }\n else\n {\n interpolator.from = keyframes[keyframes.length - 1].interpolator.to;\n }\n }\n\n const keyframe = {\n from: from,\n to: to,\n interpolator: interpolator\n };\n\n this.duration = Math.max(this.duration, to);\n this.channels[interpolator.attribute_name].push(keyframe);\n }\n\n get_current_target_value(name)\n {\n const keyframe = this.__get_current_keyframe(name, this.elapsed_time);\n\n if (this.elapsed_time < keyframe.from)\n {\n return keyframe.interpolator.evaluate(0);\n }\n\n return keyframe.interpolator.evaluate(1);\n }\n\n get_current_starting_value(name)\n {\n const keyframe = this.__get_current_keyframe(name, this.elapsed_time);\n\n return keyframe.interpolator.evaluate(0);\n }\n\n get_current_progress(name)\n {\n const keyframe = this.__get_current_keyframe(name, this.elapsed_time);\n const t = this.__linear_map_01(this.elapsed_time, keyframe.from, keyframe.to);\n\n return keyframe.interpolator.easing_function(t);\n }\n\n get_duration()\n {\n return this.duration;\n }\n\n __play_clips(from, to)\n {\n for (let i = 0; i < this.action_events.length; i++)\n {\n if (this.action_events[i].trigger_time > from - Number.EPSILON &&\n this.action_events[i].trigger_time < to + Number.EPSILON)\n {\n // console.log(\"Play event: \" + this.action_events[i].action.constructor.name + \" at \"+ this.action_events[i].trigger_time);\n this.action_events[i].action.trigger();\n }\n }\n const channel_names = Object.keys(this.initial_context);\n\n for (let i = 0; i < channel_names.length; i++)\n {\n const name = channel_names[i];\n const keyframe = this.__get_current_keyframe(name, from);\n\n this.context[name] = this.evaluate_keyframe(keyframe, from);\n }\n }\n\n evaluate_keyframe(keyframe, time)\n {\n this.tmp_t = this.__linear_map_01(time, keyframe.from, keyframe.to);\n\n return keyframe.interpolator.evaluate(OMath.clamp(this.tmp_t, 0, 1));\n }\n\n get_keyframes(channel_name)\n {\n return this.channels[channel_name];\n }\n\n is_channel_redefined(channel_name)\n {\n for (let i = 0; i < this.channels[channel_name].length; i++)\n {\n const keyframe = this.channels[channel_name][i];\n\n if (keyframe.interpolator.initial)\n {\n return false;\n }\n }\n\n return true;\n }\n\n __linear_map_01(value,\n from_range_start_value,\n from_range_end_value)\n {\n return OMath.saturate(((value - from_range_start_value) / (from_range_end_value - from_range_start_value)) * (1 - 0) + 0);\n }\n\n __get_current_keyframe(channel_name, time)\n {\n let current = undefined;\n\n const keyframes = this.channels[channel_name];\n\n for (let i = 0; i < keyframes.length; i++)\n {\n const keyframe = keyframes[i];\n\n if (time >= keyframe.from && time <= keyframe.to)\n {\n current = keyframe;\n return current;\n }\n }\n\n let min = Infinity;\n\n for (let i = 0; i < keyframes.length; i++)\n {\n const keyframe = keyframes[i];\n const distance = Math.abs(keyframe.to - time);\n\n if (distance < min)\n {\n current = keyframe;\n min = distance;\n }\n }\n\n return current;\n }\n\n __get_playback_speed()\n {\n const url_params = new URLSearchParams(window.location.search);\n\n const transitions_velocity = url_params.get('transitions_velocity');\n\n if (transitions_velocity)\n {\n return Number(transitions_velocity);\n }\n else\n {\n return 1;\n }\n }\n}\n\nexport { ActionSequencer };\n","class EasingFunctions\n{\n constructor()\n {}\n\n static linear(x)\n {\n return x;\n }\n\n static triangular(x)\n {\n return 1 - Math.abs((x * 2) % (1 * 2) - 1);\n }\n\n static ease_in_sine(x)\n {\n return 1 - Math.cos(x * 3.1415926 / 2);\n }\n\n static ease_out_sine(x)\n {\n return Math.sin(x * 3.1415926 / 2);\n }\n\n static ease_in_out_sine(x)\n {\n return -(Math.cos(3.1415926 * x) - 1) / 2;\n }\n\n static ease_in_cubic(x)\n {\n return x * x * x;\n }\n\n static ease_out_cubic(x)\n {\n return 1 - Math.pow(1 - x, 3);\n }\n\n static ease_in_out_cubic(x)\n {\n return x < 0.5\n ? 4 * x * x * x\n : 1 - Math.pow(-2 * x + 2, 3) / 2;\n }\n\n static ease_in_quad(x)\n {\n return x * x;\n }\n\n static ease_out_quad(x)\n {\n return 1 - (1 - x) * (1 - x);\n }\n\n static ease_in_out_quad(x)\n {\n return x < 0.5\n ? 2 * x * x\n : 1 - Math.pow(-2 * x + 2, 2) / 2;\n }\n\n static ease_in_quart(x)\n {\n return x * x * x * x;\n }\n\n static ease_out_quart(x)\n {\n return 1 - Math.pow(1 - x, 4);\n }\n\n static ease_in_out_quart(x)\n {\n return x < 0.5\n ? 8 * x * x * x * x\n : 1 - Math.pow(-2 * x + 2, 4) / 2;\n }\n\n static ease_in_quint(x)\n {\n return x * x * x * x * x;\n }\n\n static ease_out_quint(x)\n {\n return 1 - Math.pow(1 - x, 5);\n }\n\n static ease_in_out_quint(x)\n {\n return x < 0.5\n ? 16 * x * x * x * x * x\n : 1 - Math.pow(-2 * x + 2, 5) / 2;\n }\n\n static ease_in_expo(x)\n {\n return x === 0 ? 0 : Math.pow(2, 10 * x - 10);\n }\n\n static ease_out_expo(x)\n {\n return x === 1 ? 1 : 1 - Math.pow(2, -10 * x);\n }\n\n static ease_in_out_expo(x)\n {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? Math.pow(2, 20 * x - 10) / 2\n : (2 - Math.pow(2, -20 * x + 10)) / 2;\n }\n\n static ease_in_circ(x)\n {\n return 1 - Math.sqrt(1 - Math.pow(x, 2));\n }\n\n static ease_out_circ(x)\n {\n return Math.sqrt(1 - Math.pow(x - 1, 2));\n }\n\n static ease_in_out_circ(x)\n {\n return x < 0.5\n ? (1 - Math.sqrt(1 - Math.pow(2 * x, 2))) / 2\n : (Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2;\n }\n\n static ease_in_back(x)\n {\n return 2.7015 * x * x * x - 1.7015 * x * x;\n }\n\n static ease_out_back(x)\n {\n return 1 + 2.7015 * Math.pow(x - 1, 3) + 1.7015 * Math.pow(x - 1, 2);\n }\n\n static ease_in_out_back(x)\n {\n return x < 0.5\n ? (Math.pow(2 * x, 2) * ((2.5949095 + 1) * 2 * x - 2.5949095)) / 2\n : (Math.pow(2 * x - 2, 2) * ((2.5949095 + 1) * (x * 2 - 2) + 2.5949095) + 2) / 2;\n }\n\n static ease_in_elastic(x)\n {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : -Math.pow(2, 10 * x - 10) * Math.sin((x * 10 - 10.75) * c4);\n }\n\n static ease_out_elastic(x)\n {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * 2.0943950) + 1;\n }\n\n static ease_in_out_elastic(x)\n {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? -(Math.pow(2, 20 * x - 10) * Math.sin((20 * x - 11.125) * 1.3962633)) / 2\n : Math.pow(2, -20 * x + 10) * Math.sin((20 * x - 11.125) * 1.3962633) / 2 + 1;\n }\n\n static ease_in_bounce(x)\n {\n return 1 - this.ease_out_bounce(1 - x);\n }\n\n static ease_out_bounce(x)\n {\n const n1 = 7.5625;\n const d1 = 2.75;\n\n if (x < 1 / d1)\n {\n return n1 * x * x;\n }\n else if (x < 2 / d1)\n {\n return n1 * (x -= 1.5 / d1) * x + 0.75;\n }\n else if (x < 2.5 / d1)\n {\n return n1 * (x -= 2.25 / d1) * x + 0.9375;\n }\n else\n {\n return n1 * (x -= 2.625 / d1) * x + 0.984375;\n }\n }\n\n static ease_in_out_bounce(x)\n {\n return x < 0.5\n ? (1 - this.ease_out_bounce(1 - 2 * x)) / 2\n : (1 + this.ease_out_bounce(2 * x - 1)) / 2;\n }\n\n static heartbeat(t)\n {\n return 1.0 - Math.pow(Math.abs(Math.sin(t + 1.0)), 63.0) * Math.sign(Math.sin(t)) * Math.sin(t + 1.5 + 1.0) * 0.8;\n }\n}\n\nexport { EasingFunctions };\n","import { EasingFunctions } from '../utilities/EasingFunctions';\n\nclass ActionInterpolator\n{\n constructor(easing_function = 'linear')\n {\n this.easing_function = undefined;\n\n if (typeof easing_function === 'string')\n {\n this.easing_function = EasingFunctions[easing_function];\n }\n else\n {\n this.easing_function = easing_function;\n }\n }\n\n update(context, t)\n {\n\n }\n}\n\nexport { ActionInterpolator };\n","import { ActionInterpolator } from './ActionInterpolator';\nimport { OMath } from '../utilities/OMath';\n\nclass NumberInterpolator extends ActionInterpolator\n{\n constructor(attribute_name, from = 0, to = 1, initial = false, easing_function = 'linear')\n {\n super(easing_function);\n\n this.attribute_name = attribute_name;\n this.from = from;\n this.to = to;\n this.initial = initial;\n }\n\n update(context, t)\n {\n context[this.attribute_name] = OMath.lerp(this.from, this.to, this.easing_function(t));\n }\n\n evaluate(t)\n {\n return OMath.lerp(this.from, this.to, this.easing_function(t));\n }\n}\n\nexport { NumberInterpolator };\n","class ViewContext\n{\n constructor()\n {\n this.app = undefined;\n }\n\n set_app(app)\n {\n this.app = app;\n }\n}\n\nconst view_context = new ViewContext();\nexport { view_context as ViewContext };\n","import { ViewContext } from '../view_components/ViewContext';\n\nclass ActionEvent\n{\n constructor(name, method, args)\n {\n this.name = name;\n this.method = method;\n this.args = args;\n }\n\n trigger()\n {\n ViewContext.app[this.name][this.method](...this.args.split(','));\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, t.args);\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, core_attributes, context_attributes, threejs_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.core_attributes = {\n force_webgl2: true,\n xr_enabled: false\n };\n\n this.context_attributes = {\n alpha: true,\n antialias: false,\n depth: true,\n desynchronized: false,\n failIfMajorPerformanceCaveat: false,\n powerPreference: 'high-performance',\n premultipliedAlpha: true,\n preserveDrawingBuffer: true,\n stencil: false\n };\n\n this.threejs_attributes = {\n logarithmicDepthBuffer: false\n };\n\n Object.assign(this.core_attributes, core_attributes);\n Object.assign(this.context_attributes, context_attributes);\n\n Object.assign(this.threejs_attributes, this.context_attributes);\n Object.assign(this.threejs_attributes, threejs_attributes);\n\n if (this.core_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.threejs_attributes.canvas = canvas;\n this.threejs_attributes.context = this.canvas_context;\n\n this._renderer = new WebGLRenderer(this.threejs_attributes);\n\n if (this.core_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\n if (e.code)\n {\n this.press_key(e.code);\n }\n }\n\n on_key_up(e)\n {\n this.release_key(e.code);\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","\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 { 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(input)\n {\n this.input = input;\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(this.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 { 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 { CameraManager } from '../CameraManager';\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';\nimport { PerspectiveFrustumPointFitter } from './PerspectiveFrustumPointFitter';\nimport { OrthographicFrustumPointFitter } from './OrthographicFrustumPointFitter';\n\nclass CameraUtilities\n{\n init(input)\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 this.input = input;\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 || this.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 fit_bounding_box_points(camera, bb, scale = 1)\n {\n const dir = new Vector3();\n dir.copy(bb.max).sub(bb.min);\n\n const p1 = bb.min.clone();\n\n const p2 = p1.clone().add(new Vector3(dir.x, 0, 0));\n const p3 = p1.clone().add(new Vector3(0, dir.y, 0));\n const p4 = p1.clone().add(new Vector3(0, 0, dir.z));\n\n const p5 = p1.clone().add(new Vector3(dir.x, 0, dir.z));\n const p6 = p1.clone().add(new Vector3(0, dir.y, dir.z));\n const p7 = bb.max.clone();\n const p8 = p1.clone().add(new Vector3(dir.x, dir.y, 0));\n return this.fit_points(camera, [p1, p2, p3, p4, p5, p6, p7, p8], scale);\n }\n\n fit_points(camera, points, zoom_scale = 1)\n {\n if (camera.isPerspectiveCamera)\n {\n const camera_forward_dir = new Vector3(0, 0, -1).applyQuaternion(camera.quaternion);\n const camera_backward_dir = camera_forward_dir.clone().multiplyScalar(-1);\n\n const fitter = new PerspectiveFrustumPointFitter();\n\n const aspect_ratio = OScreen.aspect_ratio;\n\n const camera_pos = fitter.fit_points(points, camera.quaternion, camera.fov * zoom_scale, aspect_ratio);\n const box = new Box3().setFromPoints(points);\n const center = new Vector3();\n box.getCenter(center);\n\n const reference_position_plane = new Plane().setFromNormalAndCoplanarPoint(camera_backward_dir, center);\n\n const camera_ray = new Ray(camera_pos, camera_forward_dir);\n\n const reference_position = new Vector3();\n camera_ray.intersectPlane(reference_position_plane, reference_position);\n\n const zoom = camera_pos.distanceTo(reference_position);\n\n return {\n zoom: zoom,\n reference_position: reference_position,\n camera_position: camera_pos\n };\n }\n else\n {\n const fitter = new OrthographicFrustumPointFitter();\n const result = fitter.fit_points(points, this.reference_rotation, camera.fov * zoom_scale, OScreen.aspect_ratio);\n\n this.reference_position.copy(result.center);\n this.reference_zoom = result.distance_to_center;\n\n const forward = new Vector3(0, 0, 1).applyQuaternion(camera.quaternion);\n return {\n zoom: result.distance_to_center,\n reference_position: result.center,\n camera_position: forward.multiplyScalar(result.distance_to_center)\n };\n }\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 { 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(input)\n {\n CameraManager.init();\n CameraUtilities.init(input);\n Capabilities.init();\n Configuration.init();\n EventManager.init();\n GeometryBatcher.init();\n\n OS.init();\n Browser.init();\n ReflectionPlaneContext.init();\n ResourceContainer.init();\n SceneManager.init();\n OScreen.init();\n Time.init();\n UI.init(input);\n\n Debug.init();\n }\n\n dispose(render_loop)\n {\n Graphics.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.width, OScreen.height);\n this.blur_RT = new WebGLRenderTarget(OScreen.width, OScreen.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.width || this.main_RT.height !== OScreen.height)\n {\n this.main_RT.setSize(OScreen.width, OScreen.height);\n this.blur_RT.setSize(OScreen.width, OScreen.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 { 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, input)\n {\n target_application = target_application || new BaseApplication();\n\n this.target_application = target_application;\n this.graphics = graphics;\n this.input = input;\n\n this.is_running = false;\n this.frames_passed = 0;\n }\n\n update()\n {\n if (!this.is_running)\n {\n return;\n }\n Time.__update();\n\n // ###### START CYCLE ######\n if (this.frames_passed === 1)\n {\n this.target_application.on_post_start();\n }\n\n this.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 this.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.toLowerCase().replace(/[-_][a-z0-9]/g, (group) => group.slice(-1).toUpperCase());\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 grid_frag from '../shaders/grid/grid.frag';\nimport grid_vert from '../shaders/grid/grid.vert';\n\nimport { GeometryUtilities } from '../utilities/GeometryUtilities';\n\nimport { Mesh } from 'three';\nimport { ShaderMaterial } from 'three';\nimport { Color } from 'three';\nimport { PlaneGeometry } from 'three';\n\nclass Grid extends Mesh\n{\n constructor()\n {\n const material = new ShaderMaterial({\n uniforms: {\n _Color: { value: new Color('#919191') }\n },\n vertexShader: grid_vert,\n fragmentShader: grid_frag,\n extensions: { derivatives: true },\n transparent: true,\n depthWrite: false\n });\n\n const plane_geometry = new PlaneGeometry(100, 100, 100, 100);\n\n const non_indexed_geometry = GeometryUtilities.convert_to_non_indexed_geometry(plane_geometry);\n\n super(non_indexed_geometry, material);\n\n this.rotation.x = -3.14 / 2;\n }\n}\n\nexport { Grid };\n","import line_vs from '../shaders/basic_line/basic_line.vert';\nimport line_fs from '../shaders/basic_line/basic_line.frag';\n\nimport { Mesh } from 'three';\nimport { BufferAttribute } from 'three';\nimport { BufferGeometry } from 'three';\nimport { ShaderMaterial } from 'three';\nimport { Color } from 'three';\n\nclass Line extends Mesh\n{\n constructor(points)\n {\n const geometry = new BufferGeometry();\n geometry.setAttribute('position', new BufferAttribute(new Float32Array([]), 3));\n geometry.setAttribute('next_position', new BufferAttribute(new Float32Array([]), 3));\n geometry.setAttribute('previous_position', new BufferAttribute(new Float32Array([]), 3));\n geometry.setAttribute('orientation', new BufferAttribute(new Float32Array([]), 1));\n geometry.setAttribute('coverage', new BufferAttribute(new Float32Array([]), 1));\n\n const material = new ShaderMaterial({\n uniforms: {\n _Thickness: { value: 0.2 },\n _Length: { value: 0 },\n _ElapsedTime: { value: 0 },\n _Color: { value: new Color('#FF0000') }\n },\n vertexShader: line_vs,\n fragmentShader: line_fs,\n transparent: true,\n depthWrite: false,\n extensions: { derivatives: true }\n\n });\n\n super(geometry, material);\n\n if (points)\n {\n this.setup(points);\n }\n }\n\n setup(points)\n {\n const vertices = [];\n const next_position = [];\n const previous_position = [];\n const orientation = [];\n const coverage = [];\n let accumulated_length = 0;\n\n for (let i = 0; i < points.length; i++)\n {\n vertices.push(points[i].x);\n vertices.push(points[i].y);\n vertices.push(points[i].z);\n orientation.push(1);\n\n vertices.push(points[i].x);\n vertices.push(points[i].y);\n vertices.push(points[i].z);\n orientation.push(-1);\n\n const next_point = this.__get_next_position(points, i);\n next_position.push(next_point.x);\n next_position.push(next_point.y);\n next_position.push(next_point.z);\n\n next_position.push(next_point.x);\n next_position.push(next_point.y);\n next_position.push(next_point.z);\n\n const previous_point = this.__get_previous_position(points, i);\n previous_position.push(previous_point.x);\n previous_position.push(previous_point.y);\n previous_position.push(previous_point.z);\n\n previous_position.push(previous_point.x);\n previous_position.push(previous_point.y);\n previous_position.push(previous_point.z);\n\n coverage.push(accumulated_length);\n coverage.push(accumulated_length);\n\n if (i < points.length - 1)\n {\n accumulated_length += points[i].distanceTo(next_point);\n }\n }\n const vertexList = new Float32Array(vertices);\n const nextPositionList = new Float32Array(next_position);\n const previousPositionList = new Float32Array(previous_position);\n const orientationList = new Float32Array(orientation);\n const coverageList = new Float32Array(coverage);\n\n const indices = [];\n for (let i = 0; i < ((vertexList.length / 3) - 2) / 2; i++)\n {\n const index = (i * 2) + 1;\n indices.push(index);\n indices.push(index + 1);\n indices.push(index - 1);\n\n indices.push(index);\n indices.push(index + 2);\n indices.push(index + 1);\n }\n\n this.geometry.setIndex(indices);\n this.geometry.getAttribute('position').copy(new BufferAttribute(vertexList, 3));\n this.geometry.getAttribute('next_position').copy(new BufferAttribute(nextPositionList, 3));\n this.geometry.getAttribute('previous_position').copy(new BufferAttribute(previousPositionList, 3));\n this.geometry.getAttribute('orientation').copy(new BufferAttribute(orientationList, 1));\n this.geometry.getAttribute('coverage').copy(new BufferAttribute(coverageList, 1));\n\n this.geometry.getAttribute('position').needsUpdate = true;\n this.geometry.getAttribute('next_position').needsUpdate = true;\n this.geometry.getAttribute('previous_position').needsUpdate = true;\n this.geometry.getAttribute('orientation').needsUpdate = true;\n this.geometry.getAttribute('coverage').needsUpdate = true;\n\n this.material.uniforms._Length.value = accumulated_length;\n this._length = accumulated_length;\n }\n\n set thickness(value)\n {\n this.material.uniforms._Thickness.value = value;\n }\n\n get thickness()\n {\n return this.material.uniforms._Thickness.value;\n }\n\n __get_previous_position(points, i)\n {\n if (i === 0)\n {\n return points[1].clone().sub(points[0]).multiplyScalar(-1).add(points[0]);\n }\n else\n {\n return points[i - 1];\n }\n }\n\n __get_next_position(points, i)\n {\n if (i === points.length - 1)\n {\n return points[points.length - 2].clone().sub(points[points.length - 1]).multiplyScalar(-1).add(points[points.length - 1]);\n }\n else\n {\n return points[i + 1];\n }\n }\n\n update()\n {\n }\n\n distance()\n {\n return this.accumulated_length;\n }\n\n total_length()\n {\n return this.accumulated_length;\n }\n\n dispose()\n {\n this.geometry.dispose();\n this.material.dispose();\n if (this.parent)\n {\n this.parent.remove(this);\n }\n }\n\n set color(col)\n {\n this.material.uniforms._Color.value.set(col);\n }\n\n get color()\n {\n return this.material.uniforms._Color.value;\n }\n\n copy_color(col)\n {\n this.material.uniforms._Color.value.copy(col);\n }\n}\n\nexport { Line };\n","import basic_texture_vert from '../shaders/basic_texture/basic_texture.vert';\nimport basic_texture_frag from '../shaders/basic_texture/basic_texture.frag';\n\nimport { Mesh } from 'three';\nimport { Vector2 } from 'three';\nimport { ShaderMaterial } from 'three';\nimport { DoubleSide } from 'three';\nimport { PlaneGeometry } from 'three';\nimport { Vector3 } from 'three';\n\nclass WorldImage extends Mesh\n{\n constructor(texture, pivot)\n {\n pivot = pivot || new Vector2(0, 0);\n const material = new ShaderMaterial({\n uniforms: {\n _MainTex: { value: texture },\n _ScreenAligned: { value: 0 },\n _Scale: { value: 1 },\n _Opacity: { value: 1 }\n },\n vertexShader: basic_texture_vert,\n fragmentShader: basic_texture_frag,\n transparent: true,\n depthWrite: false,\n side: DoubleSide\n });\n const geometry = new PlaneGeometry(1, 1, 1);\n geometry.translate(-pivot.x / 2, -pivot.y / 2, 0);\n const current_scale = texture.image.width / texture.image.height;\n geometry.scale(current_scale, 1, 1);\n super(geometry, material);\n this.current_scale = current_scale;\n this.geometry.computeBoundingBox();\n\n this.tmp_bb_size = new Vector3();\n this.geometry.boundingBox.getSize(this.tmp_bb_size);\n }\n\n update_texture()\n {\n this.material.uniforms._MainTex.value.needsUpdate = true;\n const img = this.material.uniforms._MainTex.value.image;\n\n this.geometry.scale(1 / this.current_scale, 1, 1);\n this.current_scale = img.width / img.height;\n this.geometry.scale(this.current_scale, 1, 1);\n this.geometry.computeBoundingBox();\n this.geometry.boundingBox.getSize(this.tmp_bb_size);\n }\n\n get size()\n {\n return this.tmp_bb_size.clone().multiplyScalar(this.scale.x);\n }\n\n set size(value)\n {\n this.scale.set(value, value, value);\n this.material.uniforms._Scale.value = value;\n }\n\n set screen_aligned(boolean)\n {\n this.material.uniforms._ScreenAligned.value = boolean === true ? 1 : 0;\n }\n\n get screen_aligned()\n {\n return this.material.uniforms._ScreenAligned.value === 1;\n }\n\n set opacity(opacity)\n {\n this.material.uniforms._Opacity.value = opacity;\n }\n\n get opacity()\n {\n return this.material.uniforms._Opacity.value;\n }\n\n dispose()\n {\n this.geometry.dispose();\n this.parent.remove(this);\n this.material.uniforms._MainTex.value.dispose();\n this.material.dispose();\n }\n}\n\nexport { WorldImage };\n","import { WorldImage } from './WorldImage';\nimport { SimpleTextDrawer } from '../canvas_drawer/SimpleTextDrawer';\n\nimport { LinearMipMapLinearFilter } from 'three';\nimport { LinearFilter } from 'three';\n\nclass Text2D extends WorldImage\n{\n constructor(text, font, color, pivot, is_static)\n {\n const simple_text_drawer = new SimpleTextDrawer(is_static);\n\n const draw_settings = {\n font: font,\n font_color: color || '#000000'\n };\n const canvas_texture = simple_text_drawer.draw_on_texture(text, draw_settings);\n\n canvas_texture.minFilter = LinearMipMapLinearFilter;\n canvas_texture.minFilter = LinearFilter;\n canvas_texture.needsUpdate = true;\n super(canvas_texture, pivot);\n\n this.simple_text_drawer = simple_text_drawer;\n this.canvas_texture = canvas_texture;\n this.draw_settings = draw_settings;\n }\n\n set text(value)\n {\n this.simple_text_drawer.draw_canvas(value, this.draw_settings);\n this.update_texture();\n }\n\n get text()\n {\n return 'not implemented';\n }\n}\n\nexport { Text2D };\n","import vert from '../shaders/ui_element/ui_element.vert';\nimport frag from '../shaders/ui_element/ui_element.frag';\n\nimport { BaseShaderMaterial } from '../materials/BaseShaderMaterial';\n\nimport { Vector2 } from 'three';\nimport { Vector3 } from 'three';\n\nimport { OScreen } from '../OScreen';\n\nclass UIElementMaterial extends BaseShaderMaterial\n{\n constructor(intensity = 1)\n {\n super(vert, frag, {\n _MainTex: { value: undefined },\n _ScreenSize: { value: new Vector2(OScreen.width, OScreen.height) },\n _TextureSize: { value: new Vector2() },\n _PixelOffset: { value: new Vector2(0, 0) },\n _NDC: { value: new Vector3() },\n _PivotPoint: { value: new Vector2() },\n _DepthOffset: { value: 0 }\n });\n this.transparent = true;\n this.depthWrite = false;\n this.depthTest = false;\n }\n}\n\nexport { UIElementMaterial };\n","import { Vector2 } from 'three';\n\nclass ScreenSpacePosition\n{\n constructor()\n {\n this.tmp_vec = new Vector2();\n }\n\n get_pos_NDC(position)\n {\n return this.tmp_vec.set(position.x, position.y);\n }\n}\n\nexport { ScreenSpacePosition };\n","import { CameraManager } from '../../CameraManager';\n\nimport { Vector2 } from 'three';\nimport { Vector3 } from 'three';\n\nclass WorldSpacePosition\n{\n constructor()\n {\n this.tmp_vec3 = new Vector3();\n this.tmp_vec2 = new Vector2();\n }\n\n get_pos_NDC(position)\n {\n this.tmp_vec3.copy(position);\n this.tmp_vec3.project(CameraManager.current);\n\n return this.tmp_vec2.set(this.tmp_vec3.x, this.tmp_vec3.y);\n }\n}\n\nexport { WorldSpacePosition };\n","class UIElementState\n{\n constructor()\n {\n\n }\n\n update(ui_element, normalized_mouse_position)\n {\n\n }\n\n on_enter(ui_element)\n {}\n\n on_exit(ui_element)\n {}\n}\n\nexport { UIElementState };\n","import { UIElementState } from './UIElementState';\n\nclass OnIdle extends UIElementState\n{\n constructor()\n {\n super();\n }\n\n update(ui_element, normalized_mouse_position)\n {\n if (ui_element.is_mouse_over(normalized_mouse_position))\n {\n ui_element.set_state(ui_element._on_enter_state);\n }\n }\n}\n\nexport { OnIdle };\n","import { UIElementState } from './UIElementState';\n\nclass OnMouseEnter extends UIElementState\n{\n constructor()\n {\n super();\n }\n\n on_enter(ui_element)\n {\n ui_element.on_mouse_enter();\n }\n\n update(ui_element, normalized_mouse_position)\n {\n if (ui_element.is_mouse_over(normalized_mouse_position))\n {\n ui_element.set_state(ui_element._on_hover_state);\n }\n else\n {\n ui_element.set_state(ui_element._on_exit_state);\n }\n }\n}\n\nexport { OnMouseEnter };\n","import { UIElementState } from './UIElementState';\n\nclass OnMouseExit extends UIElementState\n{\n constructor()\n {\n super();\n }\n\n on_enter(ui_element)\n {\n ui_element.on_mouse_exit();\n ui_element.set_state(ui_element._on_idle_state);\n }\n}\n\nexport { OnMouseExit };\n","import { UIElementState } from './UIElementState';\n\nclass OnMouseHover extends UIElementState\n{\n constructor()\n {\n super();\n }\n\n on_enter(ui_element)\n {\n this.__trigger_on_hover(ui_element);\n }\n\n update(ui_element, normalized_mouse_position)\n {\n if (ui_element.is_mouse_over(normalized_mouse_position))\n {\n this.__trigger_on_hover(ui_element);\n }\n else\n {\n ui_element.set_state(ui_element._on_exit_state);\n }\n }\n\n __trigger_on_hover(ui_element)\n {\n ui_element.on_mouse_hover();\n }\n}\n\nexport { OnMouseHover };\n","\nimport { OScreen } from '../OScreen';\n\nimport { UIElementMaterial } from '../materials/UIElementMaterial';\n\nimport { ScreenSpacePosition } from '../ui/ui_element_position/ScreenSpacePosition';\nimport { WorldSpacePosition } from '../ui/ui_element_position/WorldSpacePosition';\n\nimport { OnIdle } from '../ui/ui_element_state/OnIdle';\nimport { OnMouseEnter } from '../ui/ui_element_state/OnMouseEnter';\nimport { OnMouseExit } from '../ui/ui_element_state/OnMouseExit';\nimport { OnMouseHover } from '../ui/ui_element_state/OnMouseHover';\n\nimport { Mesh } from 'three';\nimport { PlaneGeometry } from 'three';\nimport { Vector2 } from 'three';\nimport { Vector3 } from 'three';\nimport { NearestFilter } from 'three';\nimport { Box2 } from 'three';\n\nclass UIElement extends Mesh\n{\n constructor(vert, frag)\n {\n super(new PlaneGeometry(1, 1), new UIElementMaterial());\n\n this.is_clickable = false;\n\n this.position_strategy = new WorldSpacePosition();\n this.current_state = new OnIdle();\n\n this._position = new Vector3();\n\n this._on_idle_state = new OnIdle();\n this._on_enter_state = new OnMouseEnter();\n this._on_exit_state = new OnMouseExit();\n this._on_hover_state = new OnMouseHover();\n\n this.on_enter = undefined;\n this.on_exit = undefined;\n this.on_hover = undefined;\n\n this.mouse_pos_tmp = new Vector2();\n this.cached_NDC_position = new Vector2();\n this.screen_pos_tmp = new Vector2();\n\n this.texture_size = new Vector2(1, 1);\n\n this.frustumCulled = false;\n this.matrixAutoUpdate = false;\n this.renderOrder = 0;\n\n this.size = 1;\n this.pixel_offset = new Vector2();\n }\n\n set_render_order(value)\n {\n this.renderOrder = value;\n }\n\n get pivot_point()\n {\n return this.material.uniforms._PivotPoint.value;\n }\n\n set_pixel_offset(offset)\n {\n this.pixel_offset.copy(offset);\n this.material.uniforms._PixelOffset.value.copy(offset);\n }\n\n set_state(new_state)\n {\n this.current_state.on_exit(this);\n this.current_state = new_state;\n this.current_state.on_enter(this);\n }\n\n get position()\n {\n return this._position;\n }\n\n set use_depth(boolean)\n {\n this.material.depthTest = boolean;\n }\n\n get use_depth()\n {\n return this.material.depthTest;\n }\n\n set depth_offset(value)\n {\n this.material.uniforms._DepthOffset.value = value;\n }\n\n get depth_offset()\n {\n return this.material.uniforms._DepthOffset.value;\n }\n\n clear_state()\n {\n this.visible = false;\n }\n\n set_world_space_coordinate_system()\n {\n this.position_strategy = new WorldSpacePosition();\n }\n\n set_screen_space_coordinate_system()\n {\n this.position_strategy = new ScreenSpacePosition();\n }\n\n set_texture(texture)\n {\n texture.minFilter = NearestFilter;\n texture.magFilter = NearestFilter;\n texture.needsUpdate = true;\n\n this.texture_size.set(texture.image.width, texture.image.height);\n\n this.material.uniforms._MainTex.value = texture;\n this.get_size(this.material.uniforms._TextureSize.value);\n this.visible = true;\n }\n\n update_state(normalized_mouse_pos)\n {\n this.material.uniforms._ScreenSize.value.set(OScreen.width, OScreen.height);\n this.get_size(this.material.uniforms._TextureSize.value);\n\n this.cached_NDC_position.copy(this.position_strategy.get_pos_NDC(this.position));\n this.material.uniforms._NDC.value.copy(this.position);\n this.current_state.update(this, normalized_mouse_pos);\n }\n\n is_mouse_over(normalized_mouse_pos)\n {\n this.screen_pos_tmp.copy(this.cached_NDC_position);\n this.to_screen_position(this.screen_pos_tmp);\n this.screen_pos_tmp.x += this.pixel_offset.x;\n this.screen_pos_tmp.y += this.pixel_offset.y;\n\n const rect = new Box2().setFromCenterAndSize(this.screen_pos_tmp, this.get_size());\n\n this.mouse_pos_tmp.copy(normalized_mouse_pos);\n this.to_screen_position(this.mouse_pos_tmp);\n\n return rect.containsPoint(this.mouse_pos_tmp);\n }\n\n to_screen_position(projected_pos)\n {\n projected_pos.x = (projected_pos.x * 0.5 + 0.5) * OScreen.width + this.pixel_offset.x;\n projected_pos.y = (projected_pos.y * 0.5 + 0.5) * OScreen.height + this.pixel_offset.y;\n }\n\n get_screen_space_position()\n {\n const pos = this.cached_NDC_position.clone();\n this.to_screen_position(pos);\n return pos;\n }\n\n set_screen_space_position(screen_pos)\n {\n this.position.x = (screen_pos.x / OScreen.width) * 2 - 1;\n this.position.y = (screen_pos.y / OScreen.height) * 2 - 1;\n }\n\n dispose()\n {\n if (this.material.uniforms._MainTex.value)\n {\n this.material.uniforms._MainTex.value.dispose();\n }\n // OScreen.remove_screen_material(this.material);\n this.geometry.dispose();\n this.material.dispose();\n }\n\n get_size(vector2)\n {\n if (vector2)\n {\n return vector2.copy(this.texture_size).multiplyScalar(this.size / OScreen.dpr);\n }\n else\n {\n return new Vector2().copy(this.texture_size).multiplyScalar(this.size / OScreen.dpr);\n }\n }\n\n on_mouse_enter()\n {}\n\n on_mouse_exit()\n {}\n\n on_mouse_hover()\n {}\n}\n\nexport { UIElement };\n","import { Mesh } from 'three';\n\nclass UpdatableMaterialMesh extends Mesh\n{\n constructor(geometry, material)\n {\n super(geometry, material);\n\n const self = this;\n\n this.onBeforeRender = () =>\n {\n self.material.update();\n };\n }\n}\n\nexport { UpdatableMaterialMesh };\n","import { Vector2, Vector4 } from 'three';\n\nclass TextGlyph\n{\n constructor(offset, plane_bounds, atlas_bounds)\n {\n const width = plane_bounds.right - plane_bounds.left;\n const height = plane_bounds.top - plane_bounds.bottom;\n\n this.scale = new Vector2(width, height);\n this.position = new Vector2(offset + plane_bounds.left, plane_bounds.bottom);\n\n this.atlas_bounds = new Vector4(atlas_bounds.left, atlas_bounds.right, atlas_bounds.top, atlas_bounds.bottom);\n }\n}\n\nexport { TextGlyph };\n","import { Vector3, Quaternion, Matrix4, Color, Box2, Vector2 } from 'three';\nimport { TextGlyph } from './TextGlyph';\n\nclass SDFText\n{\n constructor(glyph_layout, text = '')\n {\n this.glyph_layout = glyph_layout;\n\n this.glyphs = [];\n\n this.glyph_is_dirty = true;\n this.matrix_is_dirty = true;\n this.color_is_dirty = true;\n\n this.position = new Vector3();\n this.quaternion = new Quaternion();\n this.scale = new Vector3(1, 1, 1);\n this.matrix = new Matrix4();\n\n this.color = new Color('#FFFFFF');\n\n this.pivot_point = new Vector2();\n this.__opacity = 1;\n\n this.__text = text;\n\n this.__generate_glyphs(text);\n }\n\n set text(value)\n {\n this.__text = value;\n this.__generate_glyphs(value);\n this.matrix_is_dirty = true;\n }\n\n get text()\n {\n return this.__text;\n }\n\n update_matrix()\n {\n this.matrix.compose(this.position, this.quaternion, this.scale);\n this.matrix_is_dirty = false;\n this.glyph_is_dirty = true;\n }\n\n clear_glyph_dirty()\n {\n this.glyph_is_dirty = false;\n }\n\n clear_color_dirty()\n {\n this.color_is_dirty = false;\n }\n\n set_rotation(orientation = 0, tilt = 0) // 0..360, -90..0..90\n {\n const new_orientation = new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), (orientation / 360) * Math.PI * 2);\n const new_tilt = new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), (-tilt / 360) * Math.PI * 2);\n\n this.quaternion.copy(new_orientation.multiply(new_tilt));\n this.matrix_is_dirty = true;\n }\n\n set_position(pos)\n {\n this.position.copy(pos);\n this.matrix_is_dirty = true;\n }\n\n set_size(size)\n {\n this.scale.set(size, size, size);\n this.matrix_is_dirty = true;\n }\n\n set_color(col)\n {\n this.color.set(col);\n this.color_is_dirty = true;\n }\n\n set_pivot(pivot)\n {\n this.pivot_point.copy(pivot);\n this.update_glyphs();\n }\n\n set opacity(op)\n {\n this.__opacity = op;\n this.color_is_dirty = true;\n }\n\n get opacity()\n {\n return this.__opacity;\n }\n\n update_glyphs()\n {\n this.__generate_glyphs(this.text);\n }\n\n __generate_glyphs(text)\n {\n let cursor = 0;\n\n this.glyphs.length = 0;\n\n for (let i = 0; i < text.length; i++)\n {\n const unicode = text.charCodeAt(i);\n const glyph = this.glyph_layout.find(element => element.unicode === unicode);\n if (glyph)\n {\n if (glyph.planeBounds)\n {\n const text_glyph = new TextGlyph(cursor, glyph.planeBounds, glyph.atlasBounds);\n this.glyphs.push(text_glyph);\n }\n cursor += glyph.advance;\n }\n }\n\n const box2 = new Box2();\n const first_glyph = this.glyphs[0];\n box2.setFromCenterAndSize(first_glyph.position.clone().add(new Vector2(first_glyph.scale.x / 2, first_glyph.scale.y / 2)), first_glyph.scale);\n\n for (let i = 1; i < this.glyphs.length; i++)\n {\n const g = this.glyphs[i];\n const box = new Box2().setFromCenterAndSize(g.position.clone().add(new Vector2(g.scale.x / 2, g.scale.y / 2)), g.scale);\n box2.union(box);\n }\n\n const box2_size = new Vector2();\n box2.getSize(box2_size);\n for (let i = 0; i < this.glyphs.length; i++)\n {\n this.glyphs[i].position.x -= box2_size.x / 2;\n this.glyphs[i].position.y -= box2_size.y / 2;\n\n this.glyphs[i].position.x += (box2_size.x / 2) * this.pivot_point.x;\n this.glyphs[i].position.y += (box2_size.y / 2) * this.pivot_point.y;\n }\n\n this.glyph_is_dirty = true;\n }\n}\n\nexport { SDFText };\n","import { BaseShaderMaterial } from './BaseShaderMaterial';\n\nimport frag from '../shaders/sdf_text/sdf_text.frag';\nimport vert from '../shaders/sdf_text/sdf_text.vert';\n\nimport { Vector2, DoubleSide, LinearFilter } from 'three';\nimport { OMath } from '../utilities/OMath';\n\nclass SDFTextMaterial extends BaseShaderMaterial\n{\n constructor(texture)\n {\n super(vert, frag, {\n _Texture: { value: texture },\n _Boldness: { value: 0.5 },\n _AtlasSize: { value: new Vector2(1, 1) }\n });\n\n this.transparent = true;\n this.extensions = {\n derivatives: true\n };\n this.depthWrite = false;\n this.side = DoubleSide;\n texture.minFilter = LinearFilter;\n texture.magFilter = LinearFilter;\n texture.generateMipMaps = false;\n }\n\n set_atlas_size(size)\n {\n this.uniforms._AtlasSize.value.copy(size);\n }\n\n set_boldness(value)\n {\n this.uniforms._Boldness.value = OMath.lerp(0.5, 0.2, value);\n }\n}\n\nexport { SDFTextMaterial };\n","import { SDFText } from './SDFText';\nimport { SDFTextMaterial } from '../../materials/SDFTextMaterial';\nimport { ArrayUtilities } from '../../utilities/ArrayUtilities';\n\nimport {\n PlaneGeometry,\n Mesh,\n Vector2,\n InstancedBufferGeometry,\n InstancedBufferAttribute,\n Float32BufferAttribute,\n DynamicDrawUsage\n} from 'three';\n\nclass SDFTextBatch extends Mesh\n{\n constructor(font_layout, atlas_texture)\n {\n const max_allocations = 2000;\n\n const instanced_geometry = new InstancedBufferGeometry();\n instanced_geometry.instanceCount = 0;\n\n const geometry = new PlaneGeometry(1, 1);\n geometry.translate(0.5, 0.5, 0);\n instanced_geometry.setAttribute('position', new Float32BufferAttribute(geometry.getAttribute('position').array, 3));\n instanced_geometry.setAttribute('uv', new Float32BufferAttribute(geometry.getAttribute('uv').array, 2));\n instanced_geometry.index = geometry.index;\n\n const transformsCol0 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n const transformsCol1 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n const transformsCol2 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n const transformsCol3 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n\n const glyph_bounds = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n const plane_bounds = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n\n const color = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n\n transformsCol0.usage = DynamicDrawUsage;\n transformsCol1.usage = DynamicDrawUsage;\n transformsCol2.usage = DynamicDrawUsage;\n transformsCol3.usage = DynamicDrawUsage;\n glyph_bounds.usage = DynamicDrawUsage;\n plane_bounds.usage = DynamicDrawUsage;\n color.usage = DynamicDrawUsage;\n\n instanced_geometry.setAttribute('transformsCol0', transformsCol0);\n instanced_geometry.setAttribute('transformsCol1', transformsCol1);\n instanced_geometry.setAttribute('transformsCol2', transformsCol2);\n instanced_geometry.setAttribute('transformsCol3', transformsCol3);\n\n instanced_geometry.setAttribute('glyph_bounds', glyph_bounds);\n instanced_geometry.setAttribute('plane_bounds', plane_bounds);\n instanced_geometry.setAttribute('color', color);\n\n super(instanced_geometry, new SDFTextMaterial(atlas_texture));\n\n this.text_elements = [];\n this.font_layout = font_layout;\n\n this.material.set_atlas_size(new Vector2(font_layout.atlas.width, font_layout.atlas.height));\n\n this.frustumCulled = false;\n }\n\n set_boldness(value)\n {\n this.material.set_boldness(value);\n }\n\n add_text(text_str)\n {\n const elem = new SDFText(this.font_layout.glyphs, text_str);\n this.text_elements.push(elem);\n return elem;\n }\n\n remove_text(text_elem)\n {\n ArrayUtilities.remove_elem(this.text_elements, text_elem);\n this.update(true);\n }\n\n update(force_update)\n {\n const glyph_bounds_atr = this.geometry.getAttribute('glyph_bounds');\n const plane_bounds_atr = this.geometry.getAttribute('plane_bounds');\n\n const transformsCol0 = this.geometry.getAttribute('transformsCol0');\n const transformsCol1 = this.geometry.getAttribute('transformsCol1');\n const transformsCol2 = this.geometry.getAttribute('transformsCol2');\n const transformsCol3 = this.geometry.getAttribute('transformsCol3');\n\n const color_atr = this.geometry.getAttribute('color');\n\n let matrix_needs_update = force_update === true;\n let glyph_needs_update = force_update === true;\n let color_needs_update = force_update === true;\n\n let glyph_count = 0;\n for (let i = 0; i < this.text_elements.length; i++)\n {\n const text = this.text_elements[i];\n\n if (text.matrix_is_dirty)\n {\n matrix_needs_update = true;\n text.update_matrix();\n }\n\n if (text.glyph_is_dirty)\n {\n glyph_needs_update = true;\n text.clear_glyph_dirty();\n }\n\n if (text.color_is_dirty)\n {\n color_needs_update = true;\n text.clear_color_dirty();\n }\n\n const matrix = text.matrix;\n const color = text.color;\n const opacity = text.opacity;\n\n for (let glyph_i = 0; glyph_i < text.glyphs.length; glyph_i++)\n {\n const glyph = text.glyphs[glyph_i];\n\n const buffer_i = glyph_count;\n\n glyph_bounds_atr.setXYZW(buffer_i, glyph.atlas_bounds.x, glyph.atlas_bounds.y, glyph.atlas_bounds.z, glyph.atlas_bounds.w);\n plane_bounds_atr.setXYZW(buffer_i, glyph.position.x, glyph.position.y, glyph.scale.x, glyph.scale.y);\n\n transformsCol0.setXYZW(buffer_i, matrix.elements[0],\n matrix.elements[1],\n matrix.elements[2],\n matrix.elements[3]);\n\n transformsCol1.setXYZW(buffer_i, matrix.elements[4],\n matrix.elements[5],\n matrix.elements[6],\n matrix.elements[7]);\n\n transformsCol2.setXYZW(buffer_i, matrix.elements[8],\n matrix.elements[9],\n matrix.elements[10],\n matrix.elements[11]);\n\n transformsCol3.setXYZW(buffer_i, matrix.elements[12],\n matrix.elements[13],\n matrix.elements[14],\n matrix.elements[15]);\n\n color_atr.setXYZW(buffer_i, color.r, color.g, color.b, opacity);\n\n glyph_count++;\n }\n }\n\n this.geometry.instanceCount = glyph_count;\n\n if (glyph_count > this.max_allocations)\n {\n console.error('SDFTextBatch exceeded maximum glyph allocations(max/current): ', this.max_allocations, glyph_count, this);\n }\n\n if (matrix_needs_update)\n {\n transformsCol0.needsUpdate = true;\n transformsCol1.needsUpdate = true;\n transformsCol2.needsUpdate = true;\n transformsCol3.needsUpdate = true;\n }\n if (glyph_needs_update)\n {\n glyph_bounds_atr.needsUpdate = true;\n plane_bounds_atr.needsUpdate = true;\n }\n if (color_needs_update)\n {\n color_atr.needsUpdate = true;\n }\n }\n\n dispose()\n {\n this.geometry.dispose();\n this.material.dispose();\n }\n}\n\nexport { SDFTextBatch };\n","import { ActionInterpolator } from './ActionInterpolator';\n\nclass VectorInterpolator extends ActionInterpolator\n{\n constructor(attribute_name, from = 0, to = 1, easing_function = 'linear')\n {\n super(easing_function);\n\n this.attribute_name = attribute_name;\n this.from = from;\n this.to = to;\n }\n\n update(context, t)\n {\n const tmp = this.from.clone();\n tmp.lerp(this.to, this.easing_function(t));\n context[this.attribute_name].copy(tmp);\n }\n}\n\nexport { VectorInterpolator };\n","import { BlitMaterial } from '../materials/BlitMaterial';\n\nimport frag from '../shaders/median_filter/median_filter.frag';\n\nimport { Vector2 } from 'three';\n\nclass MedianFilterMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag, undefined, {\n kernel3x3: true\n });\n\n this.uniforms._SourceTex = { value: undefined };\n this.uniforms._SourceTexSize = { value: new Vector2(1, 1) };\n }\n\n set_texture(tex)\n {\n this.uniforms._SourceTex.value = tex;\n\n const size = this.get_size(tex);\n this.uniforms._SourceTexSize.value.copy(size);\n }\n\n get_size(tex)\n {\n if (tex.isVideoTexture)\n {\n return new Vector2(Math.max(1, tex.image.videoWidth), Math.max(1, tex.image.videoHeight));\n }\n if (tex.isWebGLRenderTarget)\n {\n return new Vector2(tex.width, tex.height);\n }\n if (tex.isTexture)\n {\n return new Vector2(tex.image.width, tex.image.height);\n }\n return new Vector2(1, 1);\n }\n}\n\nexport { MedianFilterMaterial };\n","import { MedianFilterMaterial } from '../materials/MedianFilterMaterial';\nimport { Graphics } from '../Graphics';\n\nimport { WebGLRenderTarget, Vector2, RGBAFormat, FloatType, NearestFilter } from 'three';\n\nclass MedianFilter\n{\n constructor(renderer)\n {\n this.RT = new WebGLRenderTarget(1, 1, {\n type: FloatType,\n format: RGBAFormat,\n minFilter: NearestFilter,\n magFilter: NearestFilter\n });\n this.RT1 = new WebGLRenderTarget(1, 1, {\n type: FloatType,\n format: RGBAFormat,\n minFilter: NearestFilter,\n magFilter: NearestFilter\n });\n\n this.median_filter_mat = new MedianFilterMaterial();\n }\n\n filter(texture)\n {\n const tex_size = this.get_size(texture);\n if (tex_size.x !== this.RT.width || tex_size.y !== this.RT.height)\n {\n this.RT.setSize(tex_size.x, tex_size.y);\n this.RT1.setSize(tex_size.x, tex_size.y);\n }\n\n this.median_filter_mat.set_texture(texture);\n Graphics.material_pass(this.median_filter_mat, this.RT);\n\n for (let i = 0; i < 0; i++)\n {\n this.median_filter_mat.set_texture(this.RT.texture);\n Graphics.material_pass(this.median_filter_mat, this.RT1);\n\n this.median_filter_mat.set_texture(this.RT1.texture);\n Graphics.material_pass(this.median_filter_mat, this.RT);\n }\n\n return this.RT;\n }\n\n get_size(tex)\n {\n if (tex.isVideoTexture)\n {\n return new Vector2(Math.max(1, tex.image.videoWidth), Math.max(1, tex.image.videoHeight));\n }\n if (tex.isWebGLRenderTarget)\n {\n return new Vector2(tex.width, tex.height);\n }\n if (tex.isTexture)\n {\n return new Vector2(tex.image.width, tex.image.height);\n }\n return new Vector2(1, 1);\n }\n}\n\nexport { MedianFilter };\n","import { BlitMaterial } from './BlitMaterial';\n\nimport downsample_frag from '../shaders/dual_filter_blur/downsample.frag';\nimport upsample_frag from '../shaders/dual_filter_blur/upsample.frag';\n\nclass DualFilteringBlurMaterial extends BlitMaterial\n{\n constructor(upsample)\n {\n super(upsample ? upsample_frag : downsample_frag);\n }\n}\n\nexport { DualFilteringBlurMaterial };\n","import { BlitMaterial } from './BlitMaterial';\n\nimport frag from '../shaders/dual_filter_blur/alpha_filter.frag';\n\nclass AlphaFilterMaterial extends BlitMaterial\n{\n constructor(use_alpha_mask, upsample)\n {\n super(frag);\n }\n\n set offset(value)\n {\n this.uniforms._Offset.value = value;\n }\n\n get offset()\n {\n return this.uniforms._Offset.value;\n }\n}\n\nexport { AlphaFilterMaterial };\n","import { DualFilteringBlurMaterial } from '../materials/DualFilteringBlurMaterial';\nimport { AlphaFilterMaterial } from '../materials/AlphaFilterMaterial';\nimport { Graphics } from '../Graphics';\nimport { WebGLRenderTarget } from 'three';\nclass DualFilteringBlurrer\n{\n constructor(use_alpha_mask)\n {\n this.current_width = 1;\n this.current_height = 1;\n this.RT0 = new WebGLRenderTarget(1, 1);\n this.RT1 = new WebGLRenderTarget(1, 1);\n this.RT2 = new WebGLRenderTarget(1, 1);\n this.RT3 = new WebGLRenderTarget(1, 1);\n this.RT4 = new WebGLRenderTarget(1, 1);\n\n this.upscale_blur_mat = new DualFilteringBlurMaterial(true);\n this.downscale_blur_mat = new DualFilteringBlurMaterial(false);\n\n this.alpha_filter_mat = new AlphaFilterMaterial();\n }\n\n blur(RT)\n {\n this.check_RT_resize(RT.width, RT.height);\n Graphics.blit(RT, this.RT1, this.alpha_filter_mat);\n\n // Graphics.blit(this.RT0, this.RT1, this.downscale_blur_mat);\n Graphics.blit(this.RT1, this.RT2, this.downscale_blur_mat);\n Graphics.blit(this.RT2, this.RT3, this.downscale_blur_mat);\n Graphics.blit(this.RT3, this.RT4, this.downscale_blur_mat);\n\n // Graphics.blit(this.RT4, this.RT3, this.upscale_blur_mat);\n // Graphics.blit(this.RT3, this.RT4, this.upscale_blur_mat);\n Graphics.blit(this.RT4, this.RT3, this.upscale_blur_mat);\n Graphics.blit(this.RT3, this.RT2, this.upscale_blur_mat);\n Graphics.blit(this.RT2, RT, this.upscale_blur_mat);\n // Graphics.blit(this.RT1, RT, this.upscale_blur_mat);\n\n // return this.RT2;\n }\n\n check_RT_resize(width, height)\n {\n if (this.current_width !== width || this.current_height !== height)\n {\n this.current_width = width;\n this.current_height = height;\n this.RT0.setSize(this.current_width / 2, this.current_height / 2);\n this.RT1.setSize(this.current_width / 2, this.current_height / 2);\n this.RT2.setSize(this.current_width / 4, this.current_height / 4);\n this.RT3.setSize(this.current_width / 8, this.current_height / 8);\n this.RT4.setSize(this.current_width / 16, this.current_height / 16);\n }\n }\n}\n\nexport { DualFilteringBlurrer };\n","import { Graphics } from '../Graphics';\n\nimport { NearestFilter } from 'three';\nimport { RGBAFormat } from 'three';\nimport { LinearEncoding } from 'three';\nimport { HalfFloatType } from 'three';\nimport { FloatType } from 'three';\nimport { WebGLRenderTarget } from 'three';\nimport { Capabilities } from '../Capabilities';\n\nclass ParticleAttribute\n{\n constructor(attr_name, update_material)\n {\n this.read = undefined;\n this.write = undefined;\n\n this.name = attr_name;\n\n this.update_material = update_material;\n }\n\n init_from_geometry(geometry)\n {\n // overrided by inheritance\n }\n\n init_from_attribute(particle_attribute)\n {\n\n }\n\n build_RT(particle_count)\n {\n const resolution = ParticleAttribute.calculate_resolution(particle_count);\n const options = {\n minFilter: NearestFilter,\n magFilter: NearestFilter,\n format: RGBAFormat,\n encoding: LinearEncoding,\n type: Capabilities.fp_textures_available ? FloatType : HalfFloatType,\n stencilBuffer: false,\n depthBuffer: false\n };\n\n return new WebGLRenderTarget(resolution.width, resolution.height, options);\n }\n\n static calculate_resolution(particle_count)\n {\n const width = Math.min(particle_count, 512);\n const height = Math.max(1, Math.ceil(particle_count / width));\n return { width, height };\n }\n\n swap_RT()\n {\n const tmp = this.read;\n this.read = this.write;\n this.write = tmp;\n }\n\n update(attribute_writter_scene)\n {\n if (this.update_material)\n {\n this.update_material.update();\n attribute_writter_scene.children[0].material = this.update_material;\n this.update_material.uniforms._MainTex.value = this.read.texture;\n Graphics.render(attribute_writter_scene, undefined, this.write);\n attribute_writter_scene.children[0].material = undefined;\n\n this.swap_RT();\n }\n }\n\n store_geometry_attribute_in_RT(attribute, RT, storage_material, attribute_writter_scene)\n {\n attribute_writter_scene.children[0].geometry.setAttribute('data', attribute);\n attribute_writter_scene.children[0].material = storage_material;\n\n Graphics.render(attribute_writter_scene, undefined, RT);\n\n attribute_writter_scene.children[0].geometry.deleteAttribute('data');\n attribute_writter_scene.children[0].material = undefined;\n }\n\n get_texture()\n {\n return this.read.texture;\n }\n}\n\nexport { ParticleAttribute };\n","import { Object3D } from 'three';\nimport { BufferAttribute } from 'three';\nimport { PlaneGeometry } from 'three';\nimport { Mesh } from 'three';\nimport { BufferGeometry } from 'three';\nimport { Scene } from 'three';\nimport { Points } from 'three';\nimport { InstancedBufferGeometry } from 'three';\nimport { InstancedBufferAttribute } from 'three';\nimport { ParticleAttribute } from './ParticleAttribute';\n\nclass GPUParticleSystem extends Object3D\n{\n constructor(particle_count, material)\n {\n super();\n this.attributes = [];\n\n this.mesh = this.build_point_mesh(particle_count, material);\n this.add(this.mesh);\n\n this.attribute_writter_mesh = this.build_attribute_writter_mesh(particle_count);\n this.attribute_writter_scene = new Scene();\n this.attribute_writter_scene.add(this.attribute_writter_mesh);\n }\n\n add_texture_attribute(buffer_attribute)\n {\n this.attributes.push(buffer_attribute);\n }\n\n add_update_attribute_array(name, array, item_size)\n {\n this.attribute_writter_mesh.geometry.setAttribute(name, new BufferAttribute(array, item_size, false));\n }\n\n add_attribute_array(name, array, item_size)\n {\n this.mesh.geometry.setAttribute(name, new InstancedBufferAttribute(array, item_size, false));\n }\n\n update()\n {\n this.mesh.material.update();\n for (let i = 0; i < this.attributes.length; i++)\n {\n this.attributes[i].update(this.attribute_writter_scene);\n }\n }\n\n dispose()\n {\n this.mesh.geometry.dispose();\n this.mesh.material.dispose();\n }\n\n build_point_mesh(instance_count = 1, material)\n {\n const geo = new PlaneGeometry();\n\n const instanced_geo = new InstancedBufferGeometry();\n instanced_geo.setAttribute('position', geo.getAttribute('position'));\n instanced_geo.index = geo.index;\n\n instanced_geo.setAttribute('storage_uv', this.build_uv_storage_attribute(instance_count));\n instanced_geo.instanceCount = instance_count;\n const mesh = new Mesh(instanced_geo, material);\n mesh.frustumCulled = false;\n return mesh;\n }\n\n build_attribute_writter_mesh(particle_count)\n {\n const { width, height } = ParticleAttribute.calculate_resolution(particle_count);\n\n const uvs = new Float32Array(particle_count * 3);\n\n for (let i = 0; i < particle_count; i++)\n {\n const x = i % width;\n const y = Math.floor(i / width);\n uvs[i * 3 + 0] = (x + 0.5) / width;\n uvs[i * 3 + 1] = (y + 0.5) / height;\n uvs[i * 3 + 2] = i;\n }\n const geo = new BufferGeometry();\n geo.setAttribute('position', new BufferAttribute(uvs, 3, false));\n\n const points = new Points(geo);\n points.frustumCulled = false;\n return points;\n }\n\n build_uv_storage_attribute(particle_count)\n {\n const { width, height } = ParticleAttribute.calculate_resolution(particle_count);\n\n const uvs = new Float32Array(particle_count * 2);\n\n for (let i = 0; i < particle_count; i++)\n {\n const x = i % width;\n const y = Math.floor(i / width);\n uvs[i * 2 + 0] = (x + 0.5) / width;\n uvs[i * 2 + 1] = (y + 0.5) / height;\n }\n return new InstancedBufferAttribute(uvs, 2, false);\n }\n}\n\nexport { GPUParticleSystem };\n","import frag from '../../shaders/gpu_particles/generic_storage.frag';\n\nimport { ShaderMaterial } from 'three';\nimport { NoBlending } from 'three';\nimport { AlwaysDepth } from 'three';\n\nclass ParticleStorageMaterial extends ShaderMaterial\n{\n constructor()\n {\n const vert = `\n varying vec4 value;\n attribute vec4 data;\n\n void main()\n {\n gl_Position = vec4(position.xy * 2.0 - 1.0, 1.0,1.0);\n gl_PointSize = 1.0;\n\n value = data;\n }\n `;\n super({\n uniforms: {\n\n },\n vertexShader: vert,\n fragmentShader: frag,\n depthWrite: false,\n blending: NoBlending,\n depthTest: false,\n depthFunc: AlwaysDepth\n });\n }\n}\n\nexport { ParticleStorageMaterial };\n","import { BufferAttribute } from 'three';\n\nimport { ParticleAttribute } from '../gpu_particles/ParticleAttribute';\nimport { ParticleStorageMaterial } from '../materials/gpu_particles/ParticleStorageMaterial';\n\nclass ParticlePositionAttribute extends ParticleAttribute\n{\n constructor(update_material)\n {\n super('_Position', update_material);\n }\n\n store_geometry(geometry, attribute_writter_scene)\n {\n const pos_attr = geometry.getAttribute('position');\n this.read = this.build_RT(pos_attr.count);\n this.write = this.build_RT(pos_attr.count);\n\n const mat = new ParticleStorageMaterial();\n this.store_geometry_attribute_in_RT(geometry.getAttribute('position'), this.read, mat, attribute_writter_scene);\n }\n\n store_positions(positions, attribute_writter_scene)\n {\n this.read = this.build_RT(positions.length);\n this.write = this.build_RT(positions.length);\n\n const arr = new Float32Array(positions.length * 4);\n\n for (let i = 0; i < positions.length; i++)\n {\n arr[i * 4 + 0] = positions[i].x;\n arr[i * 4 + 1] = positions[i].y;\n arr[i * 4 + 2] = positions[i].z;\n arr[i * 4 + 3] = (Math.random() * 2 - 1) * 10;\n }\n const mat = new ParticleStorageMaterial();\n this.store_geometry_attribute_in_RT(new BufferAttribute(arr, 4), this.read, mat, attribute_writter_scene);\n }\n}\n\nexport { ParticlePositionAttribute };\n","import { DataTexture } from 'three';\n\nclass CustomDataTexture extends DataTexture\n{\n constructor(data, width, height, format, type)\n {\n super(data, width, height, format, type);\n this.multiplier = 1;\n }\n\n set_rgba(index, r, g, b, a)\n {\n this.data[index * 3 + 0] = r * this.multiplier;\n this.data[index * 3 + 1] = g * this.multiplier;\n this.data[index * 3 + 2] = b * this.multiplier;\n this.data[index * 3 + 3] = a * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_rgb(index, r, g, b)\n {\n this.data[index * 3 + 0] = r * this.multiplier;\n this.data[index * 3 + 1] = g * this.multiplier;\n this.data[index * 3 + 2] = b * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_r(index, value)\n {\n this.data[index * 3 + 0] = value * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_g(index, value)\n {\n this.data[index * 3 + 1] = value * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_b(index, value)\n {\n this.data[index * 3 + 2] = value * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_a(index, value)\n {\n this.data[index * 3 + 2] = value * this.multiplier;\n this.needsUpdate = true;\n }\n}\n\nexport { CustomDataTexture };\n","import { CustomDataTexture } from './CustomDataTexture';\nimport { RGBFormat } from 'three';\n\nclass RGBDataTexture extends CustomDataTexture\n{\n constructor(width, height)\n {\n const data = new Uint8Array(width * height * 3);\n super(data, width, height, RGBFormat);\n this.multiplier = 255;\n }\n}\n\nexport { RGBDataTexture };\n","import { CustomDataTexture } from './CustomDataTexture';\nimport { RGBAFormat } from 'three';\n\nclass RGBADataTexture extends CustomDataTexture\n{\n constructor(width, height)\n {\n const data = new Uint8Array(width * height * 4);\n super(data, width, height, RGBAFormat);\n this.multiplier = 255;\n }\n}\n\nexport { RGBADataTexture };\n","import { CustomDataTexture } from './CustomDataTexture';\nimport { FloatType } from 'three';\nimport { RGBFormat } from 'three';\n\nclass RGBFloatDataTexture extends CustomDataTexture\n{\n constructor(width, height)\n {\n const data = new Float32Array(width * height * 3);\n super(data, width, height, RGBFormat, FloatType);\n }\n}\n\nexport { RGBFloatDataTexture };\n","import { CustomDataTexture } from './CustomDataTexture';\nimport { FloatType } from 'three';\nimport { RGBAFormat } from 'three';\n\nclass RGBAFloatDataTexture extends CustomDataTexture\n{\n constructor(width, height)\n {\n const data = new Float32Array(width * height * 4);\n super(data, width, height, RGBAFormat, FloatType);\n }\n}\n\nexport { RGBAFloatDataTexture };\n","import { Mesh } from 'three';\nimport { RGBDataTexture } from '../data_textures/RGBDataTexture';\nimport { RGBADataTexture } from '../data_textures/RGBADataTexture';\nimport { RGBFloatDataTexture } from '../data_textures/RGBFloatDataTexture';\nimport { RGBAFloatDataTexture } from '../data_textures/RGBAFloatDataTexture';\n\nclass BatchedMesh extends Mesh\n{\n constructor(id_table, geometry, material, max_texture_width)\n {\n super(geometry, material);\n\n this.id_table = id_table;\n this.batched_count = Object.keys(id_table).length;\n this.max_texture_width = max_texture_width;\n this.batch_width = this.batched_count % max_texture_width;\n this.batch_height = Math.ceil(this.batched_count / max_texture_width);\n }\n\n attach_rgb_texture(uniform_name)\n {\n this.material.uniforms[uniform_name].value = new RGBDataTexture(this.batch_width, this.batch_height);\n }\n\n attach_rgba_texture(uniform_name)\n {\n this.material.uniforms[uniform_name].value = new RGBADataTexture(this.batch_width, this.batch_height);\n }\n\n attach_rgb_float_texture(uniform_name)\n {\n this.material.uniforms[uniform_name].value = new RGBFloatDataTexture(this.batch_width, this.batch_height);\n }\n\n attach_rgba_float_texture(uniform_name)\n {\n this.material.uniforms[uniform_name].value = new RGBAFloatDataTexture(this.batch_width, this.batch_height);\n }\n\n get_mesh_index(name)\n {\n return this.id_table[name];\n }\n\n set_rgb_value(uniform_name, mesh_name, r, g, b)\n {\n this.material.uniforms[uniform_name].set_rgb(this.get_mesh_index(mesh_name), r, g, b);\n }\n\n set_rgba_value(uniform_name, mesh_name, r, g, b, a)\n {\n this.material.uniforms[uniform_name].set_rgba(this.get_mesh_index(mesh_name), r, g, b, a);\n }\n}\n\nexport { BatchedMesh };\n","import { BatchedMesh } from './BatchedMesh';\n\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\n\nimport { BufferAttribute } from 'three';\n\nclass MeshBatcher\n{\n batch(meshes, material)\n {\n const max_texture_width = 2048;\n // let texture_width = meshes.length % max_texture_width;\n // let texture_height = Math.ceil(meshes.length / max_texture_width);\n\n // console.log(\"Store count: \" + buffer_geometries.length + \", Texture size: \" +texture_width);\n\n const geometries = [];\n const id_table = {};\n\n const attr_mesh_id = [];\n\n for (let i = 0; i < meshes.length; i++)\n {\n const mesh = meshes[i];\n const vertex_count = mesh.geometry.getAttribute('position').count;\n\n for (let count = 0; count < vertex_count; count++)\n {\n attr_mesh_id.push(i);\n }\n\n geometries.push(mesh.geometry);\n\n if (id_table[mesh.name] === undefined)\n {\n id_table[mesh.name] = i;\n }\n else\n {\n console.error('Mesh name is duplicated when trying to merge meshes. Non-unique id error.', mesh.name, id_table);\n }\n }\n\n const buffer_geometry = BufferGeometryUtils.mergeBufferGeometries(geometries);\n\n const buffer_attribute = new BufferAttribute(new Float32Array(attr_mesh_id), 1);\n buffer_geometry.setAttribute('mesh_id', buffer_attribute);\n\n return this.create_batched_mesh(id_table, buffer_geometry, material, max_texture_width);\n }\n\n create_batched_mesh(id_table, buffer_geometry, material, max_texture_width)\n {\n return new BatchedMesh(id_table, buffer_geometry, material, max_texture_width);\n }\n}\n\nexport { MeshBatcher };\n","import { Audio as TAudio } from 'three';\nimport { PositionalAudio as TPositionalAudio } from 'three';\n\nclass AudioClip\n{\n constructor(buffer, loop = true, volume = 1, positional = false)\n {\n this.buffer = buffer;\n this.loop = loop;\n this.volume = volume;\n this.positional = positional;\n\n this.audio = undefined;\n }\n\n init(audio_listener)\n {\n if (this.positional)\n {\n this.audio = new TPositionalAudio(audio_listener);\n }\n else\n {\n this.audio = new TAudio(audio_listener);\n }\n\n this.audio.setBuffer(this.buffer);\n this.audio.setLoop(this.loop);\n\n // This prevents undesired volume at the beginning of playing\n this.audio.gain.gain.value = 0;\n\n this.audio.setVolume(this.loop ? 0 : this.volume);\n }\n\n play()\n {\n this.audio.play();\n }\n\n pause()\n {\n this.audio.pause();\n }\n\n stop()\n {\n this.audio.stop();\n }\n\n get is_playing()\n {\n return this.audio.isPlaying;\n }\n}\n\nexport { AudioClip };\n","import { AudioContext } from 'three';\r\n\r\nimport { AudioClip } from '../components/AudioClip';\r\nimport { AbstractLoader } from './AbstractLoader';\r\n\r\nclass AudioLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, loop = true, volume = 0, size, positional = false)\r\n {\r\n super(resource_id, url, size);\r\n this.loop = loop;\r\n this.volume = volume;\r\n this.positional = positional;\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n // if (!window.user_interaction_for_audio)\r\n // {\r\n // setTimeout(this.on_preloaded_finished.bind(this, resource_container), 100);\r\n // }\r\n // else\r\n // {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.instantiate_audio(resource_container);\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n // }\r\n }\r\n\r\n instantiate_audio(resource_container)\r\n {\r\n const context = AudioContext.getContext();\r\n\r\n const buffer = context.createBuffer(2, 22050, 44100);\r\n\r\n fetch(this.url).then(r => r.blob()).then((response) =>\r\n {\r\n if (response.arrayBuffer)\r\n {\r\n response.arrayBuffer().then((array_buffer) =>\r\n {\r\n context.decodeAudioData(array_buffer, (audio_buffer) =>\r\n {\r\n resource_container.set_resource(\r\n this.resource_id,\r\n this.url,\r\n new AudioClip(audio_buffer, this.loop, this.volume, this.positional)\r\n );\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n });\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(\r\n this.resource_id,\r\n this.url,\r\n new AudioClip(buffer, this.loop, this.volume, this.positional)\r\n );\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport { AudioLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\n\n// import { sRGBEncoding } from 'three';\n\nclass BasisLoader extends AbstractLoader\n{\n constructor(resource_id, url, loader, size)\n {\n super(resource_id, url, size);\n\n this.loader = loader;\n }\n\n on_preloaded_finished(resource_container)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n this.loader.load(this.url, (basis) =>\n {\n // basis.encoding = sRGBEncoding;\n\n resource_container.set_resource(this.resource_id, this.url, basis);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // this.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n\nexport { BasisLoader };\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { CubeTextureLoader } from 'three';\r\n\r\nclass CubemapLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, extension, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new CubeTextureLoader();\r\n this.loader.setPath(url + '/');\r\n this.urls = [\r\n `px.${extension}`,\r\n `nx.${extension}`,\r\n `py.${extension}`,\r\n `ny.${extension}`,\r\n `pz.${extension}`,\r\n `nz.${extension}`\r\n ];\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.urls, (image) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, image);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (error) =>\r\n {\r\n this.__set_error('Image could not be loaded. Maybe wrong name or path, I don\\'t know' + '¯\\\\_(ツ)_/¯', error);\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { CubemapLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { ColladaLoader } from 'three/examples/jsm/loaders/ColladaLoader.js';\r\n\r\nclass DAELoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new ColladaLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, gltf);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { DAELoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { FileLoader as TFileLoader } from 'three';\r\n\r\nclass FileLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new TFileLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (file) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, file);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg);\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { FileLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\n\nimport { FontLoader as TFontLoader } from 'three/examples/jsm/loaders/FontLoader.js';\n\nclass FontLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n this.loader = new TFontLoader();\n }\n\n on_preloaded_finished(resource_container)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n this.loader.load(this.url, (font) =>\n {\n resource_container.set_resource(this.resource_id, this.url, font);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // this.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then probably the problem is related to the file not being found. Check the name and path of the resource');\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n\nexport { FontLoader };\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { GLTFLoader as TGLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';\r\n\r\nclass GLTFLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new TGLTFLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, gltf);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { GLTFLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';\r\n\r\nclass GLTFDRACOLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, loader, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new GLTFLoader();\r\n\r\n this.loader.setDRACOLoader(loader);\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, gltf);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { GLTFDRACOLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { HDRCubeTextureLoader as THDRCubeTextureLoader } from 'three/examples/jsm/loaders/HDRCubeTextureLoader.js';\r\nimport { UnsignedByteType } from 'three';\r\n\r\nclass HDRCubeTextureLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THDRCubeTextureLoader();\r\n this.url_suffix = ['/px.hdr', '/nx.hdr', '/py.hdr', '/ny.hdr', '/pz.hdr', '/nz.hdr'];\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.setPath(this.url)\r\n .setDataType(UnsignedByteType)\r\n .load(this.url_suffix, (hdr) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, hdr);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { HDRCubeTextureLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\n\nclass JSONLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n }\n\n on_preloaded_finished(resource_container, response)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n response.json().then((json) =>\n {\n resource_container.set_resource(this.resource_id, this.url, json);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n\nexport { JSONLoader };\n","import { AbstractLoader } from './AbstractLoader';\n\nimport { OBJLoader as TOBJLoader } from 'three/examples/jsm/loaders/OBJLoader.js';\n\nclass OBJLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n this.loader = new TOBJLoader();\n }\n\n on_preloaded_finished(resource_container)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n this.loader.load(this.url, (obj) =>\n {\n resource_container.set_resource(this.resource_id, this.url, obj);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // this.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then probably the problem is related to the file not being found. Check the name and path of the resource');\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n\nexport { OBJLoader };\n","import { AbstractLoader } from './AbstractLoader';\n\nimport { Vector3 } from 'three';\nimport { FileLoader } from 'three';\n\nclass PointArrayLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n this.loader = new FileLoader();\n }\n\n on_preloaded_finished(resource_container)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n this.loader.load(this.url, (text) =>\n {\n resource_container.set_resource(this.resource_id, this.url, this.parse_path(text));\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // this.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n this.__set_error(msg);\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n\n parse_path(raw_data)\n {\n const string_array = raw_data.split('\\n');\n\n if (string_array[string_array.length - 1] === '')\n {\n string_array.pop();\n }\n\n const positions = [];\n\n for (let i = 0; i < string_array.length; i += 3)\n {\n const x = parseFloat(string_array[i + 0]);\n const y = parseFloat(string_array[i + 1]);\n const z = parseFloat(string_array[i + 2]);\n positions.push(new Vector3(x, y, z));\n }\n return positions;\n // let curve = new THREE.CatmullRomCurve3(positions);\n // return curve.getPoints(100);\n }\n}\n\nexport { PointArrayLoader };\n","import { AbstractLoader } from './AbstractLoader';\n\nimport { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js';\n\nclass RGBETextureLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n this.loader = new RGBELoader();\n }\n\n on_preloaded_finished(resource_container)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n this.loader.load(this.url, (hdr) =>\n {\n resource_container.set_resource(this.resource_id, this.url, hdr);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // this.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n\nexport { RGBETextureLoader };\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { FileLoader as TFileLoader } from 'three';\r\n\r\nclass TextLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new TFileLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, gltf);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg);\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { TextLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { Texture } from 'three';\r\nimport { Browser } from '../Browser';\r\n\r\nclass AsyncTextureLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (Browser.is_safari && Browser.version < 15)\r\n {\r\n this.load_with_old_method(resource_container);\r\n }\r\n else\r\n {\r\n this.load_with_new_method(resource_container);\r\n }\r\n }\r\n\r\n load_with_old_method(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n const texture = new Texture();\r\n const image = new Image();\r\n\r\n image.src = this.url;\r\n\r\n image.onload = () =>\r\n {\r\n texture.image = image;\r\n texture.needsUpdate = true;\r\n\r\n resource_container.set_resource(this.resource_id, this.url, texture);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n };\r\n\r\n image.onerror = () =>\r\n {\r\n console.error('Error loading texture. Maybe the resource is not an image?', this.url, this.original_url);\r\n };\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n\r\n load_with_new_method(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n const fetchOptions = {};\r\n fetchOptions.credentials = 'same-origin';\r\n // fetchOptions.headers = this.requestHeader;\r\n\r\n fetch(this.url, fetchOptions).then((res) =>\r\n {\r\n return res.blob();\r\n }).then((blob) =>\r\n {\r\n return createImageBitmap(blob, { colorSpaceConversion: 'none' });\r\n }).then((imageBitmap) =>\r\n {\r\n const texture = new Texture(imageBitmap);\r\n texture.needsUpdate = true;\r\n\r\n resource_container.set_resource(this.resource_id, this.url, texture);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }).catch(function(e)\r\n {\r\n console.error(e);\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { AsyncTextureLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { Texture } from 'three';\r\n\r\nclass TextureLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n }\r\n\r\n on_preloaded_finished(resource_container, response)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n response.blob().then((blob) =>\r\n {\r\n const texture = new Texture();\r\n\r\n const url = URL.createObjectURL(blob);\r\n\r\n const image = new Image();\r\n image.src = url;\r\n\r\n image.onload = () =>\r\n {\r\n texture.image = image;\r\n texture.needsUpdate = true;\r\n\r\n resource_container.set_resource(this.resource_id, this.url, texture);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n };\r\n\r\n image.onerror = () =>\r\n {\r\n console.error('Error loading texture. Maybe the resource is not an image?', this.url);\r\n };\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { TextureLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\n\nclass VideoLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n }\n\n on_preloaded_finished(resource_container, response)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n response.blob().then((blob) =>\n {\n resource_container.set_resource(this.resource_id, this.url, URL.createObjectURL(blob));\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n\nexport { VideoLoader };\n","import { ResourceContainer } from '../ResourceContainer';\r\n\r\nclass ResourceBatch\r\n{\r\n constructor(batch_name)\r\n {\r\n this.resource_loaders = [];\r\n this.batch_name = batch_name || 'unnamed batch';\r\n }\r\n\r\n add_loader(loader)\r\n {\r\n this.resource_loaders.push(loader);\r\n }\r\n\r\n load(resource_container)\r\n {\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n this.resource_loaders[i].load(resource_container || ResourceContainer);\r\n }\r\n }\r\n\r\n get loading_finished()\r\n {\r\n let finished = true;\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n finished = finished && this.resource_loaders[i].has_finished;\r\n }\r\n return finished;\r\n }\r\n\r\n get has_errors()\r\n {\r\n let has_error = false;\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n has_error = has_error || this.resource_loaders[i].has_error;\r\n }\r\n return has_error;\r\n }\r\n\r\n print_errors()\r\n {\r\n console.error('Batch <' + this.batch_name + '> could not load successfully');\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n if (this.resource_loaders[i].has_error)\r\n {\r\n this.resource_loaders[i].print_error();\r\n }\r\n }\r\n }\r\n\r\n get_progress()\r\n {\r\n return this.get_loaded_bytes() / this.get_total_bytes();\r\n }\r\n\r\n get_loaded_bytes()\r\n {\r\n let loaded_bytes = 1;\r\n\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n loaded_bytes += this.resource_loaders[i].loaded_bytes;\r\n }\r\n\r\n return loaded_bytes;\r\n }\r\n\r\n get_total_bytes()\r\n {\r\n let total_bytes = 1;\r\n\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n total_bytes += this.resource_loaders[i].total_bytes;\r\n }\r\n\r\n return total_bytes;\r\n }\r\n}\r\n\r\nexport { ResourceBatch };\r\n"],"names":["browser","[object Object]","this","browser_name","agent","window","navigator","userAgent","toLowerCase","indexOf","opr","chrome","version","get_version","name","is_safari","is_chrome","is_edge","is_edge_chromium","has_webm","is_firefox","has_hvec","preferred_video_extension","ua","tem","M","match","test","exec","slice","join","replace","appName","appVersion","splice","Number","split","Validation","n","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","__get_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","transitions_velocity","URLSearchParams","location","search","EasingFunctions","cos","sin","pow","sqrt","c4","ease_out_bounce","n1","d1","sign","ActionInterpolator","NumberInterpolator","super","view_context","app","ActionEvent","args","ViewContext","DrawIOAnimationSheet","xml_document","animation_nodes","DOMParser","parseFromString","querySelectorAll","animation_tracks","triggers","node","parent_node","parentElement","getAttribute","get_node_x_position","parseFloat","includes","split_data","trigger_name","trigger_method","at_time","value_data","to_value","from_time","to_time","sort","a","x_pos","ActionSequencerBuilder","default_state_data","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","__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","AddMaterial","nMips","_SecondTex","tex","UnrealBloomComposeMaterial","NUM_MIPS","_BlurredTex","_BloomStrength","blurTexture1","blurTexture2","blurTexture3","blurTexture4","blurTexture5","bloomStrength","bloomFactors","bloomRadius","bloomTintColors","rt","col_string","set","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","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","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","core_attributes","context_attributes","threejs_attributes","_renderer","blitter","no_render","current_render_mode","generateDepthNormalTexture","depth_and_normals_renderer","is_webgl2","canvas_context","force_webgl2","xr_enabled","alpha","antialias","desynchronized","failIfMajorPerformanceCaveat","powerPreference","premultipliedAlpha","preserveDrawingBuffer","stencil","logarithmicDepthBuffer","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","code","press_key","release_key","pressed","released","key_name","key","fired","down","removeEventListener","os","operating_systems","ANDROID","IOS","LINUX","MAC","WINDOWS","is_mobile","is_ipad","maxTouchPoints","is_ios","is_android","get_os","is_linux","is_mac","is_windows","platform","reflection_plane_context","target_geometry","target_position","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","input","ui_elements","_tmp_normalized_pos","ss_scene","matrixWorldAutoUpdate","ws_scene","ss_camera","elem","set_screen_space_coordinate_system","set_world_space_coordinate_system","NDC","update_state","current_clicked_element","PerspectiveFrustumPointFitter","camera_quaternion","vertical_fov","v_fov","degToRad","h_fov","atan","tan","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","applyQuaternion","sphere_center","pull_back_distance","get_distance_to_fit_rect","far_pos","up_plane","Plane","setFromNormalAndCoplanarPoint","down_plane","left_plane","right_plane","apply_center_correction_to_pos","closest_distance","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_horizontal_correction","closest_distance_to_up_plane","closest_distance_to_down_plane","up_dir","down_line","up_line","down_dist","up_dist","correction","closest_distance_to_right_plane","closest_distance_to_left_plane","right_dir","left_line","right_line","left_dist","right_dist","Quaternion","setFromAxisAngle","distV","distH","OrthographicFrustumPointFitter","inverse_camera_quat","inverse","inverted_points","getCenter","distance_to_center","camera_utilities","tmp_mat","Matrix4","ray","Ray","tmp_size","tmp_unproj","tmp_vec","plane_position","plane_normal","get_forward_dir","isPerspectiveCamera","unproject_mouse_position","unproject","intersectPlane","zoom_scale","world_space_center","camera_forward","project_points_on_plane","projected_points_center","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","p1","p2","p3","p4","p5","p6","p7","p8","fit_points","camera_backward_dir","fitter","camera_pos","reference_position_plane","camera_ray","reference_position","camera_position","result","reference_rotation","reference_zoom","forward","initializer","init","CameraUtilities","GeometryBatcher","OS","ReflectionPlaneContext","UI","Debug","render_loop","SSAOMaterial","_InverseProjMatrix","_ProjectionMatrix","_Bias","_Radius","_SampleKernel","__get_sample_kernel","_RandomRotation","__get_rotation_kernel","sample_kernel","rotation_kernel","rotation_texture","wrapS","RepeatWrapping","wrapT","SSAOComposeMaterial","_AO","DisplayNormalTextureMaterial","depth_normals_vert","BoxBlurMaterial","_SampleDir","Blurrer","RT1","RT2","box_blur_mat","NormalAORender","ssao_mat","ssao_compose_mat","debug_normals","ssaa","use_ssaa","main_RT","SSAO_RT","blurrer","__check_RT_size","__update_uniforms","blur","projectionMatrix","NormalRender","VRRender","render_spectator_camera","spectator_camera","isPresenting","xrCam","getCamera","currentRenderTarget","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","obj","ids","FrustumPointFitter","get_hozirontal_correction","closest_up_point","closest_down_point","closest_right_point","closest_left_point","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","hexValues","hex","words","substr","charAt","TimeUtilities","time_str","hours","minutes","seconds","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","extension","CubeTextureLoader","setPath","urls","DAELoader","ColladaLoader","FileLoader","TFileLoader","file","FontLoader","TFontLoader","GLTFLoader","TGLTFLoader","GLTFDRACOLoader","setDRACOLoader","HDRCubeTextureLoader","THDRCubeTextureLoader","url_suffix","setDataType","UnsignedByteType","hdr","JSONLoader","OBJLoader","TOBJLoader","PointArrayLoader","parse_path","raw_data","string_array","pop","RGBETextureLoader","RGBELoader","TextLoader","AsyncTextureLoader","load_with_old_method","load_with_new_method","Texture","Image","onload","onerror","original_url","fetchOptions","res","createImageBitmap","colorSpaceConversion","imageBitmap","TextureLoader","VideoLoader","ResourceBatch","batch_name","resource_loaders","loading_finished","finished","has_errors","print_error","get_loaded_bytes","get_total_bytes"],"mappings":"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"}