ohzi-core 10.6.0 → 10.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/index.module.js +1 -1
- package/build/index.module.js.map +1 -1
- package/package.json +1 -1
- package/src/BaseApplication.js +3 -0
- package/src/Browser.js +7 -7
- package/src/RenderLoop.js +4 -0
- package/src/view_components/ViewManager.js +10 -0
- package/src/view_components/ViewState.js +8 -0
- package/src/view_components/transition/ViewStateTransitionHandler.js +10 -0
- package/types/BaseApplication.d.ts +2 -0
- package/types/Browser.d.ts +4 -0
- package/types/Graphics.d.ts +10 -5
- package/types/KeyboardInput.d.ts +1 -1
- package/types/RenderLoop.d.ts +1 -0
- package/types/Time.d.ts +13 -4
- package/types/action_sequencer/ActionEvent.d.ts +2 -1
- package/types/action_sequencer/ActionSequencer.d.ts +4 -2
- package/types/utilities/CameraUtilities.d.ts +11 -0
- package/types/utilities/HTMLUtilities.d.ts +4 -8
- package/types/utilities/ObjectUtilities.d.ts +4 -13
- package/types/view_components/ApplicationView.d.ts +0 -7
- package/types/view_components/ViewManager.d.ts +2 -1
- package/types/view_components/ViewState.d.ts +2 -0
- package/types/view_components/transition/ViewStateTransitionHandler.d.ts +2 -0
|
@@ -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 // vr specific\n this.vrBrowserKeywords = ['OculusBrowser', 'oculus', 'vive', 'rift', 'windowsmr', 'cardboard', 'daydream'];\n this.vrBrowser = this.vrBrowserKeywords.find(keyword => this.agent.includes(keyword));\n // Check for WebXR support (indicating VR capabilities)\n this.hasWebXRSupport = 'xr' in navigator;\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 case this.vrBrowser && this.hasWebXRSupport:\n this.browser_name = this.vrBrowser;\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 is_vr()\n {\n return this.vrBrowserKeywords.includes(this.browser_name);\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.previous_elapsed_time = -0.00001;\n this.elapsed_time = -0.00001;\n this.playback_speed = this.__get_playback_speed();\n this.playing = true;\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.previous_elapsed_time = this.elapsed_time;\n this.elapsed_time += delta_time * this.playback_speed;\n this.__play_clips(this.previous_elapsed_time, this.elapsed_time);\n }\n }\n\n set_progress(time)\n {\n this.previous_elapsed_time = this.elapsed_time;\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.previous_elapsed_time = this.elapsed_time;\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 if (this.elapsed_time > this.previous_elapsed_time)\n {\n this.__play_events(this.previous_elapsed_time, this.elapsed_time);\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 __play_events(from, to)\n {\n for (let i = 0; i < this.action_events.length; i++)\n {\n const trigger_time = this.action_events[i].trigger_time;\n if (OMath.between(trigger_time, from, to))\n {\n console.log('Play event: ' + this.action_events[i].action.constructor.name + ' at ' + this.action_events[i].trigger_time);\n this.action_events[i].action.trigger();\n }\n }\n }\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 static load_iframes(container)\n {\n const iframes = container.querySelectorAll('iframe');\n\n for (let i = 0; i < iframes.length; i++)\n {\n const iframe = iframes[i];\n\n if (iframe.dataset.src)\n {\n iframe.src = iframe.dataset.src;\n }\n }\n }\n\n static load_elements(container, selector)\n {\n const elements = container.querySelectorAll(selector);\n\n for (let i = 0; i < elements.length; i++)\n {\n const element = elements[i];\n\n if (element.dataset.src)\n {\n element.src = element.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.__delta_time = 0;\n this.__smooth_delta_time = 0;\n this.__elapsed_time = 0;\n this.__allocated_time = new Vector2(0, 0);\n this.__frame_interpolation_t = 0;\n this.fixed_delta_time = 1 / 30;\n }\n\n get elapsed_time()\n {\n return this.__elapsed_time;\n }\n\n get delta_time()\n {\n return this.__delta_time;\n }\n\n get smooth_delta_time()\n {\n return this.__smooth_delta_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 get frame_interpolation()\n {\n return this.__frame_interpolation_t;\n }\n\n get fdt()\n {\n return this.fixed_delta_time;\n }\n\n get dt()\n {\n return this.delta_time;\n }\n\n get sdt()\n {\n return this.smooth_delta_time;\n }\n\n __set_frame_interpolation(value)\n {\n this.__frame_interpolation_t = value;\n }\n\n __update()\n {\n this.__delta_time = this.___time.getDelta();\n this.__elapsed_time = this.___time.getElapsedTime();\n\n this.__delta_buffer.shift();\n this.__delta_buffer.push(this.delta_time < 0.32 ? this.delta_time : 0.032);\n\n this.__calculate_smooth_delta_time();\n }\n\n __calculate_smooth_delta_time()\n {\n this.__smooth_delta_time = 0;\n\n for (let i = 0; i < this.__delta_buffer.length; i++)\n {\n this.__smooth_delta_time += this.__delta_buffer[i];\n }\n\n this.__smooth_delta_time = this.__smooth_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 fixed_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';\nimport { CameraManager } from './CameraManager';\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(60, OScreen.aspect_ratio, 0.1, 1000);\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 this.scene.add(arrow);\n return arrow;\n }\n\n draw_axis()\n {\n const axis = new AxisHelper();\n this.scene.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 this.scene.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 this.scene.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 this.scene.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 this.scene.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 this.scene.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, CameraManager.current);\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 this.time_accumulator = 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.time_accumulator += Time.delta_time;\n\n while (this.time_accumulator > Time.fixed_delta_time)\n {\n this.target_application.fixed_update();\n this.time_accumulator -= Time.fixed_delta_time;\n }\n Time.__set_frame_interpolation(this.time_accumulator / Time.fixed_delta_time);\n\n this.target_application.update();\n\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","vrBrowserKeywords","vrBrowser","find","keyword","includes","hasWebXRSupport","indexOf","opr","chrome","version","get_version","name","is_safari","is_chrome","is_edge","is_edge_chromium","is_vr","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","previous_elapsed_time","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","__play_events","evaluate_keyframe","between","log","constructor","trigger","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","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","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","iframes","iframe","selector","TransitionTable","transitions","from_state_name","to_state_name","from_animation_sheet","__delta_buffer","___time","Clock","__delta_time","__smooth_delta_time","__elapsed_time","__allocated_time","Vector2","__frame_interpolation_t","fixed_delta_time","smooth_delta_time","shader_time","frame_interpolation","fdt","dt","sdt","getDelta","getElapsedTime","shift","__calculate_smooth_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","OScreen","origin","arrow","normalize","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","SceneManager","sphere1","bb","curve","options","offset","mesh","set_texture","graphics","set_screen_size","render","CameraManager","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","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","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","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","time_accumulator","__update","on_post_start","fixed_update","__set_frame_interpolation","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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"}
|
|
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 // vr specific\n this.vr_browser_keywords = ['oculusbrowser', 'oculus', 'vive', 'rift', 'windowsmr', 'cardboard', 'daydream'];\n this.vr_browser_name = this.vr_browser_keywords.find(keyword => this.agent.includes(keyword));\n // Check for WebXR support (indicating VR capabilities)\n this.has_web_xr_support = 'xr' in navigator;\n\n switch (true)\n {\n case this.vr_browser_name !== undefined && this.has_web_xr_support:\n this.browser_name = this.vr_browser_name;\n break;\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 is_vr()\n {\n return this.vr_browser_keywords.includes(this.browser_name);\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.previous_elapsed_time = -0.00001;\n this.elapsed_time = -0.00001;\n this.playback_speed = this.__get_playback_speed();\n this.playing = true;\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.previous_elapsed_time = this.elapsed_time;\n this.elapsed_time += delta_time * this.playback_speed;\n this.__play_clips(this.previous_elapsed_time, this.elapsed_time);\n }\n }\n\n set_progress(time)\n {\n this.previous_elapsed_time = this.elapsed_time;\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.previous_elapsed_time = this.elapsed_time;\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 if (this.elapsed_time > this.previous_elapsed_time)\n {\n this.__play_events(this.previous_elapsed_time, this.elapsed_time);\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 __play_events(from, to)\n {\n for (let i = 0; i < this.action_events.length; i++)\n {\n const trigger_time = this.action_events[i].trigger_time;\n if (OMath.between(trigger_time, from, to))\n {\n console.log('Play event: ' + this.action_events[i].action.constructor.name + ' at ' + this.action_events[i].trigger_time);\n this.action_events[i].action.trigger();\n }\n }\n }\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 static load_iframes(container)\n {\n const iframes = container.querySelectorAll('iframe');\n\n for (let i = 0; i < iframes.length; i++)\n {\n const iframe = iframes[i];\n\n if (iframe.dataset.src)\n {\n iframe.src = iframe.dataset.src;\n }\n }\n }\n\n static load_elements(container, selector)\n {\n const elements = container.querySelectorAll(selector);\n\n for (let i = 0; i < elements.length; i++)\n {\n const element = elements[i];\n\n if (element.dataset.src)\n {\n element.src = element.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.__delta_time = 0;\n this.__smooth_delta_time = 0;\n this.__elapsed_time = 0;\n this.__allocated_time = new Vector2(0, 0);\n this.__frame_interpolation_t = 0;\n this.fixed_delta_time = 1 / 30;\n }\n\n get elapsed_time()\n {\n return this.__elapsed_time;\n }\n\n get delta_time()\n {\n return this.__delta_time;\n }\n\n get smooth_delta_time()\n {\n return this.__smooth_delta_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 get frame_interpolation()\n {\n return this.__frame_interpolation_t;\n }\n\n get fdt()\n {\n return this.fixed_delta_time;\n }\n\n get dt()\n {\n return this.delta_time;\n }\n\n get sdt()\n {\n return this.smooth_delta_time;\n }\n\n __set_frame_interpolation(value)\n {\n this.__frame_interpolation_t = value;\n }\n\n __update()\n {\n this.__delta_time = this.___time.getDelta();\n this.__elapsed_time = this.___time.getElapsedTime();\n\n this.__delta_buffer.shift();\n this.__delta_buffer.push(this.delta_time < 0.32 ? this.delta_time : 0.032);\n\n this.__calculate_smooth_delta_time();\n }\n\n __calculate_smooth_delta_time()\n {\n this.__smooth_delta_time = 0;\n\n for (let i = 0; i < this.__delta_buffer.length; i++)\n {\n this.__smooth_delta_time += this.__delta_buffer[i];\n }\n\n this.__smooth_delta_time = this.__smooth_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 before_update()\n {\n }\n\n update()\n {\n }\n\n fixed_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 before_update()\n {\n this.current_state.before_update();\n }\n\n fixed_update()\n {\n this.current_state.fixed_update();\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 before_update()\n {\n this.transition_handler.before_update();\n }\n\n update()\n {\n this.transition_handler.update();\n\n this.__set_views_opacities();\n }\n\n fixed_update()\n {\n this.transition_handler.fixed_update();\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 before_update()\n {}\n\n update()\n {}\n\n fixed_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';\nimport { CameraManager } from './CameraManager';\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(60, OScreen.aspect_ratio, 0.1, 1000);\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 this.scene.add(arrow);\n return arrow;\n }\n\n draw_axis()\n {\n const axis = new AxisHelper();\n this.scene.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 this.scene.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 this.scene.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 this.scene.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 this.scene.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 this.scene.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, CameraManager.current);\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 this.time_accumulator = 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.time_accumulator += Time.delta_time;\n\n this.target_application.before_update();\n ViewManager.before_update();\n\n while (this.time_accumulator > Time.fixed_delta_time)\n {\n this.target_application.fixed_update();\n ViewManager.fixed_update();\n this.time_accumulator -= Time.fixed_delta_time;\n }\n Time.__set_frame_interpolation(this.time_accumulator / Time.fixed_delta_time);\n\n this.target_application.update();\n\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","vr_browser_keywords","vr_browser_name","find","keyword","includes","has_web_xr_support","undefined","indexOf","opr","chrome","version","get_version","name","is_safari","is_chrome","is_edge","is_edge_chromium","is_vr","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","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","previous_elapsed_time","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","__play_events","evaluate_keyframe","between","log","trigger","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","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","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","iframes","iframe","selector","TransitionTable","transitions","from_state_name","to_state_name","add_transitions","set_transitions","set_default_state_data","__delta_buffer","___time","Clock","__delta_time","__smooth_delta_time","__elapsed_time","__allocated_time","Vector2","__frame_interpolation_t","fixed_delta_time","smooth_delta_time","shader_time","frame_interpolation","fdt","dt","sdt","__set_frame_interpolation","__update","getDelta","getElapsedTime","shift","__calculate_smooth_delta_time","ViewState","start","show","hide","before_enter","on_enter","before_update","fixed_update","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","OScreen","draw_arrow","origin","arrow","normalize","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","SceneManager","draw_math_sphere","sphere1","draw_bounding_box","bb","draw_curve","curve","options","offset","draw_texture","mesh","graphics","CameraManager","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","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","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","time_accumulator","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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"}
|